sema.c 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. #include "chip.h"
  2. #include "board.h"
  3. #include "sema.h"
  4. static SemaphoreHandle_t gate_mutex[SEMA_GATE_MAX] = {0};
  5. static QueueHandle_t gate_status[SEMA_GATE_MAX] = {0};
  6. static sema_gate_state_e sema_gate_status(sema_gate_e gate)
  7. {
  8. if (gate >= SEMA_GATE_MAX)
  9. return pdFAIL;
  10. return (sema_gate_state_e)(rSemaGate(gate)&0x3);
  11. }
  12. static int sema_gate_lock(sema_gate_e gate)
  13. {
  14. int ret = 1;
  15. rSemaGate(gate) = (LOCAL_CPx + 1);
  16. if (sema_gate_status(gate) != (sema_gate_state_e)(LOCAL_CPx + 1)) {
  17. ret = 0;
  18. }
  19. return ret;
  20. }
  21. static int sema_gate_unlock(sema_gate_e gate)
  22. {
  23. int ret = 1;
  24. rSemaGate(gate) = SEMA_GATE_S_UNLOCK;
  25. if (sema_gate_status(gate) != SEMA_GATE_S_FREE) {
  26. ret = 0;
  27. }
  28. return ret;
  29. }
  30. static void sema_int_enable(sema_gate_e gate, int enable)
  31. {
  32. if (enable) {
  33. rSemaCPINE(gate / 32) |= ( 1<< (gate % 32));
  34. } else {
  35. rSemaCPINE(gate / 32) &= ~( 1<< (gate % 32));
  36. }
  37. }
  38. static void sema_clear_int_flag(void)
  39. {
  40. rSemaIRQCLR = 0x1;
  41. }
  42. static int sema_get_int_flag(sema_gate_e gate)
  43. {
  44. return (rSemaCPINTFLG(gate / 32) & (1 << (gate % 32)))? 1 : 0;
  45. }
  46. static void sema_reset_gate(sema_gate_e gate, int all_gate)
  47. {
  48. unsigned int gate_n = gate;
  49. if (all_gate) {
  50. gate_n = 64;
  51. }
  52. rSemaRSTGT = (gate_n << 8) | 0xe2;
  53. rSemaRSTGT = (gate_n << 8) | 0x1d;
  54. }
  55. static void sema_reset_int_notify(sema_gate_e gate, int all_gate)
  56. {
  57. unsigned int gate_n = gate;
  58. if (all_gate) {
  59. gate_n = 64;
  60. }
  61. rSemaRSTNTF = (gate_n << 8) | 0x47;
  62. rSemaRSTNTF = (gate_n << 8) | 0xb8;
  63. }
  64. void sema_int_handler(void *param)
  65. {
  66. int i;
  67. for (i=0; i<SEMA_GATE_MAX; i++) {
  68. if (sema_get_int_flag((sema_gate_e)i)) {
  69. if (sema_gate_lock((sema_gate_e)i)) {
  70. xQueueSendFromISR(gate_status[i], NULL, 0);
  71. }
  72. }
  73. }
  74. }
  75. int sema_take(sema_gate_e gate, TickType_t xTicksToWait)
  76. {
  77. int ret = pdPASS;
  78. if (gate >= SEMA_GATE_MAX)
  79. return pdFAIL;
  80. if (xSemaphoreTake(gate_mutex[gate], xTicksToWait) != pdPASS) {
  81. return pdFAIL;
  82. }
  83. sema_int_enable(gate, 1);
  84. xQueueReset(gate_status[gate]);
  85. while (!sema_gate_lock(gate)) {
  86. ret = xQueueReceive(gate_status[gate], NULL, (xTicksToWait > 0)?1:0);
  87. if (ret == pdPASS)
  88. break;
  89. if (xTicksToWait > 0)
  90. xTicksToWait--;
  91. if (xTicksToWait == 0)
  92. break;
  93. }
  94. sema_int_enable(gate, 0);
  95. if (ret != pdPASS) {
  96. if (sema_gate_status(gate) == (sema_gate_state_e)(LOCAL_CPx + 1))
  97. ret = pdPASS;
  98. }
  99. if (ret != pdPASS) {
  100. xSemaphoreGive(gate_mutex[gate]);
  101. }
  102. return ret;
  103. }
  104. int sema_give(sema_gate_e gate)
  105. {
  106. int ret = pdPASS;
  107. if (gate >= SEMA_GATE_MAX)
  108. return pdFAIL;
  109. ret = sema_gate_unlock(gate);
  110. if (!uxSemaphoreGetCount(gate_mutex[gate])) {
  111. xSemaphoreGive(gate_mutex[gate]);
  112. }
  113. return ret;
  114. }
  115. void sema_init(void)
  116. {
  117. int i;
  118. //sema_reset_gate(0, 1);
  119. //sema_reset_int_notify(0, 1);
  120. for (i=0; i<SEMA_GATE_MAX; i++) {
  121. gate_mutex[i] = xSemaphoreCreateMutex();
  122. gate_status[i] = xQueueCreate(1, 0);
  123. }
  124. request_irq(SEMA_IRQn, 0,sema_int_handler,NULL);
  125. /*
  126. 获取后会导致mcu无法访问,若访问需要cpu端释放,且mcu端需获取模块锁后才能正常访问;
  127. 除一些特定的应用场景外,例如:CRC模块,对模块的访问需要动态获取;
  128. 其他模块建议固定在一端访问,若需要核心间信息交互,可通过mailbox实现;
  129. */
  130. //fixed config
  131. sema_take(SEMA_GATE_SYS, portMAX_DELAY);
  132. sema_take(SEMA_GATE_GBUS, portMAX_DELAY);
  133. sema_take(SEMA_GATE_VBUS, portMAX_DELAY);
  134. sema_take(SEMA_GATE_CHBUS, portMAX_DELAY);
  135. sema_take(SEMA_GATE_CABUS, portMAX_DELAY);
  136. sema_take(SEMA_GATE_DDRCTL, portMAX_DELAY);
  137. sema_take(SEMA_GATE_DDRPHY, portMAX_DELAY);
  138. sema_take(SEMA_GATE_TIMER, portMAX_DELAY);
  139. sema_take(SEMA_GATE_UART0, portMAX_DELAY);
  140. sema_take(SEMA_GATE_UART1, portMAX_DELAY);
  141. sema_take(SEMA_GATE_DMA, portMAX_DELAY);
  142. sema_take(SEMA_GATE_SDMMC1, portMAX_DELAY);
  143. #ifdef DW_SPI0_SUPPORT
  144. sema_take(SEMA_GATE_SPI0, portMAX_DELAY);
  145. #endif
  146. #ifdef DW_SPI2_SUPPORT
  147. sema_take(SEMA_GATE_SPI2, portMAX_DELAY);
  148. #endif
  149. #ifdef EC_SPI1_SUPPORT
  150. sema_take(SEMA_GATE_ECSPI, portMAX_DELAY);
  151. #endif
  152. sema_take(SEMA_GATE_GPIO, portMAX_DELAY);
  153. sema_take(SEMA_GATE_WDT, portMAX_DELAY);
  154. sema_take(SEMA_GATE_LCD, portMAX_DELAY);
  155. sema_take(SEMA_GATE_BLENDING, portMAX_DELAY);
  156. sema_take(SEMA_GATE_PXP, portMAX_DELAY);
  157. sema_take(SEMA_GATE_QOI, portMAX_DELAY);
  158. sema_take(SEMA_GATE_MFC, portMAX_DELAY);
  159. sema_take(SEMA_GATE_WRAP, portMAX_DELAY);
  160. sema_take(SEMA_GATE_ETH, portMAX_DELAY);
  161. sema_take(SEMA_GATE_CRC, portMAX_DELAY);
  162. sema_take(SEMA_GATE_DDRRDC, portMAX_DELAY);
  163. sema_take(SEMA_GATE_SRAMRDC, portMAX_DELAY);
  164. sema_take(SEMA_GATE_ITU, portMAX_DELAY);
  165. sema_take(SEMA_GATE_I2C0, portMAX_DELAY);
  166. sema_take(SEMA_GATE_I2C1, portMAX_DELAY);
  167. sema_take(SEMA_GATE_GPU, portMAX_DELAY);
  168. #ifdef USB_SUPPORT
  169. sema_take(SEMA_GATE_USB, portMAX_DELAY);
  170. #endif
  171. sema_take(SEMA_GATE_RCRT, portMAX_DELAY);
  172. sema_take(SEMA_GATE_UART2, portMAX_DELAY);
  173. sema_take(SEMA_GATE_UART3, portMAX_DELAY);
  174. sema_take(SEMA_GATE_PWM, portMAX_DELAY);
  175. sema_take(SEMA_GATE_I2S0, portMAX_DELAY);
  176. sema_take(SEMA_GATE_I2S1, portMAX_DELAY);
  177. #ifdef RTC_SUPPORT
  178. sema_take(SEMA_GATE_RTC, portMAX_DELAY);
  179. #endif
  180. #if LCD_INTERFACE_TYPE == LCD_INTERFACE_MIPI
  181. sema_take(SEMA_GATE_DSI, portMAX_DELAY);
  182. #endif
  183. #ifdef VIDEO_DECODER_MIPI
  184. sema_take(SEMA_GATE_CSI, portMAX_DELAY);
  185. #endif
  186. //dynamic
  187. //sema_take(SEMA_GATE_SDMMC0, portMAX_DELAY);
  188. // mcu use module
  189. #ifdef ADC0_SUPPORT
  190. sema_take(SEMA_GATE_ADC0, portMAX_DELAY);
  191. #endif
  192. #ifdef ADC1_SUPPORT
  193. sema_take(SEMA_GATE_ADC1, portMAX_DELAY);
  194. #endif
  195. #ifdef ADC2_SUPPORT
  196. sema_take(SEMA_GATE_ADC2, portMAX_DELAY);
  197. #endif
  198. }