On 09/20/2017 01:55 AM, Michal Simek wrote:
From: Vipul Kumar <vipul.ku...@xilinx.com>
This patch tests the gpio commands using the
gpio data from boardenv file.
Also one test will show the default status of all the gpio's
supported by the processor.
Nit: Wrap the commit description to something like 74 characters; the
text above is far too narrow.
Nit: GPIO not gpio in any free-form text (here and in comments in the
source file)
Ah, I'd briefly though about GPIO tests before, but was wondering how to
integrate e.g. a USB GPIO device to the host PC and interface that with
the target. Loopback GPIOs make this a lot easier:-)
diff --git a/test/py/tests/test_gpio.py b/test/py/tests/test_gpio.py
+"""
+Note: This test relies on boardenv_* containing configuration values to define
+which the gpio available for testing. Without this, this test will be automat-
Nit: Double space before automatically.
+For example:
+
+# A list of gpio's that are going to be tested in order to validate the
+# test.
+env__gpio_val = {
+ "gpio": [0,1,2],
+}
Why is this a dictionary with only one key? Better to just assign the
array directly to env__gpio_val, or put both the "gpio" and
"list_of_gpios" into a single dictionary.
+# A list of gpio's that are shorted on the hardware board and first gpio of
+# each group is configured as input and the other as output. If the pins are
+# not shorted properly, then the test will be fail.
+env__gpio_input_output = {
+ "list_of_gpios": [ [36, 37], [38, 39]],
+}
Let's make the examples for env__gpio_val and env__gpio_input_output use
the same GPIO numbers so that they match, and it's obvious how the two
relate to each-other. I assume they're meant to?
Actually, why do we even need env__gpio_val if env__gpio_input_output
already lists all the pairs of GPIOs?
Again, let's collapse this dict/list pair into just a list without the
dict wrapper.
"gpio_val", "gpio", "gpio_input_output", and "list_of_gpios" aren't
exactly great names. At least for "gpio_input_output"/"list_of_gpios",
I'd suggest a more semantic name is "env__looped_back_gpios", which is a
plain list (of pairs of GPIO numbers).
+def gpio_input(u_boot_console, gpio):
+ u_boot_console.run_command("gpio input %d" %gpio)
Nit: Space after % operator (the second % outside the string). Same
comment in many other cases.
+ response = u_boot_console.run_command("gpio status -a %d" %gpio)
+ expected_response = "%d: input:" %gpio
+ assert(expected_response in response)
+
+def gpio_set(u_boot_console, gpio):
+ expected_response = "%d: output: 1" %gpio
+ u_boot_console.run_command("gpio set %d" %gpio)
+ response = u_boot_console.run_command("gpio status -a %d" %gpio)
+ assert(expected_response in response)
Why not make all these functions do things in the same order;
gpio_input() above sets expected_response immediately before the assert
(which I think is the right place to do it since it relates to the
assert and not the gpio set/clear/toggle command which is executed
earlier), whereas the other functions set expected_response at the start
of the function.
+@pytest.mark.buildconfigspec("cmd_gpio")
+def test_gpio_status(u_boot_console):
+ response = u_boot_console.run_command("gpio status -a")
+ expected_response = "0: input:"
+ assert(expected_response in response)
This test assumes that GPIO 0 is expected to be configured as an input
by default (at boot) on all HW that supports GPIOs. I don't think this
is a valid assumption.
+@pytest.mark.buildconfigspec("cmd_gpio")
+def test_gpio(u_boot_console):
+ f = u_boot_console.config.env.get('env__gpio_val', None)
+ if not f:
+ pytest.skip('No GPIO readable file to read')
What "file" is this referring to? A better message might be
'env__gpio_val not defined for this board'.
+ gpin = f.get("gpio", None)
+
+ for gpio in gpin:
+ gpio_input(u_boot_console, gpio)
+ gpio_set(u_boot_console, gpio)
+ gpio_clear(u_boot_console, gpio)
+ gpio_toggle(u_boot_console, gpio)
So this is simply to test executing those commands? Why not rely on
testing them as a side-effect of the loopback test below? the only one
untested is toggle, and that could be added to the loopback test.
+@pytest.mark.buildconfigspec("cmd_gpio")
+def test_gpio_input_output(u_boot_console):
+ f = u_boot_console.config.env.get('env__gpio_input_output', None)
+ if not f:
+ pytest.skip('No GPIO readable file to read')
+
+ list_of_gpios = f.get("list_of_gpios", None)
+
+ flag = 0
+ for list in list_of_gpios:
+ for i in list:
+ if flag == 0:
+ gpio_in = i
+ expected_response = "%d: input:" %gpio_in
+ u_boot_console.run_command("gpio input %d" %gpio_in)
+ response = u_boot_console.run_command("gpio status -a %d"
%gpio_in)
+ assert(expected_response in response)
+ flag = 1
+
+ else:
+ gpio_out = i
+ expected_response = "%d: output:" %gpio_out
+ u_boot_console.run_command("gpio set %d" %gpio_out)
+ response = u_boot_console.run_command("gpio status -a %d"
%gpio_out)
+ assert(expected_response in response)
+ flag = 0
This (the inner "for i in list") doesn't need to be a loop, since it's
using flag to do completely different things on each iteration anyway,
and that logic is pretty confusing. Instead, just do:
for list in list_of_gpios:
gpio_in = list[0]
configure input GPIO
gpio_out = list[1]
set gpio_out to 0
validate gpio_in value is 0
set gpio_out to 1
validate gpio_in value is 1
(and "list" isn't a great variable name especially since it aliases with
a Python type constructor function; gpio_pair would be better)
... and actually it might be better to do something like the following:
for every GPIO pair:
set gpio_in to input
for every GPIO pair:
set gpio_out to 0
for every GPIO pair:
set gpio_out to 1
for every GPIO pair:
if inner gpio_in == output gpio_in:
expected_val = 1
else:
expected_val = 0
validate inner gpio_in is expected_val
set gpio_out to 0
... since that will both test that each gpio_out value affects the
associated gpio_in value, but also that no gpio_out value affects any
unexpected/unassociated gpio_in value.
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot