nRF5340 USB fails to enumerate in Windows when device is self-powered (works on all other hosts)

Hello!

We are developing a device based on the nRF5340 and using SDK v2.6.0.
The firmware implements a USB composite device (CDC ACM + MIDI + Audio). Everything works perfectly and enumerates correctly on Windows, macOS, iOS, and Android, but we found a issue related to power sequence.

  1. When the device is powered from USB, it enumerates successfully on all OSes.
  2. When the device is powered from an external DC input and, after power-up, connected to USB:
    1. It enumerates fine on macOS, iOS, and Android.
    2. It fails to enumerate on Windows.

Is there any known issue related to this behavior, or any recommended workaround?

Below are the debug logs captured when powered from an external DC input and connecting the device after power-up.

Windows

[00:00:19.551,177] <dbg> usb_nrfx: usbd_event_handler: RESUMING from suspend
[00:00:19.551,177] <dbg> usb_nrfx: usbd_work_handler: USBD reset event
[00:00:19.551,208] <inf> cdc_acm: Device reset detected
[00:00:19.551,208] <dbg> usb_nrfx: usbd_work_process_pwr_events: USB resume
[00:00:19.551,208] <inf> cdc_acm: Device resumed
[00:00:19.551,208] <inf> cdc_acm: Spurious resume event
[00:00:19.551,879] <dbg> usb_nrfx: usbd_work_handler: USBD reset event
[00:00:19.551,879] <inf> cdc_acm: Device reset detected
[00:00:19.552,368] <dbg> usb_nrfx: usbd_work_handler: USBD reset event
[00:00:19.552,368] <inf> cdc_acm: Device reset detected
[00:00:19.552,734] <dbg> usb_nrfx: usbd_work_handler: USBD reset event
[00:00:19.552,764] <inf> cdc_acm: Device reset detected
[00:00:19.552,886] <dbg> usb_nrfx: usbd_work_handler: USBD reset event
[00:00:19.552,886] <inf> cdc_acm: Device reset detected
[00:00:19.553,039] <dbg> usb_nrfx: usbd_work_handler: USBD reset event
[00:00:19.553,070] <inf> cdc_acm: Device reset detected
[00:00:19.566,436] <dbg> usb_nrfx: usbd_event_handler: SUSPEND state detected
[00:00:19.566,436] <dbg> usb_nrfx: usbd_work_process_pwr_events: USB Suspend state
[00:00:19.566,436] <inf> cdc_acm: Device suspended

iOS

[00:03:09.498,107] <dbg> usb_nrfx: usbd_event_handler: RESUMING from suspend
[00:03:09.498,107] <dbg> usb_nrfx: usbd_work_handler: USBD reset event
[00:03:09.498,138] <inf> cdc_acm: Device reset detected
[00:03:09.498,138] <dbg> usb_nrfx: usbd_work_process_pwr_events: USB resume
[00:03:09.498,138] <inf> cdc_acm: Device resumed
[00:03:09.498,138] <inf> cdc_acm: Spurious resume event
[00:03:09.498,168] <dbg> usb_nrfx: usbd_work_handler: USBD reset event
[00:03:09.498,168] <inf> cdc_acm: Device reset detected
[00:03:09.498,199] <dbg> usb_nrfx: usbd_work_handler: USBD reset event
[00:03:09.498,199] <inf> cdc_acm: Device reset detected
[00:03:09.498,229] <dbg> usb_nrfx: usbd_work_handler: USBD reset event
[00:03:09.498,260] <inf> cdc_acm: Device reset detected
[00:03:09.498,291] <dbg> usb_nrfx: usbd_work_handler: USBD reset event
[00:03:09.498,291] <inf> cdc_acm: Device reset detected
[00:03:09.498,291] <dbg> usb_nrfx: usbd_work_handler: USBD reset event
[00:03:09.498,321] <inf> cdc_acm: Device reset detected
[00:03:09.498,321] <dbg> usb_nrfx: usbd_work_handler: USBD reset event
[00:03:09.498,321] <inf> cdc_acm: Device reset detected
[00:03:09.498,352] <dbg> usb_nrfx: usbd_work_handler: USBD reset event
[00:03:09.498,352] <inf> cdc_acm: Device reset detected
[00:03:09.498,413] <dbg> usb_nrfx: usbd_work_handler: USBD reset event
[00:03:09.498,413] <inf> cdc_acm: Device reset detected
[00:03:09.498,443] <dbg> usb_nrfx: usbd_work_handler: USBD reset event
[00:03:09.498,443] <inf> cdc_acm: Device reset detected
[00:03:09.498,443] <dbg> usb_nrfx: usbd_work_handler: USBD reset event
[00:03:09.498,474] <inf> cdc_acm: Device reset detected
[00:03:09.498,474] <dbg> usb_nrfx: usbd_work_handler: USBD reset event
[00:03:09.498,504] <inf> cdc_acm: Device reset detected
[00:03:09.498,504] <dbg> usb_nrfx: usbd_work_handler: USBD reset event
[00:03:09.498,535] <inf> cdc_acm: Device reset detected
[00:03:09.498,565] <dbg> usb_nrfx: usbd_work_handler: USBD reset event
[00:03:09.498,565] <inf> cdc_acm: Device reset detected
[00:03:09.502,868] <dbg> usb_nrfx: usbd_event_handler: SUSPEND state detected
[00:03:09.502,899] <dbg> usb_nrfx: usbd_work_process_pwr_events: USB Suspend state
[00:03:09.502,899] <inf> cdc_acm: Device suspended
[00:03:09.860,137] <dbg> usb_nrfx: usbd_event_handler: RESUMING from suspend
[00:03:09.860,168] <dbg> usb_nrfx: usbd_work_handler: USBD reset event
[00:03:09.860,168] <inf> cdc_acm: Device reset detected
[00:03:09.860,198] <dbg> usb_nrfx: usbd_work_process_pwr_events: USB resume
[00:03:09.860,198] <inf> cdc_acm: Device resumed
[00:03:09.860,198] <inf> cdc_acm: Spurious resume event
[00:03:09.885,864] <dbg> usb_nrfx: usbd_event_handler: SUSPEND state detected
[00:03:09.885,894] <dbg> usb_nrfx: usbd_work_process_pwr_events: USB Suspend state
[00:03:09.885,894] <inf> cdc_acm: Device suspended
--- 37 messages dropped ---
[00:03:10.547,424] <dbg> usbCDC Device found! Wait for DTR...
_nrfx: usbd_work_process_setup: SETUP: bR:0x06 bmRT:0x80 wV:0x0303 wI:0x0409 wL:28
--- 140 messages dropped ---
[00:03:10.563,781] <dbg> usb_nrfx: usb_dc_ep_write: ep_write: ep 0x80, len 0
--- 9 messages dropped ---
[00:03:10.564,727] <dbg> usb_device: usb_handle_control_transfer: ep 0x00, status 0x00
--- 11 messages dropped ---
[00:03:10.570,251] <dbg> usb_nrfx: usbd_sof_trigger_iso_read: Endpoint is not enabled
--- 12 messages dropped ---

Thank you in advance for your help!


Tomás

  • Hi Thomas,

    I think this is a known bug as mentioned and discussed in Github here. it looks like the USB endpoints have been disabled in SUSPEND mode which should not have been done. if I understand the discussions correctly, there is a patch given and it seems to have been fixed in later versions of the SDK. 

  • Hi Susheel thanks for your quick response.
    I tested the patch you suggested (PR#17492) where endpoints are not disabled on the USB_DC_SUSPEND event, but unfortunately it didn’t change the behavior.
    While checking the history of that patch, I noticed it was later referenced in issue #53451 and reverted by PR #53518. This revert seems to be included in my current Zephyr version (v3.5.99-ncs1).

    When testing with an iPhone, I see the following extra logs when reconnecting the USB, which are missing when testing on Windows:

    [00:51:39.055,603] <dbg> usb_device: usb_handle_control_transfer: ep 0x00, status 0x00
    --- 90 messages dropped ---
    [00:51:39.063,354] <dbg> usb_transfer: usb_transfer_work: Transfer done, ep 0x02, status -140, size 0
    --- 67 messages dropped ---
    [00:51:39.076,293] <dbg> usb_nrfx: usb_dc_ep_read: ep_read: ep 0x00, maxlen 8
    --- 11 messages dropped ---
    [00:51:39.077,301] <dbg> usb_device: usb_handle_control_transfer: ep 0x00, status 0x01
    --- 12 messages dropped ---
    [00:51:39.088,256] <dbg> usb_nrfx: usbd_sof_trigger_iso_read: Endpoint is not enabled

    There seems to be some control transfer activity on endpoint 0 during enumeration, which doesn’t happen when connecting to Windows.

    Do you have any insight into what could cause this difference? Could it be an issue in the USB driver or something related to the hardware? Also, do you know of any sample where a self-powered device can successfully enumerate on Windows after being reconnected?

Related