
ps5-uart — Updated!
Интерфейс для взаимодействия с PlayStation 5 EMC и EFC
24-контактный разъём рядом с salina (EDM-010)
emc header
1 5v
2 5v
3 gnd
4 gnd
5 emc gpio a1. притяжка к земле при загрузке emc заставляет ROM emc войти в uart shell @ 460800
6 uart rx emc 115200
7 uart tx emc 115200
8 3v3, опускается в ноль при сбросе emc
9 0v?
10 gnd
11 titania uart0 tx (efc fw: 460800, eap fw: 691200)
12 titania uart0 rx (efc fw: 460800, eap fw: 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" (используется только если devif_det# активен))
17 0v?
18 5v?
19 emc gpio a49 (devif_det#)
20 emc gpio a27. главный выключатель питания
21 i2c data (i2c_bus_4)
22 i2c clock (i2c_bus_4)
23 gnd
24 emc reset#
i2c_bus_4 содержит в основном управление питанием:
(7-битные адреса, 400khz)
1f pca9557_gpioexpander только 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. на самом деле rt5126 (EDM-010) или da9081 (EDM-020) на ps5
emc gpio a 4,5,6,7(cs0:efc),8(cs1:floyd) - шина spi emc-efc (общая с floyd)
emc gpio a16 идёт на вывод 13 rt5126/вывод 44 rt5127. установить в hi вместе с pg2
emc gpio a29 - efc reset#
emc gpio a30 - режим загрузки titania (0: nand, 1: uart)
чтобы пропатчить обработчик irq efc у emc: emc.fcddr_write(0xa0113200, bytes.fromhex('7047'))
предотвращает отправку eventflg 8 в задачу
uart-загрузка идёт через uart1 @ 460800.
известные команды:
info: выводит "t2.0.100.041\nEC5E98BF84CC.C.1" из efc, "t2.0.100.043\nEC5E98BF84CC.C.1" из eap
down: входит в xmodem1k/crc
0x03060000 когда hdr.cpu равен 0x99
run: (проверяет сигнатуры/расшифровывает?) загруженные данные и выполняет
0x030B0000 если вызвана без предварительного down
0x06020000 если переданы полностью невалидные данные
0x06020001 если hdr.cpu равен 4. странно!!
0x010100xx если hdr.cpu не входит в (1,2,4). xx — значение hdr.cpu (вероятно, общий код ошибки "невалидное значение")
неизвестные команды возвращают 0x030D0000
ошибки записываются в область "fw0" spi titania
примечание: чтение spi, похоже, убивает rom
emc gpio a31 - выбор cpu titania (0: efc, 1: eap)
emc gpio a38 - irq команды от efc к emc (emc ждёт его срабатывания после вывода efc из сброса)
rt5126 - соединения rt5127
13 44 (emc gpio a16)
14 45
15 46
коды ошибок rom titania
коды ошибок на uart имеют формат:
биты
31-28 cpu-источник
27-16 старшая часть ошибки
15-0 младшая часть ошибки
обычно младшая часть кода ошибки — это offending-значение или, например, значение регистра для журналирования.
старшие коды
0x001 невалидная контрольная сумма rom hi (cmd 1)
0x002 невалидная контрольная сумма rom lo (cmd 1)
0x004 невалидный src/dst cpu ipcfifo (чтение)
0x006 невалидный src/dst cpu ipcfifo (запись)
0x007 невалидный индекс банка регистров ipcfifo
0x008 длина сообщения ipcfifo слишком велика (чтение)
0x009 длина сообщения ipcfifo слишком велика (запись)
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
0x202 неизвестная команда ipcfifo
0x203 не удалось ответить на cmd 1 (контрольная сумма). может произойти только если src/dst cpu невалидны.
0x204 minor 0: не удалось прочитать адрес перехода. minor 1: не удалось подтвердить адрес перехода.
0x205 не удалось подтвердить cmd 4, или wfi проснулся.
0x206 (minor 0) __stack_chk_fail
0x207 (minor 3) __stack_chk_fail
0x30E minor 1: истекло время ожидания записи байта в uart1
коды из bootrom
0x101 невалидное значение поля hdr.cpu. minor — offending-значение.
0x306 попытка "down" образа с hdr.cpu=0x99 и невалидными другими полями
0x30B "run" без валидного состояния "down"
0x30D неизвестная uart-команда
0x602 сбой проверки образа. minor 0: efc/eap, minor 1: bcm
маршрутизация ipcfifo rom
rom использует только 6 банков ipcfifo (cpu0 <-> остальные). fw использует 12 (все <-> все)
src dst bank
1 1
2 3
3 5
1 0
2 2
3 4
т.е.
bank
0 1 -> 0
1 0 -> 1
2 2 -> 0
3 0 -> 2
4 3 -> 0
5 0 -> 3
команды ipcfifo rom
cpu 1-3 обрабатывают:
1 проверка контрольной суммы собственного rom
2 установить SCTLR.V=0 и перейти по адресу
4 wfi (диспетчер команд ipcfifo продолжает работать при пробуждении)
разводка pico
pico emc header
1 6
2 7
3 4
4 5
5 24
11 12
12 11
emc reset# используется для определения активности и сброса emc в случае сбоя.
Кнопка на pico сбросит его в режим flash.
Примечание: Если вам нужен доступ только к EMC, можно использовать разъёмы рядом с модулем bt/wifi:

(обозначения соответствуют распиновке "emc header", выше)
настройка хост-ПК
Если установлена опция cmake ENABLE_DEBUG_STDIO, интерфейс cdc 0 будет занят stdout/stdin pico sdk. Это стандартные 115200 бод 8n1. Можно использовать для отладки прошивки pcio.
Остальные интерфейсы — это emc и titania. Настройки порта uart (cdc line coding) для emc игнорируются — pico настраивает реальные uart правильным образом. Для titania скорость можно настроить с хоста.
Примечание:
emc считает \n концом команды (настраивается). эхо-вывод ввода
efc считает \r концом команды. выводит \r\n в ответ на ввод \r
salina (первый интерфейс)
Интерфейс emc буферизуется по строкам на pico. Pico берёт на себя контрольные суммы. Просто отправляйте обычные команды umcd в форме <cmd> [args..]\n. Все данные, отправляемые на хост-ПК через этот интерфейс, обрамляются так, чтобы упростить написание клиентского кода (см. Result::to_usb_response).
В настоящее время существуют следующие специальные команды:
| cmd | примечания |
|---|---|
unlock | выполняет эксплойт emc при необходимости |
picoreset | сбрасывает pico в режим flash |
picoemcreset | сбрасывает emc через emc reset# |
picoemcrom | сбрасывает emc в/из режима rom (uart bootloader) и настраивает pico по мере необходимости |
picochipconst | устанавливает константы для использования с версией железа emc |
picofwconst | устанавливает константы/шеллкод для использования с версией прошивки emc |
titania (второй интерфейс)
Это просто сырой uart, данные просто передаются между хостом и titania побайтово по мере поступления.