You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[Feature Request] [Input / Windows] Nintendo Switch 2 Pro Controller (057E:2069) not detected over USB because bundled crueter-ci/SDL3 is built without libusb (SDL_hidapi_switch2 omitted) #770
Summary
On Windows 10/11, the wired Nintendo Switch 2 Pro Controller (VID 057E / PID 2069) is currently not detected by the emulator (buttons, sticks, 250Hz IMU gyro, and HD rumble are completely unresponsive unless routed through external wrappers).
Root Cause Analysis
Protocol & Driver Requirement (SDL_hidapi_switch2.c): Unlike the original Switch 1 Pro Controller, the Switch 2 Pro Controller boots asleep (answering interrupt IN polls on Interface 0 with NAK) until it receives an initialization and wake handshake over USB Interface 1 (Vendor Class 0xFF, WinUSB bulk endpoints, GUID {6F13725E-EF0E-4FD3-AE5F-B2DE989EC825}). Valve already contributed full native support for this controller (wake handshake, SPI flash calibration reads, report 0x05 250Hz 6-axis IMU streaming, and report 0x02 40-bit HD rumble) to upstream SDL3 in src/joystick/hidapi/SDL_hidapi_switch2.c (SDL Discourse #62142).
Why It Fails in Current Windows Builds: In SDL3, SDL_hidapi_switch2.c is guarded by #ifdef HAVE_LIBUSB (SDL_HIDAPI_LIBUSB). Inspecting the Windows executable symbols shows that while the emulator links libusb-1.0.dll for joycon_driver.cpp, the prebuilt static SDL3 package pulled via cpmfile.json (crueter-ci/SDL3, 3.4.14-1788231389-147a8ee32d) was compiled without libusb support enabled. As a result, SDL_hidapi_switch2.c (SDL_JOYSTICK_HIDAPI_SWITCH2) was completely stripped at compile time.
Verification & Working User Workaround
We verified this root cause by compiling a standalone SDL3.dll from upstream libsdl-org/SDL on Windows x64 with libusb-1.0.29 enabled (SDL Issue #14742) and injecting it at runtime via SDL's built-in dynamic API override (SDL3_DYNAMIC_API=\SDL3.dll). With this override, the emulator natively wakes and recognizes the wired Switch 2 Pro Controller out of the box with full 250Hz gyroscope motion and rumble support.
Suggested Upstream Fix
Update the Windows CI build of crueter-ci/SDL3 (or the CMake configuration when building SDL3 from source) to pass libusb-1.0 so HAVE_LIBUSB / SDL_JOYSTICK_HIDAPI_SWITCH2 is compiled into SDL3: -DSDL_HIDAPI=ON -DSDL_HIDAPI_LIBUSB=ON -DSDL_HIDAPI_LIBUSB_SHARED=OFF # or ON since libusb-1.0.dll is already shipped -DLibUSB_INCLUDE_PATH="<path_to_libusb_include>" -DLibUSB_LIBRARY="<path_to_libusb-1.0.lib>"
Activity