mirror of
https://github.com/hathach/tinyusb.git
synced 2025-04-18 11:42:25 +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);
|
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
|
// Helper to implement optional parameter for TU_VERIFY Macro family
|
||||||
#define GET_3RD_ARG(arg1, arg2, arg3, ...) arg3
|
#define _GET_3RD_ARG(arg1, arg2, arg3, ...) arg3
|
||||||
#define GET_4TH_ARG(arg1, arg2, arg3, arg4, ...) arg4
|
#define _GET_4TH_ARG(arg1, arg2, arg3, arg4, ...) arg4
|
||||||
|
|
||||||
/*------------- Generator for TU_VERIFY and TU_VERIFY_HDLR -------------*/
|
/*------------- Generator for TU_VERIFY and TU_VERIFY_HDLR -------------*/
|
||||||
#define TU_VERIFY_DEFINE(_cond, _handler, _ret) do \
|
#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_1ARGS(_cond) TU_VERIFY_DEFINE(_cond, , false)
|
||||||
#define TU_VERIFY_2ARGS(_cond, _ret) TU_VERIFY_DEFINE(_cond, , _ret)
|
#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_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_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
|
/* ASSERT
|
||||||
@ -139,7 +139,7 @@
|
|||||||
#define ASSERT_2ARGS(_cond, _ret) TU_VERIFY_DEFINE(_cond, _MESS_FAILED(); TU_BREAKPOINT(), _ret)
|
#define ASSERT_2ARGS(_cond, _ret) TU_VERIFY_DEFINE(_cond, _MESS_FAILED(); TU_BREAKPOINT(), _ret)
|
||||||
|
|
||||||
#ifndef TU_ASSERT
|
#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
|
#endif
|
||||||
|
|
||||||
/*------------------------------------------------------------------*/
|
/*------------------------------------------------------------------*/
|
||||||
|
@ -466,8 +466,10 @@ bool tud_task_event_ready(void)
|
|||||||
}
|
}
|
||||||
@endcode
|
@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
|
// Skip if stack is not initialized
|
||||||
if ( !tusb_inited() ) return;
|
if ( !tusb_inited() ) return;
|
||||||
|
|
||||||
@ -475,7 +477,7 @@ void tud_task (void)
|
|||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
dcd_event_t event;
|
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 CFG_TUSB_DEBUG >= 2
|
||||||
if (event.event_id == DCD_EVENT_SETUP_RECEIVED) TU_LOG2("\r\n"); // extra line for setup
|
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();
|
TU_BREAKPOINT();
|
||||||
break;
|
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
|
// Check if device stack is already initialized
|
||||||
bool tud_inited(void);
|
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
|
// 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()
|
// Check if there is pending events need proccessing by tud_task()
|
||||||
bool tud_task_event_ready(void);
|
bool tud_task_event_ready(void);
|
||||||
|
@ -392,8 +392,10 @@ bool tuh_init(uint8_t rhport)
|
|||||||
}
|
}
|
||||||
@endcode
|
@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
|
// Skip if stack is not initialized
|
||||||
if ( !tusb_inited() ) return;
|
if ( !tusb_inited() ) return;
|
||||||
|
|
||||||
@ -401,7 +403,7 @@ void tuh_task(void)
|
|||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
hcd_event_t event;
|
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)
|
switch (event.event_id)
|
||||||
{
|
{
|
||||||
@ -497,6 +499,11 @@ void tuh_task(void)
|
|||||||
|
|
||||||
default: break;
|
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
|
// Check if host stack is already initialized
|
||||||
bool tuh_inited(void);
|
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
|
// 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
|
// Interrupt handler, name alias to HCD
|
||||||
extern void hcd_int_handler(uint8_t rhport);
|
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);
|
bool tuh_mounted(uint8_t daddr);
|
||||||
|
|
||||||
// Check if device is suspended
|
// Check if device is suspended
|
||||||
TU_ATTR_ALWAYS_INLINE
|
TU_ATTR_ALWAYS_INLINE static inline
|
||||||
static inline bool tuh_suspended(uint8_t daddr)
|
bool tuh_suspended(uint8_t daddr)
|
||||||
{
|
{
|
||||||
// TODO implement suspend & resume on host
|
// TODO implement suspend & resume on host
|
||||||
(void) daddr;
|
(void) daddr;
|
||||||
@ -115,8 +124,8 @@ static inline bool tuh_suspended(uint8_t daddr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Check if device is ready to communicate with
|
// Check if device is ready to communicate with
|
||||||
TU_ATTR_ALWAYS_INLINE
|
TU_ATTR_ALWAYS_INLINE static inline
|
||||||
static inline bool tuh_ready(uint8_t daddr)
|
bool tuh_ready(uint8_t daddr)
|
||||||
{
|
{
|
||||||
return tuh_mounted(daddr) && !tuh_suspended(daddr);
|
return tuh_mounted(daddr) && !tuh_suspended(daddr);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user