Skip to content

Commit c5c7458

Browse files
author
Seppo Takalo
authored
Merge pull request #11038 from fkjagodzinski/fpga_test-gpio
Extend the GPIO HAL API tests
2 parents 8881da9 + 74be850 commit c5c7458

File tree

2 files changed

+175
-41
lines changed
  • TESTS/mbed_hal_fpga_ci_test_shield/gpio
  • components/testing/COMPONENT_FPGA_CI_TEST_SHIELD

2 files changed

+175
-41
lines changed

TESTS/mbed_hal_fpga_ci_test_shield/gpio/main.cpp

Lines changed: 165 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -30,75 +30,199 @@ using namespace utest::v1;
3030

3131
#include "MbedTester.h"
3232
#include "pinmap.h"
33+
#include "test_utils.h"
3334

34-
const PinList *form_factor = pinmap_ff_default_pins();
35-
const PinList *restricted = pinmap_restricted_pins();
36-
MbedTester tester(form_factor, restricted);
35+
// This delay is used when reading a floating input that has an internal pull-up
36+
// or pull-down resistor. The voltage response is much slower when the input
37+
// is not driven externally.
38+
#define HI_Z_READ_DELAY_US 5
3739

38-
void gpio_inout_test(PinName pin)
40+
MbedTester tester(DefaultFormFactor::pins(), DefaultFormFactor::restricted_pins());
41+
42+
/* Test basic input & output operations.
43+
*
44+
* Given a GPIO instance initialized with a generic gpio_init() function,
45+
* when basic input and output operations are performed,
46+
* then all operations succeed.
47+
*/
48+
void test_basic_input_output(PinName pin)
3949
{
40-
gpio_t gpio;
41-
gpio_init_inout(&gpio, pin, PIN_OUTPUT, PullNone, 0);
42-
TEST_ASSERT_EQUAL(0, tester.gpio_read(MbedTester::LogicalPinGPIO0));
50+
// Reset everything and set all tester pins to hi-Z.
51+
tester.reset();
4352

44-
/* Test GPIO output */
53+
// Map pins for test.
54+
tester.pin_map_set(pin, MbedTester::LogicalPinGPIO0);
4555

46-
gpio_write(&gpio, 1);
47-
TEST_ASSERT_EQUAL(1, tester.gpio_read(MbedTester::LogicalPinGPIO0));
56+
// Select GPIO0.
57+
tester.select_peripheral(MbedTester::PeripheralGPIO);
4858

49-
gpio_write(&gpio, 0);
50-
TEST_ASSERT_EQUAL(0, tester.gpio_read(MbedTester::LogicalPinGPIO0));
59+
// Initialize GPIO pin with a generic init fun.
60+
gpio_t gpio;
61+
// Test gpio_is_connected() returned value.
62+
gpio_init(&gpio, NC);
63+
TEST_ASSERT_EQUAL_INT(0, gpio_is_connected(&gpio));
64+
gpio_init(&gpio, pin);
65+
TEST_ASSERT_NOT_EQUAL(0, gpio_is_connected(&gpio));
5166

67+
// Test GPIO used as an input.
5268
gpio_dir(&gpio, PIN_INPUT);
5369

54-
/* Test GPIO input */
55-
70+
// Test input, pull-up mode.
71+
gpio_mode(&gpio, PullUp);
72+
tester.gpio_write(MbedTester::LogicalPinGPIO0, 0, false);
73+
wait_us(HI_Z_READ_DELAY_US);
74+
TEST_ASSERT_EQUAL_INT(1, gpio_read(&gpio)); // hi-Z, pulled up
5675
tester.gpio_write(MbedTester::LogicalPinGPIO0, 0, true);
57-
TEST_ASSERT_EQUAL(0, gpio_read(&gpio));
76+
TEST_ASSERT_EQUAL_INT(0, gpio_read(&gpio));
77+
tester.gpio_write(MbedTester::LogicalPinGPIO0, 1, true);
78+
TEST_ASSERT_EQUAL_INT(1, gpio_read(&gpio));
79+
tester.gpio_write(MbedTester::LogicalPinGPIO0, 0, true);
80+
TEST_ASSERT_EQUAL_INT(0, gpio_read(&gpio));
81+
tester.gpio_write(MbedTester::LogicalPinGPIO0, 0, false);
82+
wait_us(HI_Z_READ_DELAY_US);
83+
TEST_ASSERT_EQUAL_INT(1, gpio_read(&gpio)); // hi-Z, pulled up
5884

85+
// Test input, pull-down mode.
86+
gpio_mode(&gpio, PullDown);
87+
tester.gpio_write(MbedTester::LogicalPinGPIO0, 0, false);
88+
wait_us(HI_Z_READ_DELAY_US);
89+
TEST_ASSERT_EQUAL_INT(0, gpio_read(&gpio)); // hi-Z, pulled down
5990
tester.gpio_write(MbedTester::LogicalPinGPIO0, 1, true);
60-
TEST_ASSERT_EQUAL(1, gpio_read(&gpio));
91+
TEST_ASSERT_EQUAL_INT(1, gpio_read(&gpio));
92+
tester.gpio_write(MbedTester::LogicalPinGPIO0, 0, true);
93+
TEST_ASSERT_EQUAL_INT(0, gpio_read(&gpio));
94+
tester.gpio_write(MbedTester::LogicalPinGPIO0, 1, true);
95+
TEST_ASSERT_EQUAL_INT(1, gpio_read(&gpio));
96+
tester.gpio_write(MbedTester::LogicalPinGPIO0, 0, false);
97+
wait_us(HI_Z_READ_DELAY_US);
98+
TEST_ASSERT_EQUAL_INT(0, gpio_read(&gpio)); // hi-Z, pulled down
6199

62-
/* Set gpio back to Hi-Z */
100+
// Test input, pull-none mode.
101+
gpio_mode(&gpio, PullNone);
102+
tester.gpio_write(MbedTester::LogicalPinGPIO0, 1, true);
103+
TEST_ASSERT_EQUAL_INT(1, gpio_read(&gpio));
104+
tester.gpio_write(MbedTester::LogicalPinGPIO0, 0, true);
105+
TEST_ASSERT_EQUAL_INT(0, gpio_read(&gpio));
106+
tester.gpio_write(MbedTester::LogicalPinGPIO0, 1, true);
107+
TEST_ASSERT_EQUAL_INT(1, gpio_read(&gpio));
63108

109+
// Test GPIO used as an output.
64110
tester.gpio_write(MbedTester::LogicalPinGPIO0, 0, false);
111+
gpio_dir(&gpio, PIN_OUTPUT);
112+
gpio_write(&gpio, 0);
113+
TEST_ASSERT_EQUAL_INT(0, tester.gpio_read(MbedTester::LogicalPinGPIO0));
114+
gpio_write(&gpio, 1);
115+
TEST_ASSERT_EQUAL_INT(1, tester.gpio_read(MbedTester::LogicalPinGPIO0));
116+
gpio_write(&gpio, 0);
117+
TEST_ASSERT_EQUAL_INT(0, tester.gpio_read(MbedTester::LogicalPinGPIO0));
65118
}
66119

67-
void gpio_inout_test()
120+
/* Test explicit input initialization.
121+
*
122+
* Given a GPIO instance,
123+
* when additional parameters are passed to the input init function,
124+
* then the GPIO is correctly initialized as an input.
125+
*/
126+
void test_explicit_input(PinName pin)
68127
{
69-
for (int i = 0; i < form_factor->count; i++) {
70-
const PinName test_pin = form_factor->pins[i];
71-
if (test_pin == NC) {
72-
continue;
73-
}
74-
if (pinmap_list_has_pin(restricted, test_pin)) {
75-
printf("Skipping gpio pin %s (%i)\r\n", pinmap_ff_default_pin_to_string(test_pin), test_pin);
76-
continue;
77-
}
78-
tester.pin_map_reset();
79-
tester.pin_map_set(test_pin, MbedTester::LogicalPinGPIO0);
80-
81-
printf("GPIO test on pin %s (%i)\r\n", pinmap_ff_default_pin_to_string(test_pin), test_pin);
82-
gpio_inout_test(test_pin);
83-
}
128+
// Reset everything and set all tester pins to hi-Z.
129+
tester.reset();
130+
131+
// Map pins for test.
132+
tester.pin_map_set(pin, MbedTester::LogicalPinGPIO0);
133+
134+
// Select GPIO0.
135+
tester.select_peripheral(MbedTester::PeripheralGPIO);
136+
137+
gpio_t gpio;
138+
139+
// Initialize GPIO pin as an input, pull-up mode.
140+
memset(&gpio, 0, sizeof gpio);
141+
gpio_init_in_ex(&gpio, pin, PullUp);
142+
TEST_ASSERT_NOT_EQUAL(0, gpio_is_connected(&gpio));
143+
tester.gpio_write(MbedTester::LogicalPinGPIO0, 0, false);
144+
wait_us(HI_Z_READ_DELAY_US);
145+
TEST_ASSERT_EQUAL_INT(1, gpio_read(&gpio)); // hi-Z, pulled up
146+
147+
// Initialize GPIO pin as an input, pull-down mode.
148+
memset(&gpio, 0, sizeof gpio);
149+
gpio_init_in_ex(&gpio, pin, PullDown);
150+
TEST_ASSERT_NOT_EQUAL(0, gpio_is_connected(&gpio));
151+
tester.gpio_write(MbedTester::LogicalPinGPIO0, 0, false);
152+
wait_us(HI_Z_READ_DELAY_US);
153+
TEST_ASSERT_EQUAL_INT(0, gpio_read(&gpio)); // hi-Z, pulled down
154+
155+
// Initialize GPIO pin as an input, pull-up mode.
156+
memset(&gpio, 0, sizeof gpio);
157+
gpio_init_inout(&gpio, pin, PIN_INPUT, PullUp, 0);
158+
TEST_ASSERT_NOT_EQUAL(0, gpio_is_connected(&gpio));
159+
tester.gpio_write(MbedTester::LogicalPinGPIO0, 0, false);
160+
wait_us(HI_Z_READ_DELAY_US);
161+
TEST_ASSERT_EQUAL_INT(1, gpio_read(&gpio)); // hi-Z, pulled up
162+
163+
// Initialize GPIO pin as an input, pull-down mode.
164+
memset(&gpio, 0, sizeof gpio);
165+
gpio_init_inout(&gpio, pin, PIN_INPUT, PullDown, 0);
166+
TEST_ASSERT_NOT_EQUAL(0, gpio_is_connected(&gpio));
167+
tester.gpio_write(MbedTester::LogicalPinGPIO0, 0, false);
168+
wait_us(HI_Z_READ_DELAY_US);
169+
TEST_ASSERT_EQUAL_INT(0, gpio_read(&gpio)); // hi-Z, pulled down
84170
}
85171

86-
utest::v1::status_t setup(const Case *const source, const size_t index_of_case)
172+
/* Test explicit output initialization.
173+
*
174+
* Given a GPIO instance,
175+
* when additional parameters are passed to the output init function,
176+
* then the GPIO is correctly initialized as an output.
177+
*/
178+
void test_explicit_output(PinName pin)
87179
{
180+
// Reset everything and set all tester pins to hi-Z.
88181
tester.reset();
182+
183+
// Map pins for test.
184+
tester.pin_map_set(pin, MbedTester::LogicalPinGPIO0);
185+
186+
// Select GPIO0.
89187
tester.select_peripheral(MbedTester::PeripheralGPIO);
90188

91-
return greentea_case_setup_handler(source, index_of_case);
92-
}
189+
gpio_t gpio;
93190

94-
utest::v1::status_t teardown(const Case *const source, const size_t passed, const size_t failed,
95-
const failure_t reason)
96-
{
97-
return greentea_case_teardown_handler(source, passed, failed, reason);
191+
// Initialize GPIO pin as an output, output value = 0.
192+
memset(&gpio, 0, sizeof gpio);
193+
gpio_init_out(&gpio, pin);
194+
TEST_ASSERT_NOT_EQUAL(0, gpio_is_connected(&gpio));
195+
TEST_ASSERT_EQUAL_INT(0, tester.gpio_read(MbedTester::LogicalPinGPIO0));
196+
197+
// Initialize GPIO pin as an output, output value = 1.
198+
memset(&gpio, 0, sizeof gpio);
199+
gpio_init_out_ex(&gpio, pin, 1);
200+
TEST_ASSERT_NOT_EQUAL(0, gpio_is_connected(&gpio));
201+
TEST_ASSERT_EQUAL_INT(1, tester.gpio_read(MbedTester::LogicalPinGPIO0));
202+
203+
// Initialize GPIO pin as an output, output value = 0.
204+
memset(&gpio, 0, sizeof gpio);
205+
gpio_init_out_ex(&gpio, pin, 0);
206+
TEST_ASSERT_NOT_EQUAL(0, gpio_is_connected(&gpio));
207+
TEST_ASSERT_EQUAL_INT(0, tester.gpio_read(MbedTester::LogicalPinGPIO0));
208+
209+
// Initialize GPIO pin as an output, output value = 1.
210+
memset(&gpio, 0, sizeof gpio);
211+
gpio_init_inout(&gpio, pin, PIN_OUTPUT, PullNone, 1);
212+
TEST_ASSERT_NOT_EQUAL(0, gpio_is_connected(&gpio));
213+
TEST_ASSERT_EQUAL_INT(1, tester.gpio_read(MbedTester::LogicalPinGPIO0));
214+
215+
// Initialize GPIO pin as an output, output value = 0.
216+
memset(&gpio, 0, sizeof gpio);
217+
gpio_init_inout(&gpio, pin, PIN_OUTPUT, PullNone, 0);
218+
TEST_ASSERT_NOT_EQUAL(0, gpio_is_connected(&gpio));
219+
TEST_ASSERT_EQUAL_INT(0, tester.gpio_read(MbedTester::LogicalPinGPIO0));
98220
}
99221

100222
Case cases[] = {
101-
Case("GPIO - inout", setup, gpio_inout_test, teardown),
223+
Case("generic init, input & output", all_ports<GPIOPort, DefaultFormFactor, test_basic_input_output>),
224+
Case("explicit init, input", all_ports<GPIOPort, DefaultFormFactor, test_explicit_input>),
225+
Case("explicit init, output", all_ports<GPIOPort, DefaultFormFactor, test_explicit_output>),
102226
};
103227

104228
utest::v1::status_t greentea_test_setup(const size_t number_of_cases)

components/testing/COMPONENT_FPGA_CI_TEST_SHIELD/test_utils.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,16 @@ class DefaultFormFactor {
430430
* pin set to use for testing.
431431
*/
432432

433+
struct GPIOMaps {
434+
static const PinMap *maps[];
435+
static const char *const pin_type_names[];
436+
static const char *const name;
437+
};
438+
const PinMap *GPIOMaps::maps[] = { gpio_pinmap() };
439+
const char *const GPIOMaps::pin_type_names[] = { "IO" };
440+
const char *const GPIOMaps::name = "GPIO";
441+
typedef Port<1, GPIOMaps, DefaultFormFactor, TF1> GPIOPort;
442+
433443
#if DEVICE_SPI
434444
#include "spi_api.h"
435445
struct SPIMaps {

0 commit comments

Comments
 (0)