123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206 |
- #!/bin/bash
- # SPDX-License-Identifier: GPL-2.0
- #exit status
- #1: Internal error
- #2: sysfs/debugfs not mount
- #3: insert module fail when gpio-mockup is a module.
- #4: Skip test including run as non-root user.
- #5: other reason.
- SYSFS=
- GPIO_SYSFS=
- GPIO_DRV_SYSFS=
- DEBUGFS=
- GPIO_DEBUGFS=
- dev_type=
- module=
- # Kselftest framework requirement - SKIP code is 4.
- ksft_skip=4
- 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 $ksft_skip
- 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 5
- }
- 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
|