xref: /illumos-gate/usr/src/test/os-tests/tests/gpio/gpioadm_test.ksh (revision fd71220ba0fafcc9cf5ea0785db206f3f31336e7)
1*fd71220bSRobert Mustacchi#!/usr/bin/ksh
2*fd71220bSRobert Mustacchi#
3*fd71220bSRobert Mustacchi#
4*fd71220bSRobert Mustacchi# This file and its contents are supplied under the terms of the
5*fd71220bSRobert Mustacchi# Common Development and Distribution License ("CDDL"), version 1.0.
6*fd71220bSRobert Mustacchi# You may only use this file in accordance with the terms of version
7*fd71220bSRobert Mustacchi# 1.0 of the CDDL.
8*fd71220bSRobert Mustacchi#
9*fd71220bSRobert Mustacchi# A full copy of the text of the CDDL should have accompanied this
10*fd71220bSRobert Mustacchi# source.  A copy of the CDDL is also available via the Internet at
11*fd71220bSRobert Mustacchi# http://www.illumos.org/license/CDDL.
12*fd71220bSRobert Mustacchi#
13*fd71220bSRobert Mustacchi
14*fd71220bSRobert Mustacchi#
15*fd71220bSRobert Mustacchi# Copyright 2022 Oxide Computer Company
16*fd71220bSRobert Mustacchi#
17*fd71220bSRobert Mustacchi
18*fd71220bSRobert Mustacchi#
19*fd71220bSRobert Mustacchi# Set up the environment with a standard locale and debugging tools to
20*fd71220bSRobert Mustacchi# help us catch failures.
21*fd71220bSRobert Mustacchi#
22*fd71220bSRobert Mustacchiexport LC_ALL=C.UTF-8
23*fd71220bSRobert Mustacchiexport LD_PRELOAD=libumem.so
24*fd71220bSRobert Mustacchiexport UMEM_DEBUG=default
25*fd71220bSRobert Mustacchiunalias -a
26*fd71220bSRobert Mustacchiset -o pipefail
27*fd71220bSRobert Mustacchi
28*fd71220bSRobert Mustacchigt_prog=/usr/sbin/gpioadm
29*fd71220bSRobert Mustacchigt_arg0=$(basename $0)
30*fd71220bSRobert Mustacchigt_data="$(dirname $0)/data"
31*fd71220bSRobert Mustacchigt_exit=0
32*fd71220bSRobert Mustacchigt_tmpfile="/tmp/gpioadm_test.$$"
33*fd71220bSRobert Mustacchigt_dpio0="gpioadmtestsim00"
34*fd71220bSRobert Mustacchigt_dpio1="gpioadmtestsim10"
35*fd71220bSRobert Mustacchigt_dpio2="gpioadmtestsim21"
36*fd71220bSRobert Mustacchi
37*fd71220bSRobert Mustacchiwarn()
38*fd71220bSRobert Mustacchi{
39*fd71220bSRobert Mustacchi        typeset msg="$*"
40*fd71220bSRobert Mustacchi        [[ -z "$msg" ]] && msg="failed"
41*fd71220bSRobert Mustacchi        echo "TEST FAILED: $msg" >&2
42*fd71220bSRobert Mustacchi	gt_exit=1
43*fd71220bSRobert Mustacchi}
44*fd71220bSRobert Mustacchi
45*fd71220bSRobert Mustacchifatal()
46*fd71220bSRobert Mustacchi{
47*fd71220bSRobert Mustacchi        typeset msg="$*"
48*fd71220bSRobert Mustacchi        [[ -z "$msg" ]] && msg="failed"
49*fd71220bSRobert Mustacchi        echo "$sc_arg0: $msg" >&2
50*fd71220bSRobert Mustacchi        exit 1
51*fd71220bSRobert Mustacchi}
52*fd71220bSRobert Mustacchi
53*fd71220bSRobert Mustacchicleanup()
54*fd71220bSRobert Mustacchi{
55*fd71220bSRobert Mustacchi	rm -f "$gt_tmpfile"
56*fd71220bSRobert Mustacchi}
57*fd71220bSRobert Mustacchi
58*fd71220bSRobert Mustacchi#
59*fd71220bSRobert Mustacchi# This is an invocation of gpioadm that we want to verify runs
60*fd71220bSRobert Mustacchi# successfully. We do not care about it's output, only that it exits 0.
61*fd71220bSRobert Mustacchi#
62*fd71220bSRobert Mustacchiexpect_success()
63*fd71220bSRobert Mustacchi{
64*fd71220bSRobert Mustacchi	if ! $gt_prog $@ >/dev/null; then
65*fd71220bSRobert Mustacchi		warn "failed to run $@"
66*fd71220bSRobert Mustacchi	fi
67*fd71220bSRobert Mustacchi}
68*fd71220bSRobert Mustacchi
69*fd71220bSRobert Mustacchi#
70*fd71220bSRobert Mustacchi# This is an invocation of gpioadm that we want to verify exits
71*fd71220bSRobert Mustacchi# non-zero. We do not care if it is a failure or due to usage.
72*fd71220bSRobert Mustacchi#
73*fd71220bSRobert Mustacchigpioadm_err()
74*fd71220bSRobert Mustacchi{
75*fd71220bSRobert Mustacchi	typeset reason="$1"
76*fd71220bSRobert Mustacchi	shift
77*fd71220bSRobert Mustacchi
78*fd71220bSRobert Mustacchi	if $gt_prog $@ 2>/dev/null 1>/dev/null; then
79*fd71220bSRobert Mustacchi		warn "should have failed with args "$@", but passed"
80*fd71220bSRobert Mustacchi		return
81*fd71220bSRobert Mustacchi	fi
82*fd71220bSRobert Mustacchi
83*fd71220bSRobert Mustacchi	printf "TEST PASSED: $reason: %s\n" "$*"
84*fd71220bSRobert Mustacchi}
85*fd71220bSRobert Mustacchi
86*fd71220bSRobert Mustacchi#
87*fd71220bSRobert Mustacchi# This is a case where we expect gpioadm to exit sucessfully, but we
88*fd71220bSRobert Mustacchi# want to check its exit data against a known value.
89*fd71220bSRobert Mustacchi#
90*fd71220bSRobert Mustacchicheck_output()
91*fd71220bSRobert Mustacchi{
92*fd71220bSRobert Mustacchi	typeset outfile="$gt_data/$1"
93*fd71220bSRobert Mustacchi	shift
94*fd71220bSRobert Mustacchi
95*fd71220bSRobert Mustacchi	if ! $gt_prog $@ > $gt_tmpfile 2>&1; then
96*fd71220bSRobert Mustacchi		warn "$@: exited non-zero"
97*fd71220bSRobert Mustacchi	fi
98*fd71220bSRobert Mustacchi
99*fd71220bSRobert Mustacchi	if ! diff $outfile $gt_tmpfile; then
100*fd71220bSRobert Mustacchi		warn "$@: output mismatched"
101*fd71220bSRobert Mustacchi	else
102*fd71220bSRobert Mustacchi		printf "TEST PASSED: %s\n" "$*"
103*fd71220bSRobert Mustacchi	fi
104*fd71220bSRobert Mustacchi}
105*fd71220bSRobert Mustacchi
106*fd71220bSRobert Mustacchicheck_dpio_link()
107*fd71220bSRobert Mustacchi{
108*fd71220bSRobert Mustacchi	typeset dpio="$1"
109*fd71220bSRobert Mustacchi
110*fd71220bSRobert Mustacchi	if [[ ! -L "/dev/dpio/$dpio" ]]; then
111*fd71220bSRobert Mustacchi		warn "missing /dev link for $dpio"
112*fd71220bSRobert Mustacchi	else
113*fd71220bSRobert Mustacchi		printf "TEST PASSED /dev link for %s present\n" "$dpio"
114*fd71220bSRobert Mustacchi	fi
115*fd71220bSRobert Mustacchi}
116*fd71220bSRobert Mustacchi
117*fd71220bSRobert Mustacchi#
118*fd71220bSRobert Mustacchi# This gets a specific GPIO's attribute value and confirm it's what we
119*fd71220bSRobert Mustacchi# expect.
120*fd71220bSRobert Mustacchi#
121*fd71220bSRobert Mustacchicheck_attr_field()
122*fd71220bSRobert Mustacchi{
123*fd71220bSRobert Mustacchi	typeset gpio="$1"
124*fd71220bSRobert Mustacchi	typeset attr="$2"
125*fd71220bSRobert Mustacchi	typeset exp="$3"
126*fd71220bSRobert Mustacchi	typeset field="$4"
127*fd71220bSRobert Mustacchi	typeset out=
128*fd71220bSRobert Mustacchi
129*fd71220bSRobert Mustacchi	out=$($gt_prog gpio attr get -p -o $field $gpio $attr)
130*fd71220bSRobert Mustacchi	if (( $? != 0 )); then
131*fd71220bSRobert Mustacchi		warn "failed to gpio attr get $gpio $attr"
132*fd71220bSRobert Mustacchi		return
133*fd71220bSRobert Mustacchi	fi
134*fd71220bSRobert Mustacchi
135*fd71220bSRobert Mustacchi	if [[ "$out" != "$exp" ]]; then
136*fd71220bSRobert Mustacchi		warn "$gpio $attr has $field $out, expected $exp"
137*fd71220bSRobert Mustacchi	else
138*fd71220bSRobert Mustacchi		printf "TEST PASSED: %s %s has expected %s %s\n" "$gpio" \
139*fd71220bSRobert Mustacchi		    "$attr" "$field" "$exp"
140*fd71220bSRobert Mustacchi	fi
141*fd71220bSRobert Mustacchi}
142*fd71220bSRobert Mustacchi
143*fd71220bSRobert Mustacchicheck_attr_val()
144*fd71220bSRobert Mustacchi{
145*fd71220bSRobert Mustacchi	check_attr_field $1 $2 $3 "value"
146*fd71220bSRobert Mustacchi}
147*fd71220bSRobert Mustacchi
148*fd71220bSRobert Mustacchiif [[ -n $GPIOADM ]]; then
149*fd71220bSRobert Mustacchi	gt_prog=$GPIOADM
150*fd71220bSRobert Mustacchifi
151*fd71220bSRobert Mustacchi
152*fd71220bSRobert Mustacchitrap 'cleanup' EXIT
153*fd71220bSRobert Mustacchi
154*fd71220bSRobert Mustacchi#
155*fd71220bSRobert Mustacchi# These are a series of programs we expect to fail due to invalid
156*fd71220bSRobert Mustacchi# arguments and other variants that don't require state to be built up.
157*fd71220bSRobert Mustacchi# These are all basically bad flags, commands, or filters that don't
158*fd71220bSRobert Mustacchi# match. Other tests in the gpio test suite will go and verify the more
159*fd71220bSRobert Mustacchi# fine grained errors against libxpio directly.
160*fd71220bSRobert Mustacchi#
161*fd71220bSRobert Mustacchigpioadm_err "bad command" foo
162*fd71220bSRobert Mustacchigpioadm_err "bad command" foo bar
163*fd71220bSRobert Mustacchigpioadm_err "incomplete command" controller
164*fd71220bSRobert Mustacchigpioadm_err "bad command" controller nope
165*fd71220bSRobert Mustacchigpioadm_err "bad command" controller wry
166*fd71220bSRobert Mustacchigpioadm_err "bad flags" controller list -b
167*fd71220bSRobert Mustacchigpioadm_err "parse without fields" controller list -p
168*fd71220bSRobert Mustacchigpioadm_err "bad field" controller list -p -o itsatrap
169*fd71220bSRobert Mustacchigpioadm_err "bad field" controller list -o itsatrap
170*fd71220bSRobert Mustacchigpioadm_err "bad field" controller list -p -o controller,itsatrap
171*fd71220bSRobert Mustacchigpioadm_err "unmatched filter" controller list this/doesnt/exist
172*fd71220bSRobert Mustacchigpioadm_err "incomplete command" gpio
173*fd71220bSRobert Mustacchigpioadm_err "bad command" gpio celes
174*fd71220bSRobert Mustacchigpioadm_err "bad command" gpio celes terra
175*fd71220bSRobert Mustacchigpioadm_err "bad flags" gpio list -r
176*fd71220bSRobert Mustacchigpioadm_err "bad flags" gpio list -7
177*fd71220bSRobert Mustacchigpioadm_err "parse without fields" gpio list -p
178*fd71220bSRobert Mustacchigpioadm_err "bad field" gpio list -p -o 12345
179*fd71220bSRobert Mustacchigpioadm_err "bad field" gpio list -o 12345
180*fd71220bSRobert Mustacchigpioadm_err "bad field" gpio list -p -o name,12345
181*fd71220bSRobert Mustacchigpioadm_err "unmatched filter" gpio list life/hopes/dreams
182*fd71220bSRobert Mustacchigpioadm_err "unmatched filter" gpio list where do they come from
183*fd71220bSRobert Mustacchigpioadm_err "match more than one with -1" gpio list -1
184*fd71220bSRobert Mustacchigpioadm_err "match more than one with -1" gpio list -1 gpio_sim0
185*fd71220bSRobert Mustacchigpioadm_err "match more than one with -1" gpio list -1 gpio_sim0 gpio_sim1
186*fd71220bSRobert Mustacchigpioadm_err "match more than one with -1" gpio list -1 */open-drain
187*fd71220bSRobert Mustacchigpioadm_err "match more than one with -1" gpio list -1 \
188*fd71220bSRobert Mustacchi    gpio_sim0/periodic-500ms gpio_sim1/1v8
189*fd71220bSRobert Mustacchigpioadm_err "incomplete command" gpio attr
190*fd71220bSRobert Mustacchigpioadm_err "bad command" gpio attr where are they going
191*fd71220bSRobert Mustacchigpioadm_err "missing controller/gpio" gpio attr get
192*fd71220bSRobert Mustacchigpioadm_err "bad controller/gpio" gpio attr get null
193*fd71220bSRobert Mustacchigpioadm_err "bad controller/gpio" gpio attr get gpio_sim/3
194*fd71220bSRobert Mustacchigpioadm_err "bad controller/gpio" gpio attr get gpio_sim0/kefka
195*fd71220bSRobert Mustacchigpioadm_err "parse without fields" gpio attr get gpio_sim0/3 -p
196*fd71220bSRobert Mustacchigpioadm_err "bad flags" gpio attr get -p gpio_sim0/3
197*fd71220bSRobert Mustacchigpioadm_err "bad flags" gpio attr get -x gpio_sim0/3
198*fd71220bSRobert Mustacchigpioadm_err "bad fields" gpio attr get -p -o frodo gpio_sim1/2
199*fd71220bSRobert Mustacchigpioadm_err "bad fields" gpio attr get -o sam gpio_sim1/2
200*fd71220bSRobert Mustacchigpioadm_err "bad fields" gpio attr get -p -o sim:input,frodo gpio_sim1/2
201*fd71220bSRobert Mustacchigpioadm_err "bad filter" gpio attr get gpio_sim0/3 dusk
202*fd71220bSRobert Mustacchigpioadm_err "bad filter" gpio attr get gpio_sim0/3 sim:pull muysterious
203*fd71220bSRobert Mustacchigpioadm_err "missing controller/gpio" gpio attr set
204*fd71220bSRobert Mustacchigpioadm_err "bad controller/gpio" gpio attr set gandalf
205*fd71220bSRobert Mustacchigpioadm_err "bad controller/gpio" gpio attr set gpio_sim/1
206*fd71220bSRobert Mustacchigpioadm_err "bad controller/gpio" gpio attr set gpio_sim0/gimli
207*fd71220bSRobert Mustacchigpioadm_err "missing attributes" gpio attr set gpio_sim0/1
208*fd71220bSRobert Mustacchigpioadm_err "bad flags" gpio attr set -x gpio_sim0/4 sim:output=low
209*fd71220bSRobert Mustacchigpioadm_err "bad attribute string" gpio attr set gpio_sim0/1 foo
210*fd71220bSRobert Mustacchigpioadm_err "bad attribute string" gpio attr set gpio_sim0/1 foo=
211*fd71220bSRobert Mustacchigpioadm_err "bad attribute value" gpio attr set gpio_sim0/1 sim:speed=random
212*fd71220bSRobert Mustacchigpioadm_err "bad attribute value" gpio attr set gpio_sim0/1 sim:input=0x42
213*fd71220bSRobert Mustacchigpioadm_err "incomplete command" dpio
214*fd71220bSRobert Mustacchigpioadm_err "bad command" dpio alchemy
215*fd71220bSRobert Mustacchigpioadm_err "bad flags" dpio list -m
216*fd71220bSRobert Mustacchigpioadm_err "parse without fields" dpio list -p
217*fd71220bSRobert Mustacchigpioadm_err "bad field" dpio list -p -o sabin
218*fd71220bSRobert Mustacchigpioadm_err "bad field" dpio list -o edgar
219*fd71220bSRobert Mustacchigpioadm_err "bad field" dpio list -p -o edgar,sabin,controller
220*fd71220bSRobert Mustacchigpioadm_err "unmatched filter" dpio list locke/esper
221*fd71220bSRobert Mustacchigpioadm_err "missing operands" dpio define
222*fd71220bSRobert Mustacchigpioadm_err "missing dpio" dpio define cloud
223*fd71220bSRobert Mustacchigpioadm_err "missing dpio" dpio define tifa/
224*fd71220bSRobert Mustacchigpioadm_err "missing dpio" dpio define sepiroth/7
225*fd71220bSRobert Mustacchigpioadm_err "bad controller" dpio define cloud buster
226*fd71220bSRobert Mustacchigpioadm_err "bad controller" dpio define tifa/ 7th
227*fd71220bSRobert Mustacchigpioadm_err "bad controller" dpio define sepiroth/7 reunion
228*fd71220bSRobert Mustacchigpioadm_err "bad controller" dpio define rufus/8 hq
229*fd71220bSRobert Mustacchigpioadm_err "bad flags" dpio define -7 rufus/8 hq
230*fd71220bSRobert Mustacchigpioadm_err "missing controller/gpio" dpio undefine
231*fd71220bSRobert Mustacchigpioadm_err "bad controller/gpio" dpio undefine red13/
232*fd71220bSRobert Mustacchigpioadm_err "bad controller/gpio" dpio undefine cid/2
233*fd71220bSRobert Mustacchigpioadm_err "bad dpio name" dpio define gpio_sim/1 '-trap'
234*fd71220bSRobert Mustacchigpioadm_err "bad dpio name" dpio define gpio_sim/1 '+foobar'
235*fd71220bSRobert Mustacchigpioadm_err "bad dpio name" dpio define gpio_sim/1 '$nope'
236*fd71220bSRobert Mustacchigpioadm_err "bad dpio name" dpio define gpio_sim/1 '~sorry'
237*fd71220bSRobert Mustacchigpioadm_err "bad dpio name" dpio define gpio_sim/1 \
238*fd71220bSRobert Mustacchi    'thisisanamethatisactuallytoolongibelieve'
239*fd71220bSRobert Mustacchigpioadm_err "bad dpio name" dpio define gpio_sim/1 'unsup()12#d'
240*fd71220bSRobert Mustacchi
241*fd71220bSRobert Mustacchi#
242*fd71220bSRobert Mustacchi# For the next set of tests we verify expected output from the various
243*fd71220bSRobert Mustacchi# listing operations with the goal of verifying that field selection,
244*fd71220bSRobert Mustacchi# parseability, omitting the header, and filtering is all working. Note,
245*fd71220bSRobert Mustacchi# we explicitly never use an unfiltered top-level list operation as we
246*fd71220bSRobert Mustacchi# have to assume that there will be something else on the system other
247*fd71220bSRobert Mustacchi# than the gpio_sim controllers that we create.
248*fd71220bSRobert Mustacchi#
249*fd71220bSRobert Mustacchicheck_output "ctrl-list.out" controller list -o \
250*fd71220bSRobert Mustacchi    controller,ngpios,ndpios,provider,path gpio_sim0 gpio_sim1 gpio_sim2
251*fd71220bSRobert Mustacchicheck_output "ctrl-list-H.out" controller list -H -o \
252*fd71220bSRobert Mustacchi    controller,ngpios,ndpios,provider,path gpio_sim0 gpio_sim1 gpio_sim2
253*fd71220bSRobert Mustacchicheck_output "ctrl-list-p.out" controller list -p -o \
254*fd71220bSRobert Mustacchi    controller,ngpios,ndpios,provider,path gpio_sim0 gpio_sim1 gpio_sim2
255*fd71220bSRobert Mustacchicheck_output "ctrl-list-sim1.out" controller list -o \
256*fd71220bSRobert Mustacchi    controller,ngpios,provider gpio_sim1
257*fd71220bSRobert Mustacchicheck_output "ctrl-list-H-sim1.out" controller list -H -o \
258*fd71220bSRobert Mustacchi    controller,ngpios,provider gpio_sim1
259*fd71220bSRobert Mustacchicheck_output "ctrl-list-p-sim1.out" controller list -p -o \
260*fd71220bSRobert Mustacchi    controller,ngpios,provider gpio_sim1
261*fd71220bSRobert Mustacchicheck_output "gpio-period500.out" gpio list */periodic-500ms
262*fd71220bSRobert Mustacchicheck_output "gpio-period500-H.out" gpio list -H */periodic-500ms
263*fd71220bSRobert Mustacchicheck_output "gpio-period500-o.out" gpio list -o controller */periodic-500ms
264*fd71220bSRobert Mustacchicheck_output "gpio-period500-p.out" gpio list -p -o controller */periodic-500ms
265*fd71220bSRobert Mustacchicheck_output "gpio-sim0.out" gpio list gpio_sim0
266*fd71220bSRobert Mustacchicheck_output "gpio-sim0-H.out" gpio list -H gpio_sim0
267*fd71220bSRobert Mustacchicheck_output "gpio-sim0-o.out" gpio list -o controller gpio_sim0
268*fd71220bSRobert Mustacchicheck_output "gpio-sim0-p.out" gpio list -p -o controller gpio_sim0
269*fd71220bSRobert Mustacchicheck_output "gpio-sim01.out" gpio list gpio_sim0 gpio_sim1
270*fd71220bSRobert Mustacchicheck_output "gpio-sim01-H.out" gpio list -H gpio_sim0 gpio_sim1
271*fd71220bSRobert Mustacchicheck_output "gpio-sim01-o.out" gpio list -o controller gpio_sim0 gpio_sim1
272*fd71220bSRobert Mustacchicheck_output "gpio-sim01-p.out" gpio list -p -o controller gpio_sim0 gpio_sim1
273*fd71220bSRobert Mustacchicheck_output "attr-g0_0.out" gpio attr get gpio_sim0/0
274*fd71220bSRobert Mustacchicheck_output "attr-g0_0-H.out" gpio attr get -H gpio_sim0/0
275*fd71220bSRobert Mustacchicheck_output "attr-g0_0-o.out" gpio attr get -o attr,value,raw,possible \
276*fd71220bSRobert Mustacchi    gpio_sim0/0
277*fd71220bSRobert Mustacchicheck_output "attr-g0_0-Ho.out" gpio attr get -H -o attr,value,raw,possible \
278*fd71220bSRobert Mustacchi    gpio_sim0/0
279*fd71220bSRobert Mustacchicheck_output "attr-g0_0-p.out" gpio attr get -p -o attr,value,raw,possible \
280*fd71220bSRobert Mustacchi    gpio_sim0/0
281*fd71220bSRobert Mustacchicheck_output "attr-g0_0_filt.out" gpio attr get -o attr,value gpio_sim0/0 \
282*fd71220bSRobert Mustacchi    name sim:pull sim:voltage
283*fd71220bSRobert Mustacchicheck_output "attr-g0_0_filt-p.out" gpio attr get -p -o attr,value gpio_sim0/0 \
284*fd71220bSRobert Mustacchi    name sim:pull sim:voltage
285*fd71220bSRobert Mustacchi#
286*fd71220bSRobert Mustacchi# Repeat the above with the actual GPIO name
287*fd71220bSRobert Mustacchi#
288*fd71220bSRobert Mustacchicheck_output "attr-g0_0.out" gpio attr get gpio_sim0/1v8
289*fd71220bSRobert Mustacchicheck_output "attr-g0_0-H.out" gpio attr get -H gpio_sim0/1v8
290*fd71220bSRobert Mustacchicheck_output "attr-g0_0-o.out" gpio attr get -o attr,value,raw,possible \
291*fd71220bSRobert Mustacchi    gpio_sim0/1v8
292*fd71220bSRobert Mustacchicheck_output "attr-g0_0-Ho.out" gpio attr get -H -o attr,value,raw,possible \
293*fd71220bSRobert Mustacchi    gpio_sim0/1v8
294*fd71220bSRobert Mustacchicheck_output "attr-g0_0-p.out" gpio attr get -p -o attr,value,raw,possible \
295*fd71220bSRobert Mustacchi    gpio_sim0/1v8
296*fd71220bSRobert Mustacchicheck_output "attr-g0_0_filt.out" gpio attr get -o attr,value gpio_sim0/1v8 \
297*fd71220bSRobert Mustacchi    name sim:pull sim:voltage
298*fd71220bSRobert Mustacchicheck_output "attr-g0_0_filt-p.out" gpio attr get -p -o attr,value \
299*fd71220bSRobert Mustacchi    gpio_sim0/1v8 name sim:pull sim:voltage
300*fd71220bSRobert Mustacchi
301*fd71220bSRobert Mustacchi#
302*fd71220bSRobert Mustacchi# To test DPIOs listing we need to actually go through and create a few
303*fd71220bSRobert Mustacchi# DPIOs. However, we also need to make sure that we leave the test with
304*fd71220bSRobert Mustacchi# these destroyed so we don't interfere with any other tests.
305*fd71220bSRobert Mustacchi#
306*fd71220bSRobert Mustacchiexpect_success dpio define gpio_sim0/0 "$gt_dpio0"
307*fd71220bSRobert Mustacchiexpect_success dpio define -r -w gpio_sim1/0 "$gt_dpio1"
308*fd71220bSRobert Mustacchiexpect_success dpio define -r -K gpio_sim2/3v3 "$gt_dpio2"
309*fd71220bSRobert Mustacchi
310*fd71220bSRobert Mustacchicheck_output "ctrl-list-dpio-p.out" controller list -p -o controller,ndpios \
311*fd71220bSRobert Mustacchi    gpio_sim0 gpio_sim1 gpio_sim2
312*fd71220bSRobert Mustacchi
313*fd71220bSRobert Mustacchicheck_output "dpio.out" dpio list "$gt_dpio0" "$gt_dpio1" "$gt_dpio2"
314*fd71220bSRobert Mustacchicheck_output "dpio-H.out" dpio list -H "$gt_dpio0" "$gt_dpio1" "$gt_dpio2"
315*fd71220bSRobert Mustacchicheck_output "dpio-o.out" dpio list -o dpio,caps,flags,controller,gpionum \
316*fd71220bSRobert Mustacchi    "$gt_dpio0" "$gt_dpio1" "$gt_dpio2"
317*fd71220bSRobert Mustacchicheck_output "dpio-Ho.out" dpio list -H -o dpio,caps,flags,controller,gpionum \
318*fd71220bSRobert Mustacchi    "$gt_dpio0" "$gt_dpio1" "$gt_dpio2"
319*fd71220bSRobert Mustacchicheck_output "dpio-p.out" dpio list -p -o dpio,caps,flags,controller,gpionum \
320*fd71220bSRobert Mustacchi    "$gt_dpio0" "$gt_dpio1" "$gt_dpio2"
321*fd71220bSRobert Mustacchi
322*fd71220bSRobert Mustacchi#
323*fd71220bSRobert Mustacchi# Make sure the symlinks are installed correctly
324*fd71220bSRobert Mustacchi#
325*fd71220bSRobert Mustacchicheck_dpio_link "$gt_dpio0"
326*fd71220bSRobert Mustacchicheck_dpio_link "$gt_dpio1"
327*fd71220bSRobert Mustacchicheck_dpio_link "$gt_dpio2"
328*fd71220bSRobert Mustacchi
329*fd71220bSRobert Mustacchiexpect_success dpio undefine gpio_sim0/0
330*fd71220bSRobert Mustacchiexpect_success dpio undefine gpio_sim1/0
331*fd71220bSRobert Mustacchiexpect_success dpio undefine gpio_sim2/3v3
332*fd71220bSRobert Mustacchi
333*fd71220bSRobert Mustacchi#
334*fd71220bSRobert Mustacchi# Different gpio_sim gpios have different possible values and different
335*fd71220bSRobert Mustacchi# defaults. Make sure that we actually see different possible values for
336*fd71220bSRobert Mustacchi# the same attribute on different gpios and that it's not all the same.
337*fd71220bSRobert Mustacchi# Mix up the use of IDs and names.
338*fd71220bSRobert Mustacchi#
339*fd71220bSRobert Mustacchicheck_attr_val gpio_sim1/1 name 3v3
340*fd71220bSRobert Mustacchicheck_attr_val gpio_sim1/5 name open-drain
341*fd71220bSRobert Mustacchicheck_attr_field gpio_sim1/3v3 sim:voltage 3.3V possible
342*fd71220bSRobert Mustacchicheck_attr_field gpio_sim1/2 sim:voltage 12.0V possible
343*fd71220bSRobert Mustacchicheck_attr_field gpio_sim1/open-drain sim:voltage 1.8V possible
344*fd71220bSRobert Mustacchicheck_attr_field gpio_sim1/3 sim:pull disabled,23k-down,5k-up,40k-up possible
345*fd71220bSRobert Mustacchicheck_attr_field gpio_sim1/0 sim:output disabled,low,high possible
346*fd71220bSRobert Mustacchicheck_attr_field gpio_sim1/5 sim:output disabled,low possible
347*fd71220bSRobert Mustacchicheck_attr_field gpio_sim1/5 sim:pull "disabled,down,up,up|down" possible
348*fd71220bSRobert Mustacchi
349*fd71220bSRobert Mustacchi#
350*fd71220bSRobert Mustacchi# Change around a few gpio sim attributes to make sure basic attribute
351*fd71220bSRobert Mustacchi# maniuplation works and then change them back.
352*fd71220bSRobert Mustacchi#
353*fd71220bSRobert Mustacchicheck_attr_val gpio_sim0/3 sim:output low
354*fd71220bSRobert Mustacchicheck_attr_val gpio_sim0/3 sim:pull 23k-down
355*fd71220bSRobert Mustacchicheck_attr_val gpio_sim0/3 sim:input low
356*fd71220bSRobert Mustacchiexpect_success gpio attr set gpio_sim0/3 sim:output=disabled sim:pull=40k-up
357*fd71220bSRobert Mustacchicheck_attr_val gpio_sim0/3 sim:output disabled
358*fd71220bSRobert Mustacchicheck_attr_val gpio_sim0/3 sim:pull 40k-up
359*fd71220bSRobert Mustacchicheck_attr_val gpio_sim0/3 sim:input high
360*fd71220bSRobert Mustacchiexpect_success gpio attr set gpio_sim0/3 sim:output=low sim:pull=23k-down
361*fd71220bSRobert Mustacchicheck_attr_val gpio_sim0/3 sim:output low
362*fd71220bSRobert Mustacchicheck_attr_val gpio_sim0/3 sim:pull 23k-down
363*fd71220bSRobert Mustacchicheck_attr_val gpio_sim0/3 sim:input low
364*fd71220bSRobert Mustacchi
365*fd71220bSRobert Mustacchi#
366*fd71220bSRobert Mustacchi# Repeat with the name instead of the ID.
367*fd71220bSRobert Mustacchi#
368*fd71220bSRobert Mustacchicheck_attr_val gpio_sim0/54V sim:output low
369*fd71220bSRobert Mustacchicheck_attr_val gpio_sim0/54V sim:pull 23k-down
370*fd71220bSRobert Mustacchicheck_attr_val gpio_sim0/54V sim:input low
371*fd71220bSRobert Mustacchiexpect_success gpio attr set gpio_sim0/54V sim:output=disabled sim:pull=40k-up
372*fd71220bSRobert Mustacchicheck_attr_val gpio_sim0/54V sim:output disabled
373*fd71220bSRobert Mustacchicheck_attr_val gpio_sim0/54V sim:pull 40k-up
374*fd71220bSRobert Mustacchicheck_attr_val gpio_sim0/54V sim:input high
375*fd71220bSRobert Mustacchiexpect_success gpio attr set gpio_sim0/54V sim:output=low sim:pull=23k-down
376*fd71220bSRobert Mustacchicheck_attr_val gpio_sim0/54V sim:output low
377*fd71220bSRobert Mustacchicheck_attr_val gpio_sim0/54V sim:pull 23k-down
378*fd71220bSRobert Mustacchicheck_attr_val gpio_sim0/54V sim:input low
379*fd71220bSRobert Mustacchi
380*fd71220bSRobert Mustacchiif (( gt_exit == 0 )); then
381*fd71220bSRobert Mustacchi	printf "All tests passed successfully!\n"
382*fd71220bSRobert Mustacchifi
383