diff options
| author | sakumisu <[email protected]> | 2024-03-14 19:31:52 +0800 |
|---|---|---|
| committer | sakumisu <[email protected]> | 2024-03-14 19:31:52 +0800 |
| commit | 2660af5d87275e08d6b535908a64d17ea63682f3 (patch) | |
| tree | 035bbcaddd037d60c3a8a1b494b752d177eedac7 /osal | |
| parent | 869b5809f38f47d8f3078e5ad7d10bb3f737b6b6 (diff) | |
add timer to control interrupt transfer
Diffstat (limited to 'osal')
| -rw-r--r-- | osal/usb_osal_freertos.c | 45 | ||||
| -rw-r--r-- | osal/usb_osal_rtthread.c | 31 |
2 files changed, 76 insertions, 0 deletions
diff --git a/osal/usb_osal_freertos.c b/osal/usb_osal_freertos.c index 69c210a5..e536ff14 100644 --- a/osal/usb_osal_freertos.c +++ b/osal/usb_osal_freertos.c @@ -116,6 +116,51 @@ int usb_osal_mq_recv(usb_osal_mq_t mq, uintptr_t *addr, uint32_t timeout) } } +static void __usb_timeout(TimerHandle_t *handle) +{ + struct usb_osal_timer *timer = (struct usb_osal_timer *)pvTimerGetTimerID((TimerHandle_t)handle); + + timer->handler(timer->argument); +} + +struct usb_osal_timer *usb_osal_timer_create(const char *name, uint32_t timeout_ms, usb_timer_handler_t handler, void *argument, bool is_period) +{ + struct usb_osal_timer *timer; + + timer = pvPortMalloc(sizeof(struct usb_osal_timer)); + + if (timer == NULL) { + return NULL; + } + memset(timer, 0, sizeof(struct usb_osal_timer)); + + timer->handler = handler; + timer->argument = argument; + + timer->timer = (void *)xTimerCreate("usb_tim", pdMS_TO_TICKS(timeout_ms), is_period, timer, (TimerCallbackFunction_t)__usb_timeout); + if (timer->timer == NULL) { + return NULL; + } + return timer; +} + +void usb_osal_timer_delete(struct usb_osal_timer *timer) +{ + xTimerStop(timer->timer, 0); + xTimerDelete(timer->timer, 0); + vPortFree(timer); +} + +void usb_osal_timer_start(struct usb_osal_timer *timer) +{ + xTimerStart(timer->timer, 0); +} + +void usb_osal_timer_stop(struct usb_osal_timer *timer) +{ + xTimerStop(timer->timer, 0); +} + size_t usb_osal_enter_critical_section(void) { taskDISABLE_INTERRUPTS(); diff --git a/osal/usb_osal_rtthread.c b/osal/usb_osal_rtthread.c index 890f048c..18b66a49 100644 --- a/osal/usb_osal_rtthread.c +++ b/osal/usb_osal_rtthread.c @@ -122,6 +122,37 @@ int usb_osal_mq_recv(usb_osal_mq_t mq, uintptr_t *addr, uint32_t timeout) return (int)ret; } +struct usb_osal_timer *usb_osal_timer_create(const char *name, uint32_t timeout_ms, usb_timer_handler_t handler, void *argument, bool is_period) +{ + struct usb_osal_timer *timer; + + timer = rt_malloc(sizeof(struct usb_osal_timer)); + memset(timer, 0, sizeof(struct usb_osal_timer)); + + timer->timer = (void *)rt_timer_create("usb_tim", handler, argument, timeout_ms, is_period ? (RT_TIMER_FLAG_PERIODIC | RT_TIMER_FLAG_SOFT_TIMER) : (RT_TIMER_FLAG_ONE_SHOT | RT_TIMER_FLAG_SOFT_TIMER)); + if (timer->timer == NULL) { + return NULL; + } + return timer; +} + +void usb_osal_timer_delete(struct usb_osal_timer *timer) +{ + rt_timer_stop(timer->timer); + rt_timer_delete(timer->timer); + rt_free(timer); +} + +void usb_osal_timer_start(struct usb_osal_timer *timer) +{ + rt_timer_start(timer->timer); +} + +void usb_osal_timer_stop(struct usb_osal_timer *timer) +{ + rt_timer_stop(timer->timer); +} + size_t usb_osal_enter_critical_section(void) { return rt_hw_interrupt_disable(); |
