fix samd51 setup packet handling

issue occur due to race condition
https://github.com/adafruit/Adafruit_TinyUSB_Arduino/issues/37
This commit is contained in:
hathach 2019-12-25 23:47:47 +07:00
parent 605129eb66
commit 5690e7b304
No known key found for this signature in database
GPG Key ID: 2FA891220FBFD581
3 changed files with 7 additions and 10 deletions

View File

@ -253,7 +253,7 @@ static bool maybe_handle_setup_packet(void) {
USB->DEVICE.DeviceEndpoint[0].EPINTFLAG.reg = USB_DEVICE_EPINTFLAG_RXSTP;
// This copies the data elsewhere so we can reuse the buffer.
dcd_event_setup_received(0, (uint8_t*) sram_registers[0][0].ADDR.reg, true);
dcd_event_setup_received(0, _setup_packet, true);
return true;
}
return false;

View File

@ -34,7 +34,7 @@
/*------------------------------------------------------------------*/
/* MACRO TYPEDEF CONSTANT ENUM
*------------------------------------------------------------------*/
static UsbDeviceDescBank sram_registers[8][2];
static TU_ATTR_ALIGNED(4) UsbDeviceDescBank sram_registers[8][2];
static TU_ATTR_ALIGNED(4) uint8_t _setup_packet[8];
// Setup the control endpoint 0.
@ -81,7 +81,7 @@ void dcd_init (uint8_t rhport)
while (USB->DEVICE.SYNCBUSY.bit.ENABLE == 1) {}
USB->DEVICE.INTFLAG.reg |= USB->DEVICE.INTFLAG.reg; // clear pending
USB->DEVICE.INTENSET.reg = USB_DEVICE_INTENSET_SOF | USB_DEVICE_INTENSET_EORST;
USB->DEVICE.INTENSET.reg = /* USB_DEVICE_INTENSET_SOF | */ USB_DEVICE_INTENSET_EORST;
}
void dcd_int_enable(uint8_t rhport)
@ -257,7 +257,8 @@ static bool maybe_handle_setup_packet(void) {
USB->DEVICE.DeviceEndpoint[0].EPINTFLAG.reg = USB_DEVICE_EPINTFLAG_RXSTP;
// This copies the data elsewhere so we can reuse the buffer.
dcd_event_setup_received(0, (uint8_t*) sram_registers[0][0].ADDR.reg, true);
dcd_event_setup_received(0, _setup_packet, true);
return true;
}
return false;
@ -336,11 +337,7 @@ void transfer_complete(uint8_t direction) {
continue;
}
if (direction == TUSB_DIR_OUT && maybe_handle_setup_packet()) {
continue;
}
UsbDeviceEndpoint* ep = &USB->DEVICE.DeviceEndpoint[epnum];
UsbDeviceDescBank* bank = &sram_registers[epnum][direction];
uint16_t total_transfer_size = bank->PCKSIZE.bit.BYTE_COUNT;