hpm_gpiom_drv.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. /*
  2. * Copyright (c) 2021 HPMicro
  3. *
  4. * SPDX-License-Identifier: BSD-3-Clause
  5. *
  6. */
  7. #ifndef HPM_GPIOM_DRV_H
  8. #define HPM_GPIOM_DRV_H
  9. #include "hpm_gpiom_regs.h"
  10. #include "hpm_gpiom_soc_drv.h"
  11. /**
  12. *
  13. * @brief GPIOM driver APIs
  14. * @defgroup gpiom_interface GPIOM driver APIs
  15. * @ingroup io_interfaces
  16. * @{
  17. */
  18. /* @brief pin visibility */
  19. typedef enum gpiom_pin_visibility {
  20. gpiom_pin_visible = 0,
  21. gpiom_pin_invisible = 1,
  22. } gpiom_pin_visibility_t;
  23. #ifdef __cplusplus
  24. extern "C" {
  25. #endif
  26. /**
  27. * @brief Get pin's controller
  28. *
  29. * @param ptr GPIOM base address
  30. * @param gpio_index gpio port index
  31. * @param pin_index pin index
  32. *
  33. * @retval pin control module
  34. */
  35. static inline gpiom_gpio_t gpiom_get_pin_controller(GPIOM_Type *ptr,
  36. uint8_t gpio_index,
  37. uint8_t pin_index)
  38. {
  39. return (gpiom_gpio_t)((ptr->ASSIGN[gpio_index].PIN[pin_index]
  40. & (GPIOM_ASSIGN_PIN_SELECT_MASK)) >> GPIOM_ASSIGN_PIN_SELECT_SHIFT);
  41. }
  42. /**
  43. * @brief set pin's controller
  44. *
  45. * @param ptr GPIOM base address
  46. * @param gpio_index gpio port index
  47. * @param pin_index pin index
  48. * @param gpio gpio module index
  49. */
  50. static inline void gpiom_set_pin_controller(GPIOM_Type *ptr,
  51. uint8_t gpio_index,
  52. uint8_t pin_index,
  53. gpiom_gpio_t gpio)
  54. {
  55. ptr->ASSIGN[gpio_index].PIN[pin_index] =
  56. (ptr->ASSIGN[gpio_index].PIN[pin_index] & ~(GPIOM_ASSIGN_PIN_SELECT_MASK))
  57. | GPIOM_ASSIGN_PIN_SELECT_SET(gpio);
  58. }
  59. /**
  60. * @brief Check if pin is visibility for specified module
  61. *
  62. * @param ptr GPIOM base address
  63. * @param gpio_index gpio port index
  64. * @param pin_index pin index
  65. * @param gpio gpio module index
  66. *
  67. * @retval true if pin is visible by specified module
  68. * @retval false if pin is not visible by specified module
  69. */
  70. static inline bool gpiom_check_pin_visibility(GPIOM_Type *ptr,
  71. uint8_t gpio_index,
  72. uint8_t pin_index,
  73. gpiom_gpio_t gpio)
  74. {
  75. return (ptr->ASSIGN[gpio_index].PIN[pin_index] & ((1 << gpio) << GPIOM_ASSIGN_PIN_HIDE_SHIFT))
  76. >> GPIOM_ASSIGN_PIN_HIDE_SHIFT >> gpio == gpiom_pin_visible;
  77. }
  78. /**
  79. * @brief enable pin visibility for specified module
  80. *
  81. * @param ptr GPIOM base address
  82. * @param gpio_index gpio port index
  83. * @param pin_index pin index
  84. * @param gpio gpio module index
  85. */
  86. static inline void gpiom_enable_pin_visibility(GPIOM_Type *ptr,
  87. uint8_t gpio_index,
  88. uint8_t pin_index,
  89. gpiom_gpio_t gpio)
  90. {
  91. ptr->ASSIGN[gpio_index].PIN[pin_index] =
  92. (ptr->ASSIGN[gpio_index].PIN[pin_index] & ~((1 << gpio) << GPIOM_ASSIGN_PIN_HIDE_SHIFT));
  93. }
  94. /**
  95. * @brief disable pin visibility for specified module
  96. *
  97. * @param ptr GPIOM base address
  98. * @param gpio_index gpio port index
  99. * @param pin_index pin index
  100. * @param gpio gpio module index
  101. */
  102. static inline void gpiom_disable_pin_visibility(GPIOM_Type *ptr,
  103. uint8_t gpio_index,
  104. uint8_t pin_index,
  105. gpiom_gpio_t gpio)
  106. {
  107. ptr->ASSIGN[gpio_index].PIN[pin_index] =
  108. (ptr->ASSIGN[gpio_index].PIN[pin_index] & ~((1 << gpio) << GPIOM_ASSIGN_PIN_HIDE_SHIFT))
  109. | GPIOM_ASSIGN_PIN_HIDE_SET(1 << gpio);
  110. }
  111. /**
  112. * @brief Check if pin management is locked
  113. *
  114. * @param ptr GPIOM base address
  115. * @param gpio_index gpio port index
  116. * @param pin_index pin index
  117. *
  118. * @retval true if pin management is locked
  119. * @retval false if pin management is not locked
  120. */
  121. static inline bool gpiom_pin_is_locked(GPIOM_Type *ptr,
  122. uint8_t gpio_index,
  123. uint8_t pin_index)
  124. {
  125. return (ptr->ASSIGN[gpio_index].PIN[pin_index] & GPIOM_ASSIGN_PIN_LOCK_MASK)
  126. == GPIOM_ASSIGN_PIN_LOCK_MASK;
  127. }
  128. /**
  129. * @brief lock pin management
  130. *
  131. * @param ptr GPIOM base address
  132. * @param gpio_index gpio port index
  133. * @param pin_index pin index
  134. */
  135. static inline void gpiom_lock_pin(GPIOM_Type *ptr,
  136. uint8_t gpio_index,
  137. uint8_t pin_index)
  138. {
  139. ptr->ASSIGN[gpio_index].PIN[pin_index] |= GPIOM_ASSIGN_PIN_LOCK_MASK;
  140. }
  141. #ifdef __cplusplus
  142. }
  143. #endif
  144. /**
  145. * @}
  146. */
  147. #endif /* HPM_GPIOM_DRV_H */