Il developer SKGleba chiude l’anno 2023 con la pubblicazione di bert, un client per l’interfaccia RPC del controller di sistema della Playstation Vita e PlayStation TV.
Il client espone circa 100 comandi che vanno dal semplice controllo dello stato delle periferiche a quelli più complessi come la programmazione flash o modalità di avvio SoC alternative.
The "bert" project is now public – A client for Playstation Vita's System Controller's RPC interface that exposes around 100 commands ranging from simple peripheral status checks to more complex like flash programming or alternative SoC boot modes.
Link: https://t.co/rV2PuUEahw pic.twitter.com/EZI7iwpTC1— SKGleba (@skgleba) December 30, 2023
Bert è un soprannome attribuito a un client di interfaccia UART RPC del System Controller della PSP2.
Il System Controller della PlayStation Vita e PlayStation TV, chiamato in codice “Ernie”, è un MCU a basso consumo energetico che gestisce periferiche come PMIC, controller USB, pulsanti fisici, pannelli touch e altro ancora.
Ospita un server RPC accessibile da diverse interfacce, ciascuna con il proprio set di comandi disponibili. Una delle interfacce è UART, abilitata da un circuito speciale “jig” che imposta livelli di tensione specifici sui pin/sonde di rilevamento tensione del syscon.
Questa interfaccia espone circa 100 comandi RPC, che vanno dal recupero di dettagli periferici semplici a procedure più complesse come la programmazione flash o le modalità di avvio alternative del SoC.
Hardware
Unità supportate
- DEM-3000: solo IRT-002
- Procedura di abilitazione interfaccia sconosciuta su IRT-001 / “slideys”
- CEM-3000: supportato
- PDEL-1000: supportato
- PCH-1000: supportato
- VTE-1000: supportato
- PCH-2000: supportato
Per tutte le unità supportate, il livello logico dell’interfaccia UART è di 1,8 V.
PCH-1000, DEM-3000, CEM-3000, PDEL-1000
Su queste unità, le sonde del circuito e l’UART Syscon sono esposte tramite il MultiConnector.
- Pin 6: Syscon RX
- Pin 7: Syscon TX
- Pin 11: Jig Sense 1
- Pin 12: Jig Sense 2
- Pin 14: GND
L’interfaccia UART viene abilitata se la sonda “Jig Sense 1” è compresa tra 0,47 V e 0,738 V durante il cambio di stato della sonda “Jig Sense 2”.
Il cambio di stato può essere ottenuto collegando la sonda a GND utilizzando un pulsante o un jumper wire. Si consiglia l’uso di una scheda di breakout MultiConnector.
La sfida principale è trovare un connettore popolato; abbiamo scoperto che il “Sony PlayStation Vita Cradle” PCH-ZCL1 ne ha uno, ma è difficile da reperire.
Un’altra possibilità è utilizzare i piccoli testpad sulla scheda madre o sollevare e spostare i pin su un cavo USB MultiConnector commerciale.
VTE-1000
Su questa unità, le sonde del circuito, così come l’UART di Syscon e SoC, sono esposte tramite il Service Connector.
- Pin 1: GND
- Pin 4: Jig Sense 1
- Pin 6: Jig Sense 2
- Pin 13: SoC TX (utile)
- Pin 14: SoC RX (utile)
- Pin 19: Syscon TX
- Pin 20: Syscon RX
Si consiglia di utilizzare i grandi testpad sopra il connettore piatto:
L’interfaccia UART è abilitata se la sonda “Jig Sense 1” è a 0,47v-0,738v durante il cambio di stato della sonda “Jig Sense 2”. Il cambio di stato può essere ottenuto collegando la sonda a GND utilizzando un pulsante o un cavo jumper.
PCH-2000
Su questa unità, la sonda del circuito e l’UART Syscon sono esposti tramite microUSB.
- Pin 2: D- : Syscon TX
- Pin 3: D+ : Syscon RX
- Pin 4: ID : Jig Sense
- Pin 5: GND
L’interfaccia UART viene abilitata se la sonda “Jig Sense” è compresa tra 1,017 V e 1,14 V per almeno 32000 cicli di clock di Syscon.
Quando è abilitata, viene inviato un pacchetto di saluto “UUU” via UART. Si consiglia l’uso di una scheda di breakout microUSB, ma è anche possibile utilizzare i grandi testpad sulla scheda madre.
AIO
Il circuito seguente abilita l’interfaccia UART di Syscon su tutte le unità supportate:
Software
Il protocollo dell’interfaccia UART RPC è una semplice interazione messaggio -> pacchetto di risposta, strutturata come segue:
struct _ernie_cmd {
uint16_t id; // Command ID
uint8_t ret; // 0x00 for message, return status for reply
uint16_t data_size;
uint8_t data[data_size];
uint16_t checksum; // ~(all bytes added)
} _ernie_cmd;
Ogni pacchetto viene convertito in/da ASCII e termina con CRLF; la dimensione massima del pacchetto è di 0x40 byte (ascii 0x80).
Messaggio
Un elenco di tutti i comandi disponibili si trova in commands.md.
Risposta
La risposta contiene uno stato di ritorno del comando; attualmente sono noti i seguenti ID di stato:
- 0x0 : “OK”
- 0x1 : “UNK_CMD”
- 0x2 : “BAD_LEN”
- 0x3 : “BAD_CHKSUM”
- 0x4 : “NO_CRLF”
- 0x5 : “BAD_CMD_FORMAT”
- 0x10 : “LOCKED_HANDSHAKE”
- 0x20 : “LOCKED_T1”
- 0x32 : “BAD_ARG_SIZE”
- 0x33 : “BAD_ARG”
- 0x40 : “WRONG_STATE”
- 0x50 : “WRONG_POWER_STATE”
Blocchi
Alcuni comandi sono bloccati dietro “locks” – bit che possono essere impostati utilizzando altri comandi. Ad esempio, il comando di controllo dell’alimentazione – 0x105 – richiede che il “lock” T1 sia rimosso/sbloccato chiamando prima il comando 0x103.
Alcuni comandi, come la lettura di NVS (0x131), potrebbero essere bloccati dietro più “locks” – qui, oltre a T1, il blocco T8 deve essere rimosso/sbloccato per primo eseguendo un handshake a 3 passaggi con la chiave 0x1 mediante il comando 0x110.
L’elenco completo dei comandi con i relativi blocchi può essere trovato qui. Un/lock, dove Tx è il bitmask del “lock”:
- T1: 0x103 / 0x104
- T2: 0x110 keyset 0x1
- T4: 0x900 with key / 0x901
- T8: 0x110 keyset 0xE
Lo script
Viene fornito uno script python che può essere utilizzato per comunicare con il server RPC tramite UART.
- Richiede pyserial, pycryptodome, python 3.10+
bert.py raw [COMMAND] : send a raw command, only adds checksum : -----
bert.py nop : ping ernie : 0x100
bert.py mode [USE_FAST?] [USE_BIN?] : [true/false] 115200 and binary uart modes : 0x102
bert.py info : get hardware & ernie info : 0x101
bert.py get-date-string : get ernie firmware date string : 0x107
bert.py power-off / power-on / power-fsm : set new power state : 0x105
bert.py get-power : get current power state : 0x106
bert.py get-kr600 : read some ID with overlord command 4, off 0x120 : 0x120
bert.py maika-0 [OFFu16] : read some data with overlord command 0 : 0x121
bert.py nvs-read [OFFu16] [SIZEu8] : read nvs : 0x131
bert.py nvs-read-range [OFFu16] [ENDu16] [STEPu8] : read and print nvs in STEP-sized blocks : -----
bert.py nvs-write [OFFu16] [SIZEu8] [DATA] : write nvs : 0x132
bert.py confzz-ro / confzz-rw : block/allow confzz writes : 0x144 / 0x143
bert.py confzz-read [OFFu16] [SIZEu8] : read confzz : 0x141
bert.py confzz-read-range [OFFu16] [ENDu16] [STEPu8]: read and print confzz in STEP-sized blocks : -----
bert.py confzz-write [OFFu16] [SIZEu8] [DATA] : write backup confzz : 0x142
bert.py confzz-apply : write backup confzz to main confzz : 0x145
bert.py invs-read [OFFu16] [SIZEu8] : read internal nvs : 0x154
bert.py invs-read-id [IDu8] : read internal nvs by id : 0x153
bert.py invs-read-range [OFFu16] [ENDu16] [STEPu8] : read and print internal nvs in STEP-sized blocks : -----
bert.py wipe-nvs : wipe NVS with 0xFF : 0x160
bert.py reset / reset-hard : soft-reset / hard reset ernie : 0x161 / 0x162
bert.py kill : full, hard shutdown of all components : 0x163
bert.py reset-bic : reset the battery controller : 0x182
bert.py unlock-1 / lock-1 : un/lock the T1 lock : 0x103 / 0x104
bert.py unlock-4 / lock-4 : un/lock the T4 lock with a passcode : 0x900 / 0x901
bert.py handshake-0 / handshake-1 / handshake-E : authenticate with the selected keyset : 0x110
bert.py unlock-qa : unlock the T1 and T8 locks : 0x103 + 0x110 (E)
bert.py unlock-nvs : unlock the T1 and T2 locks : 0x103 + 0x110 (1)
bert.py unlock-sdboot : unlock the T1 lock and boot into SD mode : 0x103 + 0x110 (0)
bert.py unlock-all : unlock 1,4,qa,nvs,sdboot : -----
bert.py [COMMANDu16] <SIZEu16> <DATA> : execute a command, e.g. '0x105 0x2 03' : -----
Note
- Alcuni schemi e file Gerber per PCB di breakout/jig sono disponibili nella cartella PCBs.
- Schemi alternativi per i jig possono essere trovati nella cartella schematics.
- Questo progetto è in corso di sviluppo; il firmware di syscon è ancora in fase di reverse engineering e la documentazione dei comandi è in corso.
- Non è consigliato provare comandi sconosciuti, poiché potrebbero causare un brick irreversibile.
Download: Source code Bert
Fonte: twitter.com