Nintendo Switchと専用コントローラーのJoy-ConをリバースエンジニアリングしたdekuNukemさんが、その成果をオープンソースのプロジェクト共有サイトであるGitHub上で公開しています。

GitHub - dekuNukem/Nintendo_Switch_Reverse_Engineering: A look at inner workings of Joycon and Nintendo Switch

https://github.com/dekuNukem/Nintendo_Switch_Reverse_Engineering

GitHub上で公開されている情報はNintendo Switchをバラバラに分解した「あと」の情報。先に以下のiFixitによるNintendo Switchをバラバラに分解する工程をチェックしておくと、どこの何のパーツについて述べているのかがわかりやすくなります。

Nintendo Switchをバラバラに分解、修理が容易で長く使えるように設計されていると判明 - GIGAZINE



以下のマザーボードは左のJoy-Con内のもの。Joy-Conは1.8Vで動作。内蔵キーパッドスキャナ「BCM20734」は、動作クロック128KHzでボタンの読み取りを行います。これはTASやTwitchでのプレイにJoy-Conが向いていないことを示すものですが、「プロコンは恐らく異なるので、(TASやTwitchでのプレイを行う場合は)購入する必要がある」とのこと。なお、キーパッド以外のボタンとしてジョイスティックボタンがあり、これは押し込むことで動作します。



バスには、4Mbの「MX25U4033E」フラッシュメモリと、6軸MEMS加速度計とジャイロスコープの「LSM6DS3」という2つのSPIデバイスがあります。Joy-Conのバッテリーが接続された瞬間に以下のSPIラインが流れ、Nintendo Switch本体とつながります。フラッシュメモリにアクセスするとSCKは12.5MHzで動作しますが、MEMSチップにアクセスすると6.25MHzに切り替わるとのこと。



SPIデバイスが接続されると、マイクロコントローラーはMEMSチップのソフトウェアをリセットし、加速度計とジャイロスコープを以下のように設定します。

・加速度計

ODR:1.66KHz

フルスケール:±8g

・ジャイロスコープ

ODR:208Hz

フルスケール:2000dps

加速度計は、ローパスフィルターが有効になった100Hz帯域幅のAAフィルターと、カットオフ周波数が416Hzに設定されたスロープフィルターを持っています。Joy-Conは加速度計とジャイロスコープの両方のデータに対し、1.35ms(740Hz)ごとに全軸でポーリングします。Joy-Conは1.35msごとにMEMSデータをポーリングしますが、15msごとにコントローラーのアップデートを送信するだけなので、データをスムーズにするために内部で平均化が行われているかもしれないとのこと。

Joy-Conを本体に接続すると、Joy-ConはBluetoothの代わりに物理的な接続端子を介して本体と通信するようになります。この物理的な接続端子には10個のピンがあります。



接続端子部分を取り出すとこう。左右のJoy-Conを向かい合わせにすると、左端がPIN1で右端がPIN10となります。



Joy-Conの各コマンドの最後の数バイトは何らかのチェックサムになっている模様。コンソールが間違ったチェックサムを持つコマンドを受け付けないようにし、各コマンドの動作をテストすることが難しくもなるそうです。

チェックサムの一例は以下の通り。

19 01 03 07 00 91 10 00 00 00 00 3D

19 01 03 07 00 91 01 00 00 00 00 24

19 01 03 07 00 91 11 00 00 00 00 0E

19 81 03 07 00 94 10 00 00 00 00 D6

19 81 03 07 00 94 11 00 00 0F 00 33


通常の操作では、Nintendo Switch本体はJoy-Conに15msごとに更新を要求します。更新を要求するコマンドは以下の通り。

19 01 03 08 00 92 00 01 00 00 69 2d 1f


その約4ms後、Joy-Conは61バイトの長さの応答をします。応答の例は以下の通り。

19 81 03 38

00 92 00 31

00 00 e9 2e

30 7f 40 00

00 00 65 f7

81 00 00 00

c0 23 01 e2

ff 3e 10 0a

00 d6 ff d0

ff 23 01 e1

ff 37 10 0a

00 d6 ff cf

ff 29 01 dd

ff 34 10 0a

00 d7 ff ce

ff


ここから、各バイトが何を示すのかを推測したのが以下の図



さらに、16番目と17番目のバイトはボタンの状態を表すそうで、ボタンを押すと対応するビットが1に設定されます。



ジョイスティックに関する値は19番目と20番目のバイトに含まれており、生の8ビットADCデータとして送られます。19番目のバイトがX軸、20番目のバイトがY軸の値を示しており、X軸に関する情報の4bit分は奇妙なことに反転した状態で送られます。

その他のバイトにどのような情報が含まれているのかは、現在デコード中とのこと。ただし、バッテリーレベルやボタンの状態、ジョイスティックの位置、加速度計とジャイロスコープのデータなどが含まれているとみられています。

Nintendo Switchのタッチスクリーンを制御するタッチスクリーンコントローラーには、FT9CJの容量性タッチスクリーンコントローラーが採用されています。Tech Insightsによると、このタッチスクリーンコントローラーはSTMicroelectronics製のNintendo Switch用にカスタムされた部品だそうです。なお、更新のため4msごとにポーリングされているとのこと。



Nintendo Switchの専用ドックは「STM32F048」というマイクロコントローラーを使っています。マザーボードには「STM32F048」というラベルが貼ってあり、これはFASTROMオプションを使用してSTがファクトリー内のフラッシュメモリにプリプログラムするためのものだそうです。なお、専用ドックは32KBのフラッシュメモリと6KBのRAM(メモリ)を備えており、48MHzで動作します。



他にもJoy-Conにある各コネクタピンの詳細な役割や、Joy-Conのレスポンスの差を詳細に検証したデータなども公開されています。

GitHub - dekuNukem/Nintendo_Switch_Reverse_Engineering: A look at inner workings of Joycon and Nintendo Switch