
ps5-uart — Updated!
Interface para interagir com EMC e EFC do PlayStation 5
Conector de 24 pinos perto da salina (EDM-010)
emc header
1 5v
2 5v
3 gnd
4 gnd
5 emc gpio a1. puxar para baixo no boot do emc faz a rom do emc entrar no shell uart @ 460800
6 uart rx emc 115200
7 uart tx emc 115200
8 3v3, vai para baixo quando o emc reinicia
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" (usado apenas se devif_det# estiver ativo))
17 0v?
18 5v?
19 emc gpio a49 (devif_det#)
20 emc gpio a27. interruptor principal de energia
21 dados i2c (i2c_bus_4)
22 clock i2c (i2c_bus_4)
23 gnd
24 emc reset#
i2c_bus_4 contém principalmente coisas de gerenciamento de energia:
(endereços de 7 bits, 400khz)
1f pca9557_gpioexpander apenas CP/dev
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. na verdade rt5126 (EDM-010) ou da9081 (EDM-020) no ps5
emc gpio a 4,5,6,7(cs0:efc),8(cs1:floyd) - barramento spi emc-efc (compartilhado com floyd)
emc gpio a16 vai para o pino 13 do rt5126/pino 44 do rt5127. definir alto com pg2
emc gpio a29 - efc reset#
emc gpio a30 - modo de boot titania (0: nand, 1: uart)
para remover o handler de irq do efc do emc: emc.fcddr_write(0xa0113200, bytes.fromhex('7047'))
impede que o eventflg 8 seja enviado para a task
o boot uart está na uart1 @ 460800.
cmds conhecidos:
info: imprime "t2.0.100.041\nEC5E98BF84CC.C.1" do efc, "t2.0.100.043\nEC5E98BF84CC.C.1" do eap
down: entra em xmodem1k/crc
0x03060000 quando hdr.cpu é 0x99
run: (verifica assinaturas/descriptografa?) os dados baixados e executa
0x030B0000 se chamado sem fazer down antes
0x06020000 se receber dados completamente inválidos
0x06020001 se hdr.cpu for 4. estranho!!
0x010100xx se hdr.cpu não estiver em (1,2,4). xx é o valor de hdr.cpu (provavelmente código de erro genérico de "valor inválido")
cmds desconhecidos retornam 0x030D0000
erros são registrados na região "fw0" do spi da titania
nota: ler o spi parece matar a rom
emc gpio a31 - seleção de cpu titania (0: efc, 1: eap)
emc gpio a38 - irq de cmd do efc para o emc (o emc espera que seja acionado após o efc ser liberado do reset)
conexões rt5126 - rt5127
13 44 (emc gpio a16)
14 45
15 46
códigos de erro da rom titania
os códigos de erro na uart têm o formato:
bits
31-28 origem da cpu
27-16 erro major
15-0 erro minor
normalmente a parte minor do código de erro é o valor ofensor ou, por exemplo, o valor de registro para registrar.
códigos major
0x001 checksum de rom inválido hi (cmd 1)
0x002 checksum de rom inválido lo (cmd 1)
0x004 cpu src/dst ipcfifo inválida (leitura)
0x006 cpu src/dst ipcfifo inválida (escrita)
0x007 índice de banco de registros ipcfifo inválido
0x008 tamanho de msg ipcfifo muito grande (leitura)
0x009 tamanho de msg ipcfifo muito grande (escrita)
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 esperava ipcfifo 0x55
0x202 cmd ipcfifo desconhecido
0x203 falha ao responder ao cmd 1 (checksum). só pode realmente acontecer se as cpus src/dst forem inválidas.
0x204 minor 0: falha ao ler endereço de salto. minor 1: falha ao confirmar endereço de salto.
0x205 falha ao confirmar cmd 4, ou wfi acordou.
0x206 (minor 0) __stack_chk_fail
0x207 (minor 3) __stack_chk_fail
0x30E minor 1: tempo esgotado esperando para escrever byte na uart1
códigos do bootrom
0x101 valor de campo hdr.cpu inválido. minor é o valor ofensor.
0x306 tentando "down" de imagem com hdr.cpu=0x99 e outros campos inválidos
0x30B "run" sem estado "down" válido
0x30D comando uart desconhecido
0x602 falha de verificação de imagem. minor 0: efc/eap, minor 1: bcm
roteamento ipcfifo da rom
a rom usa apenas 6 dos bancos ipcfifo (cpu0 <-> outras). o fw usa 12 (todas <-> todas)
src dst banco
1 1
2 3
3 5
1 0
2 2
3 4
ou seja
banco
0 1 -> 0
1 0 -> 1
2 2 -> 0
3 0 -> 2
4 3 -> 0
5 0 -> 3
cmds ipcfifo da rom
as cpus 1-3 lidam com:
1 verificar checksum da própria rom
2 definir SCTLR.V=0 e saltar para o endereço
4 wfi (o despacho de cmd ipcfifo continua rodando se acordar)
fiação do pico
pico emc header
1 6
2 7
3 4
4 5
5 24
11 12
12 11
emc reset# é usado para detectar atividade e reiniciar o emc em caso de travamento.
O botão no pico irá redefini-lo para o modo flash.
Nota: Se você quiser apenas acesso ao EMC, pode usar os conectores perto do módulo bt/wifi:

(as marcações se referem ao pinout do "emc header", acima)
configuração do pc host
Se a opção cmake ENABLE_DEBUG_STDIO estiver definida, a interface cdc 0 será ocupada pelo stdout/stdin do sdk do pico. É padrão 115200 baud 8n1. Pode ser usada para depurar o fw do pcio.
As outras interfaces são emc e titania. As configurações de porta uart (codificação de linha cdc) para o emc são ignoradas - o pico configura as uarts reais da maneira adequada. Para titania, a taxa de baud é configurável a partir do host.
Nota:
o emc considera \n como fim de cmd (configurável). ecoa a entrada
o efc considera \r como fim de cmd. ecoa \r\n para entrada \r
salina (primeira interface)
A interface emc é bufferizada por linha no pico. O pico cuida dos checksums. Basta enviar cmds umcd normais na forma <cmd> [args..]\n. Todos os dados enviados ao pc host nesta interface são enquadrados para facilitar a escrita de código de cliente (veja Result::to_usb_response).
Atualmente existem os seguintes cmds especiais:
| cmd | notas |
|---|---|
unlock | executa o exploit do emc se necessário |
picoreset | redefine o pico para o modo flash |
picoemcreset | reinicia o emc via emc reset# |
picoemcrom | reinicia o emc para fora/dentro do modo rom (bootloader uart) e configura o pico conforme necessário |
picochipconst | instala constantes para usar para uma versão de hardware do emc |
picofwconst | instala constantes/shellcode para usar para uma versão de fw do emc |
titania (segunda interface)
Isto é apenas uart cru, os dados são apenas passados entre host e titania byte a byte conforme disponível.