From edb04e60e7ad63df8d9e26d39a0a38acc13b61cd Mon Sep 17 00:00:00 2001 From: PaulStoffregen Date: Tue, 28 Feb 2017 04:25:51 -0800 Subject: [PATCH] Fix interrupt pipe bug when running at 480 Mbit/sec --- ehci.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/ehci.cpp b/ehci.cpp index 425a431..25e270e 100644 --- a/ehci.cpp +++ b/ehci.cpp @@ -205,6 +205,7 @@ void USBHost::isr() uint32_t stat = USBHS_USBSTS; USBHS_USBSTS = stat; // clear pending interrupts //stat &= USBHS_USBINTR; // mask away unwanted interrupts +#if 1 println(); println("ISR: ", stat, HEX); //if (stat & USBHS_USBSTS_UI) println(" USB Interrupt"); @@ -225,6 +226,7 @@ void USBHost::isr() if (stat & USBHS_USBSTS_UPI) println(" USB Periodic"); if (stat & USBHS_USBSTS_TI0) println(" Timer0"); if (stat & USBHS_USBSTS_TI1) println(" Timer1"); +#endif if (stat & USBHS_USBSTS_UAI) { // completed qTD(s) from the async schedule println("Async Followup"); @@ -308,7 +310,7 @@ void USBHost::isr() } } if (stat & USBHS_USBSTS_TI0) { // timer 0 - used for built-in port events - println("timer0"); + //println("timer0"); if (port_state == PORT_STATE_DEBOUNCE) { port_state = PORT_STATE_RESET; USBHS_PORTSC1 |= USBHS_PORTSC_PR; // begin reset sequence @@ -323,7 +325,7 @@ void USBHost::isr() } } if (stat & USBHS_USBSTS_TI1) { // timer 1 - used for USBDriverTimer - println("timer1"); + //println("timer1"); USBDriverTimer *timer = active_timers; if (timer) { USBDriverTimer *next = timer->next; @@ -362,8 +364,8 @@ void USBDriverTimer::start(uint32_t microseconds) return; } uint32_t remain = USBHS_GPTIMER1CTL & 0xFFFFFF; - Serial.print("remain = "); - Serial.println(remain); + //Serial.print("remain = "); + //Serial.println(remain); if (microseconds < remain) { // this timer event is before any on the schedule __disable_irq(); @@ -829,9 +831,13 @@ bool USBHost::allocate_interrupt_pipe_bandwidth(Pipe_t *pipe, uint32_t maxlen, u maxlen = (maxlen * 76459) >> 16; // worst case bit stuffing if (pipe->device->speed == 2) { // high speed 480 Mbit/sec + println(" ep interval = ", interval); if (interval > 15) interval = 15; interval = 1 << (interval - 1); if (interval > PERIODIC_LIST_SIZE*8) interval = PERIODIC_LIST_SIZE*8; + println(" interval = ", interval); + uint32_t pinterval = interval >> 3; + pipe->periodic_interval = (pinterval > 0) ? pinterval : 1; uint32_t stime = (55 + 32 + maxlen) >> 5; // time units: 32 bytes or 533 ns uint32_t best_offset = 0xFFFFFFFF; uint32_t best_bandwidth = 0xFFFFFFFF; @@ -976,7 +982,7 @@ void USBHost::add_qh_to_periodic_schedule(Pipe_t *pipe) } } #endif -#if 0 +#if 1 println("Periodic Schedule:"); for (uint32_t i=0; i < PERIODIC_LIST_SIZE; i++) { if (i < 10) print(" ");