drv_emu.c 6.3 KB

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