
ps5-uart — Mis à jour !
Interface pour interagir avec PlayStation 5 EMC et EFC
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 :

(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 :
| cmd | notes |
|---|---|
unlock | effectue l'exploit emc si nécessaire |
picoreset | réinitialise le pico en mode flash |
picoemcreset | réinitialise emc via emc reset# |
picoemcrom | réinitialise emc en mode rom (bootloader uart) / hors de ce mode et configure le pico selon les besoins |
picochipconst | installe les constantes à utiliser pour une version matérielle emc |
picofwconst | installe 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.