diff --git a/configs/mcu123-lpc214x/usbstorage/defconfig b/configs/mcu123-lpc214x/usbstorage/defconfig index b7408c7edbc4bf9afdb42d7906d93e3ee11ee324..8fb1029c7bda84cb3dc487480438f36f4ed0fe34 100644 --- a/configs/mcu123-lpc214x/usbstorage/defconfig +++ b/configs/mcu123-lpc214x/usbstorage/defconfig @@ -376,7 +376,7 @@ CONFIG_USBDEV_DUALSPEED=n CONFIG_USBDEV_SELFPOWERED=y CONFIG_USBDEV_REMOTEWAKEUP=n CONFIG_USBDEV_MAXPOWER=100 -CONFIG_USBDEV_TRACE=n +CONFIG_USBDEV_TRACE=y CONFIG_USBDEV_TRACE_NRECORDS=128 # diff --git a/drivers/usbdev/usbdev_trace.c b/drivers/usbdev/usbdev_trace.c index 810500f27c330a43b2b6cc51de207dc0e92b1e59..d55828183f362227bec40aab085c594d0ad11bf0 100644 --- a/drivers/usbdev/usbdev_trace.c +++ b/drivers/usbdev/usbdev_trace.c @@ -143,7 +143,7 @@ void usbtrace(uint16 event, uint16 value) if ((g_maskedidset & TRACE_ID2BIT(event)) != 0) { #ifdef CONFIG_USBDEV_TRACE - /* Yes... save the new trace data at the nead */ + /* Yes... save the new trace data at the head */ g_trace[g_head].event = event; g_trace[g_tail].event = value; @@ -354,16 +354,17 @@ void usbtrace(uint16 event, uint16 value) #ifdef CONFIG_USBDEV_TRACE int usbtrace_enumerate(trace_callback_t callback, void *arg) { - uint16 ndx = g_tail; + uint16 ndx; + uint32 idset; int ret = OK; /* Temporarily disable tracing */ - usbtrace_enable(FALSE); + idset = usbtrace_enable(0); /* Visit every entry, starting with the tail */ - while (g_tail != g_head) + for (ndx = g_tail; ndx != g_head; ) { /* Call the user provided callback */ @@ -383,6 +384,13 @@ int usbtrace_enumerate(trace_callback_t callback, void *arg) } } + /* Discard the trace data after it has been reported */ + + g_tail = g_head; + + /* Restore tracing state */ + + (void)usbtrace_enable(idset); return ret; } #endif /* CONFIG_USBDEV_TRACE */ diff --git a/examples/usbstorage/usbstrg.h b/examples/usbstorage/usbstrg.h index 2d043de8ae3e8d362a317ea4c2551dee2be0fca7..acbf5733f8e6345572a7fbc5aabea0514984afdf 100644 --- a/examples/usbstorage/usbstrg.h +++ b/examples/usbstorage/usbstrg.h @@ -83,14 +83,18 @@ #ifdef CONFIG_CPP_HAVE_VARARGS # ifdef CONFIG_DEBUG # define message(...) lib_lowprintf(__VA_ARGS__) +# define msgflush() # else # define message(...) printf(__VA_ARGS__) +# define msgflush() fflush(stdout) # endif #else # ifdef CONFIG_DEBUG # define message lib_lowprintf +# define msgflush() # else # define message printf +# define msgflush() fflush(stdout) # endif #endif diff --git a/examples/usbstorage/usbstrg_main.c b/examples/usbstorage/usbstrg_main.c index a581d356d87e68e19fc967e037b65b111ba257d9..7e85f991b5bb9e010c620cbeddae04e5af4bbb8f 100644 --- a/examples/usbstorage/usbstrg_main.c +++ b/examples/usbstorage/usbstrg_main.c @@ -57,6 +57,192 @@ * Private Data ****************************************************************************/ +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: usbstrg_enumerate + ****************************************************************************/ + +#ifdef CONFIG_USBDEV_TRACE +static int usbstrg_enumerate(struct usbtrace_s *trace, void *arg) +{ + switch (trace->event) + { + case TRACE_DEVINIT: + message("USB controller initialization: %04x\n", trace->value); + break; + + case TRACE_DEVUNINIT: + message("USB controller un-initialization: %04x\n", trace->value); + break; + + case TRACE_DEVREGISTER: + message("usbdev_register(): %04x\n", trace->value); + break; + + case TRACE_DEVUNREGISTER: + message("usbdev_unregister(): %04x\n", trace->value); + break; + + case TRACE_EPCONFIGURE: + message("Endpoint configure(): %04x\n", trace->value); + break; + + case TRACE_EPDISABLE: + message("Endpoint disable(): %04x\n", trace->value); + break; + + case TRACE_EPALLOCREQ: + message("Endpoint allocreq(): %04x\n", trace->value); + break; + + case TRACE_EPFREEREQ: + message("Endpoint freereq(): %04x\n", trace->value); + break; + + case TRACE_EPALLOCBUFFER: + message("Endpoint allocbuffer(): %04x\n", trace->value); + break; + + case TRACE_EPFREEBUFFER: + message("Endpoint freebuffer(): %04x\n", trace->value); + break; + + case TRACE_EPSUBMIT: + message("Endpoint submit(): %04x\n", trace->value); + break; + + case TRACE_EPCANCEL: + message("Endpoint cancel(): %04x\n", trace->value); + break; + + case TRACE_EPSTALL: + message("Endpoint stall(TRUE): %04x\n", trace->value); + break; + + case TRACE_EPRESUME: + message("Endpoint stall(FALSE): %04x\n", trace->value); + break; + + case TRACE_DEVALLOCEP: + message("Device allocep(): %04x\n", trace->value); + break; + + case TRACE_DEVFREEEP: + message("Device freeep(): %04x\n", trace->value); + break; + + case TRACE_DEVGETFRAME: + message("Device getframe(): %04x\n", trace->value); + break; + + case TRACE_DEVWAKEUP: + message("Device wakeup(): %04x\n", trace->value); + break; + + case TRACE_DEVSELFPOWERED: + message("Device selfpowered(): %04x\n", trace->value); + break; + + case TRACE_DEVPULLUP: + message("Device pullup(): %04x\n", trace->value); + break; + + case TRACE_CLASSBIND: + message("Class bind(): %04x\n", trace->value); + break; + + case TRACE_CLASSUNBIND: + message("Class unbind(): %04x\n", trace->value); + break; + + case TRACE_CLASSDISCONNECT: + message("Class disconnect(): %04x\n", trace->value); + break; + + case TRACE_CLASSSETUP: + message("Class setup(): %04x\n", trace->value); + break; + + case TRACE_CLASSSUSPEND: + message("Class suspend(): %04x\n", trace->value); + break; + + case TRACE_CLASSRESUME: + message("Class resume(): %04x\n", trace->value); + break; + + case TRACE_CLASSRDCOMPLETE: + message("Class RD request complete: %04x\n", trace->value); + break; + + case TRACE_CLASSWRCOMPLETE: + message("Class WR request complete: %04x\n", trace->value); + break; + + default: + switch (TRACE_ID(trace->event)) + { + case TRACE_CLASSAPI_ID: /* Other class driver system API calls */ + message("Class API call %d: %04x\n", TRACE_DATA(trace->event), trace->value); + break; + + case TRACE_CLASSSTATE_ID: /* Track class driver state changes */ + message("Class state %d: %04x\n", TRACE_DATA(trace->event), trace->value); + break; + + case TRACE_INTENTRY_ID: /* Interrupt handler entry */ + message("Interrrupt %d entry: %04x\n", TRACE_DATA(trace->event), trace->value); + break; + + case TRACE_INTDECODE_ID: /* Decoded interrupt trace->event */ + message("Interrrupt decode %d: %04x\n", TRACE_DATA(trace->event), trace->value); + break; + + case TRACE_INTEXIT_ID: /* Interrupt handler exit */ + message("Interrrupt %d exit: %04x\n", TRACE_DATA(trace->event), trace->value); + break; + + case TRACE_OUTREQQUEUED_ID: /* Request queued for OUT endpoint */ + message("EP%d OUT request queued: %04x\n", TRACE_DATA(trace->event), trace->value); + break; + + case TRACE_INREQQUEUED_ID: /* Request queued for IN endpoint */ + message("EP%d IN request queued: %04x\n", TRACE_DATA(trace->event), trace->value); + break; + + case TRACE_READ_ID: /* Read (OUT) action */ + message("EP%d OUT read: %04x\n", TRACE_DATA(trace->event), trace->value); + break; + + case TRACE_WRITE_ID: /* Write (IN) action */ + message("EP%d IN write: %04x\n", TRACE_DATA(trace->event), trace->value); + break; + + case TRACE_COMPLETE_ID: /* Request completed */ + message("EP%d request complete: %04x\n", TRACE_DATA(trace->event), trace->value); + break; + + case TRACE_DEVERROR_ID: /* USB controller driver error event */ + message("Controller error: %02x:%04x\n", TRACE_DATA(trace->event), trace->value); + break; + + case TRACE_CLSERROR_ID: /* USB class driver error event */ + message("Class error: %02x:%04x\n", TRACE_DATA(trace->event), trace->value); + break; + + default: + message("Unrecognized event: %02x:%02x:%04x\n", + TRACE_ID(trace->event) >> 8, TRACE_DATA(trace->event), trace->value); + break; + } + } + return OK; +} +#endif + /**************************************************************************** * Public Functions ****************************************************************************/ @@ -173,8 +359,21 @@ int user_start(int argc, char *argv[]) #ifndef CONFIG_DISABLE_SIGNALS for (;;) { + msgflush(); sleep(5); + +#ifdef CONFIG_USBDEV_TRACE + message("\nuser_start: USB TRACE DATA:\n"); + ret = usbtrace_enumerate(usbstrg_enumerate, NULL); + if (ret < 0) + { + message("user_start: usbtrace_enumerate failed: %d\n", -ret); + usbstrg_uninitialize(handle); + return 6; + } +#else message("user_start: Still alive\n"); +#endif } #else message("user_start: Exiting\n"); diff --git a/include/nuttx/usbdev_trace.h b/include/nuttx/usbdev_trace.h index 5e68f0c03b681b44802f3f31d9ea8d309a01a73a..892d6b57cfed137a7271fada4a40085bb25a14c4 100644 --- a/include/nuttx/usbdev_trace.h +++ b/include/nuttx/usbdev_trace.h @@ -451,6 +451,7 @@ EXTERN void usbtrace(uint16 event, uint16 value); #ifdef CONFIG_USBDEV_TRACE EXTERN int usbtrace_enumerate(trace_callback_t callback, void *arg); +#else # define usbtrace_enumerate(event) #endif