
ps5-uart — Updated!
Interfaccia per interagire con PlayStation 5 EMC e EFC
Header a 24 pin vicino a salina (EDM-010)
emc header
1 5v
2 5v
3 gnd
4 gnd
5 emc gpio a1. portato a low al boot dell'emc fa entrare la rom dell'emc nella shell uart @ 460800
6 uart rx emc 115200
7 uart tx emc 115200
8 3v3, va a low quando l'emc si resetta
9 0v?
10 gnd
11 titania uart0 tx (fw efc: 460800, fw eap: 691200)
12 titania uart0 rx (fw efc: 460800, fw eap: 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" (usato solo se devif_det# è attivo))
17 0v?
18 5v?
19 emc gpio a49 (devif_det#)
20 emc gpio a27. interruttore di alimentazione principale
21 dati i2c (i2c_bus_4)
22 clock i2c (i2c_bus_4)
23 gnd
24 emc reset#
i2c_bus_4 contiene principalmente roba per la gestione dell'alimentazione:
(indirizzi a 7bit, 400khz)
1f pca9557_gpioexpander solo CP/dev
2c ad5272_nand nand titania
2e ad5272_g6_2 gddr6
2f ad5272_g6_1 gddr6
51 rt5127_pmic pmic titania
58 ds80pci102_redriver
64 rt5069_pmic pmic salina. in realtà rt5126 (EDM-010) o da9081 (EDM-020) su ps5
emc gpio a 4,5,6,7(cs0:efc),8(cs1:floyd) - bus spi emc-efc (condiviso con floyd)
emc gpio a16 va al pin 13 del rt5126/pin 44 del rt5127. impostato a hi con pg2
emc gpio a29 - efc reset#
emc gpio a30 - bootmode titania (0: nand, 1: uart)
per rimuovere l'handler irq dell'efc dell'emc: emc.fcddr_write(0xa0113200, bytes.fromhex('7047'))
impedisce che eventflg 8 venga inviato al task
il boot uart è su uart1 @ 460800.
comandi noti:
info: stampa "t2.0.100.041\nEC5E98BF84CC.C.1" dall'efc, "t2.0.100.043\nEC5E98BF84CC.C.1" dall'eap
down: entra in xmodem1k/crc
0x03060000 quando hdr.cpu è 0x99
run: (verifica firme/decrittografa?) i dati scaricati e li esegue
0x030B0000 se chiamato senza prima fare down
0x06020000 se vengono passati dati completamente non validi
0x06020001 se hdr.cpu è 4. strano!!
0x010100xx se hdr.cpu non è in (1,2,4). xx è il valore di hdr.cpu (probabilmente codice di errore generico "valore non valido")
i comandi sconosciuti restituiscono 0x030D0000
gli errori vengono registrati nella regione "fw0" della spi della titania
nota: leggere la spi sembra uccidere la rom
emc gpio a31 - selezione cpu titania (0: efc, 1: eap)
emc gpio a38 - irq comando da efc a emc (l'emc attende che venga attivato dopo che l'efc viene rilasciato dal reset)
connessioni rt5126 - rt5127
13 44 (emc gpio a16)
14 45
15 46
codici di errore della rom titania
i codici di errore sulla uart hanno il formato:
bit
31-28 origine-cpu
27-16 errore major
15-0 errore minor
tipicamente la parte minor del codice di errore è il valore incriminato o ad es. il valore del registro da registrare.
codici major
0x001 checksum rom non valida hi (cmd 1)
0x002 checksum rom non valida lo (cmd 1)
0x004 cpu src/dst ipcfifo non valida (lettura)
0x006 cpu src/dst ipcfifo non valida (scrittura)
0x007 indice banco registri ipcfifo non valido
0x008 lunghezza msg ipcfifo troppo grande (lettura)
0x009 lunghezza msg ipcfifo troppo grande (scrittura)
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 atteso ipcfifo 0x55
0x202 comando ipcfifo sconosciuto
0x203 impossibile rispondere al cmd 1 (checksum). può accadere solo se le cpu src/dst non sono valide.
0x204 minor 0: impossibile leggere l'indirizzo di salto. minor 1: impossibile confermare l'indirizzo di salto.
0x205 impossibile confermare il cmd 4, oppure wfi si è svegliato.
0x206 (minor 0) __stack_chk_fail
0x207 (minor 3) __stack_chk_fail
0x30E minor 1: timeout in attesa di scrivere un byte su uart1
codici dalla bootrom
0x101 valore del campo hdr.cpu non valido. minor è il valore incriminato.
0x306 tentativo di "down" di un'immagine con hdr.cpu=0x99 e altri campi non validi
0x30B "run" senza uno stato "down" valido
0x30D comando uart sconosciuto
0x602 errore di verifica dell'immagine. minor 0: efc/eap, minor 1: bcm
routing ipcfifo della rom
la rom usa solo 6 dei banchi ipcfifo (cpu0 <-> altre). il fw ne usa 12 (tutte <-> tutte)
src dst banco
1 1
2 3
3 5
1 0
2 2
3 4
cioè
banco
0 1 -> 0
1 0 -> 1
2 2 -> 0
3 0 -> 2
4 3 -> 0
5 0 -> 3
comandi ipcfifo della rom
le cpu 1-3 gestiscono:
1 verifica-checksum della propria rom
2 imposta SCTLR.V=0 e salta all'indirizzo
4 wfi (il dispatch dei comandi ipcfifo continua a girare se svegliato)
cablaggio pico
pico emc header
1 6
2 7
3 4
4 5
5 24
11 12
12 11
emc reset# viene usato per rilevare la vivacità e resettare l'emc in caso di crash.
Il pulsante sul pico lo resetta in modalità flash.
Nota: se vuoi accedere solo all'EMC, puoi usare i connettori vicino al modulo bt/wifi:

(i riferimenti riguardano il pinout "emc header", sopra)
configurazione pc host
Se l'opzione cmake ENABLE_DEBUG_STDIO è impostata, l'interfaccia cdc 0 sarà occupata da stdout/stdin dell'SDK pico. È standard 115200 baud 8n1. Può essere usata per il debug del fw pcio.
Le altre interfacce sono emc e titania. Le impostazioni della porta uart (line coding cdc) per emc vengono ignorate - il pico configura le uart reali nel modo corretto. Per titania, il baudrate è configurabile dall'host.
Nota:
emc considera \n come fine del comando (configurabile). fa eco dell'input
efc considera \r come fine del comando. fa eco di \r\n per l'input \r
salina (prima interfaccia)
L'interfaccia emc è bufferizzata a linee sul pico. Il pico si occupa dei checksum. Basta inviare normali comandi umcd nella forma <cmd> [args..]\n. Tutti i dati inviati al pc host su questa interfaccia sono incapsulati per rendere più facile scrivere il codice client (vedi Result::to_usb_response).
Attualmente ci sono i seguenti comandi speciali:
| cmd | note |
|---|---|
unlock | esegue l'exploit emc se necessario |
picoreset | resetta il pico in modalità flash |
picoemcreset | resetta l'emc tramite emc reset# |
picoemcrom | resetta l'emc dentro/fuori dalla modalità rom (bootloader uart) e configura il pico come necessario |
picochipconst | installa le costanti da usare per una versione hw dell'emc |
picofwconst | installa costanti/shellcode da usare per una versione fw dell'emc |
titania (seconda interfaccia)
Questa è solo uart grezza, i dati vengono semplicemente passati tra host e titania byte per byte appena disponibili.