Bladeren bron

Fix interrupt pipe bug when running at 480 Mbit/sec

main
PaulStoffregen 7 jaren geleden
bovenliggende
commit
edb04e60e7
1 gewijzigde bestanden met toevoegingen van 11 en 5 verwijderingen
  1. +11
    -5
      ehci.cpp

+ 11
- 5
ehci.cpp Bestand weergeven

@@ -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(" ");

Laden…
Annuleren
Opslaan