Retour aux mises à jour
UpdatedSep 1, 2026

ps5-uart — Mis à jour !

Interface pour interagir avec PlayStation 5 EMC et EFC

Partager

Connecteur 24 broches près de salina (EDM-010)

emc header
 1  5v
 2  5v
 3  gnd
 4  gnd
 5  emc gpio a1. tirer à 0 au boot emc fait entrer la rom emc dans le shell uart @ 460800
 6  uart rx emc 115200
 7  uart tx emc 115200
 8  3v3, passe à 0 quand emc se réinitialise
 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" (utilisé uniquement si devif_det# est actif))
17  0v ?
18  5v ?
19  emc gpio a49 (devif_det#)
20  emc gpio a27. interrupteur d'alimentation principal
21  i2c data (i2c_bus_4)
22  i2c clock (i2c_bus_4)
23  gnd
24  emc reset#

i2c_bus_4 contient principalement des éléments de gestion d'alimentation :
(adresses 7 bits, 400 khz)
1f      pca9557_gpioexpander    CP/dev uniquement
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. en fait rt5126 (EDM-010) ou da9081 (EDM-020) sur ps5

emc gpio a 4,5,6,7(cs0:efc),8(cs1:floyd) - bus spi emc-efc (partagé avec floyd)

emc gpio a16 va vers la broche 13 du rt5126 / broche 44 du rt5127. mettre à 1 avec pg2

emc gpio a29 - efc reset#
emc gpio a30 - mode de boot titania (0 : nand, 1 : uart)
    pour patcher le handler d'irq efc d'emc : emc.fcddr_write(0xa0113200, bytes.fromhex('7047'))
        empêche l'envoi de eventflg 8 à la tâche
    le boot uart se fait sur uart1 @ 460800.
    commandes connues :
        info : affiche "t2.0.100.041\nEC5E98BF84CC.C.1" depuis efc, "t2.0.100.043\nEC5E98BF84CC.C.1" depuis eap
        down : entre en xmodem1k/crc
            0x03060000 quand hdr.cpu est 0x99
        run : (vérifie les signatures/déchiffre ?) les données téléchargées et les exécute
            0x030B0000 si appelé sans avoir fait down d'abord
            0x06020000 si des données totalement invalides sont passées
            0x06020001 si hdr.cpu est 4. bizarre !!
            0x010100xx si hdr.cpu n'est pas dans (1,2,4). xx est la valeur de hdr.cpu (probablement un code d'erreur générique "valeur invalide")
    les commandes inconnues renvoient 0x030D0000
    les erreurs sont journalisées dans la région "fw0" du spi titania
        note : la lecture du spi semble tuer la rom
emc gpio a31 - sélection cpu titania (0 : efc, 1 : eap)
emc gpio a38 - irq cmd d'efc vers emc (emc attend son déclenchement après la libération d'efc du reset)

connexions rt5126 - rt5127
13      44  (emc gpio a16)
14      45
15      46

codes d'erreur de la rom titania

les codes d'erreur sur uart ont le format :

bits
31-28       cpu d'origine
27-16       erreur majeure
15-0        erreur mineure

généralement, la partie mineure du code d'erreur est la valeur fautive ou par ex. la valeur de registre à journaliser.

codes majeurs

0x001   somme de contrôle rom invalide hi (cmd 1)
0x002   somme de contrôle rom invalide lo (cmd 1)
0x004   cpu src/dst ipcfifo invalide (lecture)
0x006   cpu src/dst ipcfifo invalide (écriture)
0x007   index de banque de registres ipcfifo invalide
0x008   longueur de msg ipcfifo trop grande (lecture)
0x009   longueur de msg ipcfifo trop grande (écriture)
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 attendu
0x202   cmd ipcfifo inconnue
0x203   échec de réponse à la cmd 1 (somme de contrôle). ne peut vraiment arriver que si les cpu src/dst sont invalides.
0x204   mineur 0 : échec de lecture de l'adresse de saut. mineur 1 : échec d'accusé de réception de l'adresse de saut.
0x205   échec d'accusé de réception de la cmd 4, ou wfi s'est réveillé.
0x206   (mineur 0) __stack_chk_fail
0x207   (mineur 3) __stack_chk_fail
0x30E   mineur 1 : délai dépassé en attendant d'écrire un octet sur uart1

codes du bootrom

0x101   valeur du champ hdr.cpu invalide. le mineur est la valeur fautive.
0x306   tentative de "down" d'une image avec hdr.cpu=0x99 et d'autres champs invalides
0x30B   "run" sans état "down" valide
0x30D   commande uart inconnue
0x602   échec de vérification d'image. mineur 0 : efc/eap, mineur 1 : bcm

routage ipcfifo de la rom

la rom n'utilise que 6 des banques ipcfifo (cpu0 <-> autres). le fw en utilise 12 (tous <-> tous)

src dst banque
    1   1
    2   3
    3   5
1       0
2       2
3       4

c.-à-d.

banque
0       1 -> 0
1       0 -> 1
2       2 -> 0
3       0 -> 2
4       3 -> 0
5       0 -> 3

cmds ipcfifo de la rom

les cpu 1-3 gèrent :

1   vérification de la somme de contrôle de sa propre rom
2   définir SCTLR.V=0 et sauter à l'adresse
4   wfi (la distribution des cmds ipcfifo continue de tourner si réveillé)

câblage pico

pico        emc header
1           6
2           7
3           4
4           5
5           24
11          12
12          11

emc reset# est utilisé pour détecter la vivacité et réinitialiser emc en cas de plantage.

Le bouton sur le pico le réinitialisera en mode flash.

Note : Si vous voulez seulement accéder à EMC, vous pouvez utiliser les connecteurs près du module bt/wifi :
emc_header_dupe_near_wifi
(les marquages correspondent au brochage "emc header", ci-dessus)

configuration du pc hôte

Si l'option cmake ENABLE_DEBUG_STDIO est définie, l'interface cdc 0 sera prise par stdout/stdin du sdk pico. C'est du 115200 baud 8n1 standard. Peut être utilisé pour déboguer le fw pcio.

Les autres interfaces sont emc et titania. Les réglages de port uart (codage de ligne cdc) pour emc sont ignorés - le pico configure les vrais uarts de la bonne manière. Pour titania, le débit en bauds est configurable depuis l'hôte.

Note :
emc considère \n comme fin de cmd (configurable). renvoie l'entrée en écho
efc considère \r comme fin de cmd. renvoie \r\n en écho pour l'entrée \r

salina (première interface)

L'interface emc est bufferisée par lignes sur le pico. Le pico s'occupe des sommes de contrôle. Envoyez simplement des cmds umcd normales sous la forme <cmd> [args..]\n. Toutes les données envoyées au pc hôte sur cette interface sont tramées afin de faciliter l'écriture de code client (voir Result::to_usb_response).

Il existe actuellement les cmds spéciales suivantes :

cmdnotes
unlockeffectue l'exploit emc si nécessaire
picoresetréinitialise le pico en mode flash
picoemcresetréinitialise emc via emc reset#
picoemcromréinitialise emc en mode rom (bootloader uart) / hors de ce mode et configure le pico selon les besoins
picochipconstinstalle les constantes à utiliser pour une version matérielle emc
picofwconstinstalle les constantes/shellcode à utiliser pour une version de fw emc

titania (deuxième interface)

C'est juste un uart brut, les données sont simplement transmises entre l'hôte et titania octet par octet dès qu'elles sont disponibles.

Catégories