add new tusb_int_handler(rhport, in_isr) as common irq handler
update tusb_init() to take rhport and role, defined as macro with optional argument for backward compatible
This commit is contained in:
@@ -39,6 +39,12 @@
|
||||
/* CONSTANTS
|
||||
*------------------------------------------------------------------*/
|
||||
|
||||
typedef enum {
|
||||
TUSB_ROLE_INVALID = 0,
|
||||
TUSB_ROLE_DEVICE,
|
||||
TUSB_ROLE_HOST,
|
||||
} tusb_role_t;
|
||||
|
||||
/// defined base on EHCI specs value for Endpoint Speed
|
||||
typedef enum {
|
||||
TUSB_SPEED_FULL = 0,
|
||||
|
||||
@@ -94,7 +94,7 @@
|
||||
#endif
|
||||
|
||||
// Helper to implement optional parameter for TU_VERIFY Macro family
|
||||
#define _GET_3RD_ARG(arg1, arg2, arg3, ...) arg3
|
||||
#define TU_GET_3RD_ARG(arg1, arg2, arg3, ...) arg3
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* TU_VERIFY
|
||||
@@ -109,7 +109,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, _dummy)(__VA_ARGS__)
|
||||
#define TU_VERIFY(...) TU_GET_3RD_ARG(__VA_ARGS__, TU_VERIFY_2ARGS, TU_VERIFY_1ARGS, _dummy)(__VA_ARGS__)
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/* ASSERT
|
||||
@@ -126,7 +126,7 @@
|
||||
#define TU_ASSERT_2ARGS(_cond, _ret) TU_ASSERT_DEFINE(_cond, _ret)
|
||||
|
||||
#ifndef TU_ASSERT
|
||||
#define TU_ASSERT(...) _GET_3RD_ARG(__VA_ARGS__, TU_ASSERT_2ARGS, TU_ASSERT_1ARGS, _dummy)(__VA_ARGS__)
|
||||
#define TU_ASSERT(...) TU_GET_3RD_ARG(__VA_ARGS__, TU_ASSERT_2ARGS, TU_ASSERT_1ARGS, _dummy)(__VA_ARGS__)
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
@@ -557,7 +557,7 @@ bool tud_task_event_ready(void) {
|
||||
*
|
||||
int main(void) {
|
||||
application_init();
|
||||
tusb_init();
|
||||
tusb_init(0, TUSB_ROLE_DEVICE);
|
||||
|
||||
while(1) { // the mainloop
|
||||
application_code();
|
||||
|
||||
@@ -459,7 +459,7 @@ bool tuh_task_event_ready(void) {
|
||||
int main(void)
|
||||
{
|
||||
application_init();
|
||||
tusb_init();
|
||||
tusb_init(0, TUSB_ROLE_HOST);
|
||||
|
||||
while(1) // the mainloop
|
||||
{
|
||||
|
||||
@@ -149,12 +149,9 @@ extern void hcd_int_handler(uint8_t rhport, bool in_isr);
|
||||
#endif
|
||||
|
||||
// Interrupt handler alias to HCD with in_isr as optional parameter
|
||||
// - tuh_int_handler(rhport) --> hcd_int_handler(rhport, true)
|
||||
// - tuh_int_handler(rhport, in_isr) --> hcd_int_handler(rhport, in_isr)
|
||||
// Note: this is similar to TU_VERIFY(), _GET_3RD_ARG() is defined in tusb_verify.h
|
||||
#define _tuh_int_handler_1arg(_rhport) hcd_int_handler(_rhport, true)
|
||||
#define _tuh_int_hanlder_2arg(_rhport, _in_isr) hcd_int_handler(_rhport, _in_isr)
|
||||
#define tuh_int_handler(...) _GET_3RD_ARG(__VA_ARGS__, _tuh_int_hanlder_2arg, _tuh_int_handler_1arg, _dummy)(__VA_ARGS__)
|
||||
#define tuh_int_handler(...) TU_GET_3RD_ARG(__VA_ARGS__, _tuh_int_hanlder_2arg, _tuh_int_handler_1arg, _dummy)(__VA_ARGS__)
|
||||
|
||||
// Check if roothub port is initialized and active as a host
|
||||
bool tuh_rhport_is_active(uint8_t rhport);
|
||||
|
||||
60
src/tusb.c
60
src/tusb.c
@@ -39,21 +39,50 @@
|
||||
#include "host/usbh_pvt.h"
|
||||
#endif
|
||||
|
||||
#define TUP_USBIP_CONTROLLER_NUM 2
|
||||
|
||||
static tusb_role_t _rhport_role[TUP_USBIP_CONTROLLER_NUM] = { 0 };
|
||||
|
||||
//--------------------------------------------------------------------+
|
||||
// Public API
|
||||
//--------------------------------------------------------------------+
|
||||
|
||||
bool tusb_init(void) {
|
||||
#if CFG_TUD_ENABLED && defined(TUD_OPT_RHPORT)
|
||||
// init device stack CFG_TUSB_RHPORTx_MODE must be defined
|
||||
TU_ASSERT ( tud_init(TUD_OPT_RHPORT) );
|
||||
bool _tusb_rhport_init(uint8_t rhport, tusb_role_t role) {
|
||||
// backward compatible called with tusb_init(void)
|
||||
#if defined(TUD_OPT_RHPORT) || defined(TUH_OPT_RHPORT)
|
||||
if (rhport == 0xff || role == TUSB_ROLE_INVALID) {
|
||||
#if CFG_TUD_ENABLED && defined(TUD_OPT_RHPORT)
|
||||
// init device stack CFG_TUSB_RHPORTx_MODE must be defined
|
||||
TU_ASSERT ( tud_init(TUD_OPT_RHPORT) );
|
||||
_rhport_role[TUD_OPT_RHPORT] = TUSB_ROLE_DEVICE;
|
||||
#endif
|
||||
|
||||
#if CFG_TUH_ENABLED && defined(TUH_OPT_RHPORT)
|
||||
// init host stack CFG_TUSB_RHPORTx_MODE must be defined
|
||||
TU_ASSERT( tuh_init(TUH_OPT_RHPORT) );
|
||||
_rhport_role[TUH_OPT_RHPORT] = TUSB_ROLE_HOST;
|
||||
#endif
|
||||
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if CFG_TUH_ENABLED && defined(TUH_OPT_RHPORT)
|
||||
// init host stack CFG_TUSB_RHPORTx_MODE must be defined
|
||||
TU_ASSERT( tuh_init(TUH_OPT_RHPORT) );
|
||||
// new API with explicit rhport and role
|
||||
TU_ASSERT(rhport < TUP_USBIP_CONTROLLER_NUM && role != TUSB_ROLE_INVALID);
|
||||
|
||||
#if CFG_TUD_ENABLED
|
||||
if (role == TUSB_ROLE_DEVICE) {
|
||||
TU_ASSERT( tud_init(rhport) );
|
||||
}
|
||||
#endif
|
||||
|
||||
#if CFG_TUH_ENABLED
|
||||
if (role == TUSB_ROLE_HOST) {
|
||||
TU_ASSERT( tuh_init(rhport) );
|
||||
}
|
||||
#endif
|
||||
|
||||
_rhport_role[rhport] = role;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -71,6 +100,23 @@ bool tusb_inited(void) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
void tusb_int_handler(uint8_t rhport, bool in_isr) {
|
||||
TU_VERIFY(rhport < TUP_USBIP_CONTROLLER_NUM,);
|
||||
|
||||
#if CFG_TUD_ENABLED
|
||||
if (_rhport_role[rhport] == TUSB_ROLE_DEVICE) {
|
||||
(void) in_isr;
|
||||
tud_int_handler(rhport);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if CFG_TUH_ENABLED
|
||||
if (_rhport_role[rhport] == TUSB_ROLE_HOST) {
|
||||
tuh_int_handler(rhport, in_isr);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------+
|
||||
// Descriptor helper
|
||||
//--------------------------------------------------------------------+
|
||||
|
||||
26
src/tusb.h
26
src/tusb.h
@@ -129,18 +129,38 @@
|
||||
//--------------------------------------------------------------------+
|
||||
// APPLICATION API
|
||||
//--------------------------------------------------------------------+
|
||||
#if CFG_TUH_ENABLED || CFG_TUD_ENABLED
|
||||
|
||||
// Initialize device/host stack
|
||||
// Internal helper for backward compatible with tusb_init(void)
|
||||
bool _tusb_rhport_init(uint8_t rhport, tusb_role_t role);
|
||||
|
||||
// Initialize roothub port with device/host role
|
||||
// Note: when using with RTOS, this should be called after scheduler/kernel is started.
|
||||
// Otherwise it could cause kernel issue since USB IRQ handler does use RTOS queue API.
|
||||
bool tusb_init(void);
|
||||
// Otherwise, it could cause kernel issue since USB IRQ handler does use RTOS queue API.
|
||||
// Note2: defined as macro for backward compatible with tusb_init(void), can be changed to function in the future.
|
||||
#define _tusb_init_0arg() _tusb_rhport_init(0xff, TUSB_ROLE_INVALID)
|
||||
#define _tusb_init_1arg(_rhport) _tusb_rhport_init(_rhport, TUSB_ROLE_INVALID)
|
||||
#define _tusb_init_2arg(_rhport, _role) _tusb_rhport_init(_rhport, _role)
|
||||
#define tusb_init(...) TU_GET_3RD_ARG(__VA_ARGS__, _tusb_init_2arg, _tusb_init_1arg, _tusb_init_0arg)(__VA_ARGS__)
|
||||
|
||||
// Check if stack is initialized
|
||||
bool tusb_inited(void);
|
||||
|
||||
// Called to handle usb interrupt/event. tusb_init(rhport, role) must be called before
|
||||
void tusb_int_handler(uint8_t rhport, bool in_isr);
|
||||
|
||||
// TODO
|
||||
// bool tusb_teardown(void);
|
||||
|
||||
#else
|
||||
|
||||
#define tusb_init(...) (false)
|
||||
#define tusb_int_handler(...) do {}while(0)
|
||||
#define tusb_inited() (false)
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user