Device specific known issues and workarounds

This page lists known issues and workarounds for specific devices.

NXP LPC54600

Severity: High

Not recommended for USB device applications (except high-speed host controller)

Reference: LPC54600 Errata Sheet

The LPC54600 series have a very buggy USB controller, with 17 issues listed in the errata which is more than half of the total issues.

Most severe issues are:

  • USB.2: In USB high-speed device mode, the NBytes field is not correct after BULK IN transfer

  • USB.5: In USB full-speed host mode, linked list on done queue is broken.

  • USB.15: USB high-speed device in endpoint TX data corruption

NXP i.MX RT1015/RT1020/RT1024/RT1050/RT1060/RT1064

Severity: High when an isochronous IN endpoint is used behind a hub

Reference: ERR050101 “USB: Endpoint conflict issue in device mode”, listed in the errata sheet of every part above - IMXRT1015CE, IMXRT1020CE, IMXRT1024CE, IMXRT1050CE, IMXRT1060CE and IMXRT1064CE. On RT1060 and RT1064 it applies to rev A silicon only and is fixed in rev B; on RT1015, RT1020, RT1024 and RT1050 it is marked no fix scheduled, so all silicon is affected. RT1010, RT116x, RT117x and RT118x do not list it.

While an isochronous IN endpoint is active, an IN token addressed to that same endpoint number on another device sharing the host can silently unprime one of this device’s OUT endpoints - control, bulk, interrupt or isochronous alike. NXP states the unpriming cannot be detected by software and raises no interrupt, so the endpoint simply stops answering OUT tokens and the transfer never completes. Typically seen when the device is behind a hub with other devices attached.

Workaround: give isochronous IN endpoints a number that no other device on the same host uses for any IN endpoint - endpoints 1-3 are used by nearly every composite device, so choose a high number (examples/device/usbtest uses endpoint 7 on this family for that reason). Devices without an isochronous IN endpoint are unaffected.

NXP LPC55S2x/LPC552x

Severity: Low (both need specific conditions)

Reference: LPC55S2x Errata Sheet USB.3, USB.5

USB.3: As a high-speed device behind certain full-speed hubs, the device does not correctly detect the host’s KJ chirp sequence and can behave erratically due to wrong speed detection. The documented workaround is to set the FORCE_FS bit in DEVCMDSTAT on bus reset when the reported link speed is full speed. TinyUSB does not implement this workaround.

USB.5: An isochronous IN endpoint sending a 1024-byte maximum-packet-size packet raises no endpoint interrupt and its command/status entry is not updated. Workaround: cap the isochronous IN maximum packet size at 1023 bytes in the descriptor.

WCH CH32F20x/CH32V20x/CH32V30x

Severity: High

Reference: CH32V30X Reference Manual USBFS/USBHS controller chapter

1. Isochronous transfer status overwritten

Not recommended for USB audio applications

The controllers have no FIFO for transfer completion status. A later isochronous transfer can overwrite INT_ST and RX_LEN before software finishes processing the previous transfer, causing data corruption.

2. USBHS interrupt endpoint starvation

The USBHS driver’s INT_BUSY protection makes endpoints respond with NAK while a transfer interrupt is pending. This mainly affects interrupt IN endpoints: closely spaced transactions on different endpoints can reduce throughput or starve an interrupt endpoint, even when its buffer is ready. Disabling INT_BUSY is not a safe workaround: an OUT endpoint can accept another packet before software processes the previous packet and updates its buffer and response.

For example, on NanoCH32V305 with Windows, three 20-byte interrupt IN endpoints polled every 125 us at HS had NAK rates of approximately 80%, 20%, and 0%; the longest gap between successful EP1 reports was 4 ms. At FS with 1 ms polling, all three delivered approximately 1,000 reports/s without sequence gaps in an 8-second test.

Workaround: force full speed on the USBHS controller when the application’s bandwidth permits it:

tusb_rhport_init_t dev_init = {
  .role = TUSB_ROLE_DEVICE,
  .speed = TUSB_SPEED_FULL
};
tusb_init(BOARD_TUD_RHPORT, &dev_init);

For CH32V30x examples, keep the build option SPEED=high to select the USBHS controller and its physical port; the initialization above selects its operating speed. Use descriptors suitable for full speed. This reduces the timing pressure but does not remove the shared-register limitation; validate the application’s endpoint mix, especially when using isochronous transfers.

Puya PY32F071/072

Severity: Very Low

Reference: PY32F07x Reference Manual USBD chapter

The USB device controller (MUSB-like) has 5 application endpoints EP1-EP5 with fixed FIFO sizes shared between IN and OUT of the same endpoint number: EP1 = 512 B, EP2-4 = 128 B, EP5 = 64 B. This is much lower than the max ISO ep size of 1024 for high EP numbers. Place large isochronous endpoints on EP1 and size descriptors accordingly.