Voltar às atualizações
UpdatedSep 1, 2026

ps5-uart — Updated!

Interface para interagir com EMC e EFC do PlayStation 5

Compartilhar

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:
emc_header_dupe_near_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:

cmdnotas
unlockexecuta o exploit do emc se necessário
picoresetredefine o pico para o modo flash
picoemcresetreinicia o emc via emc reset#
picoemcromreinicia o emc para fora/dentro do modo rom (bootloader uart) e configura o pico conforme necessário
picochipconstinstala constantes para usar para uma versão de hardware do emc
picofwconstinstala 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.

Categorias