diff --git a/drivers/usbdev/usbdev_trace.c b/drivers/usbdev/usbdev_trace.c index 5b70e6f720b4c31d63ddbca80591353ef78e3899..810500f27c330a43b2b6cc51de207dc0e92b1e59 100644 --- a/drivers/usbdev/usbdev_trace.c +++ b/drivers/usbdev/usbdev_trace.c @@ -47,8 +47,6 @@ #include <nuttx/usbdev_trace.h> #undef usbtrace -#ifdef CONFIG_USBDEV_TRACE - /**************************************************************************** * Definitions ****************************************************************************/ @@ -71,10 +69,15 @@ * Private Data ****************************************************************************/ -static uint16 g_disablecount = 0; /* != 0 means tracing is disabled */ +#ifdef CONFIG_USBDEV_TRACE static struct usbtrace_s g_trace[CONFIG_USBDEV_TRACE_NRECORDS]; static uint16 g_head = 0; static uint16 g_tail = 0; +#endif + +#if defined(CONFIG_USBDEV_TRACE) || (defined(CONFIG_DEBUG) && defined(CONFIG_DEBUG_USB)) +static usbtrace_idset_t g_maskedidset = 0; +#endif /**************************************************************************** * Private Functions @@ -88,32 +91,35 @@ static uint16 g_tail = 0; * Name: usbtrace_enable * * Description: - * Enable/disable tracing + * Enable/disable tracing per trace ID. The initial state is all IDs enabled. + * + * Input Parameters: + * idset - The bitset of IDs to be masked. TRACE_ALLIDS enables all IDS; zero + * masks all IDs. + * + * Returned Value: + * The previous idset value. * * Assumptions: - * - Initial state is enabled * - May be called from an interrupt handler * *******************************************************************************/ -void usbtrace_enable(boolean enable) +#if defined(CONFIG_USBDEV_TRACE) || (defined(CONFIG_DEBUG) && defined(CONFIG_DEBUG_USB)) +usbtrace_idset_t usbtrace_enable(usbtrace_idset_t idset) { irqstate_t flags; + usbtrace_idset_t ret; - flags = irqsave(); - if (enable) - { - if (g_disablecount < 0xffff) - { - g_disablecount++; - } - } - else if (g_disablecount > 0) - { - g_disablecount--; - } + /* The following read and write must be atomic */ + + flags = irqsave(); + ret = g_maskedidset; + g_maskedidset = idset; irqrestore(flags); + return ret; } +#endif /* CONFIG_USBDEV_TRACE || CONFIG_DEBUG && CONFIG_DEBUG_USB */ /******************************************************************************* * Name: usbtrace @@ -126,15 +132,17 @@ void usbtrace_enable(boolean enable) * *******************************************************************************/ +#if defined(CONFIG_USBDEV_TRACE) || (defined(CONFIG_DEBUG) && defined(CONFIG_DEBUG_USB)) void usbtrace(uint16 event, uint16 value) { irqstate_t flags; - /* Check if tracing is enabled */ + /* Check if tracing is enabled for this ID */ flags = irqsave(); - if (!g_disablecount) + if ((g_maskedidset & TRACE_ID2BIT(event)) != 0) { +#ifdef CONFIG_USBDEV_TRACE /* Yes... save the new trace data at the nead */ g_trace[g_head].event = event; @@ -154,9 +162,183 @@ void usbtrace(uint16 event, uint16 value) g_tail = 0; } } +#else + switch (event) + { + case TRACE_DEVINIT: + lldbg("USB controller initialization: %04x\n", value); + break; + + case TRACE_DEVUNINIT: + lldbg("USB controller un-initialization: %04x\n", value); + break; + + case TRACE_DEVREGISTER: + lldbg("usbdev_register(): %04x\n", value); + break; + + case TRACE_DEVUNREGISTER: + lldbg("usbdev_unregister(): %04x\n", value); + break; + + case TRACE_EPCONFIGURE: + lldbg("Endpoint configure(): %04x\n", value); + break; + + case TRACE_EPDISABLE: + lldbg("Endpoint disable(): %04x\n", value); + break; + + case TRACE_EPALLOCREQ: + lldbg("Endpoint allocreq(): %04x\n", value); + break; + + case TRACE_EPFREEREQ: + lldbg("Endpoint freereq(): %04x\n", value); + break; + + case TRACE_EPALLOCBUFFER: + lldbg("Endpoint allocbuffer(): %04x\n", value); + break; + + case TRACE_EPFREEBUFFER: + lldbg("Endpoint freebuffer(): %04x\n", value); + break; + + case TRACE_EPSUBMIT: + lldbg("Endpoint submit(): %04x\n", value); + break; + + case TRACE_EPCANCEL: + lldbg("Endpoint cancel(): %04x\n", value); + break; + + case TRACE_EPSTALL: + lldbg("Endpoint stall(TRUE): %04x\n", value); + break; + + case TRACE_EPRESUME: + lldbg("Endpoint stall(FALSE): %04x\n", value); + break; + + case TRACE_DEVALLOCEP: + lldbg("Device allocep(): %04x\n", value); + break; + + case TRACE_DEVFREEEP: + lldbg("Device freeep(): %04x\n", value); + break; + + case TRACE_DEVGETFRAME: + lldbg("Device getframe(): %04x\n", value); + break; + + case TRACE_DEVWAKEUP: + lldbg("Device wakeup(): %04x\n", value); + break; + + case TRACE_DEVSELFPOWERED: + lldbg("Device selfpowered(): %04x\n", value); + break; + + case TRACE_DEVPULLUP: + lldbg("Device pullup(): %04x\n", value); + break; + + case TRACE_CLASSBIND: + lldbg("Class bind(): %04x\n", value); + break; + + case TRACE_CLASSUNBIND: + lldbg("Class unbind(): %04x\n", value); + break; + + case TRACE_CLASSDISCONNECT: + lldbg("Class disconnect(): %04x\n", value); + break; + + case TRACE_CLASSSETUP: + lldbg("Class setup(): %04x\n", value); + break; + + case TRACE_CLASSSUSPEND: + lldbg("Class suspend(): %04x\n", value); + break; + + case TRACE_CLASSRESUME: + lldbg("Class resume(): %04x\n", value); + break; + + case TRACE_CLASSRDCOMPLETE: + lldbg("Class RD request complete: %04x\n", value); + break; + + case TRACE_CLASSWRCOMPLETE: + lldbg("Class WR request complete: %04x\n", value); + break; + + default: + switch (TRACE_ID(event)) + { + case TRACE_CLASSAPI_ID: /* Other class driver system API calls */ + lldbg("Class API call %d: %04x\n", TRACE_DATA(event), value); + break; + + case TRACE_CLASSSTATE_ID: /* Track class driver state changes */ + lldbg("Class state %d: %04x\n", TRACE_DATA(event), value); + break; + + case TRACE_INTENTRY_ID: /* Interrupt handler entry */ + lldbg("Interrrupt %d entry: %04x\n", TRACE_DATA(event), value); + break; + + case TRACE_INTDECODE_ID: /* Decoded interrupt event */ + lldbg("Interrrupt decode %d: %04x\n", TRACE_DATA(event), value); + break; + + case TRACE_INTEXIT_ID: /* Interrupt handler exit */ + lldbg("Interrrupt %d exit: %04x\n", TRACE_DATA(event), value); + break; + + case TRACE_OUTREQQUEUED_ID: /* Request queued for OUT endpoint */ + lldbg("EP%d OUT request queued: %04x\n", TRACE_DATA(event), value); + break; + + case TRACE_INREQQUEUED_ID: /* Request queued for IN endpoint */ + lldbg("EP%d IN request queued: %04x\n", TRACE_DATA(event), value); + break; + + case TRACE_READ_ID: /* Read (OUT) action */ + lldbg("EP%d OUT read: %04x\n", TRACE_DATA(event), value); + break; + + case TRACE_WRITE_ID: /* Write (IN) action */ + lldbg("EP%d IN write: %04x\n", TRACE_DATA(event), value); + break; + + case TRACE_COMPLETE_ID: /* Request completed */ + lldbg("EP%d request complete: %04x\n", TRACE_DATA(event), value); + break; + + case TRACE_DEVERROR_ID: /* USB controller driver error event */ + lldbg("Controller error: %02x:%04x\n", TRACE_DATA(event), value); + break; + + case TRACE_CLSERROR_ID: /* USB class driver error event */ + lldbg("Class error: %02x:%04x\n", TRACE_DATA(event), value); + break; + + default: + lldbg("Unrecognized event: %02x:%02x:%04x\n", + TRACE_ID(event) >> 8, TRACE_DATA(event), value); + break; + } + } +#endif /* CONFIG_USBDEV_TRACE */ } irqrestore(flags); } +#endif /* CONFIG_USBDEV_TRACE || CONFIG_DEBUG && CONFIG_DEBUG_USB */ /******************************************************************************* * Name: usbtrace_enumerate @@ -169,6 +351,7 @@ void usbtrace(uint16 event, uint16 value) * *******************************************************************************/ +#ifdef CONFIG_USBDEV_TRACE int usbtrace_enumerate(trace_callback_t callback, void *arg) { uint16 ndx = g_tail; @@ -202,194 +385,4 @@ int usbtrace_enumerate(trace_callback_t callback, void *arg) return ret; } - -#else - -/******************************************************************************* - * Name: usbtrace - * - * Description: - * Map trace to simple debug output - * - *******************************************************************************/ - -void usbtrace(uint16 event, uint16 value) -{ -#if defined(CONFIG_DEBUG) && defined(CONFIG_DEBUG_USB) - irqstate_t flags; - flags = irqsave(); - switch (event) - { - case TRACE_DEVINIT: - lldbg("USB controller initialization: %04x\n", value); - break; - - case TRACE_DEVUNINIT: - lldbg("USB controller un-initialization: %04x\n", value); - break; - - case TRACE_DEVREGISTER: - lldbg("usbdev_register(): %04x\n", value); - break; - - case TRACE_DEVUNREGISTER: - lldbg("usbdev_unregister(): %04x\n", value); - break; - - case TRACE_EPCONFIGURE: - lldbg("Endpoint configure(): %04x\n", value); - break; - - case TRACE_EPDISABLE: - lldbg("Endpoint disable(): %04x\n", value); - break; - - case TRACE_EPALLOCREQ: - lldbg("Endpoint allocreq(): %04x\n", value); - break; - - case TRACE_EPFREEREQ: - lldbg("Endpoint freereq(): %04x\n", value); - break; - - case TRACE_EPALLOCBUFFER: - lldbg("Endpoint allocbuffer(): %04x\n", value); - break; - - case TRACE_EPFREEBUFFER: - lldbg("Endpoint freebuffer(): %04x\n", value); - break; - - case TRACE_EPSUBMIT: - lldbg("Endpoint submit(): %04x\n", value); - break; - - case TRACE_EPCANCEL: - lldbg("Endpoint cancel(): %04x\n", value); - break; - - case TRACE_EPSTALL: - lldbg("Endpoint stall(TRUE): %04x\n", value); - break; - - case TRACE_EPRESUME: - lldbg("Endpoint stall(FALSE): %04x\n", value); - break; - - case TRACE_DEVALLOCEP: - lldbg("Device allocep(): %04x\n", value); - break; - - case TRACE_DEVFREEEP: - lldbg("Device freeep(): %04x\n", value); - break; - - case TRACE_DEVGETFRAME: - lldbg("Device getframe(): %04x\n", value); - break; - - case TRACE_DEVWAKEUP: - lldbg("Device wakeup(): %04x\n", value); - break; - - case TRACE_DEVSELFPOWERED: - lldbg("Device selfpowered(): %04x\n", value); - break; - - case TRACE_DEVPULLUP: - lldbg("Device pullup(): %04x\n", value); - break; - - case TRACE_CLASSBIND: - lldbg("Class bind(): %04x\n", value); - break; - - case TRACE_CLASSUNBIND: - lldbg("Class unbind(): %04x\n", value); - break; - - case TRACE_CLASSDISCONNECT: - lldbg("Class disconnect(): %04x\n", value); - break; - - case TRACE_CLASSSETUP: - lldbg("Class setup(): %04x\n", value); - break; - - case TRACE_CLASSSUSPEND: - lldbg("Class suspend(): %04x\n", value); - break; - - case TRACE_CLASSRESUME: - lldbg("Class resume(): %04x\n", value); - break; - - case TRACE_CLASSRDCOMPLETE: - lldbg("Class RD request complete: %04x\n", value); - break; - - case TRACE_CLASSWRCOMPLETE: - lldbg("Class WR request complete: %04x\n", value); - break; - - default: - switch (TRACE_ID(event)) - { - case TRACE_CLASSAPI_ID: /* Other class driver system API calls */ - lldbg("Class API call %d: %04x\n", TRACE_DATA(event), value); - break; - - case TRACE_CLASSSTATE_ID: /* Track class driver state changes */ - lldbg("Class state %d: %04x\n", TRACE_DATA(event), value); - - case TRACE_INTENTRY_ID: /* Interrupt handler entry */ - lldbg("Interrrupt %d entry: %04x\n", TRACE_DATA(event), value); - break; - - case TRACE_INTDECODE_ID: /* Decoded interrupt event */ - lldbg("Interrrupt decode %d: %04x\n", TRACE_DATA(event), value); - break; - - case TRACE_INTEXIT_ID: /* Interrupt handler exit */ - lldbg("Interrrupt %d exit: %04x\n", TRACE_DATA(event), value); - break; - - case TRACE_OUTREQQUEUED_ID: /* Request queued for OUT endpoint */ - lldbg("EP%d OUT request queued: %04x\n", TRACE_DATA(event), value); - break; - - case TRACE_INREQQUEUED_ID: /* Request queued for IN endpoint */ - lldbg("EP%d IN request queued: %04x\n", TRACE_DATA(event), value); - break; - - case TRACE_READ_ID: /* Read (OUT) action */ - lldbg("EP%d OUT read: %04x\n", TRACE_DATA(event), value); - break; - - case TRACE_WRITE_ID: /* Write (IN) action */ - lldbg("EP%d IN write: %04x\n", TRACE_DATA(event), value); - break; - - case TRACE_COMPLETE_ID: /* Request completed */ - lldbg("EP%d request complete: %04x\n", TRACE_DATA(event), value); - break; - - case TRACE_DEVERROR_ID: /* USB controller driver error event */ - lldbg("Controller error: %02x:%04x\n", TRACE_DATA(event), value); - break; - - case TRACE_CLSERROR_ID: /* USB class driver error event */ - lldbg("Class error: %02x:%04x\n", TRACE_DATA(event), value); - break; - - default: - lldbg("Unrecognized event: %02x:%02x:%04x\n", - TRACE_ID(event) >> 8, TRACE_DATA(event), value); - break; - } - } - irqrestore(flags); -#endif /* CONFIG_DEBUG && CONFIG_DEBUG_USB */ -} - #endif /* CONFIG_USBDEV_TRACE */ diff --git a/examples/usbstorage/usbstrg_main.c b/examples/usbstorage/usbstrg_main.c index a0db2aa5de5368a14441000e934644488a56bbb7..a581d356d87e68e19fc967e037b65b111ba257d9 100644 --- a/examples/usbstorage/usbstrg_main.c +++ b/examples/usbstorage/usbstrg_main.c @@ -45,6 +45,7 @@ #include <debug.h> #include <nuttx/usbdev.h> +#include <nuttx/usbdev_trace.h> #include "usbstrg.h" @@ -82,6 +83,24 @@ int user_start(int argc, char *argv[]) void *handle; int ret; + /* Initialize USB trace output IDs */ + + usbtrace_enable( + TRACE_INIT_BIT| /* Initialization events */ + TRACE_EP_BIT| /* Endpoint API calls */ + TRACE_DEV_BIT| /* USB device API calls */ + TRACE_CLASS_BIT| /* USB class driver API calls */ + TRACE_CLASSAPI_BIT| /* Other class driver system API calls */ + TRACE_CLASSSTATE_BIT| /* Track class driver state changes */ + TRACE_OUTREQQUEUED_BIT| /* Request queued for OUT endpoint */ + TRACE_INREQQUEUED_BIT| /* Request queued for IN endpoint */ + TRACE_READ_BIT| /* Read (OUT) action */ + TRACE_WRITE_BIT| /* Write (IN) action */ + TRACE_COMPLETE_BIT| /* Request completed */ + TRACE_DEVERROR_BIT| /* USB controller driver error event */ + TRACE_CLSERROR_BIT /* USB class driver error event */ + ); + /* Register block drivers (architecture-specific) */ message("user_start: Creating block drivers\n"); diff --git a/include/nuttx/usbdev_trace.h b/include/nuttx/usbdev_trace.h index b2a2d0f25cb91ca08a97c440277f27b3dd13cdea..5e68f0c03b681b44802f3f31d9ea8d309a01a73a 100644 --- a/include/nuttx/usbdev_trace.h +++ b/include/nuttx/usbdev_trace.h @@ -74,7 +74,28 @@ #define TRACE_DEVERROR_ID (0x0e00) /* USB controller driver error event */ #define TRACE_CLSERROR_ID (0x0f00) /* USB class driver error event */ -#define TRACE_NIDS 15 +#define TRACE_NIDS 16 /* Cannot exceed bits in usbtrace_idset_t */ + +/* Bit settings for usbtrace_enable */ + +#define TRACE_ID2BIT(id) ((1) << ((id) >> 8)) +#define TRACE_INIT_BIT TRACE_ID2BIT(TRACE_INIT_ID) +#define TRACE_EP_BIT TRACE_ID2BIT(TRACE_EP_ID) +#define TRACE_DEV_BIT TRACE_ID2BIT(TRACE_DEV_ID) +#define TRACE_CLASS_BIT TRACE_ID2BIT(TRACE_CLASS_ID) +#define TRACE_CLASSAPI_BIT TRACE_ID2BIT(TRACE_CLASSAPI_ID) +#define TRACE_CLASSSTATE_BIT TRACE_ID2BIT(TRACE_CLASSSTATE_ID) +#define TRACE_INTENTRY_BIT TRACE_ID2BIT(TRACE_INTENTRY_ID +#define TRACE_INTDECODE_BIT TRACE_ID2BIT(TRACE_INTDECODE_ID) +#define TRACE_INTEXIT_BIT TRACE_ID2BIT(TRACE_INTEXIT_ID) +#define TRACE_OUTREQQUEUED_BIT TRACE_ID2BIT(TRACE_OUTREQQUEUED_ID) +#define TRACE_INREQQUEUED_BIT TRACE_ID2BIT(TRACE_INREQQUEUED_ID) +#define TRACE_READ_BIT TRACE_ID2BIT(TRACE_READ_ID) +#define TRACE_WRITE_BIT TRACE_ID2BIT(TRACE_WRITE_ID) +#define TRACE_COMPLETE_BIT TRACE_ID2BIT(TRACE_COMPLETE_ID) +#define TRACE_DEVERROR_BIT TRACE_ID2BIT(TRACE_DEVERROR_ID) +#define TRACE_CLSERROR_BIT TRACE_ID2BIT(TRACE_CLSERROR_ID) +#define TRACE_ALLBITS ((usbtrace_idset_t)-1) /* Initialization events */ @@ -358,6 +379,12 @@ struct usbtrace_s typedef int (*trace_callback_t)(struct usbtrace_s *trace, void *arg); +/* Bit mask input type for usbtrace_enable(). If TRACE_NIDS grows beyond + * 16, then this will have to be changed to uint32 + */ + +typedef uint16 usbtrace_idset_t; + /**************************************************************************** * Public Function Prototypes ****************************************************************************/ @@ -374,18 +401,24 @@ extern "C" { * Name: usbtrace_enable * * Description: - * Enable/disable tracing + * Enable/disable tracing per trace ID. The initial state is all IDs enabled. + * + * Input Parameters: + * idset - The bitset of IDs to be masked. TRACE_ALLIDS enables all IDS; zero + * masks all IDs. + * + * Returned Value: + * The previous idset value. * * Assumptions: - * - Initial state is enabled * - May be called from an interrupt handler * *******************************************************************************/ -#ifdef CONFIG_USBDEV_TRACE -EXTERN void usbtrace_enable(boolean enable); +#if defined(CONFIG_USBDEV_TRACE) || (defined(CONFIG_DEBUG) && defined(CONFIG_DEBUG_USB)) +EXTERN usbtrace_idset_t usbtrace_enable(usbtrace_idset_t idset); #else -# define usbtrace_enable(enable) +# define usbtrace_enable(idset) #endif /*******************************************************************************