Switch Pro (NS1) USB Example
This example emulates a Nintendo Switch Pro controller over the ESP32-S3’s
native USB port, using the espp::SwitchPro protocol engine driven by the
espp::usb_device HID function.
It configures a single USB HID interface that advertises the Switch Pro report
descriptor (from hid-rp) with an interrupt-OUT endpoint, funnels received host
OUTPUT reports (the handshake) to SwitchPro::on_hid_report(), and streams input
reports once the host has enabled them — cycling the A / B / X / Y buttons and
sweeping the left stick so a connected Switch shows live input.
Emulation only. The device advertises Nintendo’s Pro Controller USB VID/PID (
0x057E/0x2009) so a real Switch will bind it. Use it to test against a Switch you own.
The USB device descriptor is filled from the espp::SwitchPro identity
constants: VID/PID, manufacturer / product strings, and the details a Switch
compares against a real controller — bcd_device (device release 2.10),
max_power_ma (500 mA) and remote_wakeup — passed to
espp::UsbDevice::Config::bcd_device / max_power_ma / remote_wakeup.
How to use
Hardware Required
An ESP32-S3 (native USB-OTG). The console is on UART0 (the native USB port is
taken by the HID interface, and on the ESP32-S3 the USB-Serial-JTAG console shares
that USB PHY) — connect a USB-UART adapter for idf.py monitor.
Build and Flash
idf.py set-target esp32s3 build flash monitor
Then plug the ESP32-S3’s native USB port into a Nintendo Switch (Home → Controllers → Change Grip/Order) or a PC controller tester. The device enumerates as “Pro Controller”; after the handshake you should see A/B/X/Y and the left stick animating.
Note
A full end-to-end handshake against real hardware requires a Switch (or a Switch-Pro-aware host); this example is structurally complete and builds clean, but the on-console handshake should be verified on hardware.