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

■端子
端子はどこが1番かわからないので番号の振り方は適当です。
赤が表面(DS4に差したときに背面)、青が裏面(DS4に差したときにDS4のボタン面)です。



クリックで拡大

1GND
2GND
3Detect
4SCL
5NC
6SDA
7NC
8VDD
FPCではなくDS4との接続端子のピンアサインです。
7番ピンはDS4内の配線が太いので充電用かと思われます。

■プロトコル概要
DualShock4は、3pinがGNDに落とされたのを検出して、VDDを供給開始します。
VDDは約160ms間供給します。その間にI2Cでネゴシエーションを完了させる必要があります。
160msの間にネゴシエーションに失敗した場合、7.5ms間VDDの供給を停止し、再度ネゴシエーションを行います。
この動作を6回繰り返し、ネゴシエーションできなかった場合、一旦3pinを開放するまでVDDの供給と停止します。
I2CのアクセスのマスターはDualShock4です。

ネゴ~キースキャンのI2Cのキャプチャファイル
※ZEROPLUS Logic Cube用

・接続時のネゴシーケンス
ADRDATA
50(W)00
50(R)04000000
50(W)04
50(R)01000012EFCDAB0B0C0D…(連番)…292A2B
50(W)50
50(R)00
少し間が空く
50(W)A0
50(R)01
50(W)A1
50(R)0000
50(W)A3
50(R)02
50(W)A4
50(R)3020
50(W)A6
50(R)03
50(W)A7
50(R)301D
50(W)A9
50(R)09
50(W)AA
50(R)02
50(W)AB
50(R)0A
50(W)AC
50(R)301F
50(W)AE
50(R)0B
50(W)AF
50(R)3018
50(W)B1
50(R)10
50(W)B2
50(R)301C
50(W)B4
50(R)00
ネゴシーケンス完了後、キースキャンが定期的に行われます。

・キースキャンプロトコル
ADRDATADATAのbitアサイン
76543210
30(W)20
30(R)00optR3L3share
30(W)1D
30(R)00×R1L1R2L2
30(W)1F
30(R)00L2 analog
30(W)18
30(R)00R2 analog
30(W)1C
30(R)00?
30(W)1Dの応答のR2/L2はデジタル値。USBのデジタルボタン情報にのみ乗る。
アナログ値0かつデジタル値ONという状態が作れる。
30(W)1Fと30(W)18の応答のアナログ値が0以外の場合、30(W)1Dの値によらず強制的にデジタルも押されている状態になる。

■互換機
arduino UNO用スケッチと修正ライブラリ
使い方はソースを見て察して

■より詳しいプロトコル説明
ここ
もどる

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