| 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`_ | |
| .. _LPC54600 Errata Sheet: https://www.nxp.com/docs/en/errata/ES_LPC546XX.pdf | |
| 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. | |
| .. _IMXRT1015CE: https://www.nxp.com/docs/en/errata/IMXRT1015CE.pdf | |
| .. _IMXRT1020CE: https://www.nxp.com/docs/en/errata/IMXRT1020CE.pdf | |
| .. _IMXRT1024CE: https://www.nxp.com/docs/en/errata/IMXRT1024CE.pdf | |
| .. _IMXRT1050CE: https://www.nxp.com/docs/en/errata/IMXRT1050CE.pdf | |
| .. _IMXRT1060CE: https://www.nxp.com/docs/en/errata/IMXRT1060CE.pdf | |
| .. _IMXRT1064CE: https://www.nxp.com/docs/en/errata/IMXRT1064CE.pdf | |
| 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 | |
| .. _LPC55S2x Errata Sheet: https://www.nxp.com/docs/en/errata/ES_LPC55S2x.pdf | |
| 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 | |
| .. _CH32V30X Reference Manual: https://www.wch-ic.com/downloads/CH32FV2x_V3xRM_PDF.html | |
| .. _wch-iso-status-overwrite: | |
| **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. | |
| .. _wch-usbhs-interrupt-starvation: | |
| **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: | |
| .. code-block:: c | |
| 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. |