- コントローラは内部に256Byte(アドレス8bit)のレジスタを持っている
- コントローラにはI2Cからレジスタにアクセスすることで通信を行う
- ライト動作
0xA4 "レジスタアドレス" "データ0" "データ1" …
"0xA4"はデバイスアドレス"0x52"+ ライトビット"0"です。この次にライトするレジスタアドレスを指定する。次にライトするデータを指定、データが連続したときにはレジスタアドレスをインクリメントしながらライトしていきます。 - リード動作
0xA4 "レジスタアドレス"
0xA5 "データ0" "データ1" …
最初にライト動作でリードしたいレジスタアドレスを指定して一旦通信を終わります。次にリード動作をするのですが、最初の"0xA5"はデバイスアドレス"0x52"+ リードビット"1"です。次にコントローラ側からリード対象のレジスタアドレスのデータを読み出すのですが、ライト動作と同じく、データが連続したときはレジスタアドレスをインクリメントしながらリードされます。連続リードはリードしている側のNACKによって止められます。
- 0xFA-0xFF(6Byte)
デバイス識別子。自分がどのデバイスかを格納している。例えば、"0100A4200101"ならクラシックコントローラPROというような感じ。 - 0x20-0x2F(16Byte)
キャリブレーションデータらしい、何のかは知らない。 - 0x30-0x3F(16Byte)
0x20-0x2Fのデータのコピーらしい、なぜコピーしているかは知らない。 - 0xF0(1Byte)
暗号化のON/OFFに関係しているレジスタ。0xAAを書き込むと暗号化ONで、0x55を書き込むと暗号化OFFらしい。 - 0x00-0x05(6Byte)
コントローラのボタン状態。何のボタンを押しているか、スティックの状態がどうかを格納している。 - 0x06-0x07(2Byte)
「NES Classic Edition」のコントローラのボタン状態が格納されているっぽい。暗号化OFFのときに有効?
Wiimote/Extension Controllers - WiiBrew
Wiimote/Extension Controllers/Classic Controller - WiiBrew
-> WiiBrewというサイトに詳しいことがまとまっています
WiiLi.org Wii Linux - Wiimote/Extension Controllers/Classic Controller
-> WiiLiというサイトもあったようですが、今はなくなっているようなのでアーカイブサイトのリンクです
次 → NES Classic Editionのコントローラの通信内容解析⑥