hal_gpio.h 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. // SPDX-License-Identifier: BSD-3-Clause
  2. // Copyright (c) 2021, Alex Taradov <alex@taradov.com>. All rights reserved.
  3. #ifndef _HAL_GPIO_H_
  4. #define _HAL_GPIO_H_
  5. /*- Definitions -------------------------------------------------------------*/
  6. #define HAL_GPIO_PIN(name, port, pin, func) \
  7. static inline void HAL_GPIO_##name##_set(void) \
  8. { \
  9. SIO->GPIO_OUT_SET = (1 << pin); \
  10. (void)HAL_GPIO_##name##_set; \
  11. } \
  12. \
  13. static inline void HAL_GPIO_##name##_clr(void) \
  14. { \
  15. SIO->GPIO_OUT_CLR = (1 << pin); \
  16. (void)HAL_GPIO_##name##_clr; \
  17. } \
  18. \
  19. static inline void HAL_GPIO_##name##_toggle(void) \
  20. { \
  21. SIO->GPIO_OUT_XOR = (1 << pin); \
  22. (void)HAL_GPIO_##name##_toggle; \
  23. } \
  24. \
  25. static inline void HAL_GPIO_##name##_write(int value) \
  26. { \
  27. if (value) \
  28. SIO->GPIO_OUT_SET = (1 << pin); \
  29. else \
  30. SIO->GPIO_OUT_CLR = (1 << pin); \
  31. (void)HAL_GPIO_##name##_write; \
  32. } \
  33. \
  34. static inline void HAL_GPIO_##name##_in(void) \
  35. { \
  36. SIO->GPIO_OE_CLR = (1 << pin); \
  37. IO_BANK##port->GPIO##pin##_CTRL = IO_BANK##port##_GPIO##pin##_CTRL_FUNCSEL_sio_##pin; \
  38. PADS_BANK##port##_CLR->GPIO##pin = PADS_BANK##port##_GPIO##pin##_PDE_Msk | PADS_BANK##port##_GPIO##pin##_PUE_Msk; \
  39. PADS_BANK##port##_SET->GPIO##pin = PADS_BANK##port##_GPIO##pin##_IE_Msk; \
  40. (void)HAL_GPIO_##name##_in; \
  41. } \
  42. \
  43. static inline void HAL_GPIO_##name##_out(void) \
  44. { \
  45. SIO->GPIO_OE_SET = (1 << pin); \
  46. IO_BANK##port->GPIO##pin##_CTRL = IO_BANK##port##_GPIO##pin##_CTRL_FUNCSEL_sio_##pin; \
  47. (void)HAL_GPIO_##name##_out; \
  48. } \
  49. \
  50. static inline void HAL_GPIO_##name##_init(void) \
  51. { \
  52. IO_BANK##port->GPIO##pin##_CTRL = IO_BANK##port##_GPIO##pin##_CTRL_FUNCSEL_##func; \
  53. (void)HAL_GPIO_##name##_init; \
  54. } \
  55. \
  56. static inline void HAL_GPIO_##name##_pullup(void) \
  57. { \
  58. PADS_BANK##port##_SET->GPIO##pin = PADS_BANK##port##_GPIO##pin##_PUE_Msk; \
  59. PADS_BANK##port##_CLR->GPIO##pin = PADS_BANK##port##_GPIO##pin##_PDE_Msk; \
  60. (void)HAL_GPIO_##name##_pullup; \
  61. } \
  62. \
  63. static inline void HAL_GPIO_##name##_pulldown(void) \
  64. { \
  65. PADS_BANK##port##_SET->GPIO##pin = PADS_BANK##port##_GPIO##pin##_PDE_Msk; \
  66. PADS_BANK##port##_CLR->GPIO##pin = PADS_BANK##port##_GPIO##pin##_PUE_Msk; \
  67. (void)HAL_GPIO_##name##_pulldown; \
  68. } \
  69. \
  70. static inline int HAL_GPIO_##name##_read(void) \
  71. { \
  72. return (SIO->GPIO_IN & (1 << pin)) != 0; \
  73. (void)HAL_GPIO_##name##_read; \
  74. } \
  75. \
  76. static inline void HAL_GPIO_##name##_funcsel(int fn) \
  77. { \
  78. IO_BANK##port->GPIO##pin##_CTRL_b.FUNCSEL = fn; \
  79. (void)HAL_GPIO_##name##_funcsel; \
  80. } \
  81. #endif // _HAL_GPIO_H_