VSF Documented
gpio_template.inc
Go to the documentation of this file.
1/*****************************************************************************
2 * Copyright(C)2009-2022 by VSF Team *
3 * *
4 * Licensed under the Apache License, Version 2.0 (the "License"); *
5 * you may not use this file except in compliance with the License. *
6 * You may obtain a copy of the License at *
7 * *
8 * http://www.apache.org/licenses/LICENSE-2.0 *
9 * *
10 * Unless required by applicable law or agreed to in writing, software *
11 * distributed under the License is distributed on an "AS IS" BASIS, *
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
13 * See the License for the specific language governing permissions and *
14 * limitations under the License. *
15 * *
16 ****************************************************************************/
17
18/*============================ INCLUDES ======================================*/
19
21
22#if VSF_HAL_USE_GPIO == ENABLED
23
24/*============================ MACROS ========================================*/
25
26#ifndef VSF_GPIO_CFG_RETAIN_DEFINED_PREFIX
27# define VSF_GPIO_CFG_RETAIN_DEFINED_PREFIX DISABLED
28#endif
29
30#ifndef VSF_GPIO_CFG_REIMPLEMENT_API_SET_INPUT
31# define VSF_GPIO_CFG_REIMPLEMENT_API_SET_INPUT DISABLED
32#endif
33
34#ifndef VSF_GPIO_CFG_REIMPLEMENT_API_SET_INPUT
35# define VSF_GPIO_CFG_REIMPLEMENT_API_SET_INPUT DISABLED
36#endif
37
38#ifndef VSF_GPIO_CFG_REIMPLEMENT_API_SET_OUTPUT
39# define VSF_GPIO_CFG_REIMPLEMENT_API_SET_OUTPUT DISABLED
40#endif
41
42#ifndef VSF_GPIO_CFG_REIMPLEMENT_API_SWITCH_DIRECTION
43# define VSF_GPIO_CFG_REIMPLEMENT_API_SWITCH_DIRECTION DISABLED
44#endif
45
46#ifndef VSF_GPIO_CFG_REIMPLEMENT_API_SET
47# define VSF_GPIO_CFG_REIMPLEMENT_API_SET DISABLED
48#endif
49
50#ifndef VSF_GPIO_CFG_REIMPLEMENT_API_CLEAR
51# define VSF_GPIO_CFG_REIMPLEMENT_API_CLEAR DISABLED
52#endif
53
54#ifndef VSF_GPIO_CFG_REIMPLEMENT_API_OUTPUT_AND_SET
55# define VSF_GPIO_CFG_REIMPLEMENT_API_OUTPUT_AND_SET DISABLED
56#endif
57
58#ifndef VSF_GPIO_CFG_REIMPLEMENT_API_OUTPUT_AND_CLEAR
59# define VSF_GPIO_CFG_REIMPLEMENT_API_OUTPUT_AND_CLEAR DISABLED
60#endif
61
62#ifndef VSF_GPIO_CFG_REIMPLEMENT_API_GET_PIN_CONFIGURATION
63# define VSF_GPIO_CFG_REIMPLEMENT_API_GET_PIN_CONFIGURATION DISABLED
64#endif
65
66#ifndef VSF_GPIO_CFG_REIMPLEMENT_API_READ_OUTPUT_REGISTER
67# define VSF_GPIO_CFG_REIMPLEMENT_API_READ_OUTPUT_REGISTER DISABLED
68#endif
69
70#ifndef VSF_GPIO_CFG_REIMPLEMENT_API_PORTS_CONFIG_PIN
71# define VSF_GPIO_CFG_REIMPLEMENT_API_PORTS_CONFIG_PIN DISABLED
72#endif
73
74#ifndef VSF_GPIO_CFG_REIMPLEMENT_API_PORTS_CONFIG_PINS
75# define VSF_GPIO_CFG_REIMPLEMENT_API_PORTS_CONFIG_PINS DISABLED
76#endif
77
78#ifndef VSF_GPIO_CFG_CHANGE_DIR_FIRST
79# define VSF_GPIO_CFG_CHANGE_DIR_FIRST ENABLED
80#endif
81
82#ifndef VSF_GPIO_CFG_CAPABILITY_SUPPORT_CONFIG_PIN
83# define VSF_GPIO_CFG_CAPABILITY_SUPPORT_CONFIG_PIN 1
84#endif
85
86#ifndef VSF_GPIO_CFG_CAPABILITY_SUPPORT_OUTPUT_AND_SET
87# define VSF_GPIO_CFG_CAPABILITY_SUPPORT_OUTPUT_AND_SET 0
88#endif
89
90#ifndef VSF_GPIO_CFG_CAPABILITY_SUPPORT_OUTPUT_AND_CLEAR
91# define VSF_GPIO_CFG_CAPABILITY_SUPPORT_OUTPUT_AND_CLEAR 0
92#endif
93
94#ifndef VSF_GPIO_CFG_CAPABILITY_SUPPORT_INTERRUPT
95# define VSF_GPIO_CFG_CAPABILITY_SUPPORT_INTERRUPT 1
96#endif
97
98#ifndef VSF_GPIO_CFG_CAPABILITY_CAN_READ_IN_GPIO_OUTPUT_MODE
99# define VSF_GPIO_CFG_CAPABILITY_CAN_READ_IN_GPIO_OUTPUT_MODE 0
100#endif
101
102#ifndef VSF_GPIO_CFG_CAPABILITY_CAN_READ_IN_ALTERNATE_MODE
103# define VSF_GPIO_CFG_CAPABILITY_CAN_READ_IN_ALTERNATE_MODE 0
104#endif
105
106#ifndef VSF_GPIO_CFG_REIMPLEMENT_API_CAPABILITY
107# define VSF_GPIO_CFG_REIMPLEMENT_API_CAPABILITY DISABLED
108#endif
109
110#ifndef VSF_GPIO_CFG_REIMPLEMENT_API_EXTI_IRQ_GET_CONFIGURATION
111# define VSF_GPIO_CFG_REIMPLEMENT_API_EXTI_IRQ_GET_CONFIGURATION DISABLED
112#endif
113
114#ifndef VSF_GPIO_CFG_REIMPLEMENT_API_EXTI_IRQ_CLEAR
115# define VSF_GPIO_CFG_REIMPLEMENT_API_EXTI_IRQ_CLEAR DISABLED
116#endif
117
118#ifndef VSF_GPIO_CFG_REIMPLEMENT_API_CTRL
119# define VSF_GPIO_CFG_REIMPLEMENT_API_CTRL DISABLED
120#endif
121
122#ifdef VSF_GPIO_CFG_IMP_REMAP_PREFIX
123# undef VSF_GPIO_CFG_REIMPLEMENT_API_SET_INPUT
124# undef VSF_GPIO_CFG_REIMPLEMENT_API_SET_OUTPUT
125# undef VSF_GPIO_CFG_REIMPLEMENT_API_SWITCH_DIRECTION
126# undef VSF_GPIO_CFG_REIMPLEMENT_API_SET
127# undef VSF_GPIO_CFG_REIMPLEMENT_API_CLEAR
128# undef VSF_GPIO_CFG_REIMPLEMENT_API_OUTPUT_AND_SET
129# undef VSF_GPIO_CFG_REIMPLEMENT_API_OUTPUT_AND_CLEAR
130# undef VSF_GPIO_CFG_REIMPLEMENT_API_GET_PIN_CONFIGURATION
131# undef VSF_GPIO_CFG_REIMPLEMENT_API_READ_OUTPUT_REGISTER
132# undef VSF_GPIO_CFG_REIMPLEMENT_API_CAPABILITY
133# undef VSF_GPIO_CFG_REIMPLEMENT_API_EXTI_IRQ_GET_CONFIGURATION
134# undef VSF_GPIO_CFG_REIMPLEMENT_API_EXTI_IRQ_CLEAR
135# undef VSF_GPIO_CFG_REIMPLEMENT_API_CTRL
136# define VSF_GPIO_CFG_REIMPLEMENT_API_SET_INPUT ENABLED
137# define VSF_GPIO_CFG_REIMPLEMENT_API_SET_OUTPUT ENABLED
138# define VSF_GPIO_CFG_REIMPLEMENT_API_SWITCH_DIRECTION ENABLED
139# define VSF_GPIO_CFG_REIMPLEMENT_API_SET ENABLED
140# define VSF_GPIO_CFG_REIMPLEMENT_API_CLEAR ENABLED
141# define VSF_GPIO_CFG_REIMPLEMENT_API_OUTPUT_AND_SET ENABLED
142# define VSF_GPIO_CFG_REIMPLEMENT_API_OUTPUT_AND_CLEAR ENABLED
143# define VSF_GPIO_CFG_REIMPLEMENT_API_GET_PIN_CONFIGURATION ENABLED
144# define VSF_GPIO_CFG_REIMPLEMENT_API_READ_OUTPUT_REGISTER ENABLED
145# define VSF_GPIO_CFG_REIMPLEMENT_API_CAPABILITY ENABLED
146# define VSF_GPIO_CFG_REIMPLEMENT_API_EXTI_IRQ_GET_CONFIGURATION ENABLED
147# define VSF_GPIO_CFG_REIMPLEMENT_API_EXTI_IRQ_CLEAR ENABLED
148# define VSF_GPIO_CFG_REIMPLEMENT_API_CTRL ENABLED
149#endif
150
151#if VSF_GPIO_CFG_REIMPLEMENT_API_CAPABILITY == DISABLED
152# ifndef VSF_GPIO_CFG_CAPABILITY_IS_ASYNC
153# define VSF_GPIO_CFG_CAPABILITY_IS_ASYNC 0
154# endif
155
156# ifndef VSF_GPIO_CFG_CAPABILITY_PIN_COUNT
157# define VSF_GPIO_CFG_CAPABILITY_PIN_COUNT 32
158# endif
159# ifndef VSF_GPIO_CFG_CAPABILITY_PIN_MASK
160# define VSF_GPIO_CFG_CAPABILITY_PIN_MASK 0xFFFFFFFF
161# endif
162#endif
163
164#ifndef VSF_GPIO_CFG_REAL_PREFIX
165# if defined(VSF_GPIO_CFG_IMP_RENAME_DEVICE_PREFIX) && (VSF_GPIO_CFG_IMP_RENAME_DEVICE_PREFIX == ENABLED)
166# define VSF_GPIO_CFG_REAL_PREFIX VSF_GPIO_CFG_IMP_DEVICE_PREFIX
167# else
168# define VSF_GPIO_CFG_REAL_PREFIX VSF_GPIO_CFG_IMP_PREFIX
169# endif
170#endif
171
172#if defined(VSF_GPIO_CFG_IMP_RENAME_DEVICE_PREFIX) && (VSF_GPIO_CFG_IMP_RENAME_DEVICE_PREFIX == ENABLED)
173# define vsf_real_gpios VSF_MCONNECT(VSF_GPIO_CFG_IMP_DEVICE_PREFIX, s)
174# define vsf_real_gpio_t VSF_MCONNECT(VSF_GPIO_CFG_IMP_DEVICE_PREFIX, _t)
175# define vsf_real_gpio_port_config_pins VSF_MCONNECT(VSF_GPIO_CFG_IMP_DEVICE_PREFIX, _port_config_pins)
176# define vsf_real_gpio_get_pin_configuration VSF_MCONNECT(VSF_GPIO_CFG_IMP_DEVICE_PREFIX, _get_pin_configuration)
177# define vsf_real_gpio_read VSF_MCONNECT(VSF_GPIO_CFG_IMP_DEVICE_PREFIX, _read)
178# define vsf_real_gpio_read_output_register VSF_MCONNECT(VSF_GPIO_CFG_IMP_DEVICE_PREFIX, _read_output_register)
179# define vsf_real_gpio_set_input VSF_MCONNECT(VSF_GPIO_CFG_IMP_DEVICE_PREFIX, _set_input)
180# define vsf_real_gpio_set_output VSF_MCONNECT(VSF_GPIO_CFG_IMP_DEVICE_PREFIX, _set_output)
181# define vsf_real_gpio_get_direction VSF_MCONNECT(VSF_GPIO_CFG_IMP_DEVICE_PREFIX, _get_direction)
182# define vsf_real_gpio_set_direction VSF_MCONNECT(VSF_GPIO_CFG_IMP_DEVICE_PREFIX, _set_direction)
183# define vsf_real_gpio_switch_direction VSF_MCONNECT(VSF_GPIO_CFG_IMP_DEVICE_PREFIX, _switch_direction)
184# define vsf_real_gpio_write VSF_MCONNECT(VSF_GPIO_CFG_IMP_DEVICE_PREFIX, _write)
185# define vsf_real_gpio_set VSF_MCONNECT(VSF_GPIO_CFG_IMP_DEVICE_PREFIX, _set)
186# define vsf_real_gpio_clear VSF_MCONNECT(VSF_GPIO_CFG_IMP_DEVICE_PREFIX, _clear)
187# define vsf_real_gpio_output_and_set VSF_MCONNECT(VSF_GPIO_CFG_IMP_DEVICE_PREFIX, _output_and_set)
188# define vsf_real_gpio_output_and_clear VSF_MCONNECT(VSF_GPIO_CFG_IMP_DEVICE_PREFIX, _output_and_clear)
189# define vsf_real_gpio_capability VSF_MCONNECT(VSF_GPIO_CFG_IMP_DEVICE_PREFIX, _capability)
190# define vsf_real_gpio_exti_irq_get_configuration VSF_MCONNECT(VSF_GPIO_CFG_IMP_DEVICE_PREFIX, _exti_irq_get_configuration)
191# define vsf_real_gpio_exti_irq_clear VSF_MCONNECT(VSF_GPIO_CFG_IMP_DEVICE_PREFIX, _exti_irq_clear)
192# define vsf_real_gpio_ctrl VSF_MCONNECT(VSF_GPIO_CFG_IMP_DEVICE_PREFIX, _ctrl)
193# define vsf_real_gpio_port_config_pin VSF_MCONNECT(VSF_GPIO_CFG_IMP_DEVICE_PREFIX, _port_config_pin)
194# define vsf_real_gpio_ports_config_pin VSF_MCONNECT(VSF_GPIO_CFG_IMP_DEVICE_PREFIX, _ports_config_pin)
195# define vsf_real_gpio_ports_config_pins VSF_MCONNECT(VSF_GPIO_CFG_IMP_DEVICE_PREFIX, _ports_config_pins)
196#else
197# define vsf_real_gpios VSF_MCONNECT(VSF_GPIO_CFG_REAL_PREFIX, _gpios)
198# define vsf_real_gpio_t VSF_MCONNECT(VSF_GPIO_CFG_REAL_PREFIX, _gpio_t)
199# define vsf_real_gpio_port_config_pins VSF_MCONNECT(VSF_GPIO_CFG_REAL_PREFIX, _gpio_port_config_pins)
200# define vsf_real_gpio_get_pin_configuration VSF_MCONNECT(VSF_GPIO_CFG_REAL_PREFIX, _gpio_get_pin_configuration)
201# define vsf_real_gpio_read VSF_MCONNECT(VSF_GPIO_CFG_REAL_PREFIX, _gpio_read)
202# define vsf_real_gpio_read_output_register VSF_MCONNECT(VSF_GPIO_CFG_REAL_PREFIX, _gpio_read_output_register)
203# define vsf_real_gpio_set_input VSF_MCONNECT(VSF_GPIO_CFG_REAL_PREFIX, _gpio_set_input)
204# define vsf_real_gpio_set_output VSF_MCONNECT(VSF_GPIO_CFG_REAL_PREFIX, _gpio_set_output)
205# define vsf_real_gpio_get_direction VSF_MCONNECT(VSF_GPIO_CFG_REAL_PREFIX, _gpio_get_direction)
206# define vsf_real_gpio_set_direction VSF_MCONNECT(VSF_GPIO_CFG_REAL_PREFIX, _gpio_set_direction)
207# define vsf_real_gpio_switch_direction VSF_MCONNECT(VSF_GPIO_CFG_REAL_PREFIX, _gpio_switch_direction)
208# define vsf_real_gpio_write VSF_MCONNECT(VSF_GPIO_CFG_REAL_PREFIX, _gpio_write)
209# define vsf_real_gpio_set VSF_MCONNECT(VSF_GPIO_CFG_REAL_PREFIX, _gpio_set)
210# define vsf_real_gpio_clear VSF_MCONNECT(VSF_GPIO_CFG_REAL_PREFIX, _gpio_clear)
211# define vsf_real_gpio_output_and_set VSF_MCONNECT(VSF_GPIO_CFG_REAL_PREFIX, _gpio_output_and_set)
212# define vsf_real_gpio_output_and_clear VSF_MCONNECT(VSF_GPIO_CFG_REAL_PREFIX, _gpio_output_and_clear)
213# define vsf_real_gpio_capability VSF_MCONNECT(VSF_GPIO_CFG_REAL_PREFIX, _gpio_capability)
214# define vsf_real_gpio_exti_irq_get_configuration VSF_MCONNECT(VSF_GPIO_CFG_REAL_PREFIX, _gpio_exti_irq_get_configuration)
215# define vsf_real_gpio_exti_irq_clear VSF_MCONNECT(VSF_GPIO_CFG_REAL_PREFIX, _gpio_exti_irq_clear)
216# define vsf_real_gpio_ctrl VSF_MCONNECT(VSF_GPIO_CFG_REAL_PREFIX, _gpio_ctrl)
217# define vsf_real_gpio_port_config_pin VSF_MCONNECT(VSF_GPIO_CFG_REAL_PREFIX, _gpio_port_config_pin)
218# define vsf_real_gpio_ports_config_pin VSF_MCONNECT(VSF_GPIO_CFG_REAL_PREFIX, _gpio_ports_config_pin)
219# define vsf_real_gpio_ports_config_pins VSF_MCONNECT(VSF_GPIO_CFG_REAL_PREFIX, _gpio_ports_config_pins)
220#endif
221
222/*============================ MACROFIED FUNCTIONS ===========================*/
223/*============================ PROTOTYPES ====================================*/
224/*============================ LOCAL VARIABLES ===============================*/
225/*============================ MACROFIED FUNCTIONS ===========================*/
226/*============================ IMPLEMENTATION ================================*/
227
228#if VSF_GPIO_CFG_REIMPLEMENT_API_SET_INPUT == DISABLED
229void vsf_real_gpio_set_input(vsf_real_gpio_t *gpio_ptr, vsf_gpio_pin_mask_t pin_mask)
230{
231 VSF_HAL_ASSERT(NULL != gpio_ptr);
232 VSF_HAL_ASSERT(0 != pin_mask);
233
234 vsf_real_gpio_set_direction(gpio_ptr, pin_mask, 0);
235}
236#endif
237
238#if VSF_GPIO_CFG_REIMPLEMENT_API_SET_OUTPUT == DISABLED
239void vsf_real_gpio_set_output(vsf_real_gpio_t *gpio_ptr, vsf_gpio_pin_mask_t pin_mask)
240{
241 VSF_HAL_ASSERT(NULL != gpio_ptr);
242 VSF_HAL_ASSERT(0 != pin_mask);
243
244 vsf_real_gpio_set_direction(gpio_ptr, pin_mask, pin_mask);
245}
246#endif
247
248#if VSF_GPIO_CFG_REIMPLEMENT_API_SWITCH_DIRECTION == DISABLED
249void vsf_real_gpio_switch_direction(vsf_real_gpio_t *gpio_ptr, vsf_gpio_pin_mask_t pin_mask)
250{
251 VSF_HAL_ASSERT(NULL != gpio_ptr);
252 VSF_HAL_ASSERT(0 != pin_mask);
253
254 uint32_t ret = ~vsf_real_gpio_get_direction(gpio_ptr, pin_mask);
255 vsf_real_gpio_set_direction(gpio_ptr, pin_mask, ret);
256}
257#endif
258
259#if VSF_GPIO_CFG_REIMPLEMENT_API_SET == DISABLED
260void vsf_real_gpio_set(vsf_real_gpio_t *gpio_ptr, vsf_gpio_pin_mask_t pin_mask)
261{
262 VSF_HAL_ASSERT(NULL != gpio_ptr);
263 VSF_HAL_ASSERT(0 != pin_mask);
264
265 vsf_real_gpio_write(gpio_ptr, pin_mask, pin_mask);
266}
267#endif
268
269#if VSF_GPIO_CFG_REIMPLEMENT_API_CLEAR == DISABLED
270void vsf_real_gpio_clear(vsf_real_gpio_t *gpio_ptr, vsf_gpio_pin_mask_t pin_mask)
271{
272 VSF_HAL_ASSERT(NULL != gpio_ptr);
273 VSF_HAL_ASSERT(0 != pin_mask);
274
275 vsf_real_gpio_write(gpio_ptr, pin_mask, 0);
276}
277#endif
278
279#if VSF_GPIO_CFG_REIMPLEMENT_API_OUTPUT_AND_SET == DISABLED
280void vsf_real_gpio_output_and_set(vsf_real_gpio_t *gpio_ptr, vsf_gpio_pin_mask_t pin_mask)
281{
282 VSF_HAL_ASSERT(NULL != gpio_ptr);
283 VSF_HAL_ASSERT(0 != pin_mask);
284
285#if VSF_GPIO_CFG_CAPABILITY_SUPPORT_OUTPUT_AND_SET == 0
287#else
288#if VSF_GPIO_CFG_CHANGE_DIR_FIRST == ENABLED
289 vsf_real_gpio_set_output(gpio_ptr, pin_mask);
290 vsf_real_gpio_set(gpio_ptr, pin_mask);
291#else
292 vsf_real_gpio_set(gpio_ptr, pin_mask);
293 vsf_real_gpio_set_output(gpio_ptr, pin_mask);
294#endif
295#endif
296}
297#endif
298
299#if VSF_GPIO_CFG_REIMPLEMENT_API_OUTPUT_AND_CLEAR == DISABLED
300void vsf_real_gpio_output_and_clear(vsf_real_gpio_t *gpio_ptr, vsf_gpio_pin_mask_t pin_mask)
301{
302 VSF_HAL_ASSERT(NULL != gpio_ptr);
303 VSF_HAL_ASSERT(0 != pin_mask);
304
305#if VSF_GPIO_CFG_CAPABILITY_SUPPORT_OUTPUT_AND_CLEAR == 0
307#else
308#if VSF_GPIO_CFG_CHANGE_DIR_FIRST == ENABLED
309 vsf_real_gpio_set_output(gpio_ptr, pin_mask);
310 vsf_real_gpio_clear(gpio_ptr, pin_mask);
311#else
312 vsf_real_gpio_clear(gpio_ptr, pin_mask);
313 vsf_real_gpio_set_output(gpio_ptr, pin_mask);
314#endif
315#endif
316}
317#endif
318
319#if VSF_GPIO_CFG_REIMPLEMENT_API_GET_PIN_CONFIGURATION == DISABLED
320vsf_err_t vsf_real_gpio_get_pin_configuration(vsf_real_gpio_t *gpio_ptr, uint16_t pin_index, vsf_gpio_cfg_t *cfg_ptr)
321{
322 VSF_HAL_ASSERT(NULL != gpio_ptr);
323 VSF_HAL_ASSERT(NULL != cfg_ptr);
324
325 // Default implementation: not supported, trigger assertion
327
328 return VSF_ERR_NOT_SUPPORT;
329}
330#endif
331
332#if VSF_GPIO_CFG_REIMPLEMENT_API_READ_OUTPUT_REGISTER == DISABLED
333vsf_gpio_pin_mask_t vsf_real_gpio_read_output_register(vsf_real_gpio_t *gpio_ptr)
334{
335 VSF_HAL_ASSERT(NULL != gpio_ptr);
336
337 // Default implementation: not supported, trigger assertion
339
340 return 0;
341}
342#endif
343
344#if VSF_GPIO_CFG_REIMPLEMENT_API_CAPABILITY == DISABLED
345vsf_gpio_capability_t vsf_real_gpio_capability(vsf_real_gpio_t *gpio_ptr)
346{
347 vsf_gpio_capability_t gpio_capability = {
348 .is_async = VSF_GPIO_CFG_CAPABILITY_IS_ASYNC,
350 .support_output_and_clear = VSF_GPIO_CFG_CAPABILITY_SUPPORT_OUTPUT_AND_CLEAR,
351 .support_interrupt = VSF_GPIO_CFG_CAPABILITY_SUPPORT_INTERRUPT,
352 .can_read_in_gpio_output_mode = VSF_GPIO_CFG_CAPABILITY_CAN_READ_IN_GPIO_OUTPUT_MODE,
353 .can_read_in_alternate_mode = VSF_GPIO_CFG_CAPABILITY_CAN_READ_IN_ALTERNATE_MODE,
354 .pin_count = VSF_GPIO_CFG_CAPABILITY_PIN_COUNT,
355 .pin_mask = VSF_GPIO_CFG_CAPABILITY_PIN_MASK,
356 };
357
358 return gpio_capability;
359}
360#endif
361
362#if VSF_GPIO_CFG_REIMPLEMENT_API_EXTI_IRQ_GET_CONFIGURATION == DISABLED
363vsf_err_t vsf_real_gpio_exti_irq_get_configuration(vsf_real_gpio_t *gpio_ptr, vsf_gpio_exti_irq_cfg_t *irq_cfg_ptr)
364{
365 VSF_HAL_ASSERT(NULL != gpio_ptr);
366 VSF_HAL_ASSERT(NULL != irq_cfg_ptr);
367
368 // Default implementation: not supported, trigger assertion
370
371 return VSF_ERR_NOT_SUPPORT;
372}
373#endif
374
375#if VSF_GPIO_CFG_REIMPLEMENT_API_EXTI_IRQ_CLEAR == DISABLED
376vsf_gpio_pin_mask_t vsf_real_gpio_exti_irq_clear(vsf_real_gpio_t *gpio_ptr, vsf_gpio_pin_mask_t pin_mask)
377{
378 VSF_HAL_ASSERT(NULL != gpio_ptr);
379
380 // Default implementation: not supported, trigger assertion
382
383 return 0;
384}
385#endif
386
387#if VSF_GPIO_CFG_REIMPLEMENT_API_CTRL == DISABLED
388vsf_err_t vsf_real_gpio_ctrl(vsf_real_gpio_t *gpio_ptr, vsf_gpio_ctrl_t ctrl, void *param)
389{
390 VSF_HAL_ASSERT(NULL != gpio_ptr);
391
392 // Default implementation: not supported, trigger assertion
394
395 return VSF_ERR_NOT_SUPPORT;
396}
397#endif
398
399#if VSF_GPIO_CFG_REIMPLEMENT_API_PORTS_CONFIG_PIN == DISABLED
400vsf_err_t vsf_real_gpio_ports_config_pin(vsf_gpio_port_cfg_pin_t *cfg_ptr,
401 uint_fast8_t count)
402{
403 VSF_HAL_ASSERT(cfg_ptr != NULL);
404 VSF_HAL_ASSERT(count != 0);
405
406 for (int i = 0; i < count; i++) {
407 vsf_gpio_cfg_t cfg = {
408 .alternate_function = cfg_ptr[i].alternate_function,
409 .mode = cfg_ptr[i].mode,
410 };
411 uint16_t port_index = vsf_gpio_get_port(cfg_ptr[i].port_pin_index);
412 uint16_t pin_index = vsf_gpio_get_pin(cfg_ptr[i].port_pin_index);
413 vsf_real_gpio_t *gpio_ptr = vsf_real_gpios[port_index];
414 vsf_err_t result =
415 vsf_real_gpio_port_config_pins(gpio_ptr, 1 << pin_index, &cfg);
416 if (result != VSF_ERR_NONE) {
417 return result;
418 }
419 }
420
421 return VSF_ERR_NONE;
422}
423#endif
424
425#if VSF_GPIO_CFG_REIMPLEMENT_API_PORTS_CONFIG_PINS == DISABLED
426vsf_err_t vsf_real_gpio_ports_config_pins(vsf_gpio_port_cfg_pins_t *cfg_ptr,
427 uint_fast8_t count)
428{
429 VSF_HAL_ASSERT(cfg_ptr != NULL);
430 VSF_HAL_ASSERT(count != 0);
431
432 for (int i = 0; i < count; i++) {
433 uint16_t port_index = cfg_ptr[i].port_index;
434 vsf_real_gpio_t *gpio_ptr = vsf_real_gpios[port_index];
435 vsf_gpio_cfg_t cfg = {
436 .alternate_function = cfg_ptr[i].alternate_function,
437 .mode = cfg_ptr[i].mode,
438 };
439 vsf_err_t result =
440 vsf_real_gpio_port_config_pins(gpio_ptr, cfg_ptr[i].pin_mask, &cfg);
441 if (result != VSF_ERR_NONE) {
442 return result;
443 }
444 }
445
446 return VSF_ERR_NONE;
447}
448#endif
449
450/*============================ MACROS ========================================*/
451
452#undef VSF_GPIO_CFG_REIMPLEMENT_TYPE_CAPABILITY
453#undef VSF_GPIO_CFG_REIMPLEMENT_TYPE_CFG
454#undef VSF_GPIO_CFG_REIMPLEMENT_TYPE_MODE
455#undef VSF_GPIO_CFG_RETAIN_DEFINED_PREFIX
456#undef VSF_GPIO_CFG_REIMPLEMENT_API_SET_INPUT
457#undef VSF_GPIO_CFG_REIMPLEMENT_API_SET_OUTPUT
458#undef VSF_GPIO_CFG_REIMPLEMENT_API_SWITCH_DIRECTION
459#undef VSF_GPIO_CFG_REIMPLEMENT_API_SET
460#undef VSF_GPIO_CFG_REIMPLEMENT_API_CLEAR
461#undef VSF_GPIO_CFG_REIMPLEMENT_API_OUTPUT_AND_SET
462#undef VSF_GPIO_CFG_REIMPLEMENT_API_OUTPUT_AND_CLEAR
463#undef VSF_GPIO_CFG_REIMPLEMENT_API_GET_PIN_CONFIGURATION
464#undef VSF_GPIO_CFG_REIMPLEMENT_API_READ_OUTPUT_REGISTER
465#undef VSF_GPIO_CFG_REIMPLEMENT_API_CAPABILITY
466#undef VSF_GPIO_CFG_REIMPLEMENT_API_EXTI_IRQ_GET_CONFIGURATION
467#undef VSF_GPIO_CFG_REIMPLEMENT_API_EXTI_IRQ_CLEAR
468#undef VSF_GPIO_CFG_REIMPLEMENT_API_CTRL
469#undef VSF_GPIO_CFG_REIMPLEMENT_API_PORTS_CONFIG_PIN
470#undef VSF_GPIO_CFG_REIMPLEMENT_API_PORTS_CONFIG_PINS
471#undef VSF_GPIO_CFG_CHANGE_DIR_FIRST
472#undef VSF_GPIO_CFG_CAPABILITY_SUPPORT_CONFIG_PIN
473#undef VSF_GPIO_CFG_CAPABILITY_SUPPORT_OUTPUT_AND_SET
474#undef VSF_GPIO_CFG_CAPABILITY_SUPPORT_OUTPUT_AND_CLEAR
475#undef VSF_GPIO_CFG_CAPABILITY_SUPPORT_INTERRUPT
476#undef VSF_GPIO_CFG_CAPABILITY_CAN_READ_IN_GPIO_OUTPUT_MODE
477#undef VSF_GPIO_CFG_CAPABILITY_CAN_READ_IN_ALTERNATE_MODE
478#undef VSF_GPIO_CFG_CAPABILITY_IS_ASYNC
479#undef VSF_GPIO_CFG_CAPABILITY_PIN_COUNT
480#undef VSF_GPIO_CFG_CAPABILITY_PIN_MASK
481#undef vsf_real_gpios
482#undef vsf_real_gpio_t
483#undef vsf_real_gpio_port_config_pins
484#undef vsf_real_gpio_get_pin_configuration
485#undef vsf_real_gpio_read
486#undef vsf_real_gpio_read_output_register
487#undef vsf_real_gpio_set_input
488#undef vsf_real_gpio_set_output
489#undef vsf_real_gpio_get_direction
490#undef vsf_real_gpio_set_direction
491#undef vsf_real_gpio_switch_direction
492#undef vsf_real_gpio_write
493#undef vsf_real_gpio_set
494#undef vsf_real_gpio_clear
495#undef vsf_real_gpio_output_and_set
496#undef vsf_real_gpio_output_and_clear
497#undef vsf_real_gpio_capability
498#undef vsf_real_gpio_exti_irq_get_configuration
499#undef vsf_real_gpio_exti_irq_clear
500#undef vsf_real_gpio_ctrl
501#undef vsf_real_gpio_port_config_pin
502#undef vsf_real_gpio_ports_config_pin
503#undef vsf_real_gpio_ports_config_pins
504
505/*============================ MACROS ========================================*/
506
507#ifdef VSF_GPIO_CFG_IMP_REMAP_PREFIX
508# ifndef VSF_GPIO_CFG_ORIGIN_PREFIX
509# define VSF_GPIO_CFG_ORIGIN_PREFIX VSF_GPIO_CFG_IMP_PREFIX
510# endif
511
512# define vsf_origin_gpio_t VSF_MCONNECT(VSF_GPIO_CFG_ORIGIN_PREFIX, _gpio_t)
513# define vsf_origin_gpio_capability VSF_MCONNECT(VSF_GPIO_CFG_ORIGIN_PREFIX, _gpio_capability)
514# define vsf_origin_gpio_port_config_pins VSF_MCONNECT(VSF_GPIO_CFG_ORIGIN_PREFIX, _gpio_port_config_pins)
515# define vsf_origin_gpio_get_pin_configuration VSF_MCONNECT(VSF_GPIO_CFG_ORIGIN_PREFIX, _gpio_get_pin_configuration)
516# define vsf_origin_gpio_set_direction VSF_MCONNECT(VSF_GPIO_CFG_ORIGIN_PREFIX, _gpio_set_direction)
517# define vsf_origin_gpio_get_direction VSF_MCONNECT(VSF_GPIO_CFG_ORIGIN_PREFIX, _gpio_get_direction)
518# define vsf_origin_gpio_set_input VSF_MCONNECT(VSF_GPIO_CFG_ORIGIN_PREFIX, _gpio_set_input)
519# define vsf_origin_gpio_set_output VSF_MCONNECT(VSF_GPIO_CFG_ORIGIN_PREFIX, _gpio_set_output)
520# define vsf_origin_gpio_switch_direction VSF_MCONNECT(VSF_GPIO_CFG_ORIGIN_PREFIX, _gpio_switch_direction)
521# define vsf_origin_gpio_read VSF_MCONNECT(VSF_GPIO_CFG_ORIGIN_PREFIX, _gpio_read)
522# define vsf_origin_gpio_read_output_register VSF_MCONNECT(VSF_GPIO_CFG_ORIGIN_PREFIX, _gpio_read_output_register)
523# define vsf_origin_gpio_write VSF_MCONNECT(VSF_GPIO_CFG_ORIGIN_PREFIX, _gpio_write)
524# define vsf_origin_gpio_set VSF_MCONNECT(VSF_GPIO_CFG_ORIGIN_PREFIX, _gpio_set)
525# define vsf_origin_gpio_clear VSF_MCONNECT(VSF_GPIO_CFG_ORIGIN_PREFIX, _gpio_clear)
526# define vsf_origin_gpio_output_and_set VSF_MCONNECT(VSF_GPIO_CFG_ORIGIN_PREFIX, _gpio_output_and_set)
527# define vsf_origin_gpio_output_and_clear VSF_MCONNECT(VSF_GPIO_CFG_ORIGIN_PREFIX, _gpio_output_and_clear)
528# define vsf_origin_gpio_toggle VSF_MCONNECT(VSF_GPIO_CFG_ORIGIN_PREFIX, _gpio_toggle)
529# define vsf_origin_gpio_exti_irq_enable VSF_MCONNECT(VSF_GPIO_CFG_ORIGIN_PREFIX, _gpio_exti_irq_enable)
530# define vsf_origin_gpio_exti_irq_disable VSF_MCONNECT(VSF_GPIO_CFG_ORIGIN_PREFIX, _gpio_exti_irq_disable)
531# define vsf_origin_gpio_exti_irq_clear VSF_MCONNECT(VSF_GPIO_CFG_ORIGIN_PREFIX, _gpio_exti_irq_clear)
532# define vsf_origin_gpio_exti_irq_config VSF_MCONNECT(VSF_GPIO_CFG_ORIGIN_PREFIX, _gpio_exti_irq_config)
533# define vsf_origin_gpio_ctrl VSF_MCONNECT(VSF_GPIO_CFG_ORIGIN_PREFIX, _gpio_ctrl)
534
535# define vsf_remap_gpio_t VSF_MCONNECT(VSF_GPIO_CFG_IMP_REMAP_PREFIX, _gpio_t)
536# define vsf_remap_gpio_capability VSF_MCONNECT(VSF_GPIO_CFG_IMP_REMAP_PREFIX, _gpio_capability)
537# define vsf_remap_gpio_port_config_pins VSF_MCONNECT(VSF_GPIO_CFG_IMP_REMAP_PREFIX, _gpio_port_config_pins)
538# define vsf_remap_gpio_get_pin_configuration VSF_MCONNECT(VSF_GPIO_CFG_IMP_REMAP_PREFIX, _gpio_get_pin_configuration)
539# define vsf_remap_gpio_set_direction VSF_MCONNECT(VSF_GPIO_CFG_IMP_REMAP_PREFIX, _gpio_set_direction)
540# define vsf_remap_gpio_get_direction VSF_MCONNECT(VSF_GPIO_CFG_IMP_REMAP_PREFIX, _gpio_get_direction)
541# define vsf_remap_gpio_set_input VSF_MCONNECT(VSF_GPIO_CFG_IMP_REMAP_PREFIX, _gpio_set_input)
542# define vsf_remap_gpio_set_output VSF_MCONNECT(VSF_GPIO_CFG_IMP_REMAP_PREFIX, _gpio_set_output)
543# define vsf_remap_gpio_switch_direction VSF_MCONNECT(VSF_GPIO_CFG_IMP_REMAP_PREFIX, _gpio_switch_direction)
544# define vsf_remap_gpio_read VSF_MCONNECT(VSF_GPIO_CFG_IMP_REMAP_PREFIX, _gpio_read)
545# define vsf_remap_gpio_read_output_register VSF_MCONNECT(VSF_GPIO_CFG_IMP_REMAP_PREFIX, _gpio_read_output_register)
546# define vsf_remap_gpio_write VSF_MCONNECT(VSF_GPIO_CFG_IMP_REMAP_PREFIX, _gpio_write)
547# define vsf_remap_gpio_set VSF_MCONNECT(VSF_GPIO_CFG_IMP_REMAP_PREFIX, _gpio_set)
548# define vsf_remap_gpio_clear VSF_MCONNECT(VSF_GPIO_CFG_IMP_REMAP_PREFIX, _gpio_clear)
549# define vsf_remap_gpio_output_and_set VSF_MCONNECT(VSF_GPIO_CFG_IMP_REMAP_PREFIX, _gpio_output_and_set)
550# define vsf_remap_gpio_output_and_clear VSF_MCONNECT(VSF_GPIO_CFG_IMP_REMAP_PREFIX, _gpio_output_and_clear)
551# define vsf_remap_gpio_toggle VSF_MCONNECT(VSF_GPIO_CFG_IMP_REMAP_PREFIX, _gpio_toggle)
552# define vsf_remap_gpio_exti_irq_enable VSF_MCONNECT(VSF_GPIO_CFG_IMP_REMAP_PREFIX, _gpio_exti_irq_enable)
553# define vsf_remap_gpio_exti_irq_disable VSF_MCONNECT(VSF_GPIO_CFG_IMP_REMAP_PREFIX, _gpio_exti_irq_disable)
554# define vsf_remap_gpio_exti_irq_clear VSF_MCONNECT(VSF_GPIO_CFG_IMP_REMAP_PREFIX, _gpio_exti_irq_clear)
555# define vsf_remap_gpio_exti_irq_config VSF_MCONNECT(VSF_GPIO_CFG_IMP_REMAP_PREFIX, _gpio_exti_irq_config)
556# define vsf_remap_gpio_ctrl VSF_MCONNECT(VSF_GPIO_CFG_IMP_REMAP_PREFIX, _gpio_ctrl)
557
558# define VSF_GPIO_CFG_IMP_REMAP_FUNCTIONS \
559 vsf_err_t vsf_origin_gpio_port_config_pins(vsf_origin_gpio_t *gpio_ptr, vsf_gpio_pin_mask_t pin_mask, vsf_gpio_cfg_t *cfg) \
560 { \
561 VSF_HAL_ASSERT(gpio_ptr != NULL); \
562 VSF_HAL_ASSERT(pin_mask != 0); \
563 VSF_HAL_ASSERT(cfg != NULL); \
564 return vsf_remap_gpio_port_config_pins(gpio_ptr, pin_mask, cfg); \
565 } \
566 vsf_err_t vsf_origin_gpio_get_pin_configuration(vsf_origin_gpio_t *gpio_ptr, uint16_t pin_index, vsf_gpio_cfg_t *cfg) \
567 { \
568 VSF_HAL_ASSERT(gpio_ptr != NULL); \
569 VSF_HAL_ASSERT(cfg != NULL); \
570 return vsf_remap_gpio_get_pin_configuration(gpio_ptr, pin_index, cfg); \
571 } \
572 void vsf_origin_gpio_set_direction(vsf_origin_gpio_t *gpio_ptr, vsf_gpio_pin_mask_t pin_mask, vsf_gpio_pin_mask_t direction_mask) \
573 { \
574 VSF_HAL_ASSERT(gpio_ptr != NULL); \
575 vsf_remap_gpio_set_direction(gpio_ptr, pin_mask, direction_mask); \
576 } \
577 vsf_gpio_pin_mask_t vsf_origin_gpio_get_direction(vsf_origin_gpio_t *gpio_ptr, vsf_gpio_pin_mask_t pin_mask) \
578 { \
579 VSF_HAL_ASSERT(gpio_ptr != NULL); \
580 return vsf_remap_gpio_get_direction(gpio_ptr, pin_mask); \
581 } \
582 void vsf_origin_gpio_set_input(vsf_origin_gpio_t *gpio_ptr, vsf_gpio_pin_mask_t pin_mask) \
583 { \
584 VSF_HAL_ASSERT(gpio_ptr != NULL); \
585 vsf_remap_gpio_set_input(gpio_ptr, pin_mask); \
586 } \
587 void vsf_origin_gpio_set_output(vsf_origin_gpio_t *gpio_ptr, vsf_gpio_pin_mask_t pin_mask) \
588 { \
589 VSF_HAL_ASSERT(gpio_ptr != NULL); \
590 vsf_remap_gpio_set_output(gpio_ptr, pin_mask); \
591 } \
592 void vsf_origin_gpio_switch_direction(vsf_origin_gpio_t *gpio_ptr, vsf_gpio_pin_mask_t pin_mask) \
593 { \
594 VSF_HAL_ASSERT(gpio_ptr != NULL); \
595 vsf_remap_gpio_switch_direction(gpio_ptr, pin_mask); \
596 } \
597 vsf_gpio_pin_mask_t vsf_origin_gpio_read(vsf_origin_gpio_t *gpio_ptr) \
598 { \
599 VSF_HAL_ASSERT(gpio_ptr != NULL); \
600 return vsf_remap_gpio_read(gpio_ptr); \
601 } \
602 vsf_gpio_pin_mask_t vsf_origin_gpio_read_output_register(vsf_origin_gpio_t *gpio_ptr) \
603 { \
604 VSF_HAL_ASSERT(gpio_ptr != NULL); \
605 return vsf_remap_gpio_read_output_register(gpio_ptr); \
606 } \
607 void vsf_origin_gpio_write(vsf_origin_gpio_t *gpio_ptr, vsf_gpio_pin_mask_t pin_mask, vsf_gpio_pin_mask_t value) \
608 { \
609 VSF_HAL_ASSERT(gpio_ptr != NULL); \
610 vsf_remap_gpio_write(gpio_ptr, pin_mask, value); \
611 } \
612 void vsf_origin_gpio_set(vsf_origin_gpio_t *gpio_ptr, vsf_gpio_pin_mask_t pin_mask) \
613 { \
614 VSF_HAL_ASSERT(gpio_ptr != NULL); \
615 vsf_remap_gpio_set(gpio_ptr, pin_mask); \
616 } \
617 void vsf_origin_gpio_clear(vsf_origin_gpio_t *gpio_ptr, vsf_gpio_pin_mask_t pin_mask) \
618 { \
619 VSF_HAL_ASSERT(gpio_ptr != NULL); \
620 vsf_remap_gpio_clear(gpio_ptr, pin_mask); \
621 } \
622 void vsf_origin_gpio_toggle(vsf_origin_gpio_t *gpio_ptr, vsf_gpio_pin_mask_t pin_mask) \
623 { \
624 VSF_HAL_ASSERT(gpio_ptr != NULL); \
625 vsf_remap_gpio_toggle(gpio_ptr, pin_mask); \
626 } \
627 void vsf_origin_gpio_output_and_set(vsf_origin_gpio_t *gpio_ptr, vsf_gpio_pin_mask_t pin_mask) \
628 { \
629 VSF_HAL_ASSERT(gpio_ptr != NULL); \
630 vsf_remap_gpio_output_and_set(gpio_ptr, pin_mask); \
631 } \
632 void vsf_origin_gpio_output_and_clear(vsf_origin_gpio_t *gpio_ptr, vsf_gpio_pin_mask_t pin_mask) \
633 { \
634 VSF_HAL_ASSERT(gpio_ptr != NULL); \
635 vsf_remap_gpio_output_and_clear(gpio_ptr, pin_mask); \
636 } \
637 vsf_gpio_capability_t vsf_origin_gpio_capability(vsf_origin_gpio_t *gpio_ptr) \
638 { \
639 VSF_HAL_ASSERT(gpio_ptr != NULL); \
640 return vsf_remap_gpio_capability(gpio_ptr); \
641 } \
642 vsf_err_t vsf_origin_gpio_exti_irq_enable(vsf_origin_gpio_t *gpio_ptr, vsf_gpio_pin_mask_t pin_mask) \
643 { \
644 VSF_HAL_ASSERT(gpio_ptr != NULL); \
645 return vsf_remap_gpio_exti_irq_enable(gpio_ptr, pin_mask); \
646 } \
647 vsf_err_t vsf_origin_gpio_exti_irq_disable(vsf_origin_gpio_t *gpio_ptr, vsf_gpio_pin_mask_t pin_mask) \
648 { \
649 VSF_HAL_ASSERT(gpio_ptr != NULL); \
650 return vsf_remap_gpio_exti_irq_disable(gpio_ptr, pin_mask); \
651 } \
652 vsf_gpio_pin_mask_t vsf_origin_gpio_exti_irq_clear(vsf_origin_gpio_t *gpio_ptr, vsf_gpio_pin_mask_t pin_mask) \
653 { \
654 VSF_HAL_ASSERT(gpio_ptr != NULL); \
655 return vsf_remap_gpio_exti_irq_clear(gpio_ptr, pin_mask); \
656 } \
657 vsf_err_t vsf_origin_gpio_exti_irq_config(vsf_origin_gpio_t *gpio_ptr, vsf_gpio_exti_irq_cfg_t *cfg) \
658 { \
659 VSF_HAL_ASSERT(gpio_ptr != NULL); \
660 return vsf_remap_gpio_exti_irq_config(gpio_ptr, cfg); \
661 } \
662 vsf_err_t vsf_origin_gpio_ctrl(vsf_origin_gpio_t *gpio_ptr, vsf_gpio_ctrl_t ctrl, void *param) \
663 { \
664 VSF_HAL_ASSERT(gpio_ptr != NULL); \
665 return vsf_remap_gpio_ctrl(gpio_ptr, ctrl, param); \
666 }
667#endif
668
669/*============================ GLOBAL VARIABLES ==============================*/
670
671#ifndef VSF_HAL_TEMPLATE_IMP_NAME
672# define VSF_HAL_TEMPLATE_IMP_NAME _gpio
673#endif
674
675#ifndef VSF_HAL_TEMPLATE_IMP_UPCASE_NAME
676# define VSF_HAL_TEMPLATE_IMP_UPCASE_NAME _GPIO
677#endif
678
679#ifndef VSF_HAL_TEMPLATE_IMP_COUNT_SUFFIX
680# define VSF_HAL_TEMPLATE_IMP_COUNT_SUFFIX _PORT_COUNT
681#endif
682
683#ifndef VSF_HAL_TEMPLATE_IMP_MASK_SUFFIX
684# define VSF_HAL_TEMPLATE_IMP_MASK_SUFFIX _PORT_MASK
685#endif
686
687#if !defined(VSF_GPIO_CFG_IMP_PREFIX) && !defined(VSF_GPIO_CFG_IMP_DEVICE_PREFIX)
688# error "Please define VSF_GPIO_CFG_IMP_PREFIX in gpio driver"
689#endif
690
691#if !defined(VSF_GPIO_CFG_IMP_UPCASE_PREFIX) && !defined(VSF_GPIO_CFG_IMP_DEVICE_UPCASE_PREFIX)
692# error "Please define VSF_GPIO_CFG_IMP_UPCASE_PREFIX in gpio driver"
693#endif
694
695#ifndef VSF_GPIO_CFG_IMP_COUNT_MASK_PREFIX
696# define VSF_GPIO_CFG_IMP_COUNT_MASK_PREFIX VSF_GPIO_CFG_IMP_UPCASE_PREFIX
697#endif
698
699#ifdef VSF_GPIO_CFG_IMP_REMAP_FUNCTIONS
700# define VSF_HAL_CFG_IMP_REMAP_FUNCTIONS VSF_GPIO_CFG_IMP_REMAP_FUNCTIONS
701#endif
702
704
705#if VSF_GPIO_CFG_RETAIN_DEFINED_PREFIX == DISABLED
706# undef VSF_GPIO_CFG_IMP_PREFIX
707# undef VSF_GPIO_CFG_IMP_UPCASE_PREFIX
708# undef VSF_GPIO_CFG_IMP_DEVICE_PREFIX
709# undef VSF_GPIO_CFG_IMP_DEVICE_UPCASE_PREFIX
710#endif
711
712#undef VSF_GPIO_CFG_REAL_PREFIX
713#undef VSF_GPIO_CFG_ORIGIN_PREFIX
714
715#undef VSF_GPIO_CFG_IMP_COUNT_MASK_PREFIX
716#undef VSF_GPIO_CFG_IMP_LV0
717#undef VSF_GPIO_CFG_IMP_REMAP_FUNCTIONS
718#undef VSF_GPIO_CFG_IMP_HAS_OP
719#undef VSF_GPIO_CFG_IMP_EXTERN_OP
720#undef VSF_GPIO_CFG_IMP_REMAP_PREFIX
721#undef VSF_GPIO_CFG_IMP_RENAME_DEVICE_PREFIX
722
723#undef vsf_origin_gpio_t
724#undef vsf_origin_gpio_capability
725#undef vsf_origin_gpio_port_config_pins
726#undef vsf_origin_gpio_get_pin_configuration
727#undef vsf_origin_gpio_set_direction
728#undef vsf_origin_gpio_get_direction
729#undef vsf_origin_gpio_set_input
730#undef vsf_origin_gpio_set_output
731#undef vsf_origin_gpio_switch_direction
732#undef vsf_origin_gpio_read
733#undef vsf_origin_gpio_read_output_register
734#undef vsf_origin_gpio_write
735#undef vsf_origin_gpio_set
736#undef vsf_origin_gpio_clear
737#undef vsf_origin_gpio_output_and_set
738#undef vsf_origin_gpio_output_and_clear
739#undef vsf_origin_gpio_toggle
740#undef vsf_origin_gpio_exti_irq_config
741#undef vsf_origin_gpio_exti_irq_enable
742#undef vsf_origin_gpio_exti_irq_disable
743#undef vsf_origin_gpio_exti_irq_clear
744#undef vsf_origin_gpio_ctrl
745
746#undef vsf_remap_gpio_t
747#undef vsf_remap_gpio_capability
748#undef vsf_remap_gpio_port_config_pins
749#undef vsf_remap_gpio_get_pin_configuration
750#undef vsf_remap_gpio_set_direction
751#undef vsf_remap_gpio_get_direction
752#undef vsf_remap_gpio_set_input
753#undef vsf_remap_gpio_set_output
754#undef vsf_remap_gpio_switch_direction
755#undef vsf_remap_gpio_read
756#undef vsf_remap_gpio_read_output_register
757#undef vsf_remap_gpio_write
758#undef vsf_remap_gpio_set
759#undef vsf_remap_gpio_clear
760#undef vsf_remap_gpio_output_and_set
761#undef vsf_remap_gpio_output_and_clear
762#undef vsf_remap_gpio_toggle
763#undef vsf_remap_gpio_exti_irq_config
764#undef vsf_remap_gpio_exti_irq_enable
765#undef vsf_remap_gpio_exti_irq_disable
766#undef vsf_remap_gpio_exti_irq_clear
767#undef vsf_remap_gpio_ctrl
768
769#undef VSF_HAL_TEMPLATE_IMP_NAME
770#undef VSF_HAL_TEMPLATE_IMP_UPCASE_NAME
771
772/*============================ STATIC ASSERTIONS ==============================*/
773
774/* User-extensible macros for custom mode and IRQ mask values
775 * Users can define these macros before including this template to append
776 * their custom enum values to the uniqueness checks.
777 *
778 * Check modes for custom values:
779 * VSF_GPIO_CFG_MODE_CHECK_UNIQUE - Check mode for custom mode values
780 * Default: VSF_HAL_CHECK_MODE_LOOSE (loose mode, no overlapping bits)
781 * Can be set to: VSF_HAL_CHECK_MODE_STRICT (strict mode, no overlapping bits)
782 * VSF_GPIO_CFG_IRQ_MASK_CHECK_UNIQUE - Check mode for custom IRQ mask values
783 * Default: VSF_HAL_CHECK_MODE_STRICT (strict mode, no overlapping bits)
784 * Can be set to: VSF_HAL_CHECK_MODE_LOOSE (loose mode, no overlapping bits)
785 *
786 * Example usage in vendor driver:
787 * #define VSF_GPIO_CUSTOM_MODE_VALUES MY_CUSTOM_MODE1, MY_CUSTOM_MODE2
788 * #define VSF_GPIO_CFG_MODE_CHECK_UNIQUE VSF_HAL_CHECK_MODE_LOOSE
789 * #define VSF_GPIO_CUSTOM_IRQ_MASK_VALUES MY_CUSTOM_IRQ1, MY_CUSTOM_IRQ2
790 * #define VSF_GPIO_CFG_IRQ_MASK_CHECK_UNIQUE VSF_HAL_CHECK_MODE_STRICT
791 * #include "hal/driver/common/gpio/gpio_template.inc"
792 */
793
794
795#ifdef VSF_GPIO_CFG_MODE_CHECK_UNIQUE
796/* Default mode lists - can be redefined by users before including this file */
797#ifndef VSF_GPIO_CHECK_UNIQUE_DIRECTION_MODES
798# define VSF_GPIO_CHECK_UNIQUE_DIRECTION_MODES \
799 VSF_GPIO_INPUT, \
800 VSF_GPIO_ANALOG, \
801 VSF_GPIO_OUTPUT_PUSH_PULL, \
802 VSF_GPIO_OUTPUT_OPEN_DRAIN, \
803 VSF_GPIO_EXTI
804#endif
805
806#ifndef VSF_GPIO_CHECK_UNIQUE_PULL_MODES
807# define VSF_GPIO_CHECK_UNIQUE_PULL_MODES \
808 VSF_GPIO_NO_PULL_UP_DOWN, \
809 VSF_GPIO_PULL_UP, \
810 VSF_GPIO_PULL_DOWN
811#endif
812
813/* ==================== GROUP INTERNAL UNIQUENESS CHECKS ==================== */
814/* Check uniqueness within each functional group */
815
816/* Check direction mode uniqueness - all direction modes should have different values
817 * Mandatory: VSF_GPIO_INPUT, VSF_GPIO_ANALOG, VSF_GPIO_OUTPUT_PUSH_PULL,
818 * VSF_GPIO_OUTPUT_OPEN_DRAIN, VSF_GPIO_EXTI
819 */
827);
828
829/* Check pull mode uniqueness - all pull modes should have different values
830 * Mandatory: VSF_GPIO_NO_PULL_UP_DOWN, VSF_GPIO_PULL_UP, VSF_GPIO_PULL_DOWN
831 */
837);
838
839#ifdef VSF_GPIO_CUSTOM_MODE_VALUES
840/* Check uniqueness among custom mode values using user-specified check mode */
842#endif
843
846 /* Mandatory modes - always included */
850 /* User-defined modes - appended by user configuration */
851#ifdef VSF_GPIO_CUSTOM_MODE_VALUES
852 , VSF_GPIO_CUSTOM_MODE_VALUES
853#endif
854);
855
856#undef VSF_GPIO_CHECK_UNIQUE_DIRECTION_MODES
857#undef VSF_GPIO_CHECK_UNIQUE_PULL_MODES
858#endif /* VSF_GPIO_CFG_MODE_CHECK_UNIQUE */
859
860/* ==================== IRQ MASK UNIQUENESS CHECKS ==================== */
861
862#ifdef VSF_GPIO_CFG_IRQ_MASK_CHECK_UNIQUE
863
864#ifdef VSF_GPIO_CUSTOM_IRQ_MASK_VALUES
865/* Check uniqueness among custom IRQ mask values using user-specified check mode */
867#endif
868
869/* Note: GPIO typically doesn't have a standard IRQ mask enum, but custom IRQ masks can be added */
870#endif /* VSF_GPIO_CFG_IRQ_MASK_CHECK_UNIQUE */
871
872#undef VSF_GPIO_CFG_MODE_CHECK_UNIQUE
873#undef VSF_GPIO_CFG_IRQ_MASK_CHECK_UNIQUE
874#undef VSF_GPIO_CUSTOM_MODE_VALUES
875#undef VSF_GPIO_CUSTOM_IRQ_MASK_VALUES
876
877#endif /* VSF_HAL_USE_GPIO */
vsf_err_t
Definition __type.h:42
@ VSF_ERR_NOT_SUPPORT
function not supported
Definition __type.h:46
@ VSF_ERR_NONE
none error
Definition __type.h:44
#define VSF_GPIO_CFG_CAPABILITY_SUPPORT_OUTPUT_AND_SET
Definition gpio.c:33
#define VSF_GPIO_CFG_CAPABILITY_SUPPORT_OUTPUT_AND_CLEAR
Definition gpio.c:32
@ VSF_GPIO_NO_PULL_UP_DOWN
Definition gpio.h:39
@ VSF_GPIO_OUTPUT_PUSH_PULL
Definition gpio.h:43
@ VSF_GPIO_EXTI
Definition gpio.h:45
@ VSF_GPIO_PULL_UP
Definition gpio.h:37
@ VSF_GPIO_INPUT
Definition gpio.h:41
@ VSF_GPIO_ANALOG
Definition gpio.h:44
@ VSF_GPIO_OUTPUT_OPEN_DRAIN
Definition gpio.h:42
@ VSF_GPIO_PULL_DOWN
Definition gpio.h:38
#define NULL
Definition lvgl.h:26
unsigned short uint16_t
Definition stdint.h:7
unsigned char uint_fast8_t
Definition stdint.h:23
unsigned uint32_t
Definition stdint.h:9
Definition vsf_template_gpio.h:696
inherit(vsf_peripheral_capability_t) uint8_t is_async uint8_t support_output_and_set
Flag indicating if GPIO operations are asynchronous. When set, operations are only guaranteed to be s...
Definition vsf_template_gpio.h:698
gpio configuration
Definition vsf_template_gpio.h:665
vsf_gpio_alternate_function_t alternate_function
alternate function is only valid in GPIO_AF mode
Definition vsf_template_gpio.h:668
Definition vsf_template_gpio.h:658
Definition vsf_template_gpio.h:672
Definition vsf_template_gpio.h:685
#define VSF_GPIO_CFG_IRQ_MASK_CHECK_UNIQUE
Definition gpio.c:281
#define VSF_GPIO_CFG_MODE_CHECK_UNIQUE
Definition gpio.c:280
#define VSF_HAL_ASSERT(__CON)
all hal modules use this configuration file
Definition vsf_hal_cfg.h:36
vsf_gpio_ctrl_t
GPIO control commands for hardware-specific operations.
Definition vsf_template_gpio.h:804
uint32_t vsf_gpio_pin_mask_t
Definition vsf_template_gpio.h:350
#define VSF_HAL_CHECK_UNIQUE_CUSTOM(__CHECK_FUNC,...)
Definition vsf_template_static_assert_unique.h:2426
Generated from commit: vsfteam/vsf@b2e9e8a