Zurück zu den Updates
UpdatedSep 1, 2026

ps5-uart — Updated!

Schnittstelle für die Interaktion mit PlayStation 5 EMC und EFC

Teilen

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:
emc_header_dupe_near_wifi
(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:

cmdhinweise
unlockführt bei Bedarf den emc-exploit aus
picoresetsetzt den pico in den Flash-Modus zurück
picoemcresetsetzt emc über emc reset# zurück
picoemcromsetzt emc in den/aus dem rom-modus (uart-bootloader) zurück und konfiguriert den pico nach Bedarf
picochipconstinstalliert konstanten für eine emc-hw-version
picofwconstinstalliert 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.

Kategorien