1
1
/*
2
- * Copyright (c) 2019, Arm Limited and affiliates.
2
+ * Copyright (c) 2019-2020 , Arm Limited and affiliates.
3
3
* SPDX-License-Identifier: Apache-2.0
4
4
*
5
5
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -56,61 +56,23 @@ void fpga_test_basic_input_output(PinName pin)
56
56
// Select GPIO0.
57
57
tester.select_peripheral (MbedTester::PeripheralGPIO);
58
58
59
- // Initialize GPIO pin with a generic init fun.
60
59
gpio_t gpio;
61
- // Test gpio_is_connected() returned value .
60
+ // Initialize GPIO pin with a generic init fun .
62
61
gpio_init (&gpio, NC);
62
+ // Test gpio_is_connected() returned value.
63
63
TEST_ASSERT_EQUAL_INT (0 , gpio_is_connected (&gpio));
64
64
gpio_free (&gpio);
65
65
gpio_init (&gpio, pin);
66
66
TEST_ASSERT_NOT_EQUAL (0 , gpio_is_connected (&gpio));
67
67
68
- // Some targets don't support input pull mode.
69
- #if !defined(TARGET_NANO100) && \
70
- !defined (TARGET_NUC472) && \
71
- !defined (TARGET_M451)
72
68
// Test GPIO used as an input.
73
69
gpio_dir (&gpio, PIN_INPUT);
74
-
75
- // Test input, pull-up mode.
76
- gpio_mode (&gpio, PullUp);
77
- tester.gpio_write (MbedTester::LogicalPinGPIO0, 0 , false );
78
- wait_us (HI_Z_READ_DELAY_US);
79
- TEST_ASSERT_EQUAL_INT (1 , gpio_read (&gpio)); // hi-Z, pulled up
80
- tester.gpio_write (MbedTester::LogicalPinGPIO0, 0 , true );
81
- TEST_ASSERT_EQUAL_INT (0 , gpio_read (&gpio));
82
- tester.gpio_write (MbedTester::LogicalPinGPIO0, 1 , true );
83
- TEST_ASSERT_EQUAL_INT (1 , gpio_read (&gpio));
84
- tester.gpio_write (MbedTester::LogicalPinGPIO0, 0 , true );
85
- TEST_ASSERT_EQUAL_INT (0 , gpio_read (&gpio));
86
- tester.gpio_write (MbedTester::LogicalPinGPIO0, 0 , false );
87
- wait_us (HI_Z_READ_DELAY_US);
88
- TEST_ASSERT_EQUAL_INT (1 , gpio_read (&gpio)); // hi-Z, pulled up
89
-
90
- // Test input, pull-down mode.
91
- gpio_mode (&gpio, PullDown);
92
- tester.gpio_write (MbedTester::LogicalPinGPIO0, 0 , false );
93
- wait_us (HI_Z_READ_DELAY_US);
94
- TEST_ASSERT_EQUAL_INT (0 , gpio_read (&gpio)); // hi-Z, pulled down
95
- tester.gpio_write (MbedTester::LogicalPinGPIO0, 1 , true );
96
- TEST_ASSERT_EQUAL_INT (1 , gpio_read (&gpio));
97
- tester.gpio_write (MbedTester::LogicalPinGPIO0, 0 , true );
98
- TEST_ASSERT_EQUAL_INT (0 , gpio_read (&gpio));
99
- tester.gpio_write (MbedTester::LogicalPinGPIO0, 1 , true );
100
- TEST_ASSERT_EQUAL_INT (1 , gpio_read (&gpio));
101
- tester.gpio_write (MbedTester::LogicalPinGPIO0, 0 , false );
102
- wait_us (HI_Z_READ_DELAY_US);
103
- TEST_ASSERT_EQUAL_INT (0 , gpio_read (&gpio)); // hi-Z, pulled down
104
-
105
- // Test input, pull-none mode.
106
- gpio_mode (&gpio, PullNone);
107
70
tester.gpio_write (MbedTester::LogicalPinGPIO0, 1 , true );
108
71
TEST_ASSERT_EQUAL_INT (1 , gpio_read (&gpio));
109
72
tester.gpio_write (MbedTester::LogicalPinGPIO0, 0 , true );
110
73
TEST_ASSERT_EQUAL_INT (0 , gpio_read (&gpio));
111
74
tester.gpio_write (MbedTester::LogicalPinGPIO0, 1 , true );
112
75
TEST_ASSERT_EQUAL_INT (1 , gpio_read (&gpio));
113
- #endif
114
76
115
77
// Test GPIO used as an output.
116
78
tester.gpio_write (MbedTester::LogicalPinGPIO0, 0 , false );
@@ -125,6 +87,85 @@ void fpga_test_basic_input_output(PinName pin)
125
87
gpio_free (&gpio);
126
88
}
127
89
90
+ /* Test input pull modes.
91
+ *
92
+ * Given a GPIO instance configured with an input pull mode,
93
+ * when basic input operations are performed,
94
+ * then all operations succeed.
95
+ */
96
+ void fpga_test_input_pull_modes (PinName pin)
97
+ {
98
+ // Reset everything and set all tester pins to hi-Z.
99
+ tester.reset ();
100
+
101
+ // Map pins for test.
102
+ tester.pin_map_set (pin, MbedTester::LogicalPinGPIO0);
103
+
104
+ // Select GPIO0.
105
+ tester.select_peripheral (MbedTester::PeripheralGPIO);
106
+
107
+ gpio_t gpio;
108
+ // Initialize GPIO pin with a generic init fun.
109
+ gpio_init (&gpio, pin);
110
+ TEST_ASSERT_NOT_EQUAL (0 , gpio_is_connected (&gpio));
111
+ gpio_dir (&gpio, PIN_INPUT);
112
+ gpio_capabilities_t gcap = {};
113
+ gpio_get_capabilities (&gpio, &gcap);
114
+
115
+ // Test input, pull-up mode.
116
+ if (gcap.pull_up ) {
117
+ gpio_mode (&gpio, PullUp);
118
+ tester.gpio_write (MbedTester::LogicalPinGPIO0, 0 , false );
119
+ wait_us (HI_Z_READ_DELAY_US);
120
+ TEST_ASSERT_EQUAL_INT (1 , gpio_read (&gpio)); // hi-Z, pulled up
121
+ tester.gpio_write (MbedTester::LogicalPinGPIO0, 0 , true );
122
+ TEST_ASSERT_EQUAL_INT (0 , gpio_read (&gpio));
123
+ tester.gpio_write (MbedTester::LogicalPinGPIO0, 1 , true );
124
+ TEST_ASSERT_EQUAL_INT (1 , gpio_read (&gpio));
125
+ tester.gpio_write (MbedTester::LogicalPinGPIO0, 0 , true );
126
+ TEST_ASSERT_EQUAL_INT (0 , gpio_read (&gpio));
127
+ tester.gpio_write (MbedTester::LogicalPinGPIO0, 0 , false );
128
+ wait_us (HI_Z_READ_DELAY_US);
129
+ TEST_ASSERT_EQUAL_INT (1 , gpio_read (&gpio)); // hi-Z, pulled up
130
+ } else {
131
+ utest_printf (" skipped PullUp," );
132
+ }
133
+
134
+ // Test input, pull-down mode.
135
+ if (gcap.pull_down ) {
136
+ gpio_mode (&gpio, PullDown);
137
+ tester.gpio_write (MbedTester::LogicalPinGPIO0, 0 , false );
138
+ wait_us (HI_Z_READ_DELAY_US);
139
+ TEST_ASSERT_EQUAL_INT (0 , gpio_read (&gpio)); // hi-Z, pulled down
140
+ tester.gpio_write (MbedTester::LogicalPinGPIO0, 1 , true );
141
+ TEST_ASSERT_EQUAL_INT (1 , gpio_read (&gpio));
142
+ tester.gpio_write (MbedTester::LogicalPinGPIO0, 0 , true );
143
+ TEST_ASSERT_EQUAL_INT (0 , gpio_read (&gpio));
144
+ tester.gpio_write (MbedTester::LogicalPinGPIO0, 1 , true );
145
+ TEST_ASSERT_EQUAL_INT (1 , gpio_read (&gpio));
146
+ tester.gpio_write (MbedTester::LogicalPinGPIO0, 0 , false );
147
+ wait_us (HI_Z_READ_DELAY_US);
148
+ TEST_ASSERT_EQUAL_INT (0 , gpio_read (&gpio)); // hi-Z, pulled down
149
+ } else {
150
+ utest_printf (" skipped PullDown," );
151
+ }
152
+
153
+ // Test input, pull-none mode.
154
+ if (gcap.pull_none ) {
155
+ gpio_mode (&gpio, PullNone);
156
+ tester.gpio_write (MbedTester::LogicalPinGPIO0, 1 , true );
157
+ TEST_ASSERT_EQUAL_INT (1 , gpio_read (&gpio));
158
+ tester.gpio_write (MbedTester::LogicalPinGPIO0, 0 , true );
159
+ TEST_ASSERT_EQUAL_INT (0 , gpio_read (&gpio));
160
+ tester.gpio_write (MbedTester::LogicalPinGPIO0, 1 , true );
161
+ TEST_ASSERT_EQUAL_INT (1 , gpio_read (&gpio));
162
+ } else {
163
+ utest_printf (" skipped PullNone," );
164
+ }
165
+
166
+ gpio_free (&gpio);
167
+ }
168
+
128
169
/* Test explicit input initialization.
129
170
*
130
171
* Given a GPIO instance,
@@ -143,42 +184,62 @@ void fpga_test_explicit_input(PinName pin)
143
184
tester.select_peripheral (MbedTester::PeripheralGPIO);
144
185
145
186
gpio_t gpio;
187
+ gpio_init (&gpio, pin);
188
+ gpio_capabilities_t gcap = {};
189
+ gpio_get_capabilities (&gpio, &gcap);
190
+ gpio_free (&gpio);
146
191
147
192
// Initialize GPIO pin as an input, pull-up mode.
148
- memset (&gpio, 0 , sizeof gpio);
149
- gpio_init_in_ex (&gpio, pin, PullUp);
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 (1 , gpio_read (&gpio)); // hi-Z, pulled up
154
- gpio_free (&gpio);
193
+ if (gcap.pull_up ) {
194
+ memset (&gpio, 0 , sizeof gpio);
195
+ gpio_init_in_ex (&gpio, pin, PullUp);
196
+ TEST_ASSERT_NOT_EQUAL (0 , gpio_is_connected (&gpio));
197
+ tester.gpio_write (MbedTester::LogicalPinGPIO0, 0 , false );
198
+ wait_us (HI_Z_READ_DELAY_US);
199
+ TEST_ASSERT_EQUAL_INT (1 , gpio_read (&gpio)); // hi-Z, pulled up
200
+ gpio_free (&gpio);
201
+ } else {
202
+ utest_printf (" skipped PullUp," );
203
+ }
155
204
156
205
// Initialize GPIO pin as an input, pull-down mode.
157
- memset (&gpio, 0 , sizeof gpio);
158
- gpio_init_in_ex (&gpio, pin, PullDown);
159
- TEST_ASSERT_NOT_EQUAL (0 , gpio_is_connected (&gpio));
160
- tester.gpio_write (MbedTester::LogicalPinGPIO0, 0 , false );
161
- wait_us (HI_Z_READ_DELAY_US);
162
- TEST_ASSERT_EQUAL_INT (0 , gpio_read (&gpio)); // hi-Z, pulled down
163
- gpio_free (&gpio);
206
+ if (gcap.pull_down ) {
207
+ memset (&gpio, 0 , sizeof gpio);
208
+ gpio_init_in_ex (&gpio, pin, PullDown);
209
+ TEST_ASSERT_NOT_EQUAL (0 , gpio_is_connected (&gpio));
210
+ tester.gpio_write (MbedTester::LogicalPinGPIO0, 0 , false );
211
+ wait_us (HI_Z_READ_DELAY_US);
212
+ TEST_ASSERT_EQUAL_INT (0 , gpio_read (&gpio)); // hi-Z, pulled down
213
+ gpio_free (&gpio);
214
+ } else {
215
+ utest_printf (" skipped PullDown," );
216
+ }
164
217
165
218
// Initialize GPIO pin as an input, pull-up mode.
166
- memset (&gpio, 0 , sizeof gpio);
167
- gpio_init_inout (&gpio, pin, PIN_INPUT, PullUp, 0 );
168
- TEST_ASSERT_NOT_EQUAL (0 , gpio_is_connected (&gpio));
169
- tester.gpio_write (MbedTester::LogicalPinGPIO0, 0 , false );
170
- wait_us (HI_Z_READ_DELAY_US);
171
- TEST_ASSERT_EQUAL_INT (1 , gpio_read (&gpio)); // hi-Z, pulled up
172
- gpio_free (&gpio);
219
+ if (gcap.pull_up ) {
220
+ memset (&gpio, 0 , sizeof gpio);
221
+ gpio_init_inout (&gpio, pin, PIN_INPUT, PullUp, 0 );
222
+ TEST_ASSERT_NOT_EQUAL (0 , gpio_is_connected (&gpio));
223
+ tester.gpio_write (MbedTester::LogicalPinGPIO0, 0 , false );
224
+ wait_us (HI_Z_READ_DELAY_US);
225
+ TEST_ASSERT_EQUAL_INT (1 , gpio_read (&gpio)); // hi-Z, pulled up
226
+ gpio_free (&gpio);
227
+ } else {
228
+ utest_printf (" skipped PullUp," );
229
+ }
173
230
174
231
// Initialize GPIO pin as an input, pull-down mode.
175
- memset (&gpio, 0 , sizeof gpio);
176
- gpio_init_inout (&gpio, pin, PIN_INPUT, PullDown, 0 );
177
- TEST_ASSERT_NOT_EQUAL (0 , gpio_is_connected (&gpio));
178
- tester.gpio_write (MbedTester::LogicalPinGPIO0, 0 , false );
179
- wait_us (HI_Z_READ_DELAY_US);
180
- TEST_ASSERT_EQUAL_INT (0 , gpio_read (&gpio)); // hi-Z, pulled down
181
- gpio_free (&gpio);
232
+ if (gcap.pull_down ) {
233
+ memset (&gpio, 0 , sizeof gpio);
234
+ gpio_init_inout (&gpio, pin, PIN_INPUT, PullDown, 0 );
235
+ TEST_ASSERT_NOT_EQUAL (0 , gpio_is_connected (&gpio));
236
+ tester.gpio_write (MbedTester::LogicalPinGPIO0, 0 , false );
237
+ wait_us (HI_Z_READ_DELAY_US);
238
+ TEST_ASSERT_EQUAL_INT (0 , gpio_read (&gpio)); // hi-Z, pulled down
239
+ gpio_free (&gpio);
240
+ } else {
241
+ utest_printf (" skipped PullDown," );
242
+ }
182
243
}
183
244
184
245
/* Test explicit output initialization.
@@ -199,6 +260,10 @@ void fpga_test_explicit_output(PinName pin)
199
260
tester.select_peripheral (MbedTester::PeripheralGPIO);
200
261
201
262
gpio_t gpio;
263
+ gpio_init (&gpio, pin);
264
+ gpio_capabilities_t gcap = {};
265
+ gpio_get_capabilities (&gpio, &gcap);
266
+ gpio_free (&gpio);
202
267
203
268
// Initialize GPIO pin as an output, output value = 0.
204
269
memset (&gpio, 0 , sizeof gpio);
@@ -222,28 +287,28 @@ void fpga_test_explicit_output(PinName pin)
222
287
gpio_free (&gpio);
223
288
224
289
// Initialize GPIO pin as an output, output value = 1.
225
- memset (&gpio, 0 , sizeof gpio);
226
- gpio_init_inout (&gpio, pin, PIN_OUTPUT, PullNone, 1 );
227
- TEST_ASSERT_NOT_EQUAL (0 , gpio_is_connected (&gpio));
228
- TEST_ASSERT_EQUAL_INT (1 , tester.gpio_read (MbedTester::LogicalPinGPIO0));
229
- gpio_free (&gpio);
230
-
231
- // Initialize GPIO pin as an output, output value = 0.
232
- memset (&gpio, 0 , sizeof gpio);
233
- gpio_init_inout (&gpio, pin, PIN_OUTPUT, PullNone, 0 );
234
- TEST_ASSERT_NOT_EQUAL (0 , gpio_is_connected (&gpio));
235
- TEST_ASSERT_EQUAL_INT (0 , tester.gpio_read (MbedTester::LogicalPinGPIO0));
236
- gpio_free (&gpio);
290
+ if (gcap.pull_none ) {
291
+ memset (&gpio, 0 , sizeof gpio);
292
+ gpio_init_inout (&gpio, pin, PIN_OUTPUT, PullNone, 1 );
293
+ TEST_ASSERT_NOT_EQUAL (0 , gpio_is_connected (&gpio));
294
+ TEST_ASSERT_EQUAL_INT (1 , tester.gpio_read (MbedTester::LogicalPinGPIO0));
295
+ gpio_free (&gpio);
296
+
297
+ // Initialize GPIO pin as an output, output value = 0.
298
+ memset (&gpio, 0 , sizeof gpio);
299
+ gpio_init_inout (&gpio, pin, PIN_OUTPUT, PullNone, 0 );
300
+ TEST_ASSERT_NOT_EQUAL (0 , gpio_is_connected (&gpio));
301
+ TEST_ASSERT_EQUAL_INT (0 , tester.gpio_read (MbedTester::LogicalPinGPIO0));
302
+ gpio_free (&gpio);
303
+ } else {
304
+ utest_printf (" skipped gpio_init_inout," );
305
+ }
237
306
}
238
307
239
308
Case cases[] = {
240
- Case (" generic init, input & output" , all_ports<GPIOPort, DefaultFormFactor, fpga_test_basic_input_output>),
241
- // Some targets don't support input pull mode.
242
- #if !defined(TARGET_NANO100) && \
243
- !defined (TARGET_NUC472) && \
244
- !defined (TARGET_M451)
309
+ Case (" basic input & output" , all_ports<GPIOPort, DefaultFormFactor, fpga_test_basic_input_output>),
310
+ Case (" input pull modes" , all_ports<GPIOPort, DefaultFormFactor, fpga_test_input_pull_modes>),
245
311
Case (" explicit init, input" , all_ports<GPIOPort, DefaultFormFactor, fpga_test_explicit_input>),
246
- #endif
247
312
Case (" explicit init, output" , all_ports<GPIOPort, DefaultFormFactor, fpga_test_explicit_output>),
248
313
};
249
314
0 commit comments