Home | History | Annotate | Download | only in gpio
      1 #!/bin/bash
      2 # SPDX-License-Identifier: GPL-2.0
      3 
      4 #exit status
      5 #1: run as non-root user
      6 #2: sysfs/debugfs not mount
      7 #3: insert module fail when gpio-mockup is a module.
      8 #4: other reason.
      9 
     10 SYSFS=
     11 GPIO_SYSFS=
     12 GPIO_DRV_SYSFS=
     13 DEBUGFS=
     14 GPIO_DEBUGFS=
     15 dev_type=
     16 module=
     17 
     18 usage()
     19 {
     20 	echo "Usage:"
     21 	echo "$0 [-f] [-m name] [-t type]"
     22 	echo "-f:  full test. It maybe conflict with existence gpio device."
     23 	echo "-m:  module name, default name is gpio-mockup. It could also test"
     24 	echo "     other gpio device."
     25 	echo "-t:  interface type: chardev(char device) and sysfs(being"
     26 	echo "     deprecated). The first one is default"
     27 	echo ""
     28 	echo "$0 -h"
     29 	echo "This usage"
     30 }
     31 
     32 prerequisite()
     33 {
     34 	msg="skip all tests:"
     35 	if [ $UID != 0 ]; then
     36 		echo $msg must be run as root >&2
     37 		exit 1
     38 	fi
     39 	SYSFS=`mount -t sysfs | head -1 | awk '{ print $3 }'`
     40 	if [ ! -d "$SYSFS" ]; then
     41 		echo $msg sysfs is not mounted >&2
     42 		exit 2
     43 	fi
     44 	GPIO_SYSFS=`echo $SYSFS/class/gpio`
     45 	GPIO_DRV_SYSFS=`echo $SYSFS/devices/platform/$module/gpio`
     46 	DEBUGFS=`mount -t debugfs | head -1 | awk '{ print $3 }'`
     47 	if [ ! -d "$DEBUGFS" ]; then
     48 		echo $msg debugfs is not mounted >&2
     49 		exit 2
     50 	fi
     51 	GPIO_DEBUGFS=`echo $DEBUGFS/gpio`
     52 	source gpio-mockup-sysfs.sh
     53 }
     54 
     55 try_insert_module()
     56 {
     57 	if [ -d "$GPIO_DRV_SYSFS" ]; then
     58 		echo "$GPIO_DRV_SYSFS exist. Skip insert module"
     59 	else
     60 		modprobe -q $module $1
     61 		if [ X$? != X0 ]; then
     62 			echo $msg insmod $module failed >&2
     63 			exit 3
     64 		fi
     65 	fi
     66 }
     67 
     68 remove_module()
     69 {
     70 	modprobe -r -q $module
     71 }
     72 
     73 die()
     74 {
     75 	remove_module
     76 	exit 4
     77 }
     78 
     79 test_chips()
     80 {
     81 	if [ X$dev_type = Xsysfs ]; then
     82 		echo "WARNING: sysfs ABI of gpio is going to deprecated."
     83 		test_chips_sysfs $*
     84 	else
     85 		$BASE/gpio-mockup-chardev $*
     86 	fi
     87 }
     88 
     89 gpio_test()
     90 {
     91 	param=$1
     92 	valid=$2
     93 
     94 	if [ X"$param" = X ]; then
     95 		die
     96 	fi
     97 	try_insert_module "gpio_mockup_ranges=$param"
     98 	echo -n "GPIO $module test with ranges: <"
     99 	echo "$param>: "
    100 	printf "%-10s %s\n" $param
    101 	test_chips $module $valid
    102 	remove_module
    103 }
    104 
    105 BASE=`dirname $0`
    106 
    107 dev_type=
    108 TEMP=`getopt -o fhm:t: -n '$0' -- "$@"`
    109 
    110 if [ "$?" != "0" ]; then
    111         echo "Parameter process failed, Terminating..." >&2
    112         exit 1
    113 fi
    114 
    115 # Note the quotes around `$TEMP': they are essential!
    116 eval set -- "$TEMP"
    117 
    118 while true; do
    119 	case $1 in
    120 	-f)
    121 		full_test=true
    122 		shift
    123 		;;
    124 	-h)
    125 		usage
    126 		exit
    127 		;;
    128 	-m)
    129 		module=$2
    130 		shift 2
    131 		;;
    132 	-t)
    133 		dev_type=$2
    134 		shift 2
    135 		;;
    136 	--)
    137 		shift
    138 		break
    139 		;;
    140 	*)
    141 		echo "Internal error!"
    142 		exit 1
    143 		;;
    144 	esac
    145 done
    146 
    147 if [ X"$module" = X ]; then
    148 	module="gpio-mockup"
    149 fi
    150 
    151 if [ X$dev_type != Xsysfs ]; then
    152 	dev_type="chardev"
    153 fi
    154 
    155 prerequisite
    156 
    157 echo "1.  Test dynamic allocation of gpio successful means insert gpiochip and"
    158 echo "    manipulate gpio pin successful"
    159 gpio_test "-1,32" true
    160 gpio_test "-1,32,-1,32" true
    161 gpio_test "-1,32,-1,32,-1,32" true
    162 if [ X$full_test = Xtrue ]; then
    163 	gpio_test "-1,32,32,64" true
    164 	gpio_test "-1,32,40,64,-1,5" true
    165 	gpio_test "-1,32,32,64,-1,32" true
    166 	gpio_test "0,32,32,64,-1,32,-1,32" true
    167 	gpio_test "-1,32,-1,32,0,32,32,64" true
    168 	echo "2.  Do basic test: successful means insert gpiochip and"
    169 	echo "    manipulate gpio pin successful"
    170 	gpio_test "0,32" true
    171 	gpio_test "0,32,32,64" true
    172 	gpio_test "0,32,40,64,64,96" true
    173 fi
    174 echo "3.  Error test: successful means insert gpiochip failed"
    175 echo "3.1 Test number of gpio overflow"
    176 #Currently: The max number of gpio(1024) is defined in arm architecture.
    177 gpio_test "-1,32,-1,1024" false
    178 if [ X$full_test = Xtrue ]; then
    179 	echo "3.2 Test zero line of gpio"
    180 	gpio_test "0,0" false
    181 	echo "3.3 Test range overlap"
    182 	echo "3.3.1 Test corner case"
    183 	gpio_test "0,32,0,1" false
    184 	gpio_test "0,32,32,64,32,40" false
    185 	gpio_test "0,32,35,64,35,45" false
    186 	gpio_test "0,32,31,32" false
    187 	gpio_test "0,32,32,64,36,37" false
    188 	gpio_test "0,32,35,64,34,36" false
    189 	echo "3.3.2 Test inserting invalid second gpiochip"
    190 	gpio_test "0,32,30,35" false
    191 	gpio_test "0,32,1,5" false
    192 	gpio_test "10,32,9,14" false
    193 	gpio_test "10,32,30,35" false
    194 	echo "3.3.3 Test others"
    195 	gpio_test "0,32,40,56,39,45" false
    196 	gpio_test "0,32,40,56,30,33" false
    197 	gpio_test "0,32,40,56,30,41" false
    198 	gpio_test "0,32,40,56,20,21" false
    199 fi
    200 
    201 echo GPIO test PASS
    202 
    203