interrupt_controller_hal.h 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  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. #ifdef __cplusplus
  18. extern "C" {
  19. #endif
  20. /**
  21. * @brief Gets target platform interrupt descriptor table
  22. *
  23. * @return Address of interrupt descriptor table
  24. */
  25. __attribute__((pure)) const int_desc_t *interrupt_controller_hal_desc_table(void);
  26. /**
  27. * @brief Gets the interrupt type given an interrupt number.
  28. *
  29. * @param interrupt_number Interrupt number 0 to 31
  30. * @return interrupt type
  31. */
  32. __attribute__((pure)) int_type_t interrupt_controller_hal_desc_type(int interrupt_number);
  33. /**
  34. * @brief Gets the interrupt level given an interrupt number.
  35. *
  36. * @param interrupt_number Interrupt number 0 to 31
  37. * @return interrupt level bitmask
  38. */
  39. __attribute__((pure)) int interrupt_controller_hal_desc_level(int interrupt_number);
  40. /**
  41. * @brief Gets the cpu flags given the interrupt number and target cpu.
  42. *
  43. * @param interrupt_number Interrupt number 0 to 31
  44. * @param cpu_number CPU number between 0 and SOC_CPU_CORES_NUM - 1
  45. * @return flags for that interrupt number
  46. */
  47. __attribute__((pure)) int_desc_flag_t interrupt_controller_hal_desc_flags(int interrupt_number, int cpu_number);
  48. /**
  49. * @brief Gets the interrupt type given an interrupt number.
  50. *
  51. * @param interrupt_number Interrupt number 0 to 31
  52. * @return interrupt type
  53. */
  54. static inline int_type_t interrupt_controller_hal_get_type(int interrupt_number)
  55. {
  56. return interrupt_controller_hal_desc_type(interrupt_number);
  57. }
  58. /**
  59. * @brief Gets the interrupt level given an interrupt number.
  60. *
  61. * @param interrupt_number Interrupt number 0 to 31
  62. * @return interrupt level bitmask
  63. */
  64. static inline int interrupt_controller_hal_get_level(int interrupt_number)
  65. {
  66. return interrupt_controller_hal_desc_level(interrupt_number);
  67. }
  68. /**
  69. * @brief Gets the cpu flags given the interrupt number and target cpu.
  70. *
  71. * @param interrupt_number Interrupt number 0 to 31
  72. * @param cpu_number CPU number between 0 and SOC_CPU_CORES_NUM - 1
  73. * @return flags for that interrupt number
  74. */
  75. static inline uint32_t interrupt_controller_hal_get_cpu_desc_flags(int interrupt_number, int cpu_number)
  76. {
  77. return interrupt_controller_hal_desc_flags(interrupt_number, cpu_number);
  78. }
  79. /**
  80. * @brief enable interrupts specified by the mask
  81. *
  82. * @param mask bitmask of interrupts that needs to be enabled
  83. */
  84. static inline void interrupt_controller_hal_enable_interrupts(uint32_t mask)
  85. {
  86. intr_cntrl_ll_enable_interrupts(mask);
  87. }
  88. /**
  89. * @brief disable interrupts specified by the mask
  90. *
  91. * @param mask bitmask of interrupts that needs to be disabled
  92. */
  93. static inline void interrupt_controller_hal_disable_interrupts(uint32_t mask)
  94. {
  95. intr_cntrl_ll_disable_interrupts(mask);
  96. }
  97. /**
  98. * @brief checks if given interrupt number has a valid handler
  99. *
  100. * @param intr interrupt number ranged from 0 to 31
  101. * @param cpu cpu number ranged betweeen 0 to SOC_CPU_CORES_NUM - 1
  102. * @return true for valid handler, false otherwise
  103. */
  104. static inline bool interrupt_controller_hal_has_handler(int intr, int cpu)
  105. {
  106. return intr_cntrl_ll_has_handler(intr, cpu);
  107. }
  108. /**
  109. * @brief sets interrupt handler and optional argument of a given interrupt number
  110. *
  111. * @param intr interrupt number ranged from 0 to 31
  112. * @param handler handler invoked when an interrupt occurs
  113. * @param arg optional argument to pass to the handler
  114. */
  115. static inline void interrupt_controller_hal_set_int_handler(uint8_t intr, interrupt_handler_t handler, void *arg)
  116. {
  117. intr_cntrl_ll_set_int_handler(intr, handler, arg);
  118. }
  119. /**
  120. * @brief Gets argument passed to handler of a given interrupt number
  121. *
  122. * @param intr interrupt number ranged from 0 to 31
  123. *
  124. * @return argument used by handler of passed interrupt number
  125. */
  126. static inline void * interrupt_controller_hal_get_int_handler_arg(uint8_t intr)
  127. {
  128. return intr_cntrl_ll_get_int_handler_arg(intr);
  129. }
  130. /**
  131. * @brief Disables interrupts that are not located in iram
  132. *
  133. * @param newmask mask of interrupts needs to be disabled
  134. * @return oldmask where to store old interrupts state
  135. */
  136. static inline uint32_t interrupt_controller_hal_disable_int_mask(uint32_t newmask)
  137. {
  138. return intr_cntrl_ll_disable_int_mask(newmask);
  139. }
  140. /**
  141. * @brief Enables interrupts that are not located in iram
  142. *
  143. * @param newmask mask of interrupts needs to be disabled
  144. */
  145. static inline void interrupt_controller_hal_enable_int_mask(uint32_t newmask)
  146. {
  147. intr_cntrl_ll_enable_int_mask(newmask);
  148. }
  149. #ifdef __cplusplus
  150. }
  151. #endif