usage()
{ echo"Usage:" echo"$0 [-frv] [-t type]" echo"-f: full test (minimal set run by default)" echo"-r: test random lines as well as fence posts" echo"-t: interface type:" echo" cdev (character device ABI) - default" echo" cdev_v1 (deprecated character device ABI)" echo" sysfs (deprecated SYSFS ABI)" echo"-v: verbose progress reporting"
exit $ksft_fail
}
# The following line helpers, release_Line, get_line and set_line, all # make use of the global $chip and $offset variables. # # This implementation drives the GPIO character device (cdev) uAPI. # Other implementations may override these to test different uAPIs.
# Release any resources related to the line
release_line()
{
[ "$line_set_pid" ] && kill $line_set_pid && wait $line_set_pid || true
line_set_pid=
}
# Read the current value of the line
get_line()
{
release_line
local cdev_opts=${uapi_opt}${active_opt}
$BASE/gpio-mockup-cdev $cdev_opts /dev/$chip $offset echo $?
}
# Set the state of the line # # Changes to line configuration are provided as parameters. # The line is assumed to be an output if the line value 0 or 1 is # specified, else an input.
set_line()
{
local val=
release_line
# parse config options... for option in $*; do
case $option in
active-low)
active_opt="-l "
;;
active-high)
active_opt=
;;
bias-none)
bias_opt=
;;
pull-down)
bias_opt="-bpull-down "
;;
pull-up)
bias_opt="-bpull-up "
;;
0)
val=0
;;
1)
val=1
;;
esac done
local cdev_opts=${uapi_opt}${active_opt} if [ "$val" ]; then
$BASE/gpio-mockup-cdev $cdev_opts -s$val /dev/$chip $offset & # failure to set is detected by reading mockup and toggling values
line_set_pid=$! # allow for gpio-mockup-cdev to launch and request line # (there is limited value in checking if line has been requested)
sleep 0.01 elif [ "$bias_opt" ]; then
cdev_opts=${cdev_opts}${bias_opt}
$BASE/gpio-mockup-cdev $cdev_opts /dev/$chip $offset || true fi
}
assert_line()
{
local val # don't need any retry here as set_mock allows for propagation
val=$(get_line)
[ "$val" = "$1" ] || fail "line value is ${val:-empty} when $1 was expected"
}
# The following mockup helpers all make use of the $mock_line
assert_mock()
{
local backoff_wait=10
local retry=0
local val # retry allows for set propagation from uAPI to mockup while true; do
val=$(< $mock_line)
[ "$val" = "$1" ] && break
retry=$((retry + 1))
[ $retry -lt 5 ] || fail "mockup $mock_line value ${val:-empty} when $1 expected"
sleep $(printf "%0.2f" $((backoff_wait))e-3)
backoff_wait=$((backoff_wait * 2)) done
}
set_mock()
{ echo"$1" > $mock_line # allow for set propagation - so we won't be in a race with set_line
assert_mock "$1"
}
# test the functionality of a line # # The line is set from the mockup side and is read from the userspace side # (input), and is set from the userspace side and is read from the mockup side # (output). # # Setting the mockup pull using the userspace interface bias settings is # tested where supported by the userspace interface (cdev).
test_line()
{
chip=$1
offset=$2
log "test_line $chip $offset"
mock_line=$GPIO_DEBUGFS/$chip/$offset
[ -e "$mock_line" ] || fail "missing line $chip:$offset"
# Load the module and check that the expected number of gpiochips, with the # expected number of lines, are created and are functional. # # $1 is the gpio_mockup_ranges parameter for the module # The remaining parameters are the number of lines, n, expected for each of # the gpiochips expected to be created. # # For each gpiochip the fence post lines, 0 and n-1, are tested, and the # line on the far side of the fence post, n, is tested to not exist. # # If the $random flag is set then a random line in the middle of the # gpiochip is tested as well.
insmod_test()
{
local ranges=
local gc=
local width=
[ "${1:-}" ] || fail "missing ranges"
ranges=$1 ; shift
try_insert_module "gpio_mockup_ranges=$ranges"
log "GPIO $module test with ranges: <$ranges>:" # e.g. /sys/kernel/debug/gpio-mockup/gpiochip1
gpiochip=$(find "$DEBUGFS/$module/" -name gpiochip* -type d | sort) for chip in $gpiochip; do
gc=${chip##*/}
[ "${1:-}" ] || fail "unexpected chip - $gc"
width=$1 ; shift
test_line $gc 0 if [ "$random" -a $width -gt 2 ]; then
test_line $gc $((RANDOM % ($width - 2) + 1)) fi
test_line $gc $(($width - 1))
test_no_line $gc $width done
[ "${1:-}" ] && fail "missing expected chip of width $1"
remove_module || fail "failed to remove module with error $?"
}
while getopts ":frvt:" opt; do
case $opt in
f)
full_test=true
;;
r)
random=true
;;
t)
dev_type=$OPTARG
;;
v)
verbose=true
;;
*)
usage
;;
esac done
shift $((OPTIND - 1))
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.