Skip to content

Re-opening — live siTD/EHCI evidence: M484 EHCI performs an illegal complete-split on FS isochronous OUT and never clears Active #59

Description

@jeromeDms

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.

  1. 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).

  2. 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.)

  3. 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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions