emc header
1 5v
2 5v
3 gnd
4 gnd
5 emc gpio a1. 在 emc 启动时拉低会导致 emc rom 进入 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 固件:460800,eap 固件:691200)
12 titania uart0 rx(efc 固件:460800,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"(仅在 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/开发板专用
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 一起置高
emc gpio a29 - efc reset#
emc gpio a30 - titania 启动模式(0:nand,1:uart)
要修补掉 emc 的 efc irq 处理程序:emc.fcddr_write(0xa0113200, bytes.fromhex('7047'))
防止 eventflg 8 被发送到任务
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 的命令 irq(emc 在 efc 从复位释放后等待其被触发)
rt5126 - rt5127 连接
13 44 (emc gpio a16)
14 45
15 46
uart 上的错误码格式为:
位
31-28 cpu 来源
27-16 错误主码
15-0 错误子码
通常错误码的子码部分为违规值或例如要记录的寄存器值。
0x001 无效的 rom 校验和高位(命令 1)
0x002 无效的 rom 校验和低位(命令 1)
0x004 无效的 ipcfifo src/dst cpu(读取)
0x006 无效的 ipcfifo src/dst cpu(写入)
0x007 无效的 ipcfifo 寄存器组索引
0x008 ipcfifo 消息长度过大(读取)
0x009 ipcfifo 消息长度过大(写入)
0x011 DFSR
0x012 IFSR
0x013 ADFSR 高位
0x014 ADFSR 低位
0x015 AIFSR 高位
0x016 AIFSR 低位
0x017 DFAR 高位
0x018 DFAR 低位
0x019 IFAR 高位
0x01a IFAR 低位
0x201 期望 ipcfifo 0x55
0x202 未知的 ipcfifo 命令
0x203 无法回复命令 1(校验和)。只有在 src/dst cpu 无效时才可能发生。
0x204 子码 0:无法读取跳转地址。子码 1:无法确认跳转地址。
0x205 无法确认命令 4,或 wfi 被唤醒。
0x206 (子码 0)__stack_chk_fail
0x207 (子码 3)__stack_chk_fail
0x30E 子码 1:等待向 uart1 写入字节超时
来自 bootrom 的代码
0x101 无效的 hdr.cpu 字段值。子码为违规值。
0x306 尝试 "down" 具有 hdr.cpu=0x99 且其他字段无效的镜像
0x30B 在没有有效 "down" 状态的情况下执行 "run"
0x30D 未知的 uart 命令
0x602 镜像验证失败。子码 0:efc/eap,子码 1:bcm
rom 仅使用 6 个 ipcfifo 组(cpu0 <-> 其他)。固件使用 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
cpu 1-3 处理:
1 校验和验证自身 rom
2 设置 SCTLR.V=0 并跳转到地址
4 wfi(如果被唤醒,ipcfifo 命令分发会继续运行)
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" 引脚排列相关)
如果设置了 ENABLE_DEBUG_STDIO cmake 选项,cdc 接口 0 将被 pico sdk 的 stdout/stdin 占用。标准为 115200 波特率 8n1。可用于调试 pcio 固件。
其他接口为 emc 和 titania。emc 的 uart 端口设置(cdc 线路编码)会被忽略 - pico 会以正确方式设置实际的 uart。对于 titania,波特率可从主机配置。
注意:
emc 将 \n 视为命令结束符(可配置)。回显输入
efc 将 \r 视为命令结束符。对输入 \r 回显 \r\n
emc 接口在 pico 上是行缓冲的。pico 负责校验和。只需以 <cmd> [args..]\n 的形式发送普通的 umcd 命令即可。发送到主机 PC 的此接口上的所有数据都会被帧化,以便更容易编写客户端代码(参见 Result::to_usb_response)。
目前有以下特殊命令:
这只是原始 uart,数据在主机和 titania 之间按字节可用性直接传递。
| cmd | 说明 |
|---|
unlock | 在需要时执行 emc 漏洞利用 |
picoreset | 将 pico 复位到刷写模式 |
picoemcreset | 通过 emc reset# 复位 emc |
picoemcrom | 将 emc 复位进入/退出 rom(uart 引导加载程序)模式并按需配置 pico |
picochipconst | 安装用于某个 emc 硬件版本的常量 |
picofwconst | 安装用于某个 emc 固件版本的常量/shellcode |