interrupt_controller_hal.h 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. // Copyright 2020 Espressif Systems (Shanghai) PTE LTD
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. // http://www.apache.org/licenses/LICENSE-2.0
  7. //
  8. // Unless required by applicable law or agreed to in writing, software
  9. // distributed under the License is distributed on an "AS IS" BASIS,
  10. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  11. // See the License for the specific language governing permissions and
  12. // limitations under the License.
  13. #pragma once
  14. #include <stdbool.h>
  15. #include "hal/interrupt_controller_types.h"
  16. #include "hal/interrupt_controller_ll.h"
  17. #include "soc/soc_caps.h"
  18. #ifdef __cplusplus
  19. extern "C" {
  20. #endif
  21. #ifndef SOC_CPU_HAS_FLEXIBLE_INTC
  22. /**
  23. * @brief Gets target platform interrupt descriptor table
  24. *
  25. * @return Address of interrupt descriptor table
  26. */
  27. __attribute__((pure)) const int_desc_t *interrupt_controller_hal_desc_table(void);
  28. #endif
  29. /**
  30. * @brief Gets the interrupt type given an interrupt number.
  31. *
  32. * @param interrupt_number Interrupt number 0 to 31
  33. * @return interrupt type
  34. */
  35. __attribute__((pure)) int_type_t interrupt_controller_hal_desc_type(int interrupt_number);
  36. /**
  37. * @brief Gets the interrupt level given an interrupt number.
  38. *
  39. * @param interrupt_number Interrupt number 0 to 31
  40. * @return interrupt level bitmask
  41. */
  42. __attribute__((pure)) int interrupt_controller_hal_desc_level(int interrupt_number);
  43. /**
  44. * @brief Gets the cpu flags given the interrupt number and target cpu.
  45. *
  46. * @param interrupt_number Interrupt number 0 to 31
  47. * @param cpu_number CPU number between 0 and SOC_CPU_CORES_NUM - 1
  48. * @return flags for that interrupt number
  49. */
  50. __attribute__((pure)) int_desc_flag_t interrupt_controller_hal_desc_flags(int interrupt_number, int cpu_number);
  51. /**
  52. * @brief Gets the interrupt type given an interrupt number.
  53. *
  54. * @param interrupt_number Interrupt number 0 to 31
  55. * @return interrupt type
  56. */
  57. static inline int_type_t interrupt_controller_hal_get_type(int interrupt_number)
  58. {
  59. return interrupt_controller_hal_desc_type(interrupt_number);
  60. }
  61. /**
  62. * @brief Gets the interrupt level given an interrupt number.
  63. *
  64. * @param interrupt_number Interrupt number 0 to 31
  65. * @return interrupt level bitmask
  66. */
  67. static inline int interrupt_controller_hal_get_level(int interrupt_number)
  68. {
  69. return interrupt_controller_hal_desc_level(interrupt_number);
  70. }
  71. #ifdef SOC_CPU_HAS_FLEXIBLE_INTC
  72. /**
  73. * @brief Set the type of an interrupt in the controller.
  74. *
  75. * @param interrupt_number Interrupt number 0 to 31
  76. * @param type interrupt type as edge or level triggered
  77. */
  78. static inline void interrupt_controller_hal_set_int_type(int intr, int_type_t type)
  79. {
  80. intr_cntrl_ll_set_int_type(intr, type);
  81. }
  82. /**
  83. * @brief Sets the interrupt level int the interrupt controller.
  84. *
  85. * @param interrupt_number Interrupt number 0 to 31
  86. * @param level priority between 1 (lowest) to 7 (highest)
  87. */
  88. static inline void interrupt_controller_hal_set_int_level(int intr, int level)
  89. {
  90. intr_cntrl_ll_set_int_level(intr, level);
  91. }
  92. #endif
  93. /**
  94. * @brief Gets the cpu flags given the interrupt number and target cpu.
  95. *
  96. * @param interrupt_number Interrupt number 0 to 31
  97. * @param cpu_number CPU number between 0 and SOC_CPU_CORES_NUM - 1
  98. * @return flags for that interrupt number
  99. */
  100. static inline uint32_t interrupt_controller_hal_get_cpu_desc_flags(int interrupt_number, int cpu_number)
  101. {
  102. return interrupt_controller_hal_desc_flags(interrupt_number, cpu_number);
  103. }
  104. /**
  105. * @brief enable interrupts specified by the mask
  106. *
  107. * @param mask bitmask of interrupts that needs to be enabled
  108. */
  109. static inline void interrupt_controller_hal_enable_interrupts(uint32_t mask)
  110. {
  111. intr_cntrl_ll_enable_interrupts(mask);
  112. }
  113. /**
  114. * @brief disable interrupts specified by the mask
  115. *
  116. * @param mask bitmask of interrupts that needs to be disabled
  117. */
  118. static inline void interrupt_controller_hal_disable_interrupts(uint32_t mask)
  119. {
  120. intr_cntrl_ll_disable_interrupts(mask);
  121. }
  122. /**
  123. * @brief Read the current interrupt mask.
  124. *
  125. * @return The bitmask of current interrupts
  126. */
  127. static inline uint32_t interrupt_controller_hal_read_interrupt_mask(void)
  128. {
  129. return intr_cntrl_ll_read_interrupt_mask();
  130. }
  131. /**
  132. * @brief checks if given interrupt number has a valid handler
  133. *
  134. * @param intr interrupt number ranged from 0 to 31
  135. * @param cpu cpu number ranged betweeen 0 to SOC_CPU_CORES_NUM - 1
  136. * @return true for valid handler, false otherwise
  137. */
  138. static inline bool interrupt_controller_hal_has_handler(int intr, int cpu)
  139. {
  140. return intr_cntrl_ll_has_handler(intr, cpu);
  141. }
  142. /**
  143. * @brief sets interrupt handler and optional argument of a given interrupt number
  144. *
  145. * @param intr interrupt number ranged from 0 to 31
  146. * @param handler handler invoked when an interrupt occurs
  147. * @param arg optional argument to pass to the handler
  148. */
  149. static inline void interrupt_controller_hal_set_int_handler(uint8_t intr, interrupt_handler_t handler, void *arg)
  150. {
  151. intr_cntrl_ll_set_int_handler(intr, handler, arg);
  152. }
  153. /**
  154. * @brief Gets argument passed to handler of a given interrupt number
  155. *
  156. * @param intr interrupt number ranged from 0 to 31
  157. *
  158. * @return argument used by handler of passed interrupt number
  159. */
  160. static inline void * interrupt_controller_hal_get_int_handler_arg(uint8_t intr)
  161. {
  162. return intr_cntrl_ll_get_int_handler_arg(intr);
  163. }
  164. /**
  165. * @brief Acknowledge an edge-trigger interrupt by clearing its pending flag
  166. *
  167. * @param intr interrupt number ranged from 0 to 31
  168. */
  169. static inline void interrupt_controller_hal_edge_int_acknowledge(int intr)
  170. {
  171. intr_cntrl_ll_edge_int_acknowledge(intr);
  172. }
  173. #ifdef __cplusplus
  174. }
  175. #endif