Skip to content

Nintendo Switch OLED not recognizing the controller in the "Nintendo Switch" input mode [FROM MAIN] #1785

Closed

Description

@ne1hunter

Expected Behavior

Nintendo Switch OLED recognizes the controller, able to use the buttons to navigate the menus and play games.

Current Behavior

Controller is receiving power, but:

  1. All inputs are ignored.
  2. It's not showing up on the list of connected controllers in the Controllers menu.

This used to work with the same controller and console on older firmware builds. Using bisection I found that the last working version is 862cb5b, and the problem starts to occur after 7f92f12.

Context

Firmware version: built from the repository at commit 8013b41
Controller name: Haute42 C-AT
Device: Switch 1 OLED

Verified fix

Cherrypick this commit from upstream tinyusb: hathach/tinyusb@ad7acc849
Updating the entire fork could be another option, but I haven't verified it and tinyusb didn't have a formal release since 0.21.0 (which contains the underlying bug).

Steps to Reproduce

  1. Flash a recent build of the firmware.
  2. Plug in via USB into either dock or directly into the main console unit.
  3. Make to select the "Nintendo Switch" input mode.
  4. Attempt to use the controller.

Important:

  1. The issue is verified on Switch OLED, but it does not affect Switch 2. I don't have other versions of Switch 1 to test if they are also affected.
  2. It also doesn't affect the other Switch input mode - Nintendo Switch Pro.

Activity

  1. added
    bugBug in the firmware - Something is not working as intended
    on Oct 19, 2026
  2. changed the title [-]Nintendo Switch OLED not recognizing the controller in the "Nintendo Switch" input mode[/-] [+]Nintendo Switch OLED not recognizing the controller in the "Nintendo Switch" input mode [FROM MAIN][/+] on Oct 19, 2026
  3. TheTrainGoes commented on Oct 19, 2026

    @TheTrainGoes
    Contributor

    Thanks for the report @ne1hunter ,

    Just to be clear on this - Switch mode works as expected on the Switch, Switch OLED, Switch Lite and Switch 2 from the v0.7.12 release.

    Anything built from main may have issues.

    We will look into this and try to fix. I have a Switch Lite I can test on.

  4. ne1hunter commented on Oct 19, 2026

    @ne1hunter
    Author

    @TheTrainGoes I can also confirm that the latest official release (0.7.12) works with Switch 1 and I understand that the code between releases can be unstable, but I've figured the report could be helpful anyway since it's still an issue that will have to be resolved at some point and I've found a working solution.

    The reason I was building from the latest source is twofold:

    1. I am working on an experimental feature (just for my own research, not planning to take it anywhere).
    2. The official builds of 0.7.12 don't include support of my controller.
  5. TheTrainGoes commented on Oct 19, 2026

    @TheTrainGoes
    Contributor

    Hi @ne1hunter ,

    Can you elaborate more on #1 and #2?

    What are you working on feature wise and what controller are you using?

  6. ne1hunter commented on Oct 19, 2026

    @ne1hunter
    Author

    @TheTrainGoes

    The controller is Haute42 C-AT.

    As for the feature, I was curious to better understand the USB polling behavior of various systems, so I added a toggle that enables the collection and display of various statistics: polls per second answered with a report, polls per second answered with "nothing new", the gap in ms from each report to the console's next poll (as min/average/max). Found that macOS, PS5, Switch 1 and Switch 2 all behave differently from each other. I don't think this is of interest to most people, which is why I'm not posting a pull request, but if you want I can share the code.

    This feature is not the cause behind the issue on Switch 1 though. I was testing clean builds of the main branch at various checkpoints, with none of my changes.

    Have you been able to reproduce on your Switch Lite? The underlying cause I found is due to how TinyUSB 0.21 handles a pending report when it receives a clear halt request from Switch OLED, essentially creating a deadlock situation. That's what hathach/tinyusb@ad7acc849 fixes by re-issuing it. Switch 2 is not affected because it doesn't send a clear halt, or at least not while the initial report is queued.

  7. speedypotato commented on Oct 20, 2026

    @speedypotato
    Contributor

    @ne1hunter #1790 could you check if this fixes the issue?

  8. ne1hunter commented on Oct 20, 2026

    @ne1hunter
    Author

    @speedypotato Yes, it works! Thank you.

    Image
  9. ne1hunter commented on Oct 20, 2026

    @ne1hunter
    Author

    @speedypotato I found another issue that started since the TinyUSB upgrade, this time with PS4/PS5 auth dongles. It fails to authenticate with my Booter5 dongle almost every time on cold plug. The temporary workaround is soft rebooting the controller, after which auth starts working. The bug is not fixed upstream, but I have a proposed fix that I'm currently testing.

  10. TheTrainGoes commented on Oct 20, 2026

    @TheTrainGoes
    Contributor

    @ne1hunter can you please tell me more about the Booter5 issue?

    I am testing this on my PS5 am not able to replicate the issue.

    I have the original Booter5 as well as the new clone unit. I also tested it with a variety of other dongles.

    I can auth with all of them on replug and also by plugging in the controller first and then dongle.

  11. ne1hunter commented on Oct 21, 2026

    @ne1hunter
    Author

    @TheTrainGoes I think it depends on the dongle unit. Mine identifies itself as “GP2040-CE (PS4)” by “Open Stick Community”, USB ID 0079:1893. What do yours show?

    The dongle itself is fine: plugged straight into a Mac, it passes jfedor’s PS auth tester. It also authenticates through the controller with older versions of GP2040 firmware (both with the auth tester and a real PS5 Pro).

    On current main it fails for me both ways: dongle already in the controller when I plug the controller into the PS5, and also controller first, then the dongle. Once it fails, replugging the dongle doesn’t help, only rebooting the controller does.

    I added some counters on the controller side, and my dongle connects and drops off the bus several times while it powers up: 4 connects every time, on both the PS5 and a Mac. The firmware checks once, 150 ms after the first connect, and if the dongle is off the bus at that moment it gives up. A dongle that connects once and stays connected won’t hit this. Happy to share a build with the counters if you want to see how your dongles behave.

    This part is a bug regardless of the dongle: hcd_port_connect_status() in TinyUSB’s hcd_pio_usb.c reads the raw line state, while Pico-PIO-USB’s own connected flag stays set, so after that one check fails it never reports a device on that port again until the host restarts.

    I've replaced line 76:

    https://github.com/speedypotato/tinyusb/blob/6edbdc88da72a0fdf9cef734d550f46257550d48/src/portable/raspberrypi/pio_usb/hcd_pio_usb.c#L76

    return line_state != PORT_PIN_SE0;

    with

    bool const connected = (line_state != PORT_PIN_SE0);
    if (!connected && root->connected && root->suspended) {
      root->connected = false;
    }
    return connected;

    With this fix, ~10 cold plugs passed authentication. Both orders now work - dongle already in the controller, and dongle plugged into a running controller.

  12. speedypotato commented on Oct 21, 2026

    @speedypotato
    Contributor

    Looks like we came to the same conclusion, although my commit adds one more change to reset the port in src/host/usbh.c which I need to see if it's required.

  13. speedypotato commented on Oct 21, 2026

    @speedypotato
    Contributor

    Did some testing and I'm aligning with @ne1hunter 's proposal as well. #1790 should be good to go, tested Booter5, MAGPS4, P5General, and Mayflash S5.

  14. added a commit that references this issue on Oct 21, 2026
  15. TheTrainGoes commented on Oct 25, 2026

    @TheTrainGoes
    Contributor

    Fixed via #1790

  16. added a commit that references this issue on Oct 26, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugBug in the firmware - Something is not working as intended

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions