drv_emu.c 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. /*
  2. * Copyright (c) 2006-2022, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2012-02-21 onelife Initial creation for EFM32
  9. */
  10. /***************************************************************************//**
  11. * @addtogroup efm32
  12. * @{
  13. ******************************************************************************/
  14. /* Includes ------------------------------------------------------------------*/
  15. #include "board.h"
  16. #include "drv_emu.h"
  17. /* Private typedef -----------------------------------------------------------*/
  18. /* Private define ------------------------------------------------------------*/
  19. /* Private macro -------------------------------------------------------------*/
  20. #ifdef EFM32_EMU_DEBUG
  21. #define emu_debug(format,args...) rt_kprintf(format, ##args)
  22. #else
  23. #define emu_debug(format,args...)
  24. #endif
  25. /* Private variables ---------------------------------------------------------*/
  26. struct efm32_emu_task emu_task;
  27. /***************************************************************************//**
  28. * @brief
  29. * Register SPI device
  30. *
  31. * @details
  32. *
  33. * @note
  34. *
  35. * @param[in] device
  36. * Pointer to device descriptor
  37. *
  38. * @param[in] name
  39. * Device name
  40. *
  41. * @param[in] flag
  42. * Configuration flags
  43. *
  44. * @param[in] spi
  45. * Pointer to SPI device descriptor
  46. *
  47. * @return
  48. * Error code
  49. ******************************************************************************/
  50. void emu_task_main_loop(void *parameter)
  51. {
  52. struct efm32_emu_task *emu_task = (struct efm32_emu_task *)parameter;
  53. while(1)
  54. {
  55. if (emu_task->em2.value == EMU_TASK_EM2_TOKEN_NUMBER)
  56. {
  57. if (emu_task->em3.value == EMU_TASK_EM3_TOKEN_NUMBER)
  58. {
  59. if (emu_task->em4.value == EMU_TASK_EM4_TOKEN_NUMBER)
  60. {
  61. EMU_EnterEM4();
  62. }
  63. else
  64. {
  65. EMU_EnterEM3(RT_TRUE);
  66. }
  67. }
  68. else
  69. {
  70. EMU_EnterEM2(RT_TRUE);
  71. }
  72. }
  73. else
  74. {
  75. EMU_EnterEM1();
  76. }
  77. }
  78. }
  79. #define OS_TIMER_LIST_EMPTY (0x00000001)
  80. #define OS_TIMER_LIST_NOT_EMPTY (0x00000002)
  81. void emu_event_send(rt_uint32_t event)
  82. {
  83. switch (event)
  84. {
  85. case OS_TIMER_LIST_EMPTY:
  86. // SysTick->CTRL &= ~SysTick_CTRL_CLKSOURCE_Msk;
  87. break;
  88. case OS_TIMER_LIST_NOT_EMPTY:
  89. // SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk;
  90. break;
  91. }
  92. }
  93. rt_bool_t emu_is_emu(struct rt_thread *thread)
  94. {
  95. return (thread == &emu_task.thread);
  96. }
  97. void emu_all_disable(void)
  98. {
  99. if (rt_sem_take(&emu_task.em4, RT_WAITING_NO) != RT_EOK)
  100. {
  101. RT_ASSERT(0);
  102. }
  103. if (rt_sem_take(&emu_task.em3, RT_WAITING_NO) != RT_EOK)
  104. {
  105. RT_ASSERT(0);
  106. }
  107. if (rt_sem_take(&emu_task.em2, RT_WAITING_NO) != RT_EOK)
  108. {
  109. RT_ASSERT(0);
  110. }
  111. }
  112. void emu_em2_disable(void)
  113. {
  114. if (rt_sem_take(&emu_task.em2, RT_WAITING_NO) != RT_EOK)
  115. {
  116. RT_ASSERT(0);
  117. }
  118. }
  119. void emu_em2_enable(void)
  120. {
  121. if (rt_sem_release(&emu_task.em2) != RT_EOK)
  122. {
  123. RT_ASSERT(0);
  124. }
  125. }
  126. void emu_em3_disable(void)
  127. {
  128. if (rt_sem_take(&emu_task.em3, RT_WAITING_NO) != RT_EOK)
  129. {
  130. RT_ASSERT(0);
  131. }
  132. }
  133. void emu_em3_enable(void)
  134. {
  135. if (rt_sem_release(&emu_task.em3) != RT_EOK)
  136. {
  137. RT_ASSERT(0);
  138. }
  139. }
  140. void emu_em4_disable(void)
  141. {
  142. if (rt_sem_take(&emu_task.em4, RT_WAITING_NO) != RT_EOK)
  143. {
  144. RT_ASSERT(0);
  145. }
  146. }
  147. void emu_em4_enable(void)
  148. {
  149. if (rt_sem_release(&emu_task.em4) != RT_EOK)
  150. {
  151. RT_ASSERT(0);
  152. }
  153. }
  154. /***************************************************************************//**
  155. * @brief
  156. * Initialize EMU module related hardware
  157. *
  158. * @details
  159. *
  160. * @note
  161. *
  162. ******************************************************************************/
  163. void efm32_emu_init(void)
  164. {
  165. do
  166. {
  167. /* init token */
  168. if (rt_sem_init(
  169. &emu_task.em2,
  170. "EM2",
  171. EMU_TASK_EM2_TOKEN_NUMBER,
  172. RT_IPC_FLAG_FIFO) != RT_EOK)
  173. {
  174. break;
  175. }
  176. if (rt_sem_init(
  177. &emu_task.em3,
  178. "EM3",
  179. EMU_TASK_EM3_TOKEN_NUMBER,
  180. RT_IPC_FLAG_FIFO) != RT_EOK)
  181. {
  182. break;
  183. }
  184. if (rt_sem_init(
  185. &emu_task.em4,
  186. "EM4",
  187. EMU_TASK_EM4_TOKEN_NUMBER,
  188. RT_IPC_FLAG_FIFO) != RT_EOK)
  189. {
  190. break;
  191. }
  192. /* init thread */
  193. if (rt_thread_init(
  194. &emu_task.thread,
  195. "EMU",
  196. emu_task_main_loop, (void *)&emu_task,
  197. (void *)&emu_task.stack, sizeof(emu_task.stack),
  198. RT_THREAD_PRIORITY_MAX - 2, RT_TICK_PER_SECOND) != RT_EOK)
  199. {
  200. break;
  201. }
  202. /* startup */
  203. if (rt_thread_startup(&emu_task.thread) != RT_EOK)
  204. {
  205. break;
  206. }
  207. } while (0);
  208. rt_kprintf("EMU err: init failed!\n");
  209. }
  210. /*******************************************************************************
  211. * Export to FINSH
  212. ******************************************************************************/
  213. #ifdef RT_USING_FINSH
  214. #include <finsh.h>
  215. void list_emu(void)
  216. {
  217. rt_kprintf(" --------- EMU Status ---------\n");
  218. rt_kprintf(" em2 token used %d\n",
  219. EMU_TASK_EM2_TOKEN_NUMBER - emu_task.em2.value);
  220. rt_kprintf(" em3 token used %d\n",
  221. EMU_TASK_EM3_TOKEN_NUMBER - emu_task.em3.value);
  222. rt_kprintf(" em4 token used %d\n",
  223. EMU_TASK_EM4_TOKEN_NUMBER - emu_task.em4.value);
  224. }
  225. FINSH_FUNCTION_EXPORT(list_emu, list the EMU status)
  226. #endif
  227. /***************************************************************************//**
  228. * @}
  229. ******************************************************************************/