mirror of
https://github.com/hathach/tinyusb.git
synced 2025-02-11 00:39:57 +00:00
add tud_task_ext(), tuh_task_ext() as exteneded version that take timeout and in_isr
also allow exit tud_task,tuh_task after processing all events for running other background task for user
This commit is contained in:
parent
ccafb42c82
commit
b034c18077
@ -198,6 +198,9 @@ void cdc_task(void* params)
|
||||
tud_cdc_write(buf, count);
|
||||
}
|
||||
}
|
||||
|
||||
// For ESP32-Sx this delay is essential to allow idle how to run and reset watchdog
|
||||
vTaskDelay(1);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -99,8 +99,8 @@
|
||||
*------------------------------------------------------------------*/
|
||||
|
||||
// Helper to implement optional parameter for TU_VERIFY Macro family
|
||||
#define GET_3RD_ARG(arg1, arg2, arg3, ...) arg3
|
||||
#define GET_4TH_ARG(arg1, arg2, arg3, arg4, ...) arg4
|
||||
#define _GET_3RD_ARG(arg1, arg2, arg3, ...) arg3
|
||||
#define _GET_4TH_ARG(arg1, arg2, arg3, arg4, ...) arg4
|
||||
|
||||
/*------------- Generator for TU_VERIFY and TU_VERIFY_HDLR -------------*/
|
||||
#define TU_VERIFY_DEFINE(_cond, _handler, _ret) do \
|
||||
@ -116,7 +116,7 @@
|
||||
#define TU_VERIFY_1ARGS(_cond) TU_VERIFY_DEFINE(_cond, , false)
|
||||
#define TU_VERIFY_2ARGS(_cond, _ret) TU_VERIFY_DEFINE(_cond, , _ret)
|
||||
|
||||
#define TU_VERIFY(...) GET_3RD_ARG(__VA_ARGS__, TU_VERIFY_2ARGS, TU_VERIFY_1ARGS, UNUSED)(__VA_ARGS__)
|
||||
#define TU_VERIFY(...) _GET_3RD_ARG(__VA_ARGS__, TU_VERIFY_2ARGS, TU_VERIFY_1ARGS, UNUSED)(__VA_ARGS__)
|
||||
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
@ -127,7 +127,7 @@
|
||||
#define TU_VERIFY_HDLR_2ARGS(_cond, _handler) TU_VERIFY_DEFINE(_cond, _handler, false)
|
||||
#define TU_VERIFY_HDLR_3ARGS(_cond, _handler, _ret) TU_VERIFY_DEFINE(_cond, _handler, _ret)
|
||||
|
||||
#define TU_VERIFY_HDLR(...) GET_4TH_ARG(__VA_ARGS__, TU_VERIFY_HDLR_3ARGS, TU_VERIFY_HDLR_2ARGS,UNUSED)(__VA_ARGS__)
|
||||
#define TU_VERIFY_HDLR(...) _GET_4TH_ARG(__VA_ARGS__, TU_VERIFY_HDLR_3ARGS, TU_VERIFY_HDLR_2ARGS,UNUSED)(__VA_ARGS__)
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* ASSERT
|
||||
@ -139,7 +139,7 @@
|
||||
#define ASSERT_2ARGS(_cond, _ret) TU_VERIFY_DEFINE(_cond, _MESS_FAILED(); TU_BREAKPOINT(), _ret)
|
||||
|
||||
#ifndef TU_ASSERT
|
||||
#define TU_ASSERT(...) GET_3RD_ARG(__VA_ARGS__, ASSERT_2ARGS, ASSERT_1ARGS,UNUSED)(__VA_ARGS__)
|
||||
#define TU_ASSERT(...) _GET_3RD_ARG(__VA_ARGS__, ASSERT_2ARGS, ASSERT_1ARGS,UNUSED)(__VA_ARGS__)
|
||||
#endif
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
|
@ -466,8 +466,10 @@ bool tud_task_event_ready(void)
|
||||
}
|
||||
@endcode
|
||||
*/
|
||||
void tud_task (void)
|
||||
void tud_task_ext(uint32_t timeout_ms, bool in_isr)
|
||||
{
|
||||
(void) in_isr; // not implemented yet
|
||||
|
||||
// Skip if stack is not initialized
|
||||
if ( !tusb_inited() ) return;
|
||||
|
||||
@ -475,7 +477,7 @@ void tud_task (void)
|
||||
while (1)
|
||||
{
|
||||
dcd_event_t event;
|
||||
if ( !osal_queue_receive(_usbd_q, &event, 1) ) return;
|
||||
if ( !osal_queue_receive(_usbd_q, &event, timeout_ms) ) return;
|
||||
|
||||
#if CFG_TUSB_DEBUG >= 2
|
||||
if (event.event_id == DCD_EVENT_SETUP_RECEIVED) TU_LOG2("\r\n"); // extra line for setup
|
||||
@ -592,6 +594,11 @@ void tud_task (void)
|
||||
TU_BREAKPOINT();
|
||||
break;
|
||||
}
|
||||
|
||||
#if CFG_TUSB_OS != OPT_OS_NONE && CFG_TUSB_OS != OPT_OS_PICO
|
||||
// return if there is no more events, for application to run other background
|
||||
if (osal_queue_empty(_usbd_q)) return;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -43,8 +43,17 @@ bool tud_init (uint8_t rhport);
|
||||
// Check if device stack is already initialized
|
||||
bool tud_inited(void);
|
||||
|
||||
// Task function should be called in main/rtos loop, extended version of tud_task()
|
||||
// - timeout_ms: millisecond to wait, zero = no wait, 0xFFFFFFFF = wait forever
|
||||
// - in_isr: if function is called in ISR
|
||||
void tud_task_ext(uint32_t timeout_ms, bool in_isr);
|
||||
|
||||
// Task function should be called in main/rtos loop
|
||||
void tud_task (void);
|
||||
TU_ATTR_ALWAYS_INLINE static inline
|
||||
void tud_task (void)
|
||||
{
|
||||
tud_task_ext(OSAL_TIMEOUT_WAIT_FOREVER, false);
|
||||
}
|
||||
|
||||
// Check if there is pending events need proccessing by tud_task()
|
||||
bool tud_task_event_ready(void);
|
||||
|
@ -392,8 +392,10 @@ bool tuh_init(uint8_t rhport)
|
||||
}
|
||||
@endcode
|
||||
*/
|
||||
void tuh_task(void)
|
||||
void tuh_task_ext(uint32_t timeout_ms, bool in_isr)
|
||||
{
|
||||
(void) in_isr; // not implemented yet
|
||||
|
||||
// Skip if stack is not initialized
|
||||
if ( !tusb_inited() ) return;
|
||||
|
||||
@ -401,7 +403,7 @@ void tuh_task(void)
|
||||
while (1)
|
||||
{
|
||||
hcd_event_t event;
|
||||
if ( !osal_queue_receive(_usbh_q, &event, 1) ) return;
|
||||
if ( !osal_queue_receive(_usbh_q, &event, timeout_ms) ) return;
|
||||
|
||||
switch (event.event_id)
|
||||
{
|
||||
@ -497,6 +499,11 @@ void tuh_task(void)
|
||||
|
||||
default: break;
|
||||
}
|
||||
|
||||
#if CFG_TUSB_OS != OPT_OS_NONE && CFG_TUSB_OS != OPT_OS_PICO
|
||||
// return if there is no more events, for application to run other background
|
||||
if (osal_queue_empty(_usbh_q)) return;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -91,8 +91,17 @@ bool tuh_init(uint8_t rhport);
|
||||
// Check if host stack is already initialized
|
||||
bool tuh_inited(void);
|
||||
|
||||
// Task function should be called in main/rtos loop, extended version of tuh_task()
|
||||
// - timeout_ms: millisecond to wait, zero = no wait, 0xFFFFFFFF = wait forever
|
||||
// - in_isr: if function is called in ISR
|
||||
void tuh_task_ext(uint32_t timeout_ms, bool in_isr);
|
||||
|
||||
// Task function should be called in main/rtos loop
|
||||
void tuh_task(void);
|
||||
TU_ATTR_ALWAYS_INLINE static inline
|
||||
void tuh_task(void)
|
||||
{
|
||||
tuh_task_ext(OSAL_TIMEOUT_WAIT_FOREVER, false);
|
||||
}
|
||||
|
||||
// Interrupt handler, name alias to HCD
|
||||
extern void hcd_int_handler(uint8_t rhport);
|
||||
@ -106,8 +115,8 @@ tusb_speed_t tuh_speed_get(uint8_t daddr);
|
||||
bool tuh_mounted(uint8_t daddr);
|
||||
|
||||
// Check if device is suspended
|
||||
TU_ATTR_ALWAYS_INLINE
|
||||
static inline bool tuh_suspended(uint8_t daddr)
|
||||
TU_ATTR_ALWAYS_INLINE static inline
|
||||
bool tuh_suspended(uint8_t daddr)
|
||||
{
|
||||
// TODO implement suspend & resume on host
|
||||
(void) daddr;
|
||||
@ -115,8 +124,8 @@ static inline bool tuh_suspended(uint8_t daddr)
|
||||
}
|
||||
|
||||
// Check if device is ready to communicate with
|
||||
TU_ATTR_ALWAYS_INLINE
|
||||
static inline bool tuh_ready(uint8_t daddr)
|
||||
TU_ATTR_ALWAYS_INLINE static inline
|
||||
bool tuh_ready(uint8_t daddr)
|
||||
{
|
||||
return tuh_mounted(daddr) && !tuh_suspended(daddr);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user