-->

2017年4月4日火曜日

NES Classic Editionのコントローラの通信内容解析⑤

ここで、解析されているクラシックコントローラの通信内容についてまとめておきます。
  • コントローラは内部に256Byte(アドレス8bit)のレジスタを持っている
  • コントローラにはI2Cからレジスタにアクセスすることで通信を行う
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のコントローラの通信内容解析⑥