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.

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.