Home Homebrew Rilasciato bert, un client e circuito per l’interfaccia System Controller RPC...

[Scena PS Vita] Rilasciato bert, un client e circuito per l’interfaccia System Controller RPC della Playstation Vita e PlayStation TV

374
0

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.

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 CradlePCH-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

LASCIA UN COMMENTO

Per favore inserisci il tuo commento!
Per favore inserisci il tuo nome qui

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.