Dear Nuvoton team,
We are re-opening this issue. In our closing comment we attributed the problem to the USB2517 hub, because a generic UGREEN hub worked with the unmodified BSP. Since then we instrumented the running M484 with a J-Link probe and read the EHCI operational registers and the siTD descriptors directly in RAM while the controller runs (non-halting background reads; struct offsets resolved from DWARF). This gives new, direct evidence that the root cause is the M484 EHCI iso-OUT state machine itself — independent of the hub and independent of any TT error response.
Setup: M484 + on-board USB2517 hub + ESI U46DJ (FS UAC, 6-ch 16-bit 44.1 kHz OUT ≈ 528 B/frame, scnt = 3). UsbHostLib BSP, original code path.
The EHCI controller is healthy throughout: UCMDR = 0x00010031 (Run = 1, Periodic + Async schedules enabled), USTSR = 0x0000E00C (HCHalted = 0, no Host System Error, periodic + async active), FRINDEX advancing. So this is not a controller stall — only the OUT siTD is stuck.
-
Single-TT (hub HS, default):
OUT siTD: Sched S-mask = 0x07 (microframes 0,1,2), C-mask = 0x00.
StsCtrl = 0x015401C2 → Active | ERR | SplitXstate = DoComplete (status bit 1).
xferCount 540 → 340: the first 188-byte start-split was issued and accepted, and the transaction position advanced Begin → Mid. The siTD then stays Active indefinitely (DoComplete) → the endpoint is permanently wedged. The IN siTD on the same endpoint (multi-microframe split IN) is healthy (Active only, no ERR, no DoComplete).
-
Multi-TT (we issued SET_INTERFACE(interface = 0, alternate = 1) on the hub; return = USBH_OK, verified live):
With the OUT S-mask kept valid (0x07), StsCtrl = 0x82 → Active | SplitXstate = DoComplete, with NO ERR bit. The USB2517 TT returns no error in Multi-TT, yet the M484 still hangs the siTD in DoComplete and never clears Active. (The IN siTD in Multi-TT completes with 0 bytes received — xferCount unchanged.)
-
We also tried giving the OUT siTD a C-mask, so the controller's complete-split phase has target microframes. The controller then advances its complete-split progress (cPgMsk changes), but StsCtrl status stays 0x82 — Active is still never cleared.
Summary: for any FS isochronous OUT with payload > 188 bytes/frame (T-Count > 1, TP != All), the M484 EHCI drives the OUT siTD into SplitXstate = DoComplete (a state reserved for the IN direction per EHCI 1.0 §4.12.5) with C-mask = 0, and never clears the Active bit. This holds in Single-TT and Multi-TT, with or without a TT error response, and even when we supply a C-mask. The fault is in the M484 EHCI OUT split-iso state machine, not in the hub. (A generic UGREEN hub "works" only because its TT happens to satisfy the spurious complete-split; the USB2517 does not.)
Questions:
Can you confirm the M480/M484 EHCI performs a complete-split (SplitXstate = DoComplete) on a multi-start-split FS isochronous OUT siTD, and that it does not clear Active when the TT does not return a complete-split response?
Is there any silicon errata, undocumented register, or BSP change that would (a) prevent the complete-split on iso OUT, or (b) make the controller retire the iso-OUT siTD instead of hanging on Active?
If this is a hard silicon limitation, please confirm so we can finalize a hardware migration. We would also appreciate a recommendation for a Nuvoton USB-Host-capable MCU that correctly handles FS isochronous OUT above 188 bytes/frame.
We can share the full live register/siTD dumps and our debug tooling on request.
Thank you.
Dear Nuvoton team,
We are re-opening this issue. In our closing comment we attributed the problem to the USB2517 hub, because a generic UGREEN hub worked with the unmodified BSP. Since then we instrumented the running M484 with a J-Link probe and read the EHCI operational registers and the siTD descriptors directly in RAM while the controller runs (non-halting background reads; struct offsets resolved from DWARF). This gives new, direct evidence that the root cause is the M484 EHCI iso-OUT state machine itself — independent of the hub and independent of any TT error response.
Setup: M484 + on-board USB2517 hub + ESI U46DJ (FS UAC, 6-ch 16-bit 44.1 kHz OUT ≈ 528 B/frame, scnt = 3). UsbHostLib BSP, original code path.
The EHCI controller is healthy throughout: UCMDR = 0x00010031 (Run = 1, Periodic + Async schedules enabled), USTSR = 0x0000E00C (HCHalted = 0, no Host System Error, periodic + async active), FRINDEX advancing. So this is not a controller stall — only the OUT siTD is stuck.
Single-TT (hub HS, default):
OUT siTD: Sched S-mask = 0x07 (microframes 0,1,2), C-mask = 0x00.
StsCtrl = 0x015401C2 → Active | ERR | SplitXstate = DoComplete (status bit 1).
xferCount 540 → 340: the first 188-byte start-split was issued and accepted, and the transaction position advanced Begin → Mid. The siTD then stays Active indefinitely (DoComplete) → the endpoint is permanently wedged. The IN siTD on the same endpoint (multi-microframe split IN) is healthy (Active only, no ERR, no DoComplete).
Multi-TT (we issued SET_INTERFACE(interface = 0, alternate = 1) on the hub; return = USBH_OK, verified live):
With the OUT S-mask kept valid (0x07), StsCtrl = 0x82 → Active | SplitXstate = DoComplete, with NO ERR bit. The USB2517 TT returns no error in Multi-TT, yet the M484 still hangs the siTD in DoComplete and never clears Active. (The IN siTD in Multi-TT completes with 0 bytes received — xferCount unchanged.)
We also tried giving the OUT siTD a C-mask, so the controller's complete-split phase has target microframes. The controller then advances its complete-split progress (cPgMsk changes), but StsCtrl status stays 0x82 — Active is still never cleared.
Summary: for any FS isochronous OUT with payload > 188 bytes/frame (T-Count > 1, TP != All), the M484 EHCI drives the OUT siTD into SplitXstate = DoComplete (a state reserved for the IN direction per EHCI 1.0 §4.12.5) with C-mask = 0, and never clears the Active bit. This holds in Single-TT and Multi-TT, with or without a TT error response, and even when we supply a C-mask. The fault is in the M484 EHCI OUT split-iso state machine, not in the hub. (A generic UGREEN hub "works" only because its TT happens to satisfy the spurious complete-split; the USB2517 does not.)
Questions:
Can you confirm the M480/M484 EHCI performs a complete-split (SplitXstate = DoComplete) on a multi-start-split FS isochronous OUT siTD, and that it does not clear Active when the TT does not return a complete-split response?
Is there any silicon errata, undocumented register, or BSP change that would (a) prevent the complete-split on iso OUT, or (b) make the controller retire the iso-OUT siTD instead of hanging on Active?
If this is a hard silicon limitation, please confirm so we can finalize a hardware migration. We would also appreciate a recommendation for a Nuvoton USB-Host-capable MCU that correctly handles FS isochronous OUT above 188 bytes/frame.
We can share the full live register/siTD dumps and our debug tooling on request.
Thank you.