
ps5-uart — Updated!
PlayStation 5 の EMC および EFC と対話するためのインターフェース
サリナ近くの24ピンヘッダー (EDM-010)
emc header
1 5v
2 5v
3 gnd
4 gnd
5 emc gpio a1. emc起動時にlowにするとemc romが460800でuartシェルに入る
6 uart rx emc 115200
7 uart tx emc 115200
8 3v3, emcがリセットされるとlowになる
9 0v?
10 gnd
11 titania uart0 tx (efc fw: 460800, eap fw: 691200)
12 titania uart0 rx (efc fw: 460800, eap fw: 691200)
13 titania uart1 rx (bootrom: 460800, apu: 230400)
14 titania uart1 tx (bootrom: 460800, apu: 230400)
15 gnd
16 emc gpio c5 ("GPI SW" (devif_det#がアクティブな場合のみ使用))
17 0v?
18 5v?
19 emc gpio a49 (devif_det#)
20 emc gpio a27. メイン電源スイッチ
21 i2c data (i2c_bus_4)
22 i2c clock (i2c_bus_4)
23 gnd
24 emc reset#
i2c_bus_4には主に電源管理関連のものが含まれる:
(7bitアドレス, 400khz)
1f pca9557_gpioexpander CP/devのみ
2c ad5272_nand titania nand
2e ad5272_g6_2 gddr6
2f ad5272_g6_1 gddr6
51 rt5127_pmic titania pmic
58 ds80pci102_redriver
64 rt5069_pmic salina pmic. 実際はps5ではrt5126 (EDM-010) または da9081 (EDM-020)
emc gpio a 4,5,6,7(cs0:efc),8(cs1:floyd) - emc-efc spiバス (floydと共有)
emc gpio a16 は rt5126 ピン13/rt5127 ピン44 に接続。pg2でhiに設定
emc gpio a29 - efc reset#
emc gpio a30 - titania bootmode (0: nand, 1: uart)
emcのefc irqハンドラをパッチで無効化するには: emc.fcddr_write(0xa0113200, bytes.fromhex('7047'))
eventflg 8 がタスクに送信されるのを防ぐ
uart boot は uart1 @ 460800 を使用。
既知のコマンド:
info: efcから "t2.0.100.041\nEC5E98BF84CC.C.1" を出力、eapから "t2.0.100.043\nEC5E98BF84CC.C.1" を出力
down: xmodem1k/crc を開始
hdr.cpu が 0x99 の場合 0x03060000
run: ダウンロードしたデータを(署名検証/復号化?)して実行
downを先に実行せずに呼び出した場合 0x030B0000
完全に無効なデータを渡した場合 0x06020000
hdr.cpu が 4 の場合 0x06020001。変だ!!
hdr.cpu が (1,2,4) 以外の場合 0x010100xx。xx は hdr.cpu の値 (おそらく一般的な「無効な値」エラーコード)
不明なコマンドは 0x030D0000 を返す
エラーは titania spi の "fw0" 領域に記録される
注: spiの読み取りはromを壊すようです
emc gpio a31 - titania cpu select (0: efc, 1: eap)
emc gpio a38 - efcからemcへのcmd irq (emcはefcがリセットから解放された後にトリガーされるのを待つ)
rt5126 - rt5127 接続
13 44 (emc gpio a16)
14 45
15 46
titania rom エラーコード
uart上のエラーコードの形式:
bits
31-28 cpu-origin
27-16 error major
15-0 error minor
通常、エラーコードのminor部分は問題の値や、記録するレジスタ値など。
majorコード
0x001 無効なrom checksum hi (cmd 1)
0x002 無効なrom checksum lo (cmd 1)
0x004 無効なipcfifo src/dst cpu (読み取り)
0x006 無効なipcfifo src/dst cpu (書き込み)
0x007 無効なipcfifoレジスタバンクインデックス
0x008 ipcfifoメッセージ長が大きすぎる (読み取り)
0x009 ipcfifoメッセージ長が大きすぎる (書き込み)
0x011 DFSR
0x012 IFSR
0x013 ADFSR hi
0x014 ADFSR lo
0x015 AIFSR hi
0x016 AIFSR lo
0x017 DFAR hi
0x018 DFAR lo
0x019 IFAR hi
0x01a IFAR lo
0x201 ipcfifo 0x55 を期待
0x202 不明なipcfifoコマンド
0x203 cmd 1 (checksum) への応答に失敗。src/dst cpuが無効な場合にのみ発生し得る。
0x204 minor 0: ジャンプアドレスの読み取りに失敗。minor 1: ジャンプアドレスの応答に失敗。
0x205 cmd 4 の応答に失敗、またはwfiが起床した。
0x206 (minor 0) __stack_chk_fail
0x207 (minor 3) __stack_chk_fail
0x30E minor 1: uart1へのバイト書き込み待機がタイムアウト
bootromからのコード
0x101 無効なhdr.cpuフィールド値。minorは問題の値。
0x306 hdr.cpu=0x99 で他のフィールドが無効なイメージを "down" しようとした
0x30B 有効な "down" 状態なしで "run" を実行
0x30D 不明なuartコマンド
0x602 イメージ検証失敗。minor 0: efc/eap, minor 1: bcm
rom ipcfifo ルーティング
romはipcfifoバンクのうち6つのみを使用 (cpu0 <-> 他)。fwは12すべてを使用 (全 <-> 全)
src dst bank
1 1
2 3
3 5
1 0
2 2
3 4
つまり
bank
0 1 -> 0
1 0 -> 1
2 2 -> 0
3 0 -> 2
4 3 -> 0
5 0 -> 3
rom ipcfifo コマンド
cpu 1-3 が処理:
1 自身のromのchecksum検証
2 SCTLR.V=0 を設定してアドレスにジャンプ
4 wfi (起床してもipcfifoコマンドディスパッチは実行され続ける)
pico 配線
pico emc header
1 6
2 7
3 4
4 5
5 24
11 12
12 11
emc reset# は生存確認と、クラッシュ時のemcリセットに使用される。
picoのボタンでフラッシュモードにリセットされる。
注: EMCのみにアクセスしたい場合は、bt/wifiモジュール近くのコネクタを使用できる:

(マーキングは上記の "emc header" ピン配置に対応)
ホストPCのセットアップ
ENABLE_DEBUG_STDIO cmakeオプションが設定されている場合、cdcインターフェース0はpico sdkのstdout/stdinに使用される。標準の115200ボー 8n1。pico fwのデバッグに使用できる。
他のインターフェースはemcとtitania。emcのuartポート設定 (cdc line coding) は無視される - picoが実際のuartを適切な方法で設定する。titaniaの場合、ボーレートはホストから設定可能。
注:
emcは \n をコマンドの終端とみなす (設定可能)。入力をエコーする
efcは \r をコマンドの終端とみなす。入力 \r に対して \r\n をエコーする
salina (最初のインターフェース)
emcインターフェースはpico上でラインバッファリングされる。picoがchecksumを処理する。通常のumcdコマンドを <cmd> [args..]\n の形式で送信するだけ。このインターフェースでホストPCに送信されるすべてのデータは、クライアントコードを書きやすくするためにフレーム化される (Result::to_usb_response を参照)。
現在、以下の特別なコマンドがある:
| cmd | notes |
|---|---|
unlock | 必要に応じてemcエクスプロイトを実行 |
picoreset | picoをフラッシュモードにリセット |
picoemcreset | emc reset# でemcをリセット |
picoemcrom | emcをrom (uartブートローダー) モードに/からリセットし、必要に応じてpicoを設定 |
picochipconst | emc hwバージョン用の定数をインストール |
picofwconst | emc fwバージョン用の定数/シェルコードをインストール |
titania (2番目のインターフェース)
これは単なる生のuartで、データはホストとtitaniaの間で利用可能な限りバイト単位でそのまま転送される。