summaryrefslogtreecommitdiff
path: root/osal
diff options
context:
space:
mode:
authorsakumisu <[email protected]>2024-03-14 19:31:52 +0800
committersakumisu <[email protected]>2024-03-14 19:31:52 +0800
commit2660af5d87275e08d6b535908a64d17ea63682f3 (patch)
tree035bbcaddd037d60c3a8a1b494b752d177eedac7 /osal
parent869b5809f38f47d8f3078e5ad7d10bb3f737b6b6 (diff)
add timer to control interrupt transfer
Diffstat (limited to 'osal')
-rw-r--r--osal/usb_osal_freertos.c45
-rw-r--r--osal/usb_osal_rtthread.c31
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();