linux-gpio.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Zhangjian (Bamvor)" <bamvor.zhangjian@huawei.com>
To: shuahkh@osg.samsung.com, linus.walleij@linaro.org
Cc: linux-gpio@vger.kernel.org, broonie@kernel.org,
	mwelling@ieee.org, shuah@kernel.org, bamvor.zhangjian@linaro.org
Subject: Re: [PATCH v5] selftest/gpio: add gpio test case
Date: Tue, 13 Dec 2016 20:42:10 +0800	[thread overview]
Message-ID: <8d50fbdd-f17b-fae2-14dd-80da9fac0a48@huawei.com> (raw)
In-Reply-To: <1479723371-5489-1-git-send-email-bamvor.zhangjian@huawei.com>

Ping.

On 2016/11/21 18:16, bamvor.zhangjian@huawei.com wrote:
> From: Bamvor Jian Zhang <bamvor.zhangjian@linaro.org>
>
> This test script try to do whitebox testing for gpio subsystem(based on
> gpiolib). It manipulate gpio device through chardev or sysfs and check
> the result from debugfs. This script test gpio-mockup through chardev by
> default. User could test other gpio chip by passing the module name.
> Some of the testcases are turned off by default to avoid the conflicting
> with gpiochip in system.
>
> In details, it test the following things:
> 1.  Test direction and output value for valid pin.
> 2.  Test dynamic allocation of gpio base.
> 3.  Add single, multi gpiochip to do overlap check.
>
> Run "tools/testing/selftests/gpio/gpio-mockup.sh -h" for usage.
>
> Acked-by: Shuah Khan <shuahkh@osg.samsung.com>
> Signed-off-by: Bamvor Jian Zhang <bamvor.zhangjian@linaro.org>
> ---
> Changes since v4:
> 1.  Install header to to linux/usr/include instead of default path
> 2.  Print being deprecated for sysfs ABI.
>
>  tools/testing/selftests/Makefile                   |   1 +
>  tools/testing/selftests/gpio/Makefile              |  23 ++
>  tools/testing/selftests/gpio/gpio-mockup-chardev.c | 324 +++++++++++++++++++++
>  tools/testing/selftests/gpio/gpio-mockup-sysfs.sh  | 134 +++++++++
>  tools/testing/selftests/gpio/gpio-mockup.sh        | 201 +++++++++++++
>  5 files changed, 683 insertions(+)
>  create mode 100644 tools/testing/selftests/gpio/Makefile
>  create mode 100644 tools/testing/selftests/gpio/gpio-mockup-chardev.c
>  create mode 100755 tools/testing/selftests/gpio/gpio-mockup-sysfs.sh
>  create mode 100755 tools/testing/selftests/gpio/gpio-mockup.sh
>
> diff --git a/tools/testing/selftests/Makefile b/tools/testing/selftests/Makefile
> index ff9e5f2..2437dbc 100644
> --- a/tools/testing/selftests/Makefile
> +++ b/tools/testing/selftests/Makefile
> @@ -6,6 +6,7 @@ TARGETS += exec
>  TARGETS += firmware
>  TARGETS += ftrace
>  TARGETS += futex
> +TARGETS += gpio
>  TARGETS += ipc
>  TARGETS += kcmp
>  TARGETS += lib
> diff --git a/tools/testing/selftests/gpio/Makefile b/tools/testing/selftests/gpio/Makefile
> new file mode 100644
> index 0000000..205e4d1
> --- /dev/null
> +++ b/tools/testing/selftests/gpio/Makefile
> @@ -0,0 +1,23 @@
> +
> +TEST_PROGS := gpio-mockup.sh
> +TEST_FILES := gpio-mockup-sysfs.sh $(BINARIES)
> +BINARIES := gpio-mockup-chardev
> +
> +include ../lib.mk
> +
> +all: $(BINARIES)
> +
> +clean:
> +	$(RM) $(BINARIES)
> +
> +CFLAGS += -O2 -g -std=gnu99 -Wall -I../../../../usr/include/
> +LDLIBS += -lmount -I/usr/include/libmount
> +
> +$(BINARIES): ../../../gpio/gpio-utils.o ../../../../usr/include/linux/gpio.h
> +
> +../../../gpio/gpio-utils.o:
> +	make ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C ../../../gpio
> +
> +../../../../usr/include/linux/gpio.h:
> +	make -C ../../../.. headers_install INSTALL_HDR_PATH=$(shell pwd)/../../../../usr/
> +
> diff --git a/tools/testing/selftests/gpio/gpio-mockup-chardev.c b/tools/testing/selftests/gpio/gpio-mockup-chardev.c
> new file mode 100644
> index 0000000..667e916
> --- /dev/null
> +++ b/tools/testing/selftests/gpio/gpio-mockup-chardev.c
> @@ -0,0 +1,324 @@
> +/*
> + * GPIO chardev test helper
> + *
> + * Copyright (C) 2016 Bamvor Jian Zhang
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License version 2 as published by
> + * the Free Software Foundation.
> + */
> +
> +#define _GNU_SOURCE
> +#include <unistd.h>
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <stdio.h>
> +#include <errno.h>
> +#include <string.h>
> +#include <fcntl.h>
> +#include <getopt.h>
> +#include <sys/ioctl.h>
> +#include <libmount.h>
> +#include <err.h>
> +#include <dirent.h>
> +#include <linux/gpio.h>
> +#include "../../../gpio/gpio-utils.h"
> +
> +#define CONSUMER	"gpio-selftest"
> +#define	GC_NUM		10
> +enum direction {
> +	OUT,
> +	IN
> +};
> +
> +static int get_debugfs(char **path)
> +{
> +	struct libmnt_context *cxt;
> +	struct libmnt_table *tb;
> +	struct libmnt_iter *itr = NULL;
> +	struct libmnt_fs *fs;
> +	int found = 0;
> +
> +	cxt = mnt_new_context();
> +	if (!cxt)
> +		err(EXIT_FAILURE, "libmount context allocation failed");
> +
> +	itr = mnt_new_iter(MNT_ITER_FORWARD);
> +	if (!itr)
> +		err(EXIT_FAILURE, "failed to initialize libmount iterator");
> +
> +	if (mnt_context_get_mtab(cxt, &tb))
> +		err(EXIT_FAILURE, "failed to read mtab");
> +
> +	while (mnt_table_next_fs(tb, itr, &fs) == 0) {
> +		const char *type = mnt_fs_get_fstype(fs);
> +
> +		if (!strcmp(type, "debugfs")) {
> +			found = 1;
> +			break;
> +		}
> +	}
> +	if (found)
> +		asprintf(path, "%s/gpio", mnt_fs_get_target(fs));
> +
> +	mnt_free_iter(itr);
> +	mnt_free_context(cxt);
> +
> +	if (!found)
> +		return -1;
> +
> +	return 0;
> +}
> +
> +static int gpio_debugfs_get(const char *consumer, int *dir, int *value)
> +{
> +	char *debugfs;
> +	FILE *f;
> +	char *line = NULL;
> +	size_t len = 0;
> +	char *cur;
> +	int found = 0;
> +
> +	if (get_debugfs(&debugfs) != 0)
> +		err(EXIT_FAILURE, "debugfs is not mounted");
> +
> +	f = fopen(debugfs, "r");
> +	if (!f)
> +		err(EXIT_FAILURE, "read from gpio debugfs failed");
> +
> +	/*
> +	 * gpio-2   (                    |gpio-selftest               ) in  lo
> +	 */
> +	while (getline(&line, &len, f) != -1) {
> +		cur = strstr(line, consumer);
> +		if (cur == NULL)
> +			continue;
> +
> +		cur = strchr(line, ')');
> +		if (!cur)
> +			continue;
> +
> +		cur += 2;
> +		if (!strncmp(cur, "out", 3)) {
> +			*dir = OUT;
> +			cur += 4;
> +		} else if (!strncmp(cur, "in", 2)) {
> +			*dir = IN;
> +			cur += 4;
> +		}
> +
> +		if (!strncmp(cur, "hi", 2))
> +			*value = 1;
> +		else if (!strncmp(cur, "lo", 2))
> +			*value = 0;
> +
> +		found = 1;
> +		break;
> +	}
> +	free(debugfs);
> +	fclose(f);
> +	free(line);
> +
> +	if (!found)
> +		return -1;
> +
> +	return 0;
> +}
> +
> +static struct gpiochip_info *list_gpiochip(const char *gpiochip_name, int *ret)
> +{
> +	struct gpiochip_info *cinfo;
> +	struct gpiochip_info *current;
> +	const struct dirent *ent;
> +	DIR *dp;
> +	char *chrdev_name;
> +	int fd;
> +	int i = 0;
> +
> +	cinfo = calloc(sizeof(struct gpiochip_info) * 4, GC_NUM + 1);
> +	if (!cinfo)
> +		err(EXIT_FAILURE, "gpiochip_info allocation failed");
> +
> +	current = cinfo;
> +	dp = opendir("/dev");
> +	if (!dp) {
> +		*ret = -errno;
> +		goto error_out;
> +	} else {
> +		*ret = 0;
> +	}
> +
> +	while (ent = readdir(dp), ent) {
> +		if (check_prefix(ent->d_name, "gpiochip")) {
> +			*ret = asprintf(&chrdev_name, "/dev/%s", ent->d_name);
> +			if (*ret < 0)
> +				goto error_out;
> +
> +			fd = open(chrdev_name, 0);
> +			if (fd == -1) {
> +				*ret = -errno;
> +				fprintf(stderr, "Failed to open %s\n",
> +					chrdev_name);
> +				goto error_close_dir;
> +			}
> +			*ret = ioctl(fd, GPIO_GET_CHIPINFO_IOCTL, current);
> +			if (*ret == -1) {
> +				perror("Failed to issue CHIPINFO IOCTL\n");
> +				goto error_close_dir;
> +			}
> +			close(fd);
> +			if (strcmp(current->label, gpiochip_name) == 0
> +			    || check_prefix(current->label, gpiochip_name)) {
> +				*ret = 0;
> +				current++;
> +				i++;
> +			}
> +		}
> +	}
> +
> +	if ((!*ret && i == 0) || *ret < 0) {
> +		free(cinfo);
> +		cinfo = NULL;
> +	}
> +	if (!*ret && i > 0) {
> +		cinfo = realloc(cinfo, sizeof(struct gpiochip_info) * 4 * i);
> +		*ret = i;
> +	}
> +
> +error_close_dir:
> +	closedir(dp);
> +error_out:
> +	if (*ret < 0)
> +		err(EXIT_FAILURE, "list gpiochip failed: %s", strerror(*ret));
> +
> +	return cinfo;
> +}
> +
> +int gpio_pin_test(struct gpiochip_info *cinfo, int line, int flag, int value)
> +{
> +	struct gpiohandle_data data;
> +	unsigned int lines[] = {line};
> +	int fd;
> +	int debugfs_dir = IN;
> +	int debugfs_value = 0;
> +	int ret;
> +
> +	data.values[0] = value;
> +	ret = gpiotools_request_linehandle(cinfo->name, lines, 1, flag, &data,
> +					   CONSUMER);
> +	if (ret < 0)
> +		goto fail_out;
> +	else
> +		fd = ret;
> +
> +	ret = gpio_debugfs_get(CONSUMER, &debugfs_dir, &debugfs_value);
> +	if (ret) {
> +		ret = -EINVAL;
> +		goto fail_out;
> +	}
> +	if (flag & GPIOHANDLE_REQUEST_INPUT) {
> +		if (debugfs_dir != IN) {
> +			errno = -EINVAL;
> +			ret = -errno;
> +		}
> +	} else if (flag & GPIOHANDLE_REQUEST_OUTPUT) {
> +		if (flag & GPIOHANDLE_REQUEST_ACTIVE_LOW)
> +			debugfs_value = !debugfs_value;
> +
> +		if (!(debugfs_dir == OUT && value == debugfs_value))
> +			errno = -EINVAL;
> +		ret = -errno;
> +
> +	}
> +	gpiotools_release_linehandle(fd);
> +
> +fail_out:
> +	if (ret)
> +		err(EXIT_FAILURE, "gpio<%s> line<%d> test flag<0x%x> value<%d>",
> +		    cinfo->name, line, flag, value);
> +
> +	return ret;
> +}
> +
> +void gpio_pin_tests(struct gpiochip_info *cinfo, unsigned int line)
> +{
> +	printf("line<%d>", line);
> +	gpio_pin_test(cinfo, line, GPIOHANDLE_REQUEST_OUTPUT, 0);
> +	printf(".");
> +	gpio_pin_test(cinfo, line, GPIOHANDLE_REQUEST_OUTPUT, 1);
> +	printf(".");
> +	gpio_pin_test(cinfo, line,
> +		      GPIOHANDLE_REQUEST_OUTPUT | GPIOHANDLE_REQUEST_ACTIVE_LOW,
> +		      0);
> +	printf(".");
> +	gpio_pin_test(cinfo, line,
> +		      GPIOHANDLE_REQUEST_OUTPUT | GPIOHANDLE_REQUEST_ACTIVE_LOW,
> +		      1);
> +	printf(".");
> +	gpio_pin_test(cinfo, line, GPIOHANDLE_REQUEST_INPUT, 0);
> +	printf(".");
> +}
> +
> +/*
> + * ./gpio-mockup-chardev gpio_chip_name_prefix is_valid_gpio_chip
> + * Return 0 if successful or exit with EXIT_FAILURE if test failed.
> + * gpio_chip_name_prefix: The prefix of gpiochip you want to test. E.g.
> + *			  gpio-mockup
> + * is_valid_gpio_chip:	  Whether the gpio_chip is valid. 1 means valid,
> + *			  0 means invalid which could not be found by
> + *			  list_gpiochip.
> + */
> +int main(int argc, char *argv[])
> +{
> +	char *prefix;
> +	int valid;
> +	struct gpiochip_info *cinfo;
> +	struct gpiochip_info *current;
> +	int i;
> +	int ret;
> +
> +	if (argc < 3) {
> +		printf("Usage: %s prefix is_valid", argv[0]);
> +		exit(EXIT_FAILURE);
> +	}
> +
> +	prefix = argv[1];
> +	valid = strcmp(argv[2], "true") == 0 ? 1 : 0;
> +
> +	printf("Test gpiochip %s: ", prefix);
> +	cinfo = list_gpiochip(prefix, &ret);
> +	if (!cinfo) {
> +		if (!valid && ret == 0) {
> +			printf("Invalid test successful\n");
> +			ret = 0;
> +			goto out;
> +		} else {
> +			ret = -EINVAL;
> +			goto out;
> +		}
> +	} else if (cinfo && !valid) {
> +		ret = -EINVAL;
> +		goto out;
> +	}
> +	current = cinfo;
> +	for (i = 0; i < ret; i++) {
> +		gpio_pin_tests(current, 0);
> +		gpio_pin_tests(current, current->lines - 1);
> +		gpio_pin_tests(current, random() % current->lines);
> +		current++;
> +	}
> +	ret = 0;
> +	printf("successful\n");
> +
> +out:
> +	if (ret)
> +		fprintf(stderr, "gpio<%s> test failed\n", prefix);
> +
> +	if (cinfo)
> +		free(cinfo);
> +
> +	if (ret)
> +		exit(EXIT_FAILURE);
> +
> +	return ret;
> +}
> diff --git a/tools/testing/selftests/gpio/gpio-mockup-sysfs.sh b/tools/testing/selftests/gpio/gpio-mockup-sysfs.sh
> new file mode 100755
> index 0000000..085d7a3
> --- /dev/null
> +++ b/tools/testing/selftests/gpio/gpio-mockup-sysfs.sh
> @@ -0,0 +1,134 @@
> +
> +is_consistent()
> +{
> +	val=
> +
> +	active_low_sysfs=`cat $GPIO_SYSFS/gpio$nr/active_low`
> +	val_sysfs=`cat $GPIO_SYSFS/gpio$nr/value`
> +	dir_sysfs=`cat $GPIO_SYSFS/gpio$nr/direction`
> +
> +	gpio_this_debugfs=`cat $GPIO_DEBUGFS |grep "gpio-$nr" | sed "s/(.*)//g"`
> +	dir_debugfs=`echo $gpio_this_debugfs | awk '{print $2}'`
> +	val_debugfs=`echo $gpio_this_debugfs | awk '{print $3}'`
> +	if [ $val_debugfs = "lo" ]; then
> +		val=0
> +	elif [ $val_debugfs = "hi" ]; then
> +		val=1
> +	fi
> +
> +	if [ $active_low_sysfs = "1" ]; then
> +		if [ $val = "0" ]; then
> +			val="1"
> +		else
> +			val="0"
> +		fi
> +	fi
> +
> +	if [ $val_sysfs = $val ] && [ $dir_sysfs = $dir_debugfs ]; then
> +		echo -n "."
> +	else
> +		echo "test fail, exit"
> +		die
> +	fi
> +}
> +
> +test_pin_logic()
> +{
> +	nr=$1
> +	direction=$2
> +	active_low=$3
> +	value=$4
> +
> +	echo $direction > $GPIO_SYSFS/gpio$nr/direction
> +	echo $active_low > $GPIO_SYSFS/gpio$nr/active_low
> +	if [ $direction = "out" ]; then
> +		echo $value > $GPIO_SYSFS/gpio$nr/value
> +	fi
> +	is_consistent $nr
> +}
> +
> +test_one_pin()
> +{
> +	nr=$1
> +
> +	echo -n "test pin<$nr>"
> +
> +	echo $nr > $GPIO_SYSFS/export 2>/dev/null
> +
> +	if [ X$? != X0 ]; then
> +		echo "test GPIO pin $nr failed"
> +		die
> +	fi
> +
> +	#"Checking if the sysfs is consistent with debugfs: "
> +	is_consistent $nr
> +
> +	#"Checking the logic of active_low: "
> +	test_pin_logic $nr out 1 1
> +	test_pin_logic $nr out 1 0
> +	test_pin_logic $nr out 0 1
> +	test_pin_logic $nr out 0 0
> +
> +	#"Checking the logic of direction: "
> +	test_pin_logic $nr in 1 1
> +	test_pin_logic $nr out 1 0
> +	test_pin_logic $nr low 0 1
> +	test_pin_logic $nr high 0 0
> +
> +	echo $nr > $GPIO_SYSFS/unexport
> +
> +	echo "successful"
> +}
> +
> +test_one_pin_fail()
> +{
> +	nr=$1
> +
> +	echo $nr > $GPIO_SYSFS/export 2>/dev/null
> +
> +	if [ X$? != X0 ]; then
> +		echo "test invalid pin $nr successful"
> +	else
> +		echo "test invalid pin $nr failed"
> +		echo $nr > $GPIO_SYSFS/unexport 2>/dev/null
> +		die
> +	fi
> +}
> +
> +list_chip()
> +{
> +	echo `ls -d $GPIO_DRV_SYSFS/gpiochip* 2>/dev/null`
> +}
> +
> +test_chip()
> +{
> +	chip=$1
> +	name=`basename $chip`
> +	base=`cat $chip/base`
> +	ngpio=`cat $chip/ngpio`
> +	printf "%-10s %-5s %-5s\n" $name $base $ngpio
> +	if [ $ngpio = "0" ]; then
> +		echo "number of gpio is zero is not allowed".
> +	fi
> +	test_one_pin $base
> +	test_one_pin $(($base + $ngpio - 1))
> +	test_one_pin $((( RANDOM % $ngpio )  + $base ))
> +}
> +
> +test_chips_sysfs()
> +{
> +       gpiochip=`list_chip $module`
> +       if [ X"$gpiochip" = X ]; then
> +               if [ X"$valid" = Xfalse ]; then
> +                       echo "successful"
> +               else
> +                       echo "fail"
> +                       die
> +               fi
> +       else
> +               for chip in $gpiochip; do
> +                       test_chip $chip
> +               done
> +       fi
> +}
> +
> diff --git a/tools/testing/selftests/gpio/gpio-mockup.sh b/tools/testing/selftests/gpio/gpio-mockup.sh
> new file mode 100755
> index 0000000..b183439
> --- /dev/null
> +++ b/tools/testing/selftests/gpio/gpio-mockup.sh
> @@ -0,0 +1,201 @@
> +#!/bin/bash
> +
> +#exit status
> +#1: run as non-root user
> +#2: sysfs/debugfs not mount
> +#3: insert module fail when gpio-mockup is a module.
> +#4: other reason.
> +
> +SYSFS=
> +GPIO_SYSFS=
> +GPIO_DRV_SYSFS=
> +DEBUGFS=
> +GPIO_DEBUGFS=
> +dev_type=
> +module=
> +
> +usage()
> +{
> +	echo "Usage:"
> +	echo "$0 [-f] [-m name] [-t type]"
> +	echo "-f:  full test. It maybe conflict with existence gpio device."
> +	echo "-m:  module name, default name is gpio-mockup. It could also test"
> +	echo "     other gpio device."
> +	echo "-t:  interface type: chardev(char device) and sysfs(being"
> +	echo "     deprecated). The first one is default"
> +	echo ""
> +	echo "$0 -h"
> +	echo "This usage"
> +}
> +
> +prerequisite()
> +{
> +	msg="skip all tests:"
> +	if [ $UID != 0 ]; then
> +		echo $msg must be run as root >&2
> +		exit 1
> +	fi
> +	SYSFS=`mount -t sysfs | head -1 | awk '{ print $3 }'`
> +	if [ ! -d "$SYSFS" ]; then
> +		echo $msg sysfs is not mounted >&2
> +		exit 2
> +	fi
> +	GPIO_SYSFS=`echo $SYSFS/class/gpio`
> +	GPIO_DRV_SYSFS=`echo $SYSFS/devices/platform/$module/gpio`
> +	DEBUGFS=`mount -t debugfs | head -1 | awk '{ print $3 }'`
> +	if [ ! -d "$DEBUGFS" ]; then
> +		echo $msg debugfs is not mounted >&2
> +		exit 2
> +	fi
> +	GPIO_DEBUGFS=`echo $DEBUGFS/gpio`
> +	source gpio-mockup-sysfs.sh
> +}
> +
> +try_insert_module()
> +{
> +	if [ -d "$GPIO_DRV_SYSFS" ]; then
> +		echo "$GPIO_DRV_SYSFS exist. Skip insert module"
> +	else
> +		modprobe -q $module $1
> +		if [ X$? != X0 ]; then
> +			echo $msg insmod $module failed >&2
> +			exit 3
> +		fi
> +	fi
> +}
> +
> +remove_module()
> +{
> +	modprobe -r -q $module
> +}
> +
> +die()
> +{
> +	remove_module
> +	exit 4
> +}
> +
> +test_chips()
> +{
> +	if [ X$dev_type = Xsysfs ]; then
> +		echo "WARNING: sysfs ABI of gpio is going to deprecated."
> +		test_chips_sysfs $*
> +	else
> +		$BASE/gpio-mockup-chardev $*
> +	fi
> +}
> +
> +gpio_test()
> +{
> +	param=$1
> +	valid=$2
> +
> +	if [ X"$param" = X ]; then
> +		die
> +	fi
> +	try_insert_module "gpio_mockup_ranges=$param"
> +	echo -n "GPIO $module test with ranges: <"
> +	echo "$param>: "
> +	printf "%-10s %s\n" $param
> +	test_chips $module $valid
> +	remove_module
> +}
> +
> +BASE=`dirname $0`
> +
> +dev_type=
> +TEMP=`getopt -o fhm:t: -n '$0' -- "$@"`
> +
> +if [ "$?" != "0" ]; then
> +        echo "Parameter process failed, Terminating..." >&2
> +        exit 1
> +fi
> +
> +# Note the quotes around `$TEMP': they are essential!
> +eval set -- "$TEMP"
> +
> +while true; do
> +	case $1 in
> +	-f)
> +		full_test=true
> +		shift
> +		;;
> +	-h)
> +		usage
> +		exit
> +		;;
> +	-m)
> +		module=$2
> +		shift 2
> +		;;
> +	-t)
> +		dev_type=$2
> +		shift 2
> +		;;
> +	--)
> +		shift
> +		break
> +		;;
> +	*)
> +		echo "Internal error!"
> +		exit 1
> +		;;
> +	esac
> +done
> +
> +if [ X"$module" = X ]; then
> +	module="gpio-mockup"
> +fi
> +
> +if [ X$dev_type != Xsysfs ]; then
> +	dev_type="chardev"
> +fi
> +
> +prerequisite
> +
> +echo "1.  Test dynamic allocation of gpio successful means insert gpiochip and"
> +echo "    manipulate gpio pin successful"
> +gpio_test "-1,32" true
> +gpio_test "-1,32,-1,32" true
> +gpio_test "-1,32,-1,32,-1,32" true
> +if [ X$full_test = Xtrue ]; then
> +	gpio_test "-1,32,32,64" true
> +	gpio_test "-1,32,40,64,-1,5" true
> +	gpio_test "-1,32,32,64,-1,32" true
> +	gpio_test "0,32,32,64,-1,32,-1,32" true
> +	gpio_test "-1,32,-1,32,0,32,32,64" true
> +	echo "2.  Do basic test: successful means insert gpiochip and"
> +	echo "    manipulate gpio pin successful"
> +	gpio_test "0,32" true
> +	gpio_test "0,32,32,64" true
> +	gpio_test "0,32,40,64,64,96" true
> +fi
> +echo "3.  Error test: successful means insert gpiochip failed"
> +echo "3.1 Test number of gpio overflow"
> +#Currently: The max number of gpio(1024) is defined in arm architecture.
> +gpio_test "-1,32,-1,1024" false
> +if [ X$full_test = Xtrue ]; then
> +	echo "3.2 Test zero line of gpio"
> +	gpio_test "0,0" false
> +	echo "3.3 Test range overlap"
> +	echo "3.3.1 Test corner case"
> +	gpio_test "0,32,0,1" false
> +	gpio_test "0,32,32,64,32,40" false
> +	gpio_test "0,32,35,64,35,45" false
> +	gpio_test "0,32,31,32" false
> +	gpio_test "0,32,32,64,36,37" false
> +	gpio_test "0,32,35,64,34,36" false
> +	echo "3.3.2 Test inserting invalid second gpiochip"
> +	gpio_test "0,32,30,35" false
> +	gpio_test "0,32,1,5" false
> +	gpio_test "10,32,9,14" false
> +	gpio_test "10,32,30,35" false
> +	echo "3.3.3 Test others"
> +	gpio_test "0,32,40,56,39,45" false
> +	gpio_test "0,32,40,56,30,33" false
> +	gpio_test "0,32,40,56,30,41" false
> +	gpio_test "0,32,40,56,20,21" false
> +fi
> +
> +echo GPIO test PASS
> +
>


  reply	other threads:[~2016-12-13 12:55 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-10-14  2:48 [PATCH v4 0/3] Add gpio test framework Bamvor Jian Zhang
2016-10-14  2:48 ` [PATCH v4 1/3] tools/gpio: add gpio basic opereations Bamvor Jian Zhang
2016-10-21 11:46   ` Linus Walleij
2016-10-14  2:48 ` [PATCH v4 2/3] tools/gpio: re-work gpio hammer with gpio operations Bamvor Jian Zhang
2016-10-21 11:47   ` Linus Walleij
2016-10-14  2:48 ` [PATCH v4 3/3] selftest/gpio: add gpio test case Bamvor Jian Zhang
2016-10-21 11:54   ` Linus Walleij
2016-10-21 14:43     ` Bamvor Zhang Jian
2016-11-16 23:42     ` Shuah Khan
2016-11-18 11:41       ` Zhangjian (Bamvor)
2016-11-21 10:16       ` [PATCH v5] " bamvor.zhangjian
2016-12-13 12:42         ` Zhangjian (Bamvor) [this message]
2016-12-13 14:33           ` Shuah Khan

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=8d50fbdd-f17b-fae2-14dd-80da9fac0a48@huawei.com \
    --to=bamvor.zhangjian@huawei.com \
    --cc=bamvor.zhangjian@linaro.org \
    --cc=broonie@kernel.org \
    --cc=linus.walleij@linaro.org \
    --cc=linux-gpio@vger.kernel.org \
    --cc=mwelling@ieee.org \
    --cc=shuah@kernel.org \
    --cc=shuahkh@osg.samsung.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).