
ps5-uart — Updated!
Schnittstelle für die Interaktion mit PlayStation 5 EMC und EFC
24-Pin-Header bei Salina (EDM-010)
emc header
1 5v
2 5v
3 gnd
4 gnd
5 emc gpio a1. pulling low at emc boot causes emc rom to enter uart shell @ 460800
6 uart rx emc 115200
7 uart tx emc 115200
8 3v3, goes low when emc resets
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" (only used if devif_det# active))
17 0v?
18 5v?
19 emc gpio a49 (devif_det#)
20 emc gpio a27. main power switch
21 i2c data (i2c_bus_4)
22 i2c clock (i2c_bus_4)
23 gnd
24 emc reset#
i2c_bus_4 enthält hauptsächlich Power-Management-Kram:
(7bit addrs, 400khz)
1f pca9557_gpioexpander CP/dev only
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. actually rt5126 (EDM-010) or da9081 (EDM-020) on ps5
emc gpio a 4,5,6,7(cs0:efc),8(cs1:floyd) - emc-efc spi bus (shared with floyd)
emc gpio a16 geht an rt5126 pin 13/rt5127 pin 44. set hi with pg2
emc gpio a29 - efc reset#
emc gpio a30 - titania bootmode (0: nand, 1: uart)
um emc's efc-irq-handler zu patchen: emc.fcddr_write(0xa0113200, bytes.fromhex('7047'))
verhindert, dass eventflg 8 an die task gesendet wird
uart boot läuft auf uart1 @ 460800.
bekannte cmds:
info: gibt "t2.0.100.041\nEC5E98BF84CC.C.1" von efc aus, "t2.0.100.043\nEC5E98BF84CC.C.1" von eap
down: startet xmodem1k/crc
0x03060000 wenn hdr.cpu 0x99 ist
run: (signaturprüft/entschlüsselt?) heruntergeladene daten und führt sie aus
0x030B0000 wenn aufgerufen ohne vorher down auszuführen
0x06020000 wenn komplett ungültige daten übergeben werden
0x06020001 wenn hdr.cpu 4 ist. komisch!!
0x010100xx wenn hdr.cpu nicht in (1,2,4) ist. xx ist der hdr.cpu-wert (wahrscheinlich generischer "ungültiger wert"-fehlercode)
unbekannte cmds geben 0x030D0000 zurück
fehler werden in der "fw0"-region des titania spi protokolliert
hinweis: das lesen von spi scheint den rom zu killen
emc gpio a31 - titania cpu select (0: efc, 1: eap)
emc gpio a38 - efc zu emc cmd irq (emc wartet darauf, dass es ausgelöst wird, nachdem efc aus dem reset entlassen wurde)
rt5126 - rt5127 verbindungen
13 44 (emc gpio a16)
14 45
15 46
titania rom fehlercodes
die fehlercodes auf uart haben das format:
bits
31-28 cpu-origin
27-16 error major
15-0 error minor
typischerweise ist der minor-teil des fehlercodes der fehlerhafte wert oder z. b. der registerwert, der protokolliert werden soll.
major codes
0x001 ungültige rom-checksumme hi (cmd 1)
0x002 ungültige rom-checksumme lo (cmd 1)
0x004 ungültige ipcfifo src/dst cpu (lesen)
0x006 ungültige ipcfifo src/dst cpu (schreiben)
0x007 ungültiger ipcfifo-registerbank-index
0x008 ipcfifo msg len zu groß (lesen)
0x009 ipcfifo msg len zu groß (schreiben)
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 erwartet
0x202 unbekannter ipcfifo cmd
0x203 antwort auf cmd 1 (checksumme) fehlgeschlagen. kann eigentlich nur passieren, wenn src/dst cpu ungültig sind.
0x204 minor 0: lesen der sprungadresse fehlgeschlagen. minor 1: bestätigung der sprungadresse fehlgeschlagen.
0x205 bestätigung von cmd 4 fehlgeschlagen, oder wfi wurde aufgeweckt.
0x206 (minor 0) __stack_chk_fail
0x207 (minor 3) __stack_chk_fail
0x30E minor 1: timeout beim schreiben eines bytes an uart1
codes vom bootrom
0x101 ungültiger hdr.cpu-feldwert. minor ist der fehlerhafte wert.
0x306 versuch, ein image mit hdr.cpu=0x99 und ungültigen anderen feldern zu "downen"
0x30B "run" ohne gültigen "down"-zustand
0x30D unbekannter uart-befehl
0x602 bildverifizierungsfehler. minor 0: efc/eap, minor 1: bcm
rom ipcfifo routing
der rom verwendet nur 6 der ipcfifo-banken (cpu0 <-> andere). fw verwendet 12 (alle <-> alle)
src dst bank
1 1
2 3
3 5
1 0
2 2
3 4
d. h.
bank
0 1 -> 0
1 0 -> 1
2 2 -> 0
3 0 -> 2
4 3 -> 0
5 0 -> 3
rom ipcfifo cmds
cpus 1-3 behandeln:
1 checksum-verify own rom
2 set SCTLR.V=0 and jump to address
4 wfi (ipcfifo cmd dispatch keeps running if woken)
pico verdrahtung
pico emc header
1 6
2 7
3 4
4 5
5 24
11 12
12 11
emc reset# wird verwendet, um die Lebendigkeit zu erkennen und emc bei einem Absturz zurückzusetzen.
Der Knopf auf dem pico setzt ihn in den Flash-Modus zurück.
Hinweis: Wenn du nur Zugriff auf EMC möchtest, kannst du die Anschlüsse in der Nähe des bt/wifi-moduls verwenden:

(die Markierungen beziehen sich auf das "emc header"-Pinout, oben)
host pc einrichtung
Wenn die cmake-Option ENABLE_DEBUG_STDIO gesetzt ist, wird cdc-interface 0 von pico-sdk stdout/stdin belegt. Es ist standardmäßig 115200 baud 8n1. Kann zum Debuggen der pico-fw verwendet werden.
Die anderen Interfaces sind emc und titania. Die uart-porteinstellungen (cdc line coding) für emc werden ignoriert – der pico richtet die tatsächlichen uarts ordnungsgemäß ein. Für titania ist die baudrate vom host aus konfigurierbar.
Hinweis:
emc betrachtet \n als Ende eines cmds (konfigurierbar). gibt Eingaben zurück
efc betrachtet \r als Ende eines cmds. gibt \r\n für Eingabe \r zurück
salina (erstes interface)
Das emc-interface ist auf dem pico zeilenweise gepuffert. Der pico kümmert sich um die checksummen. Sende einfach normale umcd-cmds in der Form <cmd> [args..]\n. Alle daten, die auf diesem interface an den host-pc gesendet werden, sind so gerahmt, dass das Schreiben von Client-Code einfacher wird (siehe Result::to_usb_response).
Es gibt derzeit die folgenden speziellen cmds:
| cmd | hinweise |
|---|---|
unlock | führt bei Bedarf den emc-exploit aus |
picoreset | setzt den pico in den Flash-Modus zurück |
picoemcreset | setzt emc über emc reset# zurück |
picoemcrom | setzt emc in den/aus dem rom-modus (uart-bootloader) zurück und konfiguriert den pico nach Bedarf |
picochipconst | installiert konstanten für eine emc-hw-version |
picofwconst | installiert konstanten/shellcode für eine emc-fw-version |
titania (zweites interface)
Dies ist nur roher uart, daten werden einfach byteweise zwischen host und titania durchgereicht, sobald verfügbar.