No description
Find a file
2020-08-05 20:56:11 +02:00
applet Attempt to prevent disconnect/crash when bond completes 2020-06-10 00:21:51 +02:00
Atmosphere@18d59e341e Update submodules 2020-08-05 00:00:27 +02:00
Atmosphere-libs@cac5957d3f Update submodules 2020-08-05 00:00:27 +02:00
btdrv-mitm btdrv-mitm: return nullptr if GetRealSharedMemory is called prior to 7.0.0 2020-08-05 20:56:11 +02:00
common Reorganise project 2020-04-17 11:52:22 +02:00
exefs_patches/bluetooth_patches Add generalised exefs patches for all firmware to make bluetooth PinReply function actually use the pincode passed over IPC 2020-07-14 13:27:13 +02:00
libnx@14c74b268f Update submodules 2020-08-05 00:00:27 +02:00
sysmodule sysmodule: fixed copy-paste error in dualshock4 controller handler 2020-06-09 21:49:49 +02:00
.gitignore Clean up .gitignore 2020-07-30 17:02:53 +02:00
.gitmodules Add Atmosphere as submodule and update Atmosphere-libs 2020-07-21 12:30:08 +02:00
LICENSE Initial commit 2020-03-05 22:08:24 +01:00
Makefile Create path to boot2 when running make dist 2020-08-04 23:59:49 +02:00
README.md Update readme 2020-07-30 22:23:42 +02:00

GitHub GitHub All Releases

MissionControl ko-fi

Use controllers from other consoles natively on your Nintendo Switch via Bluetooth. No dongles or other external hardware neccessary.

Features

  • Supports all firmware versions
  • Pair Bluetooth controllers natively via Change Grip/Order screen
  • Native button remapping (firmware 10.0.0+)
  • btdrv-mitm module also allows for interacting with the bluetooth process without interfering with/interference from the system.

Supported Controllers

Currently, the following controllers are supported. If you have a third-party variant of one of the below, or a Bluetooth controller that isn't listed, consider submitting an issue with the controller details, including vid/pid, to request support.

  • Nintendo Wii Remote + extensions (Nunchuck, Classic Controller, Classic Controller Pro)*
  • Nintendo WiiU Pro Controller
  • Sony DualShock4 Controller
  • Microsoft Xbox One S Controller**

*Extension Controllers remain untested since I don't actually own any. Please report any issues. Motion Plus not currently supported. **Not all Xbox One wireless controllers support Bluetooth. Older variants use a proprietary 2.4Ghz protocol and cannot be used with the Switch. See here for information on identifying the Bluetooth variant.

Requirements

  • Hackable Nintendo Switch running the latest Atmosphère CFW
  • Compatible Bluetooth controller

Installation

Download the latest release .zip and extract to the root of your SD card. A console reboot is required in order for MissionControl to become active.

Note: Currently a modified boot2 is required to launch btdrv-mitm early enough to intercept Bluetooth initialisation. This will get overwritten any time Atmosphère is updated on SD, and will need to be replaced.

Building from source

First, clone the repository to your local machine

git clone --recurse-submodules https://github.com/ndeadly/MissionControl.git

MissionControl uses a custom fork of libnx that adds Bluetooth service wrappers and type definitions. This needs to be built and installed first

cd libnx
make && make install

Next build Atmosphere-libs

cd ../Atmosphere-libs
make

Finally, build and package the distribution .zip. This will build a custom boot2, btdrv-mitm and package them up with bluetooth exefs patches.

cd ..
make dist

The resulting package can be installed as described in the above section.

Usage

Install MissionControl to your SD card, reboot the console and then pair controllers as you normally would via the Controllers->Change Grip/Order screen. Once paired, controllers will reconnect automatically when woken up.

Most native features should just work (with the exception of things like firmware update). If you find something that's broken please create an issue.

How it works

MissionControl works by Man-In-The-Middling the bluetooth system module and intercepting its initialisation IPC commands and system events, and translating their data to convince the Switch that it's communicating with a Pro Controller.

To achieve this, the btdrv-mitm module obtains the handles to bluetooth system events and shared memory when the system attempts to initialise them over IPC via the btm and hid modules. It then creates its own secondary versions of these and passes their handles on instead of the original. This allows modifications to be made to any data buffers before notifying (or not) the system. Additionally, the WriteHidData IPC command is intercepted to translate or drop outgoing requests to the controller. In the case of the latter, fake responses can be written directly to the buffer in shared memory.

Intercepting initialisation IPC commands also allows homebrew to properly make use of the bluetooth service. Normally, calling any of the IPC commands that would initialise or finalise system events would either crash the console, or invalidate the event handles held by system processes. With btdrv-mitm we are able to hand out alternative event handles when homebrew attempts to initialise an interface, and redirect the real system events to those instead of the events held by system processes.

IPS patches to the bluetooth module are provided to (re)enable the passing of abitrary pincodes when Bluetooth legacy pairing is used (Nintendo hardcodes a value of '0000', ignoring IPC arguments). This enables Wii(U) devices to be paired with the console.

Planned Features

  • Controller management application
  • Rumble support
  • Motion support
  • Keyboard and mouse support

Known Issues and limitations

  • Non-Switch controllers cannot be used to wake the system from sleep.
  • Wii(U) controllers can take a while to pair with the console. For some reason they are only detected at the end of a device discovery cycle. Be patient and re-press the sync button on the controller if neccessary.
  • Xbox One controllers may disconnect and refuse to reconnect after initial pairing. The controller will connect normally after console is restarted.
  • Layout of Xbox One input report appears to have changed at some point. Button mapping may be incorrect on newer controller firmwares. I no longer have access to a controller to test.

Credits

  • switchbrew for the extensive documention of the Switch OS.
  • devkitPro for the homebrew compiler toolchain.
  • SciresM for his dedicated work on the Atmosphère project, libstratosphere and general helpfulness with all things Switch related.
  • Everyone else over at the ReSwitched discord server for answering development related questions and helping with testing.
  • misson20000 for his handy debug monitor Twili and IPC logger Ilia
  • dekuNukem, CTCaer, shinyquagsire23 and others for their work in reversing and documenting the switch controller communication protocol.
  • COVID-19 for giving me the break from social commitments required to finish this project.