Torna agli aggiornamenti
UpdatedSep 1, 2026

ps5-uart — Updated!

Interfaccia per interagire con PlayStation 5 EMC e EFC

Condividi

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:
emc_header_dupe_near_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:

cmdnote
unlockesegue l'exploit emc se necessario
picoresetresetta il pico in modalità flash
picoemcresetresetta l'emc tramite emc reset#
picoemcromresetta l'emc dentro/fuori dalla modalità rom (bootloader uart) e configura il pico come necessario
picochipconstinstalla le costanti da usare per una versione hw dell'emc
picofwconstinstalla 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.

Categorie