Index: firmware/export/logf.h =================================================================== --- firmware/export/logf.h (revision 24309) +++ firmware/export/logf.h (working copy) @@ -29,7 +29,7 @@ #ifndef __PCTOOL__ -#define MAX_LOGF_SIZE 16384 +#define MAX_LOGF_SIZE 1024*1024 extern unsigned char logfbuffer[MAX_LOGF_SIZE]; extern int logfindex; Index: firmware/usbstack/usb_storage.c =================================================================== --- firmware/usbstack/usb_storage.c (revision 24333) +++ firmware/usbstack/usb_storage.c (working copy) @@ -23,7 +23,7 @@ #include "usb_core.h" #include "usb_drv.h" #include "usb_class_driver.h" -/*#define LOGF_ENABLE*/ +#define LOGF_ENABLE #include "logf.h" #include "storage.h" #include "hotswap.h" Index: firmware/usbstack/usb_hid.c =================================================================== --- firmware/usbstack/usb_hid.c (revision 24309) +++ firmware/usbstack/usb_hid.c (working copy) @@ -25,7 +25,7 @@ #include "kernel.h" #include "usb_hid.h" #include "usb_class_driver.h" -/*#define LOGF_ENABLE*/ +#define LOGF_ENABLE #include "logf.h" /* Documents avaiable here: http://www.usb.org/developers/devclass_docs/ */ @@ -180,6 +180,7 @@ static int cur_buf_send; static bool active = false; +static bool currently_sending = false; static int ep_in; static int usb_interface; @@ -595,6 +596,7 @@ logf("hid: init connection"); active = true; + currently_sending = false; } /* called by usb_core_init() */ @@ -611,12 +613,14 @@ cur_buf_send = 0; active = true; + currently_sending = false; } void usb_hid_disconnect(void) { logf("hid: disconnect"); active = false; + currently_sending = false; } /* called by usb_core_transfer_complete() */ @@ -627,6 +631,7 @@ (void)status; (void)length; + logf("HID: transfer complete: %d %d %d %d",ep,dir,status,length); switch (dir) { case USB_DIR_OUT: @@ -638,6 +643,7 @@ send_buffer_len[cur_buf_send] = 0; HID_BUF_INC(cur_buf_send); + currently_sending = false; usb_hid_try_send_drv(); break; } @@ -787,7 +793,15 @@ if (!length) return; + if (currently_sending) + { + logf("HID: Already sending"); + return; + } + + logf("HID: Sending %d bytes",length); rc = usb_drv_send_nonblocking(ep_in, send_buffer[cur_buf_send], length); + currently_sending = true; if (rc) { send_buffer_len[cur_buf_send] = 0; Index: firmware/target/arm/usb-drv-arc.c =================================================================== --- firmware/target/arm/usb-drv-arc.c (revision 24309) +++ firmware/target/arm/usb-drv-arc.c (working copy) @@ -30,7 +30,7 @@ #include "panic.h" #include "usb_drv.h" -/*#define LOGF_ENABLE*/ +#define LOGF_ENABLE #include "logf.h" /* USB device mode registers (Little Endian) */ @@ -709,9 +709,11 @@ prev_td=0; int tdlen; + logf("starting ep %d %s (%d bytes)",ep_num,send?"send":"receive",len); do { tdlen=MIN(len,16384); + logf("getting td for %d bytes",tdlen); prepare_td(cur_td, prev_td, ptr, tdlen,pipe); ptr+=tdlen; prev_td=cur_td; @@ -719,13 +721,21 @@ len-=tdlen; } while(len>0); - //logf("starting ep %d %s",ep_num,send?"send":"receive"); + if(REG_ENDPTCOMPLETE & mask) + logf("REG_ENDPTCOMPLETE shows that the endpoint is still busy!"); + logf("REG_ENDPTPRIME = %x",REG_ENDPTPRIME); + logf("REG_ENDPTCOMPLETE= %x",REG_ENDPTCOMPLETE); + logf("REG_ENDPTSTATUS= %x",REG_ENDPTSTATUS); + qh->dtd.next_td_ptr = (unsigned int)new_td; qh->dtd.size_ioc_sts &= ~(QH_STATUS_HALT | QH_STATUS_ACTIVE); REG_ENDPTPRIME |= mask; + logf("REG_ENDPTPRIME = %x",REG_ENDPTPRIME); + logf("REG_ENDPTCOMPLETE= %x",REG_ENDPTCOMPLETE); + logf("REG_ENDPTSTATUS= %x",REG_ENDPTSTATUS); if(ep_num == EP_CONTROL && (REG_ENDPTSETUPSTAT & EPSETUP_STATUS_EP0)) { /* 32.14.3.2.2 */ logf("new setup arrived"); @@ -765,6 +775,9 @@ rc = -4; goto pt_error; } + logf("REG_ENDPTPRIME = %x",REG_ENDPTPRIME); + logf("REG_ENDPTCOMPLETE= %x",REG_ENDPTCOMPLETE); + logf("REG_ENDPTSTATUS= %x",REG_ENDPTSTATUS); restore_irq(oldlevel); @@ -910,11 +923,14 @@ unsigned int mask = REG_ENDPTCOMPLETE; REG_ENDPTCOMPLETE = mask; + logf("transfer complete : %x",mask); + logf("transfer complete REG_ENDPTCOMPLETE : %x",REG_ENDPTCOMPLETE); for (ep=0; epwait) { qh->wait=0; @@ -926,6 +942,7 @@ { length += ((td->reserved & DTD_RESERVED_LENGTH_MASK) - ((td->size_ioc_sts & DTD_PACKET_SIZE) >> DTD_LENGTH_BIT_POS)); + logf("another td, len=%d",length); td=(struct transfer_descriptor*) td->next_td_ptr; } usb_core_transfer_complete(ep, dir?USB_DIR_IN:USB_DIR_OUT,