123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252 |
- /*
- * Copyright (c) 2006-2022, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2012-02-21 onelife Initial creation for EFM32
- */
- /***************************************************************************//**
- * @addtogroup efm32
- * @{
- ******************************************************************************/
- /* Includes ------------------------------------------------------------------*/
- #include "board.h"
- #include "drv_emu.h"
- /* Private typedef -----------------------------------------------------------*/
- /* Private define ------------------------------------------------------------*/
- /* Private macro -------------------------------------------------------------*/
- #ifdef EFM32_EMU_DEBUG
- #define emu_debug(format,args...) rt_kprintf(format, ##args)
- #else
- #define emu_debug(format,args...)
- #endif
- /* Private variables ---------------------------------------------------------*/
- struct efm32_emu_task emu_task;
- /***************************************************************************//**
- * @brief
- * Register SPI device
- *
- * @details
- *
- * @note
- *
- * @param[in] device
- * Pointer to device descriptor
- *
- * @param[in] name
- * Device name
- *
- * @param[in] flag
- * Configuration flags
- *
- * @param[in] spi
- * Pointer to SPI device descriptor
- *
- * @return
- * Error code
- ******************************************************************************/
- void emu_task_main_loop(void *parameter)
- {
- struct efm32_emu_task *emu_task = (struct efm32_emu_task *)parameter;
- while(1)
- {
- if (emu_task->em2.value == EMU_TASK_EM2_TOKEN_NUMBER)
- {
- if (emu_task->em3.value == EMU_TASK_EM3_TOKEN_NUMBER)
- {
- if (emu_task->em4.value == EMU_TASK_EM4_TOKEN_NUMBER)
- {
- EMU_EnterEM4();
- }
- else
- {
- EMU_EnterEM3(RT_TRUE);
- }
- }
- else
- {
- EMU_EnterEM2(RT_TRUE);
- }
- }
- else
- {
- EMU_EnterEM1();
- }
- }
- }
- #define OS_TIMER_LIST_EMPTY (0x00000001)
- #define OS_TIMER_LIST_NOT_EMPTY (0x00000002)
- void emu_event_send(rt_uint32_t event)
- {
- switch (event)
- {
- case OS_TIMER_LIST_EMPTY:
- // SysTick->CTRL &= ~SysTick_CTRL_CLKSOURCE_Msk;
- break;
- case OS_TIMER_LIST_NOT_EMPTY:
- // SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk;
- break;
- }
- }
- rt_bool_t emu_is_emu(struct rt_thread *thread)
- {
- return (thread == &emu_task.thread);
- }
- void emu_all_disable(void)
- {
- if (rt_sem_take(&emu_task.em4, RT_WAITING_NO) != RT_EOK)
- {
- RT_ASSERT(0);
- }
- if (rt_sem_take(&emu_task.em3, RT_WAITING_NO) != RT_EOK)
- {
- RT_ASSERT(0);
- }
- if (rt_sem_take(&emu_task.em2, RT_WAITING_NO) != RT_EOK)
- {
- RT_ASSERT(0);
- }
- }
- void emu_em2_disable(void)
- {
- if (rt_sem_take(&emu_task.em2, RT_WAITING_NO) != RT_EOK)
- {
- RT_ASSERT(0);
- }
- }
- void emu_em2_enable(void)
- {
- if (rt_sem_release(&emu_task.em2) != RT_EOK)
- {
- RT_ASSERT(0);
- }
- }
- void emu_em3_disable(void)
- {
- if (rt_sem_take(&emu_task.em3, RT_WAITING_NO) != RT_EOK)
- {
- RT_ASSERT(0);
- }
- }
- void emu_em3_enable(void)
- {
- if (rt_sem_release(&emu_task.em3) != RT_EOK)
- {
- RT_ASSERT(0);
- }
- }
- void emu_em4_disable(void)
- {
- if (rt_sem_take(&emu_task.em4, RT_WAITING_NO) != RT_EOK)
- {
- RT_ASSERT(0);
- }
- }
- void emu_em4_enable(void)
- {
- if (rt_sem_release(&emu_task.em4) != RT_EOK)
- {
- RT_ASSERT(0);
- }
- }
- /***************************************************************************//**
- * @brief
- * Initialize EMU module related hardware
- *
- * @details
- *
- * @note
- *
- ******************************************************************************/
- void efm32_emu_init(void)
- {
- do
- {
- /* init token */
- if (rt_sem_init(
- &emu_task.em2,
- "EM2",
- EMU_TASK_EM2_TOKEN_NUMBER,
- RT_IPC_FLAG_FIFO) != RT_EOK)
- {
- break;
- }
- if (rt_sem_init(
- &emu_task.em3,
- "EM3",
- EMU_TASK_EM3_TOKEN_NUMBER,
- RT_IPC_FLAG_FIFO) != RT_EOK)
- {
- break;
- }
- if (rt_sem_init(
- &emu_task.em4,
- "EM4",
- EMU_TASK_EM4_TOKEN_NUMBER,
- RT_IPC_FLAG_FIFO) != RT_EOK)
- {
- break;
- }
- /* init thread */
- if (rt_thread_init(
- &emu_task.thread,
- "EMU",
- emu_task_main_loop, (void *)&emu_task,
- (void *)&emu_task.stack, sizeof(emu_task.stack),
- RT_THREAD_PRIORITY_MAX - 2, RT_TICK_PER_SECOND) != RT_EOK)
- {
- break;
- }
- /* startup */
- if (rt_thread_startup(&emu_task.thread) != RT_EOK)
- {
- break;
- }
- } while (0);
- rt_kprintf("EMU err: init failed!\n");
- }
- /*******************************************************************************
- * Export to FINSH
- ******************************************************************************/
- #ifdef RT_USING_FINSH
- #include <finsh.h>
- void list_emu(void)
- {
- rt_kprintf(" --------- EMU Status ---------\n");
- rt_kprintf(" em2 token used %d\n",
- EMU_TASK_EM2_TOKEN_NUMBER - emu_task.em2.value);
- rt_kprintf(" em3 token used %d\n",
- EMU_TASK_EM3_TOKEN_NUMBER - emu_task.em3.value);
- rt_kprintf(" em4 token used %d\n",
- EMU_TASK_EM4_TOKEN_NUMBER - emu_task.em4.value);
- }
- FINSH_FUNCTION_EXPORT(list_emu, list the EMU status)
- #endif
- /***************************************************************************//**
- * @}
- ******************************************************************************/
|