ESP32-S3 USB CDC not working, no device detected

roomz98
Posts: 1
Joined: Fri Sep 12, 2025 10:54 am

ESP32-S3 USB CDC not working, no device detected

Postby roomz98 » Fri Sep 12, 2025 10:59 am

I've been working on a PCB based on the ESP32-S3. I don't want to add buttons to it for boot selection, so I added a TagConnect footprint to allow me to enter DFU mode/flash using the ESPProg 2 board for the initial firmware upload.

It was my understanding that after flashing the first firmware with USB CDC On Boot enabled, I could then flash future firmware using the USB port.

Unfortunately, this doesn't seem to work. Even after flashing the first firmware successfully via RX/TX on ESPProg, the device doesn't appear at all on my mac when connected via USB. The ESPProg board appears, which is also ESP-based, so I don't think it is a driver issue.

When connected via USB (whether in DFU mode or otherwise), it's not recognized as a device at all and doesn't appear in `lsusb`. I have tried doing a power cycle after flashing, and I've tried both DFU and CDC modes by toggling BOOT/RESET via ESPProg when connected.

Schematic: https://imgur.com/s7zulbf

Layout: https://imgur.com/xoRpIvC

* The TC header is top left, this connects to RX/TX and IO0/EN
* Flashing via RX/TX works
* Entering DFU mode via the buttons on the ESPProg works
* The USB data pins go through and ESD diode straight to D+/D- on the ESP
* Good continuity between the USB data pins and the ESP
* Good power when connected via USB, stable 3.3v from the 5V input
* I'm using ESP32-S3-WROOM-1-N4
* I'm following these docs for enabling USB CDC: https://docs.espressif.com/projects/ard ... flash.html
* I've tested using the same cable as I use for the ESPProg USB, so it's definitely not a power-only cable
* I've tried enabling it via both Arduino IDE and PlatformIO

Any ideas?

Sprite
Espressif staff
Espressif staff
Posts: 10617
Joined: Thu Nov 26, 2015 4:08 am

Re: ESP32-S3 USB CDC not working, no device detected

Postby Sprite » Sat Sep 13, 2025 12:50 am

Just to take the firmware out of the equation, can you force IO0 low, reset (or power on) the chip, and try to connect then? That takes the chip into bootloader download mode and you should always see USB then.

roomz98
Posts: 1
Joined: Fri Sep 12, 2025 10:54 am

Re: ESP32-S3 USB CDC not working, no device detected

Postby roomz98 » Mon Sep 15, 2025 8:27 pm

Makes no difference, nothing even appears in lsusb.

My next guess was I fried the ESD chip while assembling, so I removed it to do some more testing. With the ESD chip removed and the board powered by USB, there is a steady 3.3v on the ESP D+ pin (0v on D-). With the ESD chip removed there is no obvious power path for this pin except through the ESP.

I disconnected the board and checked the pins for continuity. While unpowered, no continuity between D+ and the 3.3v rail, and no continuity between D+ and either of the neighboring pins.

The ESP itself works fine still, but potentially something inside is fried?

EDIT:

I just assembled another board to test in case it was an assembly or parts issue. This board has no firmware on it yet. When I power it by the USB port, I get a 3.3v on the ESP D+ pin which then drops to 0v and repeats, as the ESP boot loops with no firmware. If I enter bootloader mode, I get a constant 3.3v on the D+ pin which I think confirms this is coming from the ESP itself and not from a bridged contact.

There is still no devices shown when in bootloader mode.

I uploaded a basic sketch which sets the USB pin mode to input, which gives 0V on D+/D- when USB is connected as expected.

I also measured the voltage across D+ while connecting the USB. It oscillates between 3v and 1v for a few seconds before stabilizing at 3.1v.
Last edited by roomz98 on Mon Sep 15, 2025 11:52 pm, edited 3 times in total.

Sprite
Espressif staff
Espressif staff
Posts: 10617
Joined: Thu Nov 26, 2015 4:08 am

Re: ESP32-S3 USB CDC not working, no device detected

Postby Sprite » Tue Sep 16, 2025 3:17 am

That is all expected behaviour. USB indicates a full-speed device using an 1.5K pull-up to 3.3V, this resistor is integrated in the ESP32-S3 and will turn on after reset. What I'd expect is your PC to detect this and try to negotiate with the device. Can you check the kernel messages (sudo dmesg) and see what that says? If that stays mute about the USB device, it's not seeing the D+ at all. If it gives you a heap of errors trying to associating an address / configuring, it means it sees the high D+ but cannot get communication going.

roomz98
Posts: 1
Joined: Fri Sep 12, 2025 10:54 am

Re: ESP32-S3 USB CDC not working, no device detected

Postby roomz98 » Tue Sep 16, 2025 3:45 am

Ah okay, thanks. Here are the logs. I filtered to messages from IOPort, IOAccessory and IOService as they seemed the most relevant, but I can share unfiltered logs if needed (there was ~1k unfiltered in the same timespan!).

After connecting board

Code: Select all

default 04:40:08.820713+0100  kernel  IOPortTransportState::setAuthenticationTimeout(): [Port-USB-C@3: USB3] authTimeout: 0 seconds
default 04:40:08.820719+0100  kernel  IOPortTransportState::setDriverStatus(): [Port-USB-C@3: USB3] driverStatus: 1 [Not Ready]
default 04:40:08.820735+0100  kernel  AppleNotificationQueue::_handleNotifications(): Handling notifications...
default 04:40:08.820744+0100  kernel  IOPortTransportState::registerService(): [Port-USB-C@3: USB3] Registering service USB3@(null)... (transportType: 3, provider: Port-USB-C@3)
default 04:40:08.821261+0100  kernel  IOPort::addTransport_block_invoke(): [Port-USB-C@3] Added transport! (transport: Port-USB-C@3/USB3)
default 04:40:08.823813+0100  kernel  IOAccessoryTRM::_updateStatusGated(): Updating status...
default 04:40:08.823816+0100  kernel  IOAccessoryTRM::_copyID(): ID bus info doesn't exist for this dock! (m_mgrPrimaryPortID: 259)
default 04:40:08.823827+0100  kernel  IOAccessoryTRM::_updateStatusGated(): *** UAAA *** (m_mgrPrimaryPortID: 259)
default 04:40:08.823865+0100  kernel  IOAccessoryTRM::_setPropertiesGated(): Setting USB Restricted Mode: NO... (m_mgrPrimaryPortID: 259)
default 04:40:08.823900+0100  kernel  IOAccessoryTRM::_setPropertiesGated(): *** supervisedTransportsRestricted: NO *** (m_mgrPrimaryPortID: 259)
default 04:40:08.823903+0100  kernel  IOAccessoryTRM::_setPropertiesGated(): Published RM status! (supervisedTransportsRestricted: NO, supervisedAccessoryAttached: YES, state: 1, gracePeriodReason: 1) (m_mgrPrimaryPortID: 259)
default 04:40:08.823921+0100  kernel  IOAccessoryTRM::_handleNotificationGated(): Handling Attach/Detach/AccessoryDetected/ConfigChange/USBConnectChange notification... (m_mgrPrimaryPortID: 259)
default 04:40:08.823929+0100  kernel  IOAccessoryTRM::_handleNotificationGated(): supervisedAccessoryAttached: YES, m_status.supervisedAccessoryAttached: YES (m_mgrPrimaryPortID: 259)
default 04:40:08.823936+0100  kernel  IOAccessoryTRM::_handleNotificationGated(): Handling Attach/Detach/AccessoryDetected/ConfigChange/USBConnectChange notification... (m_mgrPrimaryPortID: 259)
default 04:40:08.823945+0100  kernel  IOAccessoryTRM::_handleNotificationGated(): supervisedAccessoryAttached: YES, m_status.supervisedAccessoryAttached: YES (m_mgrPrimaryPortID: 259)
default 04:40:08.823977+0100  kernel  IOServiceNotificationManager::sendMessages(): [Port-USB-C@3] Sending 1 message(s)... (m_propertyChanged: NO)
default 04:40:08.823998+0100  kernel  IOAccessoryTRM::_handleNotificationGated(): Handling Attach/Detach/AccessoryDetected/ConfigChange/USBConnectChange notification... (m_mgrPrimaryPortID: 259)
default 04:40:08.824007+0100  kernel  IOAccessoryTRM::_handleNotificationGated(): supervisedAccessoryAttached: YES, m_status.supervisedAccessoryAttached: YES (m_mgrPrimaryPortID: 259)
default 04:40:08.824012+0100  kernel  IOAccessoryTRM::_handleNotifications(): Handling notifications...
default 04:40:08.824067+0100  kernel  AppleNotificationQueue::_handleNotifications(): Handling notifications...
default 04:40:08.835972+0100  IOUIAgent messageType: kIOPort_Message_AuthorizationStateChange
default 04:40:08.875389+0100  kernel  IOPortTransportState::setDriverStatus(): [Port-USB-C@3: USB3] driverStatus: 2 [Ready]
default 04:40:08.875483+0100  kernel  IOServiceNotificationManager::sendMessages(): [Port-USB-C@3/USB3] Sending 2 message(s)... (m_propertyChanged: YES)
default 04:40:08.877403+0100  kernel  IOPortTransportState::setDriverStatus(): [Port-USB-C@3: USB2] driverStatus: 2 [Ready]
default 04:40:08.877434+0100  kernel  IOServiceNotificationManager::sendMessages(): [Port-USB-C@3/USB2] Sending 2 message(s)... (m_propertyChanged: YES)
default 04:40:08.923381+0100  kernel  IOPortTransportState::handleStateChange(): [Port-USB-C@3: USB3] Handling state change...
default 04:40:08.923405+0100  kernel  IOServiceNotificationManager::sendMessages(): [Port-USB-C@3/USB3] Sending 2 message(s)... (m_propertyChanged: YES)
default 04:40:08.923471+0100  kernel  IOPortTransportState::handleStateChange(): [Port-USB-C@3: USB2] Handling state change...
default 04:40:08.923490+0100  kernel  IOServiceNotificationManager::sendMessages(): [Port-USB-C@3/USB2] Sending 1 message(s)... (m_propertyChanged: NO)
default 04:40:08.923535+0100  kernel  IOAccessoryTRM::_processNotifications(): Processing notifications...
default 04:40:08.923707+0100  kernel  IOAccessoryTRM::_handleNotifications(): Handling notifications...
default 04:40:08.931850+0100  kernel  IOAccessoryTRM::_handleNotificationGated(): Handling Attach/Detach/AccessoryDetected/ConfigChange/USBConnectChange notification... (m_mgrPrimaryPortID: 259)
default 04:40:08.931884+0100  kernel  IOAccessoryTRM::_handleNotificationGated(): supervisedAccessoryAttached: YES, m_status.supervisedAccessoryAttached: YES (m_mgrPrimaryPortID: 259)
default 04:40:08.939820+0100  kernel  IOPortTransportState::handleStateChange(): [Port-USB-C@3: USB3] Handling state change...
default 04:40:08.939846+0100  kernel  IOServiceNotificationManager::sendMessages(): [Port-USB-C@3/USB3] Sending 2 message(s)... (m_propertyChanged: YES)
default 04:40:08.939915+0100  kernel  IOPortTransportState::handleStateChange(): [Port-USB-C@3: USB2] Handling state change...
default 04:40:08.939925+0100  kernel  IOServiceNotificationManager::sendMessages(): [Port-USB-C@3/USB2] Sending 1 message(s)... (m_propertyChanged: NO)
default 04:40:08.939963+0100  kernel  IOAccessoryTRM::_processNotifications(): Processing notifications...
default 04:40:08.939977+0100  kernel  IOAccessoryTRM::_handleNotifications(): Handling notifications...
default 04:40:08.941431+0100  kernel  IOAccessoryTRM::_handleNotificationGated(): Handling Attach/Detach/AccessoryDetected/ConfigChange/USBConnectChange notification... (m_mgrPrimaryPortID: 259)
default 04:40:08.941448+0100  kernel  IOAccessoryTRM::_handleNotificationGated(): supervisedAccessoryAttached: YES, m_status.supervisedAccessoryAttached: YES (m_mgrPrimaryPortID: 259)
default 04:40:08.950042+0100  kernel  IOPortTransportState::handleStateChange(): [Port-USB-C@3: USB3] Handling state change...
default 04:40:08.950067+0100  kernel  IOServiceNotificationManager::sendMessages(): [Port-USB-C@3/USB3] Sending 2 message(s)... (m_propertyChanged: YES)
default 04:40:08.950129+0100  kernel  IOPortTransportState::handleStateChange(): [Port-USB-C@3: USB2] Handling state change...
default 04:40:08.950136+0100  kernel  IOServiceNotificationManager::sendMessages(): [Port-USB-C@3/USB2] Sending 1 message(s)... (m_propertyChanged: NO)
default 04:40:08.950174+0100  kernel  IOAccessoryTRM::_processNotifications(): Processing notifications...
default 04:40:08.950186+0100  kernel  IOAccessoryTRM::_handleNotifications(): Handling notifications...
default 04:40:08.953872+0100  kernel  IOPortTransportState::handleStateChange(): [Port-USB-C@3: USB3] Handling state change...
default 04:40:08.953892+0100  kernel  IOServiceNotificationManager::sendMessages(): [Port-USB-C@3/USB3] Sending 2 message(s)... (m_propertyChanged: YES)
default 04:40:08.953954+0100  kernel  IOPortTransportState::handleStateChange(): [Port-USB-C@3: USB2] Handling state change...
default 04:40:08.953963+0100  kernel  IOServiceNotificationManager::sendMessages(): [Port-USB-C@3/USB2] Sending 1 message(s)... (m_propertyChanged: NO)
default 04:40:08.953999+0100  kernel  IOAccessoryTRM::_processNotifications(): Processing notifications...
default 04:40:08.955513+0100  kernel  IOAccessoryTRM::_handleNotificationGated(): Handling Attach/Detach/AccessoryDetected/ConfigChange/USBConnectChange notification... (m_mgrPrimaryPortID: 259)
default 04:40:08.955538+0100  kernel  IOAccessoryTRM::_handleNotificationGated(): supervisedAccessoryAttached: YES, m_status.supervisedAccessoryAttached: YES (m_mgrPrimaryPortID: 259)
default 04:40:08.958178+0100  kernel  IOPortTransportState::handleStateChange(): [Port-USB-C@3: USB3] Handling state change...
default 04:40:08.958201+0100  kernel  IOServiceNotificationManager::sendMessages(): [Port-USB-C@3/USB3] Sending 2 message(s)... (m_propertyChanged: YES)
default 04:40:08.958283+0100  kernel  IOPortTransportState::handleStateChange(): [Port-USB-C@3: USB2] Handling state change...
default 04:40:08.958292+0100  kernel  IOServiceNotificationManager::sendMessages(): [Port-USB-C@3/USB2] Sending 1 message(s)... (m_propertyChanged: NO)
default 04:40:08.958327+0100  kernel  IOAccessoryTRM::_processNotifications(): Processing notifications...
default 04:40:08.958329+0100  kernel  IOAccessoryTRM::_processNotifications(): Thread call cancelled! (already pending)
default 04:40:08.958924+0100  kernel  IOAccessoryTRM::_handleNotificationGated(): Handling Attach/Detach/AccessoryDetected/ConfigChange/USBConnectChange notification... (m_mgrPrimaryPortID: 259)
default 04:40:08.958944+0100  kernel  IOAccessoryTRM::_handleNotificationGated(): supervisedAccessoryAttached: YES, m_status.supervisedAccessoryAttached: YES (m_mgrPrimaryPortID: 259)
default 04:40:08.958955+0100  kernel  IOAccessoryTRM::_handleNotificationGated(): Handling Attach/Detach/AccessoryDetected/ConfigChange/USBConnectChange notification... (m_mgrPrimaryPortID: 259)
default 04:40:08.958964+0100  kernel  IOAccessoryTRM::_handleNotificationGated(): supervisedAccessoryAttached: YES, m_status.supervisedAccessoryAttached: YES (m_mgrPrimaryPortID: 259)
default 04:40:08.959013+0100  kernel  IOAccessoryTRM::_handleNotifications(): Handling notifications...
default 04:40:08.959037+0100  kernel  IOPortTransportStateUSB2::setActive(): [Port-USB-C@3: USB2] active: YES
default 04:40:08.959044+0100  kernel  IOPortTransportStateUSB2::setActive_block_invoke(): [Port-USB-C@3: USB2] active: 0 [NO] -> 1 [YES]
default 04:40:08.959050+0100  kernel  IOPortTransportState::setActive(): [Port-USB-C@3: USB2] active: YES (transportType: 2 [USB2])
default 04:40:08.959063+0100  kernel  IOPortTransportState::_updateTRMState(): [Port-USB-C@3: USB2] Updating TRM state...
default 04:40:08.959069+0100  kernel  IOPortTransportStateUSB::calculateAuthorizationState(): [Port-USB-C@3: USB2] Calculating authorization state...
default 04:40:08.959080+0100  kernel  IOPortTransportState::calculateAuthorizationState(): [Port-USB-C@3: USB2] Calculating authorization state...
default 04:40:08.959089+0100  kernel  IOPortTransportState::calculateAuthorizationState_block_invoke(): [Port-USB-C@3: USB2] *** LTRR ***
default 04:40:08.959100+0100  kernel  IOPortTransportState::handleStateChange(): [Port-USB-C@3: USB2] Handling state change...
default 04:40:08.959106+0100  kernel  IOServiceNotificationManager::sendMessages(): [Port-USB-C@3/USB2] Sending 3 message(s)... (m_propertyChanged: YES)
default 04:40:08.959134+0100  kernel  AppleNotificationQueue::processNotifications(): Processing 1 notification(s)...
default 04:40:08.959146+0100  kernel  AppleNotificationQueue::_handleNotifications(): Handling notifications...
default 04:40:08.959156+0100  kernel  IOServiceNotificationManager::handleServiceReregistration(): [Port-USB-C@3/USB2] Re-registering service...
default 04:40:08.959165+0100  kernel  IOPortTransportState::registerService(): [Port-USB-C@3: USB2] Registering service USB2@(null)... (transportType: 2, provider: Port-USB-C@3)
default 04:40:08.959326+0100  kernel  IOPortTransportState::setNominalSignalingFrequencies(): [Port-USB-C@3: USB2] Setting nominal signaling frequencies... (nominalSignalingFrequenciesHz: YES, nominalSignalingFrequenciesHz.count: 3)
default 04:40:08.959417+0100  kernel  IOServiceNotificationManager::sendMessages(): [Port-USB-C@3] Sending 3 message(s)... (m_propertyChanged: YES)
default 04:40:08.961162+0100  IOUIAgent messageType: kIOPort_Message_AuthorizationStateChange
default 04:40:09.034251+0100  kernel  IOPortTransportState::setNominalSignalingFrequencies(): [Port-USB-C@3: USB3] Setting nominal signaling frequencies... (nominalSignalingFrequenciesHz: YES, nominalSignalingFrequenciesHz.count: 1)
default 04:40:09.034347+0100  kernel  IOPortTransportStateUSB3::setActive(): [Port-USB-C@3: USB3] active: YES
default 04:40:09.034351+0100  kernel  IOPortTransportStateUSB3::setActive_block_invoke(): [Port-USB-C@3: USB3] active: 0 [NO] -> 1 [YES]
default 04:40:09.034359+0100  kernel  IOPortTransportState::setActive(): [Port-USB-C@3: USB3] active: YES (transportType: 3 [USB3])
default 04:40:09.034373+0100  kernel  IOPortTransportState::_updateTRMState(): [Port-USB-C@3: USB3] Updating TRM state...
default 04:40:09.034379+0100  kernel  IOPortTransportStateUSB::calculateAuthorizationState(): [Port-USB-C@3: USB3] Calculating authorization state...
default 04:40:09.034392+0100  kernel  IOPortTransportState::calculateAuthorizationState(): [Port-USB-C@3: USB3] Calculating authorization state...
default 04:40:09.034400+0100  kernel  IOPortTransportState::calculateAuthorizationState_block_invoke(): [Port-USB-C@3: USB3] *** LTRR ***
default 04:40:09.034424+0100  kernel  IOPortTransportState::handleStateChange(): [Port-USB-C@3: USB3] Handling state change...
default 04:40:09.034431+0100  kernel  IOServiceNotificationManager::sendMessages(): [Port-USB-C@3/USB3] Sending 3 message(s)... (m_propertyChanged: YES)
default 04:40:09.034471+0100  kernel  AppleNotificationQueue::processNotifications(): Processing 1 notification(s)...
default 04:40:09.034482+0100  kernel  AppleNotificationQueue::_handleNotifications(): Handling notifications...
default 04:40:09.034503+0100  kernel  IOServiceNotificationManager::handleServiceReregistration(): [Port-USB-C@3/USB3] Re-registering service...
default 04:40:09.034512+0100  kernel  IOPortTransportState::registerService(): [Port-USB-C@3: USB3] Registering service USB3@(null)... (transportType: 3, provider: Port-USB-C@3)
default 04:40:09.034739+0100  kernel  IOServiceNotificationManager::sendMessages(): [Port-USB-C@3] Sending 2 message(s)... (m_propertyChanged: YES)
default 04:40:09.061218+0100  kernel  IOPortTransportState::handleStateChange(): [Port-USB-C@3: USB3] Handling state change...
default 04:40:09.061245+0100  kernel  IOServiceNotificationManager::sendMessages(): [Port-USB-C@3/USB3] Sending 2 message(s)... (m_propertyChanged: YES)
default 04:40:09.061351+0100  kernel  IOAccessoryTRM::_processNotifications(): Processing notifications...
default 04:40:09.061368+0100  kernel  IOAccessoryTRM::_handleNotifications(): Handling notifications...
default 04:40:09.062999+0100  kernel  IOAccessoryTRM::_handleNotificationGated(): Handling Attach/Detach/AccessoryDetected/ConfigChange/USBConnectChange notification... (m_mgrPrimaryPortID: 259)
default 04:40:09.063019+0100  kernel  IOAccessoryTRM::_handleNotificationGated(): supervisedAccessoryAttached: YES, m_status.supervisedAccessoryAttached: YES (m_mgrPrimaryPortID: 259)
default 04:40:09.223217+0100  kernel  IOPortTransportState::setNominalSignalingFrequencies(): [Port-USB-C@3: USB2] Setting nominal signaling frequencies... (nominalSignalingFrequenciesHz: YES, nominalSignalingFrequenciesHz.count: 1)
default 04:40:10.136122+0100  kernel  IOPortTransportState::setNominalSignalingFrequencies(): [Port-USB-C@3: USB3] Setting nominal signaling frequencies... (nominalSignalingFrequenciesHz: YES, nominalSignalingFrequenciesHz.count: 1)
default 04:40:10.136156+0100  kernel  IOPortTransportStateUSB3::setActive(): [Port-USB-C@3: USB3] active: NO
default 04:40:10.136158+0100  kernel  IOPortTransportStateUSB3::setActive_block_invoke(): [Port-USB-C@3: USB3] active: 1 [YES] -> 0 [NO]
default 04:40:10.136166+0100  kernel  IOPortTransportState::setActive(): [Port-USB-C@3: USB3] active: NO (transportType: 3 [USB3])
default 04:40:10.136173+0100  kernel  IOPortTransportState::setHash(): [Port-USB-C@3: USB3] hash: NO
default 04:40:10.136190+0100  kernel  IOPortTransportState::handleMetadataChanges(): [Port-USB-C@3: USB3] Handling metadata changes... (shouldReregisterService: NO, m_handleMetadataChangesRecursionCount: 0)
default 04:40:10.136195+0100  kernel  IOPortTransportState::_updatePreDefinedMetadataProperties(): [Port-USB-C@3: USB3] Updating pre-defined metadata properties...
default 04:40:10.136230+0100  kernel  IOPortTransportState::setAuthenticationStatus(): [Port-USB-C@3: USB3] authenticationStatus: 0 [Idle]
default 04:40:10.136234+0100  kernel  IOPortTransportState::_updateTRMState(): [Port-USB-C@3: USB3] Updating TRM state...
default 04:40:10.136239+0100  kernel  IOPortTransportStateUSB::calculateAuthorizationState(): [Port-USB-C@3: USB3] Calculating authorization state...
default 04:40:10.136244+0100  kernel  IOPortTransportState::calculateAuthorizationState(): [Port-USB-C@3: USB3] Calculating authorization state...
default 04:40:10.136248+0100  kernel  IOPortTransportState::calculateAuthorizationState_block_invoke(): [Port-USB-C@3: USB3] *** LTNART ***
default 04:40:10.136257+0100  kernel  IOPortTransportState::handleStateChange(): [Port-USB-C@3: USB3] Handling state change...
default 04:40:10.136264+0100  kernel  IOServiceNotificationManager::sendMessages(): [Port-USB-C@3/USB3] Sending 2 message(s)... (m_propertyChanged: NO)
default 04:40:10.136284+0100  kernel  AppleNotificationQueue::processNotifications(): Processing 1 notification(s)...
default 04:40:10.136296+0100  kernel  AppleNotificationQueue::_handleNotifications(): Handling notifications...
default 04:40:10.136343+0100  kernel  IOServiceNotificationManager::sendMessages(): [Port-USB-C@3] Sending 2 message(s)... (m_propertyChanged: YES)
default 04:40:10.224307+0100  kernel  IOPortTransportState::setNominalSignalingFrequencies(): [Port-USB-C@3: USB2] Setting nominal signaling frequencies... (nominalSignalingFrequenciesHz: YES, nominalSignalingFrequenciesHz.count: 3)
default 04:40:10.345758+0100  kernel  IOPortTransportState::setNominalSignalingFrequencies(): [Port-USB-C@3: USB2] Setting nominal signaling frequencies... (nominalSignalingFrequenciesHz: YES, nominalSignalingFrequenciesHz.count: 1)
default 04:40:11.347074+0100  kernel  IOPortTransportState::setNominalSignalingFrequencies(): [Port-USB-C@3: USB2] Setting nominal signaling frequencies... (nominalSignalingFrequenciesHz: YES, nominalSignalingFrequenciesHz.count: 3)
default 04:40:11.528738+0100  kernel  IOPortTransportState::setNominalSignalingFrequencies(): [Port-USB-C@3: USB2] Setting nominal signaling frequencies... (nominalSignalingFrequenciesHz: YES, nominalSignalingFrequenciesHz.count: 1)
default 04:40:12.529943+0100  kernel  IOPortTransportState::setNominalSignalingFrequencies(): [Port-USB-C@3: USB2] Setting nominal signaling frequencies... (nominalSignalingFrequenciesHz: YES, nominalSignalingFrequenciesHz.count: 3)
default 04:40:12.772881+0100  kernel  IOPortTransportState::setNominalSignalingFrequencies(): [Port-USB-C@3: USB2] Setting nominal signaling frequencies... (nominalSignalingFrequenciesHz: YES, nominalSignalingFrequenciesHz.count: 1)
default 04:40:13.774384+0100  kernel  IOPortTransportState::setNominalSignalingFrequencies(): [Port-USB-C@3: USB2] Setting nominal signaling frequencies... (nominalSignalingFrequenciesHz: YES, nominalSignalingFrequenciesHz.count: 3)
default 04:40:14.063138+0100  kernel  IOPortTransportState::handleMetadataChanges(): [Port-USB-C@3: CC] Handling metadata changes... (shouldReregisterService: NO, m_handleMetadataChangesRecursionCount: 0)
default 04:40:14.063150+0100  kernel  IOPortTransportState::_updatePreDefinedMetadataProperties(): [Port-USB-C@3: CC] Updating pre-defined metadata properties...
default 04:40:14.063230+0100  kernel  IOServiceNotificationManager::handleServiceReregistration(): [Port-USB-C@3/CC] Re-registering service...
default 04:40:14.063237+0100  kernel  IOPortTransportState::registerService(): [Port-USB-C@3: CC] Registering service CC@(null)... (transportType: 1, provider: Port-USB-C@3)
default 04:40:14.067331+0100  kernel  IOPortFamily::handleMetadataChanges(): [Port-USB-C@3/CC/SOP'] Handling metadata changes... (shouldReregisterService: NO)
default 04:40:14.067337+0100  kernel  IOPortFamily::_updatePreDefinedMetadataProperties(): [Port-USB-C@3/CC/SOP'] Updating pre-defined metadata properties...
default 04:40:14.067501+0100  kernel  IOPortFamily::_updatePreDefinedMetadataProperties(): [Port-USB-C@3/CC/SOP'] Updating pre-defined metadata properties...
default 04:40:14.067540+0100  kernel  IOPortFamily::registerService(): [Port-USB-C@3/CC/SOP'] Registering service... (providerPath: IOService:/AppleARMPE/arm-io/AppleT600xIO/i2c0@9B040000/AppleS5L8940XI2CController/hpmBusManager@6B/AppleHPMBusController/hpm2/AppleHPMARMI2C/AppleHPMDevice@3B/Port-USB-C@3/CC, options: 0)
default 04:40:14.067676+0100  kernel  IOPortFamily::handleMetadataChanges(): [Port-USB-C@3/CC/SOP'] Handling metadata changes... (shouldReregisterService: NO)
default 04:40:14.067679+0100  kernel  IOPortFamily::_updatePreDefinedMetadataProperties(): [Port-USB-C@3/CC/SOP'] Updating pre-defined metadata properties...
default 04:40:14.067717+0100  kernel  IOPortFamily::handleMetadataChanges(): [Port-USB-C@3/CC/SOP'] Handling metadata changes... (shouldReregisterService: NO)
default 04:40:14.067719+0100  kernel  IOPortFamily::_updatePreDefinedMetadataProperties(): [Port-USB-C@3/CC/SOP'] Updating pre-defined metadata properties...
default 04:40:14.067733+0100  kernel  IOServiceNotificationManager::handleServiceReregistration(): [Port-USB-C@3/CC/SOP'] Re-registering service...
default 04:40:14.067778+0100  kernel  IOPortFamily::_updatePreDefinedMetadataProperties(): [Port-USB-C@3/CC/SOP'] Updating pre-defined metadata properties...
default 04:40:14.067790+0100  kernel  IOPortFamily::registerService(): [Port-USB-C@3/CC/SOP'] Registering service... (providerPath: IOService:/AppleARMPE/arm-io/AppleT600xIO/i2c0@9B040000/AppleS5L8940XI2CController/hpmBusManager@6B/AppleHPMBusController/hpm2/AppleHPMARMI2C/AppleHPMDevice@3B/Port-USB-C@3/CC, options: 0)
default 04:40:14.068262+0100  kernel  IOServiceNotificationManager::handleServiceReregistration(): [Port-USB-C@3/CC/SOP'] Re-registering service...
default 04:40:14.068295+0100  kernel  IOPortFamily::registerService(): [Port-USB-C@3/CC/SOP'] Registering service... (providerPath: IOService:/AppleARMPE/arm-io/AppleT600xIO/i2c0@9B040000/AppleS5L8940XI2CController/hpmBusManager@6B/AppleHPMBusController/hpm2/AppleHPMARMI2C/AppleHPMDevice@3B/Port-USB-C@3/CC, options: 0)
default 04:40:14.071171+0100  kernel  IOPortTransportProtocolAppleUVDM::start - [Port-USB-C@3/CC/SOP'/AppleUVDM] uvdmlog boot-arg: 0x1, uvdmdebug boot-arg: 0x0
default 04:40:14.071455+0100  kernel  IOPortTransportProtocolAppleUVDM::setPowerState - [Port-USB-C@3/CC/SOP'/AppleUVDM] Setting power state to 0x1
default 04:40:14.073415+0100  kernel  IOPortTransportProtocolAppleUVDM::poweredStart - [Port-USB-C@3/CC/SOP'/AppleUVDM] AUVDM mode not active
default 04:40:14.073422+0100  kernel  IOPortTransportProtocolAppleUVDM::terminate - [Port-USB-C@3/CC/SOP'/AppleUVDM] terminating
default 04:40:14.073430+0100  kernel  IOPortFamily::terminate(): [Port-USB-C@3/CC/SOP'/AppleUVDM] Terminating Port-USB-C@3/CC/SOP'/AppleUVDM...
default 04:40:14.073899+0100  kernel  IOPortTransportProtocolAppleUVDM::poweredStart - [Port-USB-C@3/CC/SOP'/AppleUVDM] Start time: 1757994014s,71471us, finish time: 1757994014s,73899us, status=0xE00002C7
default 04:40:14.074018+0100  kernel  IOPortTransportProtocol::stop(): [Port-USB-C@3/CC/SOP'/AppleUVDM] Stopping protocol...
default 04:40:14.074033+0100  kernel  IOPortFamily::stop(): [Port-USB-C@3/CC/SOP'/AppleUVDM] Stopping Port-USB-C@3/CC/SOP'/AppleUVDM...
default 04:40:14.078206+0100  kernel  IOPortTransportState::setNominalSignalingFrequencies(): [Port-USB-C@3: USB2] Setting nominal signaling frequencies... (nominalSignalingFrequenciesHz: YES, nominalSignalingFrequenciesHz.count: 1)
default 04:40:15.079035+0100  kernel  IOPortTransportState::setNominalSignalingFrequencies(): [Port-USB-C@3: USB2] Setting nominal signaling frequencies... (nominalSignalingFrequenciesHz: YES, nominalSignalingFrequenciesHz.count: 3)
default 04:40:15.444782+0100  kernel  IOPortTransportState::setNominalSignalingFrequencies(): [Port-USB-C@3: USB2] Setting nominal signaling frequencies... (nominalSignalingFrequenciesHz: YES, nominalSignalingFrequenciesHz.count: 1)
default 04:40:16.446249+0100  kernel  IOPortTransportState::setNominalSignalingFrequencies(): [Port-USB-C@3: USB2] Setting nominal signaling frequencies... (nominalSignalingFrequenciesHz: YES, nominalSignalingFrequenciesHz.count: 3)
default 04:40:16.871942+0100  kernel  IOPortTransportState::setNominalSignalingFrequencies(): [Port-USB-C@3: USB2] Setting nominal signaling frequencies... (nominalSignalingFrequenciesHz: YES, nominalSignalingFrequenciesHz.count: 1)
default 04:40:17.872587+0100  kernel  IOPortTransportState::setNominalSignalingFrequencies(): [Port-USB-C@3: USB2] Setting nominal signaling frequencies... (nominalSignalingFrequenciesHz: YES, nominalSignalingFrequenciesHz.count: 3)
default 04:40:18.184192+0100  kernel  IOPortTransportState::handleStateChange(): [Port-USB-C@3: USB3] Handling state change...
default 04:40:18.184225+0100  kernel  IOServiceNotificationManager::sendMessages(): [Port-USB-C@3/USB3] Sending 2 message(s)... (m_propertyChanged: YES)
default 04:40:18.184343+0100  kernel  IOAccessoryTRM::_processNotifications(): Processing notifications...
default 04:40:18.184357+0100  kernel  IOAccessoryTRM::_handleNotifications(): Handling notifications...
default 04:40:18.186002+0100  kernel  IOAccessoryTRM::_handleNotificationGated(): Handling Attach/Detach/AccessoryDetected/ConfigChange/USBConnectChange notification... (m_mgrPrimaryPortID: 259)
default 04:40:18.186022+0100  kernel  IOAccessoryTRM::_handleNotificationGated(): supervisedAccessoryAttached: YES, m_status.supervisedAccessoryAttached: YES (m_mgrPrimaryPortID: 259)
default 04:40:18.359183+0100  kernel  IOPortTransportState::setNominalSignalingFrequencies(): [Port-USB-C@3: USB2] Setting nominal signaling frequencies... (nominalSignalingFrequenciesHz: YES, nominalSignalingFrequenciesHz.count: 1)
After disconnecting board

Code: Select all

default 04:42:31.040214+0100  kernel  IOPortTransportState::setNominalSignalingFrequencies(): [Port-USB-C@3: USB2] Setting nominal signaling frequencies... (nominalSignalingFrequenciesHz: YES, nominalSignalingFrequenciesHz.count: 3)
default 04:42:31.067797+0100  kernel  IOPortFeaturePower::removePowerSources(): [Port-USB-C@3/Power In] Removing all power sources...
default 04:42:31.068538+0100  kernel  IOPortTransportState::handleMetadataChanges(): [Port-USB-C@3: CC] Handling metadata changes... (shouldReregisterService: NO, m_handleMetadataChangesRecursionCount: 0)
default 04:42:31.068546+0100  kernel  IOPortTransportState::_updatePreDefinedMetadataProperties(): [Port-USB-C@3: CC] Updating pre-defined metadata properties...
default 04:42:31.068597+0100  kernel  IOServiceNotificationManager::handleServiceReregistration(): [Port-USB-C@3/CC] Re-registering service...
default 04:42:31.068605+0100  kernel  IOPortTransportState::registerService(): [Port-USB-C@3: CC] Registering service CC@(null)... (transportType: 1, provider: Port-USB-C@3)
default 04:42:31.068837+0100  kernel  IOPortTransportState::handleMetadataChanges(): [Port-USB-C@3: CC] Handling metadata changes... (shouldReregisterService: NO, m_handleMetadataChangesRecursionCount: 0)
default 04:42:31.072423+0100  kernel  IOPort::_removeTransport_block_invoke(): [Port-USB-C@3] Removed transport! (transport: Port-USB-C@3/USB2)
default 04:42:31.072459+0100  kernel  IOPortFamily::handleMetadataChanges(): [Port-USB-C@3] Handling metadata changes... (shouldReregisterService: NO)
default 04:42:31.072464+0100  kernel  IOPortFamily::_updatePreDefinedMetadataProperties(): [Port-USB-C@3] Updating pre-defined metadata properties...
default 04:42:31.072480+0100  kernel  IOPort::_updateConnectionActive_block_invoke(): [Port-USB-C@3] m_connectionActive: NO, m_connectionCount: 57, m_connectionUUID: NULL
default 04:42:31.072490+0100  kernel  IOServiceNotificationManager::sendMessages(): [Port-USB-C@3] Sending 2 message(s)... (m_propertyChanged: YES)
default 04:42:31.072530+0100  kernel  IOPort::_setUserAuthorizationStatus(): [Port-USB-C@3] userAuthorizationStatus: 0 [Not Required]
default 04:42:31.072568+0100  kernel  IOServiceNotificationManager::sendMessages(): [Port-USB-C@3] Sending 3 message(s)... (m_propertyChanged: YES)
default 04:42:31.072741+0100  kernel  IOPortFamily::registerService(): [Port-USB-C@3] Registering service... (providerPath: IOService:/AppleARMPE/arm-io/AppleT600xIO/i2c0@9B040000/AppleS5L8940XI2CController/hpmBusManager@6B/AppleHPMBusController/hpm2/AppleHPMARMI2C/AppleHPMDevice@3B, options: 8)
default 04:42:31.072788+0100  kernel  IOAccessoryTRM::_processNotifications(): Processing notifications...
default 04:42:31.072802+0100  kernel  IOAccessoryTRM::_handleNotifications(): Handling notifications...
default 04:42:31.072916+0100  kernel  IOAccessoryTRM::_processNotifications(): Processing notifications...
default 04:42:31.073060+0100  kernel  IOPortFamily::registerService(): [Port-USB-C@3] Registering service... (providerPath: IOService:/AppleARMPE/arm-io/AppleT600xIO/i2c0@9B040000/AppleS5L8940XI2CController/hpmBusManager@6B/AppleHPMBusController/hpm2/AppleHPMARMI2C/AppleHPMDevice@3B, options: 8)
default 04:42:31.073091+0100  kernel  IOAccessoryTRM::_processNotifications(): Processing notifications...
default 04:42:31.073092+0100  kernel  IOAccessoryTRM::_processNotifications(): Thread call cancelled! (already pending)
default 04:42:31.077683+0100  IOUIAgent messageType: kIOPort_Message_AuthorizationStateChange
default 04:42:31.082401+0100  kernel  IOPortFeaturePower::removePowerSources(): [Port-USB-C@3/Power In] Removing all power sources...
default 04:42:31.082470+0100  kernel  IOServiceNotificationManager::sendMessages(): [Port-USB-C@3] Sending 2 message(s)... (m_propertyChanged: YES)
default 04:42:31.082479+0100  kernel  IOAccessoryTRM::_handleNotificationGated(): Handling Attach/Detach/AccessoryDetected/ConfigChange/USBConnectChange notification... (m_mgrPrimaryPortID: 259)
default 04:42:31.082488+0100  kernel  IOAccessoryTRM::_handleNotificationGated(): supervisedAccessoryAttached: NO, m_status.supervisedAccessoryAttached: YES (m_mgrPrimaryPortID: 259)
default 04:42:31.082493+0100  kernel  IOAccessoryTRM::_updateStatusGated(): Updating status...
default 04:42:31.082503+0100  kernel  IOAccessoryTRM::_updateStatusGated(): *** UAAA *** (m_mgrPrimaryPortID: 259)
default 04:42:31.082545+0100  kernel  IOAccessoryTRM::_setPropertiesGated(): Setting USB Restricted Mode: NO... (m_mgrPrimaryPortID: 259)
default 04:42:31.082586+0100  kernel  IOAccessoryTRM::_setPropertiesGated(): *** supervisedTransportsRestricted: NO *** (m_mgrPrimaryPortID: 259)
default 04:42:31.082587+0100  kernel  IOAccessoryTRM::_setPropertiesGated(): Published RM status! (supervisedTransportsRestricted: NO, supervisedAccessoryAttached: NO, state: 1, gracePeriodReason: 1) (m_mgrPrimaryPortID: 259)
default 04:42:31.082607+0100  kernel  IOAccessoryTRM::_handleNotificationGated(): Handling Attach/Detach/AccessoryDetected/ConfigChange/USBConnectChange notification... (m_mgrPrimaryPortID: 259)
default 04:42:31.082608+0100  kernel  IOAccessoryTRM::_handleNotificationGated(): supervisedAccessoryAttached: NO, m_status.supervisedAccessoryAttached: NO (m_mgrPrimaryPortID: 259)
default 04:42:31.082617+0100  kernel  IOAccessoryTRM::_handleNotificationGated(): Handling Attach/Detach/AccessoryDetected/ConfigChange/USBConnectChange notification... (m_mgrPrimaryPortID: 259)
default 04:42:31.082621+0100  kernel  IOAccessoryTRM::_handleNotificationGated(): supervisedAccessoryAttached: NO, m_status.supervisedAccessoryAttached: NO (m_mgrPrimaryPortID: 259)
default 04:42:31.082624+0100  kernel  IOAccessoryTRM::_handleNotifications(): Handling notifications...
default 04:42:31.082787+0100  kernel  IOPortTransportComponent::stop(): [Port-USB-C@3/CC/SOP'] Stopping component...
default 04:42:31.082803+0100  kernel  IOPortFamily::stop(): [Port-USB-C@3/CC/SOP'] Stopping Port-USB-C@3/CC/SOP'...
default 04:42:31.082990+0100  kernel  IOPortTransportStateUSB3::stop(): [Port-USB-C@3: USB3] Stopping IOPortTransportStateUSB3...
default 04:42:31.082998+0100  kernel  IOPortTransportStateUSB::stop(): [Port-USB-C@3: USB3] Stopping IOPortTransportStateUSB3...
default 04:42:31.083004+0100  kernel  IOPortTransportState::stop(): [Port-USB-C@3: USB3] Stopping IOPortTransportStateUSB3... (this: USB3@(null), provider: Port-USB-C@3)
default 04:42:31.083014+0100  kernel  AppleNotificationQueue::disableNotifications(): Disabling notifications...
default 04:42:31.083022+0100  kernel  AppleNotificationQueue::dropAllNotifications(): Dropping all 0 notifications...
default 04:42:31.083107+0100  kernel  IOPortTransportStateUSB2::stop(): [Port-USB-C@3: USB2] Stopping IOPortTransportStateUSB2...
default 04:42:31.083112+0100  kernel  IOPortTransportStateUSB::stop(): [Port-USB-C@3: USB2] Stopping IOPortTransportStateUSB2...
default 04:42:31.083116+0100  kernel  IOPortTransportState::stop(): [Port-USB-C@3: USB2] Stopping IOPortTransportStateUSB2... (this: USB2@(null), provider: Port-USB-C@3)
default 04:42:31.083121+0100  kernel  AppleNotificationQueue::disableNotifications(): Disabling notifications...
default 04:42:31.083126+0100  kernel  AppleNotificationQueue::dropAllNotifications(): Dropping all 0 notifications...
error 04:42:31.241689+0100  kernel  [ERROR] [@: USB2] Transport has been terminated, ignoring method invocation!
default 04:42:31.241708+0100  kernel  IOPortTransportState::setNominalSignalingFrequencies(): [@: USB2] Setting nominal signaling frequencies... (nominalSignalingFrequenciesHz: NO, nominalSignalingFrequenciesHz.count: 0)
error 04:42:31.241715+0100  kernel  [ERROR] [@: USB2] Transport has been terminated, ignoring method invocation!

EDIT

This mornning I tried removing the ESD chip and soldering wires directly from D+/D- to the ESD input pads. It's now detected and I can upload this test sketch via USB:

Code: Select all

void setup() {
  Serial.begin(115200);
  delay(1000);
}

void loop() {
  Serial.println("USB Test");
  delay(1000);
}
I still don't see any log messages in the console, but at least firmware upload works which is something.

It looks like it must be a problem with the ESD chip then. Any ideas? It is a USBLC6-2 (https://www.lcsc.com/datasheet/C15999.pdf) which I've seen recommended by other people.
Last edited by roomz98 on Tue Sep 16, 2025 3:11 pm, edited 1 time in total.

Sprite
Espressif staff
Espressif staff
Posts: 10617
Joined: Thu Nov 26, 2015 4:08 am

Re: ESP32-S3 USB CDC not working, no device detected

Postby Sprite » Wed Sep 17, 2025 9:02 am

Ah, sorry, for some reason I thought I read you were on Linux; the kernel messages are a lot more informative for USB debugging there.

On the ESD chip: That's odd indeed. You sure you didn't accidentally get an USBLC6-4 instead of an USBLC6-2? Also, in your layout, I don't see a connection for the 'gnd' pin of that chip, bit I can't really see how that'd interfere with USB communications.

toybuilder
Posts: 9
Joined: Thu Jan 31, 2019 6:02 pm

Re: ESP32-S3 USB CDC not working, no device detected

Postby toybuilder » Thu Nov 13, 2025 1:09 pm

* The USB data pins go through and ESD diode straight to D+/D- on the ESP
It looks schematically correct and layout looks like it should be fine.

I once accidentally substituted USBLC6-4 and it took me a day or two to realize what had happened. You can't sub -2 and -4 with each other.

Who is online

Users browsing this forum: No registered users and 4 guests