mirror of
https://github.com/gdsports/USBHost_t36
synced 2024-11-27 19:42:15 -05:00
Fix interrupt pipe bug when running at 480 Mbit/sec
This commit is contained in:
parent
8ee6d28432
commit
edb04e60e7
16
ehci.cpp
16
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(" ");
|
||||
|
Loading…
Reference in New Issue
Block a user