]> begriffs open source - cmsis-driver-validation/blob - Source/DV_GPIO.c
Add GPIO CMSIS-Driver Validation tests (#13)
[cmsis-driver-validation] / Source / DV_GPIO.c
1 /*\r
2  * Copyright (c) 2023 Arm Limited. All rights reserved.\r
3  *\r
4  * SPDX-License-Identifier: Apache-2.0\r
5  *\r
6  * Licensed under the Apache License, Version 2.0 (the License); you may\r
7  * not use this file except in compliance with the License.\r
8  * You may obtain a copy of the License at\r
9  *\r
10  * www.apache.org/licenses/LICENSE-2.0\r
11  *\r
12  * Unless required by applicable law or agreed to in writing, software\r
13  * distributed under the License is distributed on an AS IS BASIS, WITHOUT\r
14  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
15  * See the License for the specific language governing permissions and\r
16  * limitations under the License.\r
17  *\r
18  * -----------------------------------------------------------------------------\r
19  *\r
20  * Project:     CMSIS-Driver Validation\r
21  * Title:       General-purpose Input Output (GPIO) Driver Validation tests\r
22  *\r
23  * -----------------------------------------------------------------------------\r
24  */\r
25 \r
26 #ifndef __DOXYGEN__                     // Exclude form the documentation\r
27 \r
28 #include <stdio.h>\r
29 #include <stdlib.h>\r
30 #include <string.h>\r
31 \r
32 #include "cmsis_dv.h"\r
33 #include "DV_GPIO_Config.h"\r
34 #include "DV_Framework.h"\r
35 \r
36 #include "Driver_GPIO.h"\r
37 \r
38 // Register Driver_GPIO#\r
39 extern ARM_DRIVER_GPIO          CREATE_SYMBOL(Driver_GPIO, DRV_GPIO);\r
40 static ARM_DRIVER_GPIO *drv =  &CREATE_SYMBOL(Driver_GPIO, DRV_GPIO);\r
41 \r
42 // Global variables (used in this module only)\r
43 static volatile uint32_t        event;\r
44 static volatile ARM_GPIO_Pin_t  event_pin;\r
45 static volatile uint32_t        event_cnt;\r
46 \r
47 static char                     msg_buf[256];\r
48 \r
49 // Local functions\r
50 static void     GPIO_DrvEvent           (ARM_GPIO_Pin_t pin, uint32_t evt);\r
51 static int32_t  PinUnderTestIsAvailable (void);\r
52 static void     PinUnderTestInit        (void);\r
53 static void     PinUnderTestUninit      (void);\r
54 static int32_t  AuxiliaryPinIsAvailable (void);\r
55 static void     AuxiliaryPinInit        (void);\r
56 static void     AuxiliaryPinUninit      (void);\r
57 static void     AuxiliaryPinConfigInput (void);\r
58 static void     AuxiliaryPinConfigOutput(void);\r
59 static void     AuxiliaryPinSetOutput   (uint32_t val);\r
60 \r
61 // Helper functions\r
62 \r
63 /*\r
64   \fn            static void GPIO_DrvEvent (ARM_GPIO_Pin_t pin, uint32_t evt)\r
65   \brief         Store event(s) into a global variables.\r
66   \detail        This is a callback function called by the driver upon an event(s).\r
67   \param[in]     pin            GPIO pin\r
68   \param[in]     evt            GPIO event\r
69   \return        none\r
70 */\r
71 static void GPIO_DrvEvent (ARM_GPIO_Pin_t pin, uint32_t evt) {\r
72   event     |= evt;\r
73   event_pin  = pin;\r
74   event_cnt++;\r
75 }\r
76 \r
77 /*\r
78   \fn            static int32_t PinUnderTestIsAvailable (void)\r
79   \brief         Check if Pin Under Test is available.\r
80   \detail        This function is used to skip executing a test if Pin Under Test is not available.\r
81   \return        execution status\r
82                    - EXIT_SUCCESS: Pin Under Test is available\r
83                    - EXIT_FAILURE: Pin Under Test is not available\r
84 */\r
85 static int32_t PinUnderTestIsAvailable (void) {\r
86 \r
87   if (drv->Setup(GPIO_CFG_PIN_UNDER_TEST, NULL) == ARM_DRIVER_OK) {\r
88     return EXIT_SUCCESS;\r
89   } else {\r
90     TEST_MESSAGE("[FAILED] Pin Under Test is not available!");\r
91     return EXIT_FAILURE;\r
92   }\r
93 }\r
94 \r
95 /*\r
96   \fn            static void PinUnderTestInit (void)\r
97   \brief         Initialize Pin Under Test.\r
98   \param[in]     none\r
99   \return        none\r
100 */\r
101 static void PinUnderTestInit (void) {\r
102 \r
103   (void)drv->Setup(GPIO_CFG_PIN_UNDER_TEST, NULL);\r
104 }\r
105 \r
106 /*\r
107   \fn            static void PinUnderTestUninit (void)\r
108   \brief         Uninitialize Pin Under Test.\r
109   \param[in]     none\r
110   \return        none\r
111 */\r
112 static void PinUnderTestUninit (void) {\r
113 \r
114   (void)drv->SetDirection(GPIO_CFG_PIN_UNDER_TEST, ARM_GPIO_INPUT);\r
115   (void)drv->Setup       (GPIO_CFG_PIN_UNDER_TEST, NULL);\r
116 }\r
117 \r
118 /*\r
119   \fn            static int32_t AuxiliaryPinIsAvailable (void)\r
120   \brief         Check if Auxiliary Pin is available.\r
121   \detail        This function is used to skip executing a test if Auxiliary Pin is not available.\r
122   \return        execution status\r
123                    - EXIT_SUCCESS: Auxiliary Pin is available\r
124                    - EXIT_FAILURE: Auxiliary Pin is not available\r
125 */\r
126 static int32_t AuxiliaryPinIsAvailable (void) {\r
127 \r
128   if (drv->Setup(GPIO_CFG_PIN_AUX, NULL) == ARM_DRIVER_OK) {\r
129     return EXIT_SUCCESS;\r
130   } else {\r
131     TEST_MESSAGE("[FAILED] Auxiliary Pin is not available!");\r
132     return EXIT_FAILURE;\r
133   }\r
134 }\r
135 \r
136 /*\r
137   \fn            static void AuxiliaryPinInit (void)\r
138   \brief         Initialize Auxiliary Pin.\r
139   \param[in]     none\r
140   \return        none\r
141 */\r
142 static void AuxiliaryPinInit (void) {\r
143 \r
144   (void)drv->Setup(GPIO_CFG_PIN_AUX, NULL);\r
145 }\r
146 \r
147 /*\r
148   \fn            static void AuxiliaryPinUninit (void)\r
149   \brief         Uninitialize Auxiliary Pin.\r
150   \param[in]     none\r
151   \return        none\r
152 */\r
153 static void AuxiliaryPinUninit (void) {\r
154 \r
155   (void)drv->SetDirection(GPIO_CFG_PIN_AUX, ARM_GPIO_INPUT);\r
156   (void)drv->Setup       (GPIO_CFG_PIN_AUX, NULL);\r
157 }\r
158 \r
159 /*\r
160   \fn            static void AuxiliaryPinConfigInput (void)\r
161   \brief         Configure Auxiliary Pin as Input.\r
162   \param[in]     none\r
163   \return        none\r
164 */\r
165 static void AuxiliaryPinConfigInput (void) {\r
166 \r
167   (void)drv->SetDirection(GPIO_CFG_PIN_AUX, ARM_GPIO_INPUT);\r
168 }\r
169 \r
170 /*\r
171   \fn            static void AuxiliaryPinConfigOutput (void)\r
172   \brief         Configure Auxiliary Pin as Output with Push-pull Output mode.\r
173   \param[in]     none\r
174   \return        none\r
175 */\r
176 static void AuxiliaryPinConfigOutput (void) {\r
177 \r
178   (void)drv->SetOutputMode(GPIO_CFG_PIN_AUX, ARM_GPIO_PUSH_PULL);\r
179   (void)drv->SetDirection (GPIO_CFG_PIN_AUX, ARM_GPIO_OUTPUT);\r
180 }\r
181 \r
182 /*\r
183   \fn            static void AuxiliaryPinSetOutput (uint32_t val)\r
184   \brief         Set Auxiliary Pin output level (0 or 1).\r
185   \param[in]     val            Output level\r
186   \return        none\r
187 */\r
188 static void AuxiliaryPinSetOutput (uint32_t val) {\r
189 \r
190   drv->SetOutput(GPIO_CFG_PIN_AUX, val);\r
191   (void)osDelay(2U);            // Wait for voltage to stabilize\r
192 }\r
193 \r
194 #endif                                  // End of exclude form the documentation\r
195 \r
196 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/\r
197 /**\r
198 \defgroup dv_gpio GPIO Validation\r
199 \brief GPIO driver validation\r
200 \details\r
201 The GPIO validation performs the following tests:\r
202 - API interface compliance\r
203 - Functions operation\r
204 - Event signaling\r
205 \r
206 To perform GPIO validation tests, it is required to select and configure two pins in the <b>DV_GPIO_Config.h</b> configuration file:\r
207 - Pin Under Test: pin to be tested\r
208 - Auxiliary Pin: pin with serial low resistance resistor connected to Pin Under Test (suggested resistance of this resistor is around 1 kOhm)\r
209 \r
210 \image html gpio_loopback.png\r
211 \r
212 \note\r
213  - Pins (Pin Under Test and Auxiliary Pin) should not have any external resistors or any external devices connected to it except the low resistance resistor used for testing.\r
214 \r
215 \defgroup gpio_tests Tests\r
216 \ingroup dv_gpio\r
217 @{\r
218 */\r
219 \r
220 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/\r
221 /* GPIO tests                                                                                                               */\r
222 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/\r
223 /**\r
224 \brief  Function: GPIO_Setup\r
225 \details\r
226 The function \b GPIO_Setup verifies the \b Setup function.\r
227 \code\r
228   int32_t Setup (ARM_GPIO_Pin_t pin, ARM_GPIO_SignalEvent_t cb_event);\r
229 \endcode\r
230 \r
231 Testing sequence:\r
232   - Call Setup function (without callback specified) and assert that it returned ARM_DRIVER_OK status\r
233   - Call Setup function (with callback specified) and assert that it returned ARM_DRIVER_OK status\r
234 */\r
235 void GPIO_Setup (void) {\r
236 \r
237   if (PinUnderTestIsAvailable() != EXIT_SUCCESS) { TEST_FAIL(); return; }\r
238 \r
239   // Call Setup function (without callback specified) and assert that it returned ARM_DRIVER_OK status\r
240   TEST_ASSERT(drv->Setup(GPIO_CFG_PIN_UNDER_TEST, NULL) == ARM_DRIVER_OK);\r
241 \r
242   // Call Setup function (with callback specified) and assert that it returned ARM_DRIVER_OK status\r
243   TEST_ASSERT(drv->Setup(GPIO_CFG_PIN_UNDER_TEST, GPIO_DrvEvent) == ARM_DRIVER_OK);\r
244 \r
245   PinUnderTestUninit();\r
246 }\r
247 \r
248 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/\r
249 /**\r
250 \brief  Function: GPIO_SetDirection\r
251 \details\r
252 The function \b GPIO_SetDirection verifies the \b SetDirection function.\r
253 \code\r
254   int32_t ARM_GPIO_SetDirection (ARM_GPIO_Pin_t pin, ARM_GPIO_DIRECTION direction);\r
255 \endcode\r
256 \r
257 Testing sequence:\r
258   - Call SetDirection function (with Input direction) and assert that it returned ARM_DRIVER_OK status\r
259   - Configure Auxiliary Pin as Output\r
260   - Drive Auxiliary Pin low\r
261   - Read Pin Under Test input level and assert that it returned 0\r
262   - Drive Auxiliary Pin high\r
263   - Read Pin Under Test input level and assert that it returned 1\r
264   - Configure Auxiliary Pin as Input\r
265   - Call SetDirection function (with Output direction) and assert that it returned ARM_DRIVER_OK status\r
266   - Call SetOutput function and set output level low\r
267   - Read Auxiliary Pin input level and assert that it returned 0\r
268   - Call SetOutput function and set output level high\r
269   - Read Auxiliary Pin input level and assert that it returned 1\r
270 */\r
271 void GPIO_SetDirection (void) {\r
272 \r
273   if (PinUnderTestIsAvailable() != EXIT_SUCCESS) { TEST_FAIL(); return; }\r
274   if (AuxiliaryPinIsAvailable() != EXIT_SUCCESS) { TEST_FAIL(); return; }\r
275 \r
276   PinUnderTestInit();\r
277   AuxiliaryPinInit();\r
278 \r
279   // Call SetDirection function (with Input direction) and assert that it returned ARM_DRIVER_OK status\r
280   TEST_ASSERT(drv->SetDirection(GPIO_CFG_PIN_UNDER_TEST, ARM_GPIO_INPUT) == ARM_DRIVER_OK);\r
281 \r
282   // Configure Auxiliary Pin as Output\r
283   AuxiliaryPinConfigOutput();\r
284 \r
285   // Drive Auxiliary Pin low\r
286   AuxiliaryPinSetOutput(0U);\r
287 \r
288   // Read Pin Under Test input level and assert that it returned 0\r
289   TEST_ASSERT(drv->GetInput(GPIO_CFG_PIN_UNDER_TEST) == 0U);\r
290 \r
291   // Drive Auxiliary Pin high\r
292   AuxiliaryPinSetOutput(1U);\r
293 \r
294   // Read Pin Under Test input level and assert that it returned 1\r
295   TEST_ASSERT(drv->GetInput(GPIO_CFG_PIN_UNDER_TEST) == 1U);\r
296 \r
297   // Configure Auxiliary Pin as Input\r
298   AuxiliaryPinConfigInput();\r
299 \r
300   // Call SetDirection function (with Output direction) and assert that it returned ARM_DRIVER_OK status\r
301   TEST_ASSERT(drv->SetDirection(GPIO_CFG_PIN_UNDER_TEST, ARM_GPIO_OUTPUT) == ARM_DRIVER_OK);\r
302 \r
303   // Call SetOutput function and set output level low\r
304   drv->SetOutput(GPIO_CFG_PIN_UNDER_TEST, 0U);\r
305 \r
306  (void)osDelay(2U);\r
307 \r
308   // Read Auxiliary Pin input level and assert that it returned 0\r
309   TEST_ASSERT(drv->GetInput(GPIO_CFG_PIN_AUX) == 0U);\r
310 \r
311   // Call SetOutput function and set output level high\r
312   drv->SetOutput(GPIO_CFG_PIN_UNDER_TEST, 1U);\r
313 \r
314  (void)osDelay(2U);\r
315 \r
316   // Read Auxiliary Pin input level and assert that it returned 1\r
317   TEST_ASSERT(drv->GetInput(GPIO_CFG_PIN_AUX) == 1U);\r
318 \r
319   AuxiliaryPinUninit();\r
320   PinUnderTestUninit();\r
321 }\r
322 \r
323 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/\r
324 /**\r
325 \brief  Function: GPIO_SetOutputMode\r
326 \details\r
327 The function \b GPIO_SetOutputMode verifies the \b SetOutputMode function.\r
328 \code\r
329   int32_t ARM_GPIO_SetOutputMode (ARM_GPIO_Pin_t pin, ARM_GPIO_OUTPUT_MODE mode);\r
330 \endcode\r
331 \r
332 Testing sequence:\r
333   - Call SetDirection function (with Output direction) and assert that it returned ARM_DRIVER_OK status\r
334   - Call SetOutputMode function (with Push-pull mode) and assert that it returned ARM_DRIVER_OK status\r
335   - Configure Auxiliary Pin as Input\r
336   - Call SetOutput function and set output level low\r
337   - Read Auxiliary Pin input level and assert that it returned 0\r
338   - Call SetOutput function and set output level high\r
339   - Read Auxiliary Pin input level and assert that it returned 1\r
340   - Call SetOutputMode function (with Open-drain mode) and assert that it returned ARM_DRIVER_OK status\r
341   - Call SetOutput function and set output level low\r
342   - Read Auxiliary Pin input level and assert that it returned 0\r
343 */\r
344 void GPIO_SetOutputMode (void) {\r
345 \r
346   if (PinUnderTestIsAvailable() != EXIT_SUCCESS) { TEST_FAIL(); return; }\r
347   if (AuxiliaryPinIsAvailable() != EXIT_SUCCESS) { TEST_FAIL(); return; }\r
348 \r
349   PinUnderTestInit();\r
350   AuxiliaryPinInit();\r
351 \r
352   // Call SetDirection function (with Output direction) and assert that it returned ARM_DRIVER_OK status\r
353   TEST_ASSERT(drv->SetDirection(GPIO_CFG_PIN_UNDER_TEST, ARM_GPIO_OUTPUT) == ARM_DRIVER_OK);\r
354 \r
355   // Call SetOutputMode function (with Push-pull mode) and assert that it returned ARM_DRIVER_OK status\r
356   TEST_ASSERT(drv->SetOutputMode(GPIO_CFG_PIN_UNDER_TEST, ARM_GPIO_PUSH_PULL) == ARM_DRIVER_OK);\r
357 \r
358   // Configure Auxiliary Pin as Input\r
359   AuxiliaryPinConfigInput();\r
360 \r
361   // Call SetOutput function and set output level low\r
362   drv->SetOutput(GPIO_CFG_PIN_UNDER_TEST, 0U);\r
363 \r
364   (void)osDelay(2U);\r
365 \r
366   // Read Auxiliary Pin input level and assert that it returned 0\r
367   TEST_ASSERT(drv->GetInput(GPIO_CFG_PIN_AUX) == 0U);\r
368 \r
369   // Call SetOutput function and set output level high\r
370   drv->SetOutput(GPIO_CFG_PIN_UNDER_TEST, 1U);\r
371 \r
372   (void)osDelay(2U);\r
373 \r
374   // Read Auxiliary Pin input level and assert that it returned 1\r
375   TEST_ASSERT(drv->GetInput(GPIO_CFG_PIN_AUX) == 1U);\r
376 \r
377   // Call SetOutputMode function (with Open-drain mode) and assert that it returned ARM_DRIVER_OK status\r
378   TEST_ASSERT(drv->SetOutputMode(GPIO_CFG_PIN_UNDER_TEST, ARM_GPIO_OPEN_DRAIN) == ARM_DRIVER_OK);\r
379 \r
380   // Call SetOutput function and set output level low\r
381   drv->SetOutput(GPIO_CFG_PIN_UNDER_TEST, 0U);\r
382 \r
383   (void)osDelay(2U);\r
384 \r
385   // Read Auxiliary Pin input level and assert that it returned 0\r
386   TEST_ASSERT(drv->GetInput(GPIO_CFG_PIN_AUX) == 0U);\r
387 \r
388   AuxiliaryPinUninit();\r
389   PinUnderTestUninit();\r
390 }\r
391 \r
392 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/\r
393 /**\r
394 \brief  Function: GPIO_SetPullResistor\r
395 \details\r
396 The function \b GPIO_SetPullResistor verifies the \b SetPullResistor function.\r
397 \code\r
398   int32_t ARM_GPIO_SetPullResistor (ARM_GPIO_Pin_t pin, ARM_GPIO_PULL_RESISTOR resistor);\r
399 \endcode\r
400 \r
401 Testing sequence:\r
402   - Call SetDirection function (with Input direction) and assert that it returned ARM_DRIVER_OK status\r
403   - Call SetPullResistor function (without resistor) and assert that it returned ARM_DRIVER_OK status\r
404   - Configure Auxiliary Pin as Output\r
405   - Drive Auxiliary Pin low\r
406   - Read Pin Under Test input level and assert that it returned 0\r
407   - Drive Auxiliary Pin high\r
408   - Read Pin Under Test input level and assert that it returned 1\r
409   - Configure Auxiliary Pin as Input\r
410   - Call SetPullResistor function (with Pull-down resistor) and assert that it returned ARM_DRIVER_OK status\r
411   - Read Pin Under Test input level and assert that it returned 0\r
412   - Configure Auxiliary Pin as Output\r
413   - Drive Auxiliary Pin high\r
414   - Read Pin Under Test input level and assert that it returned 1\r
415   - Configure Auxiliary Pin as Input\r
416   - Call SetPullResistor function (with Pull-up resistor) and assert that it returned ARM_DRIVER_OK status\r
417   - Read Pin Under Test input level and assert that it returned 1\r
418   - Configure Auxiliary Pin as Output\r
419   - Drive Auxiliary Pin low\r
420   - Read Pin Under Test input level and assert that it returned 0\r
421 */\r
422 void GPIO_SetPullResistor (void) {\r
423 \r
424   if (PinUnderTestIsAvailable() != EXIT_SUCCESS) { TEST_FAIL(); return; }\r
425   if (AuxiliaryPinIsAvailable() != EXIT_SUCCESS) { TEST_FAIL(); return; }\r
426 \r
427   PinUnderTestInit();\r
428   AuxiliaryPinInit();\r
429 \r
430   // Call SetDirection function (with Input direction) and assert that it returned ARM_DRIVER_OK status\r
431   TEST_ASSERT(drv->SetDirection(GPIO_CFG_PIN_UNDER_TEST, ARM_GPIO_INPUT) == ARM_DRIVER_OK);\r
432 \r
433   // Call SetPullResistor function (without resistor) and assert that it returned ARM_DRIVER_OK status\r
434   TEST_ASSERT(drv->SetPullResistor(GPIO_CFG_PIN_UNDER_TEST, ARM_GPIO_PULL_NONE) == ARM_DRIVER_OK);\r
435 \r
436   // Configure Auxiliary Pin as Output\r
437   AuxiliaryPinConfigOutput();\r
438 \r
439   // Drive Auxiliary Pin low\r
440   AuxiliaryPinSetOutput(0U);\r
441 \r
442   // Read Pin Under Test input level and assert that it returned 0\r
443   TEST_ASSERT(drv->GetInput(GPIO_CFG_PIN_UNDER_TEST) == 0U);\r
444 \r
445   // Drive Auxiliary Pin high\r
446   AuxiliaryPinSetOutput(1U);\r
447 \r
448   // Read Pin Under Test input level and assert that it returned 1\r
449   TEST_ASSERT(drv->GetInput(GPIO_CFG_PIN_UNDER_TEST) == 1U);\r
450 \r
451   // Configure Auxiliary Pin as Input\r
452   AuxiliaryPinConfigInput();\r
453 \r
454   (void)osDelay(2U);\r
455 \r
456   // Call SetPullResistor function (with Pull-down resistor) and assert that it returned ARM_DRIVER_OK status\r
457   TEST_ASSERT(drv->SetPullResistor(GPIO_CFG_PIN_UNDER_TEST, ARM_GPIO_PULL_DOWN) == ARM_DRIVER_OK);\r
458 \r
459   (void)osDelay(2U);\r
460 \r
461   // Read Pin Under Test input level and assert that it returned 0\r
462   TEST_ASSERT(drv->GetInput(GPIO_CFG_PIN_UNDER_TEST) == 0U);\r
463 \r
464   // Configure Auxiliary Pin as Output\r
465   AuxiliaryPinConfigOutput();\r
466 \r
467   // Drive Auxiliary Pin high\r
468   AuxiliaryPinSetOutput(1U);\r
469 \r
470   // Read Pin Under Test input level and assert that it returned 1\r
471   TEST_ASSERT(drv->GetInput(GPIO_CFG_PIN_UNDER_TEST) == 1U);\r
472 \r
473   // Configure Auxiliary Pin as Input\r
474   AuxiliaryPinConfigInput();\r
475 \r
476   (void)osDelay(2U);\r
477 \r
478   // Call SetPullResistor function (with Pull-up resistor) and assert that it returned ARM_DRIVER_OK status\r
479   TEST_ASSERT(drv->SetPullResistor(GPIO_CFG_PIN_UNDER_TEST, ARM_GPIO_PULL_UP) == ARM_DRIVER_OK);\r
480 \r
481   (void)osDelay(2U);\r
482 \r
483   // Read Pin Under Test input level and assert that it returned 1\r
484   TEST_ASSERT(drv->GetInput(GPIO_CFG_PIN_UNDER_TEST) == 1U);\r
485 \r
486   // Configure Auxiliary Pin as Output\r
487   AuxiliaryPinConfigOutput();\r
488 \r
489   // Drive Auxiliary Pin low\r
490   AuxiliaryPinSetOutput(0U);\r
491 \r
492   // Read Pin Under Test input level and assert that it returned 0\r
493   TEST_ASSERT(drv->GetInput(GPIO_CFG_PIN_UNDER_TEST) == 0U);\r
494 \r
495   AuxiliaryPinUninit();\r
496   PinUnderTestUninit();\r
497 }\r
498 \r
499 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/\r
500 /**\r
501 \brief  Function: GPIO_SetEventTrigger\r
502 \details\r
503 The function \b GPIO_SetEventTrigger verifies the \b SetEventTrigger function.\r
504 \code\r
505   int32_t ARM_GPIO_SetEventTrigger (ARM_GPIO_Pin_t pin, ARM_GPIO_EVENT_TRIGGER trigger);\r
506 \endcode\r
507 \r
508 Testing sequence:\r
509   - Call Setup function (with callback specified) and assert that it returned ARM_DRIVER_OK status\r
510   - Configure Auxiliary Pin as Output\r
511   - Drive Auxiliary Pin low\r
512   - Call SetEventTrigger function (configure trigger on Rising-edge) and assert that it returned ARM_DRIVER_OK status\r
513   - Drive Auxiliary Pin high thus generate Rising-edge\r
514   - Assert that event ARM_GPIO_EVENT_RISING_EDGE was signaled\r
515   - Assert that event was signaled on Pin Under Test pin\r
516   - Assert that only 1 event was signaled\r
517   - Drive Auxiliary Pin low thus generate Falling-edge\r
518   - Assert that event was not signaled\r
519   - Drive Auxiliary Pin high\r
520   - Call SetEventTrigger function (configure trigger on Falling-edge) and assert that it returned ARM_DRIVER_OK status\r
521   - Drive Auxiliary Pin low thus generate Falling-edge\r
522   - Assert that event ARM_GPIO_EVENT_FALLING_EDGE was signaled\r
523   - Assert that event was signaled on Pin Under Test pin\r
524   - Assert that only 1 event was signaled\r
525   - Drive Auxiliary Pin high thus generate Rising-edge\r
526   - Assert that event was not signaled\r
527   - Drive Auxiliary Pin low\r
528   - Call SetEventTrigger function (configure trigger on Either-edge) and assert that it returned ARM_DRIVER_OK status\r
529   - Drive Auxiliary Pin high thus generate Rising-edge\r
530   - Assert that event ARM_GPIO_EVENT_RISING_EDGE or ARM_GPIO_EVENT_EITHER_EDGE was signaled\r
531   - Assert that event was signaled on Pin Under Test pin\r
532   - Assert that only 1 event was signaled\r
533   - Drive Auxiliary Pin low thus generate Falling-edge\r
534   - Assert that event ARM_GPIO_EVENT_FALLING_EDGE or ARM_GPIO_EVENT_EITHER_EDGE was signaled\r
535   - Assert that event was signaled on Pin Under Test pin\r
536   - Assert that only 1 event was signaled\r
537   - Drive Auxiliary Pin low\r
538   - Call SetEventTrigger function (disable trigger) and assert that it returned ARM_DRIVER_OK status\r
539   - Drive Auxiliary Pin high thus generate Rising-edge\r
540   - Drive Auxiliary Pin low thus generate Falling-edge\r
541   - Assert that event was not signaled\r
542 */\r
543 void GPIO_SetEventTrigger (void) {\r
544 \r
545   if (PinUnderTestIsAvailable() != EXIT_SUCCESS) { TEST_FAIL(); return; }\r
546   if (AuxiliaryPinIsAvailable() != EXIT_SUCCESS) { TEST_FAIL(); return; }\r
547 \r
548   PinUnderTestInit();\r
549   AuxiliaryPinInit();\r
550 \r
551   // Call Setup function (with callback specified) and assert that it returned ARM_DRIVER_OK status\r
552   TEST_ASSERT(drv->Setup(GPIO_CFG_PIN_UNDER_TEST, GPIO_DrvEvent) == ARM_DRIVER_OK);\r
553 \r
554   // Configure Auxiliary Pin as Output\r
555   AuxiliaryPinConfigOutput();\r
556 \r
557   // Test Rising-edge\r
558   // Drive Auxiliary Pin low\r
559   AuxiliaryPinSetOutput(0U);\r
560 \r
561   event     = 0U;\r
562   event_pin = 0U;\r
563   event_cnt = 0U;\r
564 \r
565   // Call SetEventTrigger function (configure trigger on Rising-edge) and assert that it returned ARM_DRIVER_OK status\r
566   TEST_ASSERT(drv->SetEventTrigger(GPIO_CFG_PIN_UNDER_TEST, ARM_GPIO_TRIGGER_RISING_EDGE) == ARM_DRIVER_OK);\r
567 \r
568   // Drive Auxiliary Pin high thus generate Rising-edge\r
569   AuxiliaryPinSetOutput(1U);\r
570 \r
571   // Assert that event ARM_GPIO_EVENT_RISING_EDGE was signaled\r
572   TEST_ASSERT_MESSAGE(event == ARM_GPIO_EVENT_RISING_EDGE, "[FAILED] Event ARM_GPIO_EVENT_RISING_EDGE was not signaled!");\r
573 \r
574   // Assert that event was signaled on Pin Under Test pin\r
575   TEST_ASSERT_MESSAGE(event_pin == (uint32_t)GPIO_CFG_PIN_UNDER_TEST, "[FAILED] Event was not signaled on Pin Under Test pin!");\r
576 \r
577   if (event_cnt != 1U) {\r
578     // If number of events signaled was different than 1\r
579     (void)snprintf(msg_buf, sizeof(msg_buf), "[FAILED] Number of signaled events was %i! Expected number of events was 1!", event_cnt);\r
580   }\r
581   // Assert that only 1 event was signaled\r
582   TEST_ASSERT_MESSAGE(event_cnt == 1U, msg_buf);\r
583 \r
584   event     = 0U;\r
585   event_pin = 0U;\r
586   event_cnt = 0U;\r
587 \r
588   // Drive Auxiliary Pin low thus generate Falling-edge\r
589   AuxiliaryPinSetOutput(0U);\r
590 \r
591   // Assert that event was not signaled\r
592   TEST_ASSERT_MESSAGE(event_cnt == 0U, "[FAILED] Event was signaled on Pin Under Test pin! Event signaled on falling-edge for rising-edge trigger!");\r
593 \r
594   // Test Falling-edge\r
595   // Drive Auxiliary Pin high\r
596   AuxiliaryPinSetOutput(1U);\r
597 \r
598   event     = 0U;\r
599   event_pin = 0U;\r
600   event_cnt = 0U;\r
601 \r
602   // Call SetEventTrigger function (configure trigger on Falling-edge) and assert that it returned ARM_DRIVER_OK status\r
603   TEST_ASSERT(drv->SetEventTrigger(GPIO_CFG_PIN_UNDER_TEST, ARM_GPIO_TRIGGER_FALLING_EDGE) == ARM_DRIVER_OK);\r
604 \r
605   // Drive Auxiliary Pin low thus generate Falling-edge\r
606   AuxiliaryPinSetOutput(0U);\r
607 \r
608   // Assert that event ARM_GPIO_EVENT_FALLING_EDGE was signaled\r
609   TEST_ASSERT_MESSAGE(event == ARM_GPIO_EVENT_FALLING_EDGE, "[FAILED] Event ARM_GPIO_EVENT_FALLING_EDGE was not signaled!");\r
610 \r
611   // Assert that event was signaled on Pin Under Test pin\r
612   TEST_ASSERT_MESSAGE(event_pin == (uint32_t)GPIO_CFG_PIN_UNDER_TEST, "[FAILED] Event was not signaled on Pin Under Test pin!");\r
613 \r
614   if (event_cnt != 1U) {\r
615     // If number of events signaled was different than 1\r
616     (void)snprintf(msg_buf, sizeof(msg_buf), "[FAILED] Number of signaled events was %i! Expected number of events was 1!", event_cnt);\r
617   }\r
618   // Assert that only 1 event was signaled\r
619   TEST_ASSERT_MESSAGE(event_cnt == 1U, msg_buf);\r
620 \r
621   event     = 0U;\r
622   event_pin = 0U;\r
623   event_cnt = 0U;\r
624 \r
625   // Drive Auxiliary Pin high thus generate Rising-edge\r
626   AuxiliaryPinSetOutput(0U);\r
627 \r
628   // Assert that event was not signaled\r
629   TEST_ASSERT_MESSAGE(event_cnt == 0U, "[FAILED] Event was signaled on Pin Under Test pin! Event signaled on rising-edge for falling-edge trigger!");\r
630 \r
631   // Test Either-edge\r
632   // Drive Auxiliary Pin low\r
633   AuxiliaryPinSetOutput(0U);\r
634 \r
635   event     = 0U;\r
636   event_pin = 0U;\r
637   event_cnt = 0U;\r
638 \r
639   // Call SetEventTrigger function (configure trigger on Either-edge) and assert that it returned ARM_DRIVER_OK status\r
640   TEST_ASSERT(drv->SetEventTrigger(GPIO_CFG_PIN_UNDER_TEST, ARM_GPIO_TRIGGER_EITHER_EDGE) == ARM_DRIVER_OK);\r
641 \r
642   // Drive Auxiliary Pin high thus generate Rising-edge\r
643   AuxiliaryPinSetOutput(1U);\r
644 \r
645   // Assert that event ARM_GPIO_EVENT_RISING_EDGE or ARM_GPIO_EVENT_EITHER_EDGE was signaled\r
646   TEST_ASSERT_MESSAGE((event == ARM_GPIO_EVENT_RISING_EDGE) ||\r
647                       (event == ARM_GPIO_EVENT_EITHER_EDGE), "[FAILED] Event ARM_GPIO_EVENT_RISING_EDGE or ARM_GPIO_EVENT_EITHER_EDGE was not signaled!");\r
648 \r
649   // Assert that event was signaled on Pin Under Test pin\r
650   TEST_ASSERT_MESSAGE(event_pin == (uint32_t)GPIO_CFG_PIN_UNDER_TEST, "[FAILED] Event was not signaled on Pin Under Test pin!");\r
651 \r
652   if (event_cnt != 1U) {\r
653     // If number of events signaled was different than 1\r
654     (void)snprintf(msg_buf, sizeof(msg_buf), "[FAILED] Number of signaled events was %i! Expected number of events was 1!", event_cnt);\r
655   }\r
656   // Assert that only 1 event was signaled\r
657   TEST_ASSERT_MESSAGE(event_cnt == 1U, msg_buf);\r
658 \r
659   event     = 0U;\r
660   event_pin = 0U;\r
661   event_cnt = 0U;\r
662 \r
663   // Drive Auxiliary Pin low thus generate Falling-edge\r
664   AuxiliaryPinSetOutput(0U);\r
665 \r
666   // Assert that event ARM_GPIO_EVENT_FALLING_EDGE or ARM_GPIO_EVENT_EITHER_EDGE was signaled\r
667   TEST_ASSERT_MESSAGE((event == ARM_GPIO_EVENT_FALLING_EDGE) ||\r
668                       (event == ARM_GPIO_EVENT_EITHER_EDGE), "[FAILED] Event ARM_GPIO_EVENT_FALLING_EDGE or ARM_GPIO_EVENT_EITHER_EDGE was not signaled!");\r
669 \r
670   // Assert that event was signaled on Pin Under Test pin\r
671   TEST_ASSERT_MESSAGE(event_pin == (uint32_t)GPIO_CFG_PIN_UNDER_TEST, "[FAILED] Event was not signaled on Pin Under Test pin!");\r
672 \r
673   if (event_cnt != 1U) {\r
674     // If number of events signaled was different than 1\r
675     (void)snprintf(msg_buf, sizeof(msg_buf), "[FAILED] Number of signaled events was %i! Expected number of events was 1!", event_cnt);\r
676   }\r
677   // Assert that only 1 event was signaled\r
678   TEST_ASSERT_MESSAGE(event_cnt == 1U, msg_buf);\r
679 \r
680   // Test no trigger enabled functionality\r
681   // Drive Auxiliary Pin low\r
682   AuxiliaryPinSetOutput(0U);\r
683 \r
684   event     = 0U;\r
685   event_pin = 0U;\r
686   event_cnt = 0U;\r
687 \r
688   // Call SetEventTrigger function (disable trigger) and assert that it returned ARM_DRIVER_OK status\r
689   TEST_ASSERT(drv->SetEventTrigger(GPIO_CFG_PIN_UNDER_TEST, ARM_GPIO_TRIGGER_NONE) == ARM_DRIVER_OK);\r
690 \r
691   // Drive Auxiliary Pin high thus generate Rising-edge\r
692   AuxiliaryPinSetOutput(1U);\r
693 \r
694   // Drive Auxiliary Pin low thus generate Falling-edge\r
695   AuxiliaryPinSetOutput(0U);\r
696 \r
697   // Assert that event was not signaled\r
698   TEST_ASSERT_MESSAGE(event_cnt == 0U, "[FAILED] Event was signaled on Pin Under Test pin with trigger functionality disabled!");\r
699 \r
700   AuxiliaryPinUninit();\r
701   PinUnderTestUninit();\r
702 }\r
703 \r
704 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/\r
705 /**\r
706 \brief  Function: GPIO_SetOutput\r
707 \details\r
708 The function \b GPIO_SetOutput verifies the \b SetOutput function.\r
709 \r
710 Testing sequence:\r
711   - Call SetDirection function (with Output direction) and assert that it returned ARM_DRIVER_OK status\r
712   - Call SetOutputMode function (with Push-pull mode) and assert that it returned ARM_DRIVER_OK status\r
713   - Configure Auxiliary Pin as Input\r
714   - Call SetOutput function and set output level low\r
715   - Read Auxiliary Pin input level and assert that it returned 0\r
716   - Call SetOutput function and set output level high\r
717   - Read Auxiliary Pin input level and assert that it returned 1\r
718 */\r
719 void GPIO_SetOutput (void) {\r
720 \r
721   if (PinUnderTestIsAvailable() != EXIT_SUCCESS) { TEST_FAIL(); return; }\r
722   if (AuxiliaryPinIsAvailable() != EXIT_SUCCESS) { TEST_FAIL(); return; }\r
723 \r
724   PinUnderTestInit();\r
725   AuxiliaryPinInit();\r
726 \r
727   // Call SetDirection function (with Output direction) and assert that it returned ARM_DRIVER_OK status\r
728   TEST_ASSERT(drv->SetDirection(GPIO_CFG_PIN_UNDER_TEST, ARM_GPIO_OUTPUT) == ARM_DRIVER_OK);\r
729 \r
730   // Call SetOutputMode function (with Push-pull mode) and assert that it returned ARM_DRIVER_OK status\r
731   TEST_ASSERT(drv->SetOutputMode(GPIO_CFG_PIN_UNDER_TEST, ARM_GPIO_PUSH_PULL) == ARM_DRIVER_OK);\r
732 \r
733   // Configure Auxiliary Pin as Input\r
734   AuxiliaryPinConfigInput();\r
735 \r
736   // Call SetOutput function and set output level low\r
737   drv->SetOutput(GPIO_CFG_PIN_UNDER_TEST, 0U);\r
738 \r
739   (void)osDelay(2U);\r
740 \r
741   // Read Auxiliary Pin input level and assert that it returned 0\r
742   TEST_ASSERT(drv->GetInput(GPIO_CFG_PIN_AUX) == 0U);\r
743 \r
744   // Call SetOutput function and set output level high\r
745   drv->SetOutput(GPIO_CFG_PIN_UNDER_TEST, 1U);\r
746 \r
747   (void)osDelay(2U);\r
748 \r
749   // Read Auxiliary Pin input level and assert that it returned 1\r
750   TEST_ASSERT(drv->GetInput(GPIO_CFG_PIN_AUX) == 1U);\r
751 \r
752   AuxiliaryPinUninit();\r
753   PinUnderTestUninit();\r
754 }\r
755 \r
756 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/\r
757 /**\r
758 \brief  Function: GPIO_GetInput\r
759 \details\r
760 The function \b GPIO_GetInput verifies the \b GetInput function.\r
761 \r
762 Testing sequence:\r
763   - Call SetDirection function (with Input direction) and assert that it returned ARM_DRIVER_OK status\r
764   - Configure Auxiliary Pin as Output\r
765   - Drive Auxiliary Pin low\r
766   - Read Pin Under Test input level and assert that it returned 0\r
767   - Drive Auxiliary Pin high\r
768   - Read Pin Under Test input level and assert that it returned 1\r
769 */\r
770 void GPIO_GetInput (void) {\r
771 \r
772   if (PinUnderTestIsAvailable() != EXIT_SUCCESS) { TEST_FAIL(); return; }\r
773   if (AuxiliaryPinIsAvailable() != EXIT_SUCCESS) { TEST_FAIL(); return; }\r
774 \r
775   PinUnderTestInit();\r
776   AuxiliaryPinInit();\r
777 \r
778   // Call SetDirection function (with Input direction) and assert that it returned ARM_DRIVER_OK status\r
779   TEST_ASSERT(drv->SetDirection(GPIO_CFG_PIN_UNDER_TEST, ARM_GPIO_INPUT) == ARM_DRIVER_OK);\r
780 \r
781   // Configure Auxiliary Pin as Output\r
782   AuxiliaryPinConfigOutput();\r
783 \r
784   // Drive Auxiliary Pin low\r
785   AuxiliaryPinSetOutput(0U);\r
786 \r
787  (void)osDelay(2U);\r
788 \r
789   // Read Pin Under Test input level and assert that it returned 0\r
790   TEST_ASSERT(drv->GetInput(GPIO_CFG_PIN_UNDER_TEST) == 0U);\r
791 \r
792   // Drive Auxiliary Pin high\r
793   AuxiliaryPinSetOutput(1U);\r
794 \r
795  (void)osDelay(2U);\r
796 \r
797   // Read Pin Under Test input level and assert that it returned 1\r
798   TEST_ASSERT(drv->GetInput(GPIO_CFG_PIN_UNDER_TEST) == 1U);\r
799 \r
800   AuxiliaryPinUninit();\r
801   PinUnderTestUninit();\r
802 }\r
803 \r
804 /**\r
805 @}\r
806 */\r
807 // end of group dv_gpio\r