Browse Source

Fix interrupt pipe bug when running at 480 Mbit/sec

main
PaulStoffregen 7 years ago
parent
commit
edb04e60e7
1 changed files with 11 additions and 5 deletions
  1. +11
    -5
      ehci.cpp

+ 11
- 5
ehci.cpp View File

uint32_t stat = USBHS_USBSTS; uint32_t stat = USBHS_USBSTS;
USBHS_USBSTS = stat; // clear pending interrupts USBHS_USBSTS = stat; // clear pending interrupts
//stat &= USBHS_USBINTR; // mask away unwanted interrupts //stat &= USBHS_USBINTR; // mask away unwanted interrupts
#if 1
println(); println();
println("ISR: ", stat, HEX); println("ISR: ", stat, HEX);
//if (stat & USBHS_USBSTS_UI) println(" USB Interrupt"); //if (stat & USBHS_USBSTS_UI) println(" USB Interrupt");
if (stat & USBHS_USBSTS_UPI) println(" USB Periodic"); if (stat & USBHS_USBSTS_UPI) println(" USB Periodic");
if (stat & USBHS_USBSTS_TI0) println(" Timer0"); if (stat & USBHS_USBSTS_TI0) println(" Timer0");
if (stat & USBHS_USBSTS_TI1) println(" Timer1"); if (stat & USBHS_USBSTS_TI1) println(" Timer1");
#endif


if (stat & USBHS_USBSTS_UAI) { // completed qTD(s) from the async schedule if (stat & USBHS_USBSTS_UAI) { // completed qTD(s) from the async schedule
println("Async Followup"); println("Async Followup");
} }
} }
if (stat & USBHS_USBSTS_TI0) { // timer 0 - used for built-in port events if (stat & USBHS_USBSTS_TI0) { // timer 0 - used for built-in port events
println("timer0");
//println("timer0");
if (port_state == PORT_STATE_DEBOUNCE) { if (port_state == PORT_STATE_DEBOUNCE) {
port_state = PORT_STATE_RESET; port_state = PORT_STATE_RESET;
USBHS_PORTSC1 |= USBHS_PORTSC_PR; // begin reset sequence USBHS_PORTSC1 |= USBHS_PORTSC_PR; // begin reset sequence
} }
} }
if (stat & USBHS_USBSTS_TI1) { // timer 1 - used for USBDriverTimer if (stat & USBHS_USBSTS_TI1) { // timer 1 - used for USBDriverTimer
println("timer1");
//println("timer1");
USBDriverTimer *timer = active_timers; USBDriverTimer *timer = active_timers;
if (timer) { if (timer) {
USBDriverTimer *next = timer->next; USBDriverTimer *next = timer->next;
return; return;
} }
uint32_t remain = USBHS_GPTIMER1CTL & 0xFFFFFF; uint32_t remain = USBHS_GPTIMER1CTL & 0xFFFFFF;
Serial.print("remain = ");
Serial.println(remain);
//Serial.print("remain = ");
//Serial.println(remain);
if (microseconds < remain) { if (microseconds < remain) {
// this timer event is before any on the schedule // this timer event is before any on the schedule
__disable_irq(); __disable_irq();
maxlen = (maxlen * 76459) >> 16; // worst case bit stuffing maxlen = (maxlen * 76459) >> 16; // worst case bit stuffing
if (pipe->device->speed == 2) { if (pipe->device->speed == 2) {
// high speed 480 Mbit/sec // high speed 480 Mbit/sec
println(" ep interval = ", interval);
if (interval > 15) interval = 15; if (interval > 15) interval = 15;
interval = 1 << (interval - 1); interval = 1 << (interval - 1);
if (interval > PERIODIC_LIST_SIZE*8) interval = PERIODIC_LIST_SIZE*8; 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 stime = (55 + 32 + maxlen) >> 5; // time units: 32 bytes or 533 ns
uint32_t best_offset = 0xFFFFFFFF; uint32_t best_offset = 0xFFFFFFFF;
uint32_t best_bandwidth = 0xFFFFFFFF; uint32_t best_bandwidth = 0xFFFFFFFF;
} }
} }
#endif #endif
#if 0
#if 1
println("Periodic Schedule:"); println("Periodic Schedule:");
for (uint32_t i=0; i < PERIODIC_LIST_SIZE; i++) { for (uint32_t i=0; i < PERIODIC_LIST_SIZE; i++) {
if (i < 10) print(" "); if (i < 10) print(" ");

Loading…
Cancel
Save