PS4 背面ボタンアタッチメントのプロトコル(詳細)

■I2C
きわめて普通のI2Cアクセス。
初期ネゴシエーションに使うスレーブアドレスは0x50。
実際にキースキャンに使うスレーブアドレスはデフォルトでは0x30。ただし、ネゴシエーション時に変更できる。8~0x77が使えるようだ。

・I2Cによる1byteライトでワードアドレス確定。2byte以上のライトは行わない。
・I2Cによるリードで、設定したワードアドレスのデータを読み出し。任意長。

■初期シーケンス(スレーブアドレス0x50)
(1)ワードアドレス0x00ライト→リード4byte(04 00 00 00)。恐らく見ていない。
(2)ワードアドレス0x04ライト→リード0x28byte(01 00 00 12 EF CD AB 0B 0C 0D・・・29 2A 2B)。恐らく見ていない。
(3)ワードアドレス0x40ライト→リード1byte(00)。恐らく見ていない。

(4)スキャン情報テーブルリードループ
スキャン情報テーブルは、ワードアドレス0xA0から
・データtype(1byte)
・追加データ(任意長、最大3byte)
が連続で並んでいる。
ワードアドレス0xA0ライト→リード1byte(データtype)→ワードアドレス0xA1ライト→リード任意byte(追加data)、
ワードアドレス0xA0+nライト→リード1byte(データtype)→以下繰り返し。
データtype0で初期シーケンス終了。キースキャンに移行する。

テーブルタイプと追加データは下記の通り
※必要な物のみ設定する。
typedata1data2data3コメント
00-スキャン情報テーブル終了
01mask1mask2-ボタンマスク情報。type02(mask1)とtype03(mask2)で指定したキースキャンを行うとき、
リザルトデータの特定bitをマスクする。マスク情報のbitが立っているボタンは無視する
02slave ADRword adr-キースキャンをするスレーブアドレスとワードアドレスを指定する。
03slave ADRword adr-キースキャンをするスレーブアドレスとワードアドレスを指定する。
04enable-アナログスティックのスキャンを有効にする。enableが01 or 02で有効。
05slave ADRword adr-L stick X値を取得するスレーブアドレスとワードアドレスを指定する。
06slave ADRword adr-L stick Y値を取得するスレーブアドレスとワードアドレスを指定する。
07slave ADRword adr-R stick X値を取得するスレーブアドレスとワードアドレスを指定する。
08slave ADRword adr-R stick Y値を取得するスレーブアドレスとワードアドレスを指定する。
09enable-アナログトリガのスキャンを有効にする。enableが01 or 02で有効。背面ボタンアタッチメントでは02で使用。
0Aslave ADRword adr-L2 analog値を取得するスレーブアドレスとワードアドレスを指定する。
0Bslave ADRword adr-R2 analog値を取得するスレーブアドレスとワードアドレスを指定する。
0Cslave ADRword adr-HID report(25)の値を取得するスレーブアドレスとワードアドレスを指定する。
0Dslave ADRword adr-HID report(26)の値を取得するスレーブアドレスとワードアドレスを指定する。
0Eslave ADRword adr-HID report(27)の値を取得するスレーブアドレスとワードアドレスを指定する。
0Fslave ADRword adr-HID report(28)の値を取得するスレーブアドレスとワードアドレスを指定する。
10slave ADRword adr-HID report(29)の値を取得するスレーブアドレスとワードアドレスを指定する。
11slave ADRword adr-アドレスを指定するとスキャンする。HID reportのどこにも反映されていないと思われる。
12slave ADRword adr-アドレスを指定するとスキャンする。HID reportのどこにも反映されていないと思われる。
13slave ADRword adr-アドレスを指定するとスキャンする。HID reportのどこにも反映されていないと思われる。
14????-データ長は2byte。用途不明。アドレスではない。
15????-
16????-
17????-
18????-
19????-
1A????-
1B????-
1Cslave ADRword adrbitこのtypeを設定すると、HID report(31)のbit0が常に1になる。また、スキャンしたデータのうち、
bitで指定したbitをHID report(31)のbit1に反映する。
※type 1D以降を設定すると、その時点でテーブル解析が終わり、ネゴシエーション失敗する。

HID report(25)~(29)は実際に何に使われているか不明。

■キースキャン
スキャン情報テーブルで設定したスレーブに対し、ワードアドレスライトとリード(1byte)が行われる。
アナログ値については、リードしたデータがそのままHID reportに乗る。
ボタンの対応は下記の通り。
typeDATADATAのbitアサイン
76543210
0200optR3L3share
0300×R1L1R2L2

■補足
・アナログ値は、EXT端子経由で与えた値と、実際のコントローラの値の(振れ幅の絶対値で)大きい方を採用する。

(例)アナログスティックLX
  EXT端子からで与えたLX値=127
  実際のDS4のLX値=125
レポートされる値=125

つまり、EXT端子でLX値=128と与えても、DS4のスティックが正確に真ん中に戻っていない限り、レポート値は128にならない。
よって、DIVAの専コンモードは作れないorz

・タッチパネル部の制御はできなそう
・加速度、傾きセンサーの制御もできなそう
→もしかしたら不明箇所が解析できれば可能なのかも・・・?

■戯言
というわけで、DIVAの専コンモードの再現は(たぶん)できないという結論になってしまった。
ただ、通常の用途であれば問題無い仕様なので、自作アケコンなどを作るときには十分に活用可能かと。
問題はEXTオスコネクタの入手性。昔のMDウォークマンとかのリモコンと同じかなと思ったらちょっと小さいんですねこれ。
1.5mmピッチの1.6tだと思うので、基板起こせば作れそうな気もしますがどうなんでしょうね。

■参考
・HID report
https://www.psdevwiki.com/ps4/DS4-USB
のReport StructureのData Formatを参照。

もどる

質問はtwitter:@r_y_u_nへどうぞ。