add timer to control interrupt transfer

This commit is contained in:
sakumisu
2024-03-14 19:31:52 +08:00
parent 869b5809f3
commit 2660af5d87
6 changed files with 110 additions and 4 deletions

View File

@@ -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();

View File

@@ -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();