diff --git a/CMakeLists.txt b/CMakeLists.txt index 8b91ef0..b6f98fd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,6 +9,7 @@ include(Fxconv) option(GINT_NO_OS_STACK "Do not use the OS stack as a memory pool (fx-CG only)") option(GINT_STATIC_GRAY "Use static memory instead of malloc for gray buffers (fx-9860G only)") option(GINT_KMALLOC_DEBUG "Enable debug functions for kmalloc") +option(GINT_USB_DEBUG "Enable debug functions for the USB driver") set(CMAKE_INSTALL_MESSAGE LAZY) diff --git a/include/gint/config.h.in b/include/gint/config.h.in index 33d9bcf..c71c50d 100644 --- a/include/gint/config.h.in +++ b/include/gint/config.h.in @@ -38,4 +38,7 @@ enabled or disabled at runtime. */ #cmakedefine GINT_KMALLOC_DEBUG +/* GINT_USB_DEBUG: Selects whether USB debug functions are enabled */ +#cmakedefine GINT_USB_DEBUG + #endif /* GINT_CONFIG */ diff --git a/include/gint/usb.h b/include/gint/usb.h index 07ddba5..95547cd 100644 --- a/include/gint/usb.h +++ b/include/gint/usb.h @@ -12,6 +12,7 @@ extern "C" { #include #include #include +#include #include #include @@ -271,6 +272,9 @@ int usb_commit_async(int pipe, gint_call_t callback); // USB debugging log //--- +#ifdef GINT_USB_DEBUG +#define USB_LOG(...) usb_log(__VA_ARGS__) + /* usb_set_log(): Set the logging function for the USB driver The USB driver can produce logs, which are mostly useful to troubleshoot @@ -284,6 +288,10 @@ void usb_set_log(void (*logger)(char const *format, va_list args)); /* usb_log(): Send a message to the USB log */ void usb_log(char const *format, ...); +#else +#define USB_LOG(...) do {} while(0) +#endif + //--- // Standard descriptors //--- diff --git a/src/usb/configure.c b/src/usb/configure.c index 953f746..26aef0f 100644 --- a/src/usb/configure.c +++ b/src/usb/configure.c @@ -177,25 +177,27 @@ int usb_configure_solve(usb_interface_t const **interfaces) return 0; } -/* usb_configure_log(): Print configuration results in the usb_log() */ +/* usb_configure_log(): Print configuration results in the USB_LOG() */ void usb_configure_log(void) { +#ifdef GINT_USB_DEBUG /* Log the final configuration */ for(int i = 0; i < 16 && conf_if[i]; i++) - usb_log("Interface #%d: %p\n", i, conf_if[i]); + USB_LOG("Interface #%d: %p\n", i, conf_if[i]); for(int i = 0; i < 32; i++) { if(!conf_ep[i].intf) continue; endpoint_t *ep = &conf_ep[i]; - usb_log("Endpoint %02x\n", + USB_LOG("Endpoint %02x\n", (i & 15) + (i >= 16 ? 0x80 : 0)); - usb_log(" Interface %p address %02x\n", + USB_LOG(" Interface %p address %02x\n", ep->intf, ep->dc->bEndpointAddress); - usb_log(" Pipe %d (FIFO: %02x..%02x)\n", + USB_LOG(" Pipe %d (FIFO: %02x..%02x)\n", ep->pipe, ep->bufnmb, ep->bufnmb + ep->bufsize); } +#endif } /* usb_configure(): Load the generated configuration to the USB module */ diff --git a/src/usb/pipes.c b/src/usb/pipes.c index 1128752..b0799a2 100644 --- a/src/usb/pipes.c +++ b/src/usb/pipes.c @@ -76,7 +76,7 @@ static fifo_t fifo_access(int pipe) if(pipe == 0) return CF; /* Find a free controller */ if(USB.D0FIFOSEL.CURPIPE == 0) return D0F; - usb_log("Wait D0 is unavailable\n"); + USB_LOG("Wait D0 is unavailable\n"); if(USB.D1FIFOSEL.CURPIPE == 0) return D1F; return NOF; @@ -295,7 +295,7 @@ static void write_round(struct transfer volatile *t, int pipe) bool ok = dma_transfer_async(channel, block_size, size, t->data, DMA_INC, (void *)FIFO, DMA_FIXED, callback); - if(!ok) usb_log("DMA async failed on channel %d!\n", channel); + if(!ok) USB_LOG("DMA async failed on channel %d!\n", channel); } else { @@ -349,7 +349,7 @@ int usb_write_sync_timeout(int pipe, void const *data, int size, int unit_size, if(rc == 0) break; if(rc == USB_WRITE_NOFIFO) - usb_log("USB_WRITE_NOFIFO\n"); + USB_LOG("USB_WRITE_NOFIFO\n"); if(rc != USB_WRITE_BUSY) return rc; if(timeout_elapsed(timeout)) @@ -401,7 +401,7 @@ int usb_commit_async(int pipe, gint_call_t callback) fifo_bind(t->ct, pipe, FIFO_WRITE, t->unit_size); if(t->ct == D0F) USB.D0FIFOCTR.BVAL = 1; if(t->ct == D1F) USB.D1FIFOCTR.BVAL = 1; - usb_log("[PIPE%d] Committed transfer\n", pipe); + USB_LOG("[PIPE%d] Committed transfer\n", pipe); return 0; } diff --git a/src/usb/setup.c b/src/usb/setup.c index 710e283..cd0f54d 100644 --- a/src/usb/setup.c +++ b/src/usb/setup.c @@ -88,7 +88,7 @@ static void write_configuration_descriptor(int wLength) uint8_t const *dc = interfaces[i]->dc[k]; total_length += dc[0]; } - usb_log("Configuration descriptor size: %d\n", (int)total_length); + USB_LOG("Configuration descriptor size: %d\n", (int)total_length); /* Write the configuration descriptor */ dc_configuration.wTotalLength = htole16(total_length); @@ -127,9 +127,9 @@ static void req_get_descriptor(int wValue, int wLength) int type = (wValue >> 8) & 0xff; int num = (wValue & 0xff); - static char const *strs[] = { + GUNUSED static char const *strs[] = { "DEV","CONFIG","STR","INTF","ENDP","DEVQ","OSC","POWER" }; - usb_log("GET_DESCRIPTOR: %s #%d len:%d\n", strs[type-1], num, wLength); + USB_LOG("GET_DESCRIPTOR: %s #%d len:%d\n", strs[type-1], num, wLength); if(type == USB_DC_DEVICE && num == 0) dcp_write(&dc_device, dc_device.bLength); @@ -150,13 +150,13 @@ static void req_get_descriptor(int wValue, int wLength) static void req_get_configuration(void) { - usb_log("GET_CONFIGURATION -> %d\n", 1); + USB_LOG("GET_CONFIGURATION -> %d\n", 1); dcp_write("\x01", 1); } static void req_set_configuration(int wValue) { - usb_log("SET_CONFIGURATION: %d\n", wValue); + USB_LOG("SET_CONFIGURATION: %d\n", wValue); /* Ok for (wValue == 1) only */ USB.DCPCTR.PID = (wValue == 1) ? 1 : 2; } @@ -167,7 +167,7 @@ void usb_req_setup(void) int bRequest = USB.USBREQ.BREQUEST; int bmRequestType = USB.USBREQ.BMREQUEST; int wValue = USB.USBVAL.word; - int wIndex = USB.USBINDX.word; + GUNUSED int wIndex = USB.USBINDX.word; int wLength = USB.USBLENG.word; USB.INTSTS0.VALID = 0; @@ -185,7 +185,7 @@ void usb_req_setup(void) req_set_configuration(wValue); /* TODO: Other standard SETUP requests */ - else usb_log("SETUP: bRequest=%02x bmRequestType=%02x wValue=%04x\n" + else USB_LOG("SETUP: bRequest=%02x bmRequestType=%02x wValue=%04x\n" " wIndex=%04x wLength=%d -> ???\n", bRequest, bmRequestType, wValue, wIndex, wLength); diff --git a/src/usb/usb.c b/src/usb/usb.c index 278e8cf..1bf803c 100644 --- a/src/usb/usb.c +++ b/src/usb/usb.c @@ -111,14 +111,14 @@ static void hpoweroff(void) int usb_open(usb_interface_t const **interfaces, gint_call_t callback) { - usb_log("---- usb_open ----\n"); + USB_LOG("---- usb_open ----\n"); int rc = usb_configure_solve(interfaces); usb_configure_log(); if(rc != 0) { - usb_log("configure failure: %d\n", rc); + USB_LOG("configure failure: %d\n", rc); return rc; } @@ -189,7 +189,7 @@ void usb_close(void) { intc_priority(INTC_USB, 0); hpoweroff(); - usb_log("---- usb_close ----\n"); + USB_LOG("---- usb_close ----\n"); usb_open_callback = GINT_CALL_NULL; usb_open_status = false; @@ -201,7 +201,7 @@ void usb_close(void) static void usb_interrupt_handler(void) { - static char const * const device_st[] = { + GUNUSED static char const * const device_st[] = { "powered", "default", "address", "configured", "suspended-powered", "suspended-default", "suspended-address", "suspended-configured", @@ -212,7 +212,7 @@ static void usb_interrupt_handler(void) if(USB.INTSTS0.VBINT) { INTSTS0_clear(VBINT); - usb_log("VBUS %s\n", USB.INTSTS0.VBSTS ? "up" : "down"); + USB_LOG("VBUS %s\n", USB.INTSTS0.VBSTS ? "up" : "down"); } else if(USB.INTSTS0.CTRT) { @@ -222,9 +222,9 @@ static void usb_interrupt_handler(void) else if(USB.INTSTS0.DVST) { INTSTS0_clear(DVST); - usb_log("DVST %s", device_st[USB.INTSTS0.DVSQ]); - if(USB.INTSTS0.DVSQ == 2) usb_log(": %04x\n",USB.USBADDR.word); - else usb_log("\n"); + USB_LOG("DVST %s", device_st[USB.INTSTS0.DVSQ]); + if(USB.INTSTS0.DVSQ == 2) USB_LOG(": %04x\n",USB.USBADDR.word); + else USB_LOG("\n"); /* When configured, run the callback for usb_open() */ if(USB.INTSTS0.DVSQ == 3) @@ -248,7 +248,7 @@ static void usb_interrupt_handler(void) if(status & (1 << i)) usb_pipe_write_bemp(i); } } - else usb_log("<%04X> -> ???\n", USB.INTSTS0.word); + else USB_LOG("<%04X> -> ???\n", USB.INTSTS0.word); /* Restore PIPESEL which can have been used for transfers */ USB.PIPESEL.word = pipesel; diff --git a/src/usb/usb_private.h b/src/usb/usb_private.h index 9b8027a..8e997ff 100644 --- a/src/usb/usb_private.h +++ b/src/usb/usb_private.h @@ -131,7 +131,7 @@ void usb_pipe_init_transfers(void); GINT_CALL_SET_STOP(&__f)); \ if(__t >= 0) timer_start(__t); \ while((condition) && __f == 0) {} \ - if(__f) usb_log("%s: %d: (" #condition ") holds\n", \ + if(__f) USB_LOG("%s: %d: (" #condition ") holds\n", \ __FUNCTION__, __LINE__); \ if(__t >= 0) timer_stop(__t); \ __f != 0; \