
ps5-uart — Updated!
PlayStation 5 EMC 및 EFC와 상호작용하기 위한 인터페이스
살리나 근처의 24핀 헤더 (EDM-010)
emc header
1 5v
2 5v
3 gnd
4 gnd
5 emc gpio a1. emc 부팅 시 low로 당기면 emc rom이 460800 속도로 uart 셸에 진입함
6 uart rx emc 115200
7 uart tx emc 115200
8 3v3, emc 리셋 시 low로 떨어짐
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에는 주로 전원 관리 관련 장치가 포함됨:
(7bit 주소, 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. 실제로는 ps5에서 rt5126 (EDM-010) 또는 da9081 (EDM-020)
emc gpio a 4,5,6,7(cs0:efc),8(cs1:floyd) - emc-efc spi 버스 (floyd와 공유)
emc gpio a16은 rt5126 핀 13/rt5127 핀 44로 연결됨. pg2와 함께 hi로 설정
emc gpio a29 - efc reset#
emc gpio a30 - titania bootmode (0: nand, 1: uart)
emc의 efc irq 핸들러를 패치하려면: emc.fcddr_write(0xa0113200, bytes.fromhex('7047'))
eventflg 8이 task로 전송되는 것을 방지함
uart 부팅은 uart1 @ 460800에서 수행됨.
알려진 명령:
info: efc에서 "t2.0.100.041\nEC5E98BF84CC.C.1" 출력, eap에서 "t2.0.100.043\nEC5E98BF84CC.C.1" 출력
down: xmodem1k/crc 모드 진입
hdr.cpu가 0x99일 때 0x03060000
run: (서명 검사/복호화?) 다운로드된 데이터를 실행
down을 먼저 수행하지 않고 호출하면 0x030B0000
완전히 잘못된 데이터를 전달하면 0x06020000
hdr.cpu가 4이면 0x06020001. 이상함!!
hdr.cpu가 (1,2,4)에 없으면 0x010100xx. xx는 hdr.cpu 값 (아마 일반적인 "잘못된 값" 오류 코드)
알 수 없는 명령은 0x030D0000 반환
오류는 titania spi의 "fw0" 영역에 기록됨
참고: spi를 읽으면 rom이 죽는 것으로 보임
emc gpio a31 - titania cpu 선택 (0: efc, 1: eap)
emc gpio a38 - efc에서 emc로의 cmd irq (efc가 리셋에서 해제된 후 emc는 이 신호가 트리거되기를 기다림)
rt5126 - rt5127 연결
13 44 (emc gpio a16)
14 45
15 46
titania rom 오류 코드
uart의 오류 코드 형식:
bits
31-28 cpu-출처
27-16 오류 major
15-0 오류 minor
일반적으로 오류 코드의 minor 부분은 문제가 되는 값 또는 기록할 레지스터 값 등입니다.
major 코드
0x001 잘못된 rom 체크섬 hi (cmd 1)
0x002 잘못된 rom 체크섬 lo (cmd 1)
0x004 잘못된 ipcfifo src/dst cpu (읽기)
0x006 잘못된 ipcfifo src/dst cpu (쓰기)
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 cmd
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는 문제가 되는 값.
0x306 hdr.cpu=0x99 및 잘못된 기타 필드로 이미지 "down" 시도
0x30B 유효한 "down" 상태 없이 "run" 실행
0x30D 알 수 없는 uart 명령
0x602 이미지 검증 실패. minor 0: efc/eap, minor 1: bcm
rom ipcfifo 라우팅
rom은 ipcfifo 뱅크 중 6개만 사용합니다 (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
rom ipcfifo 명령
cpu 1-3이 처리:
1 자체 rom 체크섬 검증
2 SCTLR.V=0 설정 후 주소로 점프
4 wfi (깨어나면 ipcfifo cmd 디스패치 계속 실행)
pico 배선
pico emc header
1 6
2 7
3 4
4 5
5 24
11 12
12 11
emc reset#은 활성 상태 감지 및 충돌 시 emc 리셋에 사용됩니다.
pico의 버튼은 플래시 모드로 리셋합니다.
참고: EMC에만 접근하려면 bt/wifi 모듈 근처의 커넥터를 사용할 수 있습니다:

(표시는 위의 "emc header" 핀아웃과 관련됨)
호스트 PC 설정
ENABLE_DEBUG_STDIO cmake 옵션이 설정된 경우, cdc 인터페이스 0은 pico sdk stdout/stdin이 사용합니다. 표준 115200 보드 8n1입니다. pcio fw 디버깅에 사용할 수 있습니다.
다른 인터페이스는 emc와 titania입니다. emc의 uart 포트 설정 (cdc line coding)은 무시됩니다 - pico가 실제 uart를 적절한 방식으로 설정합니다. titania의 경우 보드레이트는 호스트에서 구성 가능합니다.
참고:
emc는 \n을 명령 종료로 간주합니다 (구성 가능). 입력을 에코합니다.
efc는 \r을 명령 종료로 간주합니다. 입력 \r에 대해 \r\n을 에코합니다.
salina (첫 번째 인터페이스)
emc 인터페이스는 pico에서 라인 버퍼링됩니다. pico가 체크섬을 처리합니다. 일반적인 umcd 명령을 <cmd> [args..]\n 형식으로 보내면 됩니다. 이 인터페이스에서 호스트 PC로 전송되는 모든 데이터는 클라이언트 코드 작성을 쉽게 하기 위해 프레임화됩니다 (Result::to_usb_response 참조).
현재 다음과 같은 특수 명령이 있습니다:
| cmd | 참고 |
|---|---|
unlock | 필요한 경우 emc 익스플로잇 수행 |
picoreset | pico를 플래시 모드로 리셋 |
picoemcreset | emc reset#을 통해 emc 리셋 |
picoemcrom | emc를 rom (uart 부트로더) 모드로/에서 리셋하고 필요에 따라 pico 구성 |
picochipconst | emc hw 버전에 사용할 상수 설치 |
picofwconst | emc fw 버전에 사용할 상수/셸코드 설치 |
titania (두 번째 인터페이스)
이것은 단순한 raw uart이며, 데이터는 사용 가능한 대로 호스트와 titania 사이에 바이트 단위로 전달됩니다.