
ps5-uart — Actualizado!
Interfaz para interactuar con EMC y EFC de PlayStation 5
Cabecera de 24 pines cerca de 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 contains mainly power management stuff:
(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 goes to rt5126 pin 13/rt5127 pin 44. set hi with pg2
emc gpio a29 - efc reset#
emc gpio a30 - titania bootmode (0: nand, 1: uart)
to patch out emc's efc irq handler: emc.fcddr_write(0xa0113200, bytes.fromhex('7047'))
prevents eventflg 8 being sent to task
uart boot is on uart1 @ 460800.
known cmds:
info: prints "t2.0.100.041\nEC5E98BF84CC.C.1" from efc, "t2.0.100.043\nEC5E98BF84CC.C.1" from eap
down: enters xmodem1k/crc
0x03060000 when hdr.cpu is 0x99
run: (sigchecks/decrypts?) downloaded data and execs
0x030B0000 if called without doing down first
0x06020000 if passed completely invalid data
0x06020001 if hdr.cpu is 4. weird!!
0x010100xx if hdr.cpu is not in (1,2,4). xx is hdr.cpu value (probably generic "invalid value" errorcode)
unknown cmds return 0x030D0000
errors get logged into "fw0" region of titania spi
note: reading spi seems to kill rom
emc gpio a31 - titania cpu select (0: efc, 1: eap)
emc gpio a38 - efc to emc cmd irq (emc waits for it to be triggered after efc released from reset)
rt5126 - rt5127 connections
13 44 (emc gpio a16)
14 45
15 46
Códigos de error de la ROM de titania
los códigos de error en uart tienen el formato:
bits
31-28 cpu-origin
27-16 error major
15-0 error minor
normalmente la parte minor del código de error es el valor infractor o, p. ej., el valor de registro a registrar.
Códigos major
0x001 invalid rom checksum hi (cmd 1)
0x002 invalid rom checksum lo (cmd 1)
0x004 invalid ipcfifo src/dst cpu (read)
0x006 invalid ipcfifo src/dst cpu (write)
0x007 invalid ipcfifo register bank index
0x008 ipcfifo msg len too large (read)
0x009 ipcfifo msg len too large (write)
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 expected ipcfifo 0x55
0x202 unknown ipcfifo cmd
0x203 failed to reply to cmd 1 (checksum). can only really happen if src/dst cpu are invalid.
0x204 minor 0: failed to read jump address. minor 1: failed to ack jump address.
0x205 failed to ack cmd 4, or wfi woke up.
0x206 (minor 0) __stack_chk_fail
0x207 (minor 3) __stack_chk_fail
0x30E minor 1: timed out waiting to write byte to uart1
códigos de bootrom
0x101 invalid hdr.cpu field value. minor is offending value.
0x306 trying to "down" image with hdr.cpu=0x99 and invalid other fields
0x30B "run" without valid "down" state
0x30D unknown uart command
0x602 image verification failure. minor 0: efc/eap, minor 1: bcm
Enrutamiento de ipcfifo de la ROM
la ROM solo usa 6 de los bancos de ipcfifo (cpu0 <-> otros). el fw usa 12 (todos <-> todos)
src dst bank
1 1
2 3
3 5
1 0
2 2
3 4
es decir
bank
0 1 -> 0
1 0 -> 1
2 2 -> 0
3 0 -> 2
4 3 -> 0
5 0 -> 3
Comandos ipcfifo de la ROM
las cpus 1-3 manejan:
1 checksum-verify own rom
2 set SCTLR.V=0 and jump to address
4 wfi (ipcfifo cmd dispatch keeps running if woken)
Cableado del pico
pico emc header
1 6
2 7
3 4
4 5
5 24
11 12
12 11
emc reset# se usa para detectar actividad y reiniciar emc en caso de bloqueo.
El botón del pico lo reiniciará al modo flash.
Nota: Si solo quieres acceso a EMC, puedes usar los conectores cerca del módulo bt/wifi:

(las marcas se refieren al pinout de "emc header", arriba)
Configuración del PC host
Si la opción de cmake ENABLE_DEBUG_STDIO está activada, la interfaz cdc 0 será tomada por stdout/stdin del pico sdk. Es estándar 115200 baudios 8n1. Se puede usar para depurar el fw de pcio.
Las otras interfaces son emc y titania. Los ajustes del puerto uart (codificación de línea cdc) para emc se ignoran: el pico configura los uarts reales de la manera adecuada. Para titania, la velocidad en baudios es configurable desde el host.
Nota:
emc considera \n como fin de comando (configurable). hace eco de la entrada
efc considera \r como fin de comando. hace eco de \r\n para la entrada \r
salina (primera interfaz)
La interfaz emc está almacenada en búfer de línea en el pico. El pico se encarga de las sumas de comprobación. Solo envía comandos umcd normales en la forma <cmd> [args..]\n. Todos los datos enviados al PC host en esta interfaz están enmarcados para facilitar la escritura de código de cliente (ver Result::to_usb_response).
Actualmente existen los siguientes comandos especiales:
| cmd | notas |
|---|---|
unlock | realiza el exploit de emc si es necesario |
picoreset | reinicia el pico al modo flash |
picoemcreset | reinicia emc mediante emc reset# |
picoemcrom | reinicia emc dentro/fuera del modo rom (cargador de arranque uart) y configura el pico según sea necesario |
picochipconst | instala constantes para usar con una versión de hardware de emc |
picofwconst | instala constantes/shellcode para usar con una versión de fw de emc |
titania (segunda interfaz)
Esto es solo uart crudo; los datos simplemente se pasan entre el host y titania byte a byte según estén disponibles.