interrupt_controller_hal.h 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. /*
  2. * SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #pragma once
  7. /*
  8. Note: This is a compatibility header. Call the interfaces in esp_cpu.h instead
  9. */
  10. #include <stdint.h>
  11. #include <stdbool.h>
  12. #include "soc/soc_caps.h"
  13. #include "esp_attr.h"
  14. #include "esp_cpu.h"
  15. #ifdef __cplusplus
  16. extern "C" {
  17. #endif
  18. typedef enum {
  19. INTDESC_NORMAL = 0,
  20. INTDESC_RESVD,
  21. INTDESC_SPECIAL,
  22. } int_desc_flag_t;
  23. typedef enum {
  24. INTTP_LEVEL = ESP_CPU_INTR_TYPE_LEVEL,
  25. INTTP_EDGE = ESP_CPU_INTR_TYPE_EDGE,
  26. INTTP_NA = ESP_CPU_INTR_TYPE_NA,
  27. } int_type_t;
  28. typedef struct {
  29. int level;
  30. int_type_t type;
  31. int_desc_flag_t cpuflags[SOC_CPU_CORES_NUM];
  32. } int_desc_t;
  33. typedef void (*interrupt_handler_t)(void *arg);
  34. // ---------------- Interrupt Descriptors ------------------
  35. /**
  36. * @brief Gets the interrupt type given an interrupt number.
  37. *
  38. * @param interrupt_number Interrupt number 0 to 31
  39. * @return interrupt type
  40. */
  41. FORCE_INLINE_ATTR __attribute__((deprecated)) int_type_t interrupt_controller_hal_desc_type(int interrupt_number)
  42. {
  43. esp_cpu_intr_desc_t intr_desc;
  44. esp_cpu_intr_get_desc(esp_cpu_get_core_id(), interrupt_number, &intr_desc);
  45. return (int_type_t)intr_desc.type;
  46. }
  47. /**
  48. * @brief Gets the interrupt level given an interrupt number.
  49. *
  50. * @param interrupt_number Interrupt number 0 to 31
  51. * @return interrupt level bitmask
  52. */
  53. FORCE_INLINE_ATTR __attribute__((deprecated)) int interrupt_controller_hal_desc_level(int interrupt_number)
  54. {
  55. esp_cpu_intr_desc_t intr_desc;
  56. esp_cpu_intr_get_desc(esp_cpu_get_core_id(), interrupt_number, &intr_desc);
  57. return intr_desc.priority;
  58. }
  59. /**
  60. * @brief Gets the cpu flags given the interrupt number and target cpu.
  61. *
  62. * @param interrupt_number Interrupt number 0 to 31
  63. * @param cpu_number CPU number between 0 and SOC_CPU_CORES_NUM - 1
  64. * @return flags for that interrupt number
  65. */
  66. FORCE_INLINE_ATTR __attribute__((deprecated))
  67. int_desc_flag_t interrupt_controller_hal_desc_flags(int interrupt_number, int cpu_number)
  68. {
  69. esp_cpu_intr_desc_t intr_desc;
  70. esp_cpu_intr_get_desc(cpu_number, interrupt_number, &intr_desc);
  71. int_desc_flag_t ret;
  72. if (intr_desc.flags & ESP_CPU_INTR_DESC_FLAG_SPECIAL) {
  73. ret = INTDESC_SPECIAL;
  74. } else if (intr_desc.flags & ESP_CPU_INTR_DESC_FLAG_RESVD) {
  75. ret = INTDESC_RESVD;
  76. } else {
  77. ret = INTDESC_NORMAL;
  78. }
  79. return ret;
  80. }
  81. /**
  82. * @brief Gets the interrupt type given an interrupt number.
  83. *
  84. * @param interrupt_number Interrupt number 0 to 31
  85. * @return interrupt type
  86. */
  87. FORCE_INLINE_ATTR __attribute__((deprecated)) int_type_t interrupt_controller_hal_get_type(int interrupt_number)
  88. {
  89. return interrupt_controller_hal_desc_type(interrupt_number);
  90. }
  91. /**
  92. * @brief Gets the interrupt level given an interrupt number.
  93. *
  94. * @param interrupt_number Interrupt number 0 to 31
  95. * @return interrupt level bitmask
  96. */
  97. FORCE_INLINE_ATTR __attribute__((deprecated)) int interrupt_controller_hal_get_level(int interrupt_number)
  98. {
  99. return interrupt_controller_hal_desc_level(interrupt_number);
  100. }
  101. /**
  102. * @brief Gets the cpu flags given the interrupt number and target cpu.
  103. *
  104. * @param interrupt_number Interrupt number 0 to 31
  105. * @param cpu_number CPU number between 0 and SOC_CPU_CORES_NUM - 1
  106. * @return flags for that interrupt number
  107. */
  108. FORCE_INLINE_ATTR __attribute__((deprecated))
  109. uint32_t interrupt_controller_hal_get_cpu_desc_flags(int interrupt_number, int cpu_number)
  110. {
  111. return (uint32_t)interrupt_controller_hal_desc_flags(interrupt_number, cpu_number);
  112. }
  113. // --------------- Interrupt Configuration -----------------
  114. #if SOC_CPU_HAS_FLEXIBLE_INTC
  115. /**
  116. * @brief Set the type of an interrupt in the controller.
  117. *
  118. * @param interrupt_number Interrupt number 0 to 31
  119. * @param type interrupt type as edge or level triggered
  120. */
  121. FORCE_INLINE_ATTR __attribute__((deprecated)) void interrupt_controller_hal_set_int_type(int intr, int_type_t type)
  122. {
  123. esp_cpu_intr_set_type(intr, (esp_cpu_intr_type_t)type);
  124. }
  125. /**
  126. * @brief Sets the interrupt level int the interrupt controller.
  127. *
  128. * @param interrupt_number Interrupt number 0 to 31
  129. * @param level priority between 1 (lowest) to 7 (highest)
  130. */
  131. FORCE_INLINE_ATTR __attribute__((deprecated)) void interrupt_controller_hal_set_int_level(int intr, int level)
  132. {
  133. esp_cpu_intr_set_priority(intr, level);
  134. }
  135. #endif // SOC_CPU_HAS_FLEXIBLE_INTC
  136. /**
  137. * @brief checks if given interrupt number has a valid handler
  138. *
  139. * @param intr interrupt number ranged from 0 to 31
  140. * @param cpu this argument is ignored
  141. * @return true for valid handler, false otherwise
  142. */
  143. FORCE_INLINE_ATTR __attribute__((deprecated)) bool interrupt_controller_hal_has_handler(int intr, int cpu)
  144. {
  145. (void) cpu;
  146. return esp_cpu_intr_has_handler(intr);
  147. }
  148. /**
  149. * @brief sets interrupt handler and optional argument of a given interrupt number
  150. *
  151. * @param intr interrupt number ranged from 0 to 31
  152. * @param handler handler invoked when an interrupt occurs
  153. * @param arg optional argument to pass to the handler
  154. */
  155. FORCE_INLINE_ATTR __attribute__((deprecated))
  156. void interrupt_controller_hal_set_int_handler(uint8_t intr, interrupt_handler_t handler, void *arg)
  157. {
  158. esp_cpu_intr_set_handler(intr, (esp_cpu_intr_handler_t)handler, arg);
  159. }
  160. /**
  161. * @brief Gets argument passed to handler of a given interrupt number
  162. *
  163. * @param intr interrupt number ranged from 0 to 31
  164. *
  165. * @return argument used by handler of passed interrupt number
  166. */
  167. FORCE_INLINE_ATTR __attribute__((deprecated)) void *interrupt_controller_hal_get_int_handler_arg(uint8_t intr)
  168. {
  169. return esp_cpu_intr_get_handler_arg(intr);
  170. }
  171. // ------------------ Interrupt Control --------------------
  172. /**
  173. * @brief enable interrupts specified by the mask
  174. *
  175. * @param mask bitmask of interrupts that needs to be enabled
  176. */
  177. FORCE_INLINE_ATTR __attribute__((deprecated)) void interrupt_controller_hal_enable_interrupts(uint32_t mask)
  178. {
  179. esp_cpu_intr_enable(mask);
  180. }
  181. /**
  182. * @brief disable interrupts specified by the mask
  183. *
  184. * @param mask bitmask of interrupts that needs to be disabled
  185. */
  186. FORCE_INLINE_ATTR __attribute__((deprecated)) void interrupt_controller_hal_disable_interrupts(uint32_t mask)
  187. {
  188. esp_cpu_intr_disable(mask);
  189. }
  190. /**
  191. * @brief Read the current interrupt mask.
  192. *
  193. * @return The bitmask of current interrupts
  194. */
  195. FORCE_INLINE_ATTR __attribute__((deprecated)) uint32_t interrupt_controller_hal_read_interrupt_mask(void)
  196. {
  197. return esp_cpu_intr_get_enabled_mask();
  198. }
  199. /**
  200. * @brief Acknowledge an edge-trigger interrupt by clearing its pending flag
  201. *
  202. * @param intr interrupt number ranged from 0 to 31
  203. */
  204. FORCE_INLINE_ATTR __attribute__((deprecated)) void interrupt_controller_hal_edge_int_acknowledge(int intr)
  205. {
  206. esp_cpu_intr_edge_ack(intr);
  207. }
  208. #ifdef __cplusplus
  209. }
  210. #endif