探针层
探针层回答一个问题:一次「读 DP 的某个寄存器」或「写 AP 的某个寄存器」,怎么变成 USB 上的字节、线上的电平。probe/ 目录加上 architecture/arm/traits/polyfill.rs,约 2 万行,是访问主线的最底层。
四章按「从抽象到具体」排:
- DebugProbe 与驱动注册表:
DRIVERS表里的 9 个ProbeFactory;Lister怎么让每个驱动枚举 USB 设备、怎么挑第一个打得开的;DebugProbetrait 的必需方法和「按架构取接口」的方法;一张表列出每个驱动接在哪一层:固件自己做 DAP 事务(CMSIS-DAP、Glasgow)、更高一层直接做内存访问(ST-Link、SiFli),还是只会翻转引脚(J-Link、FTDI、CH347、linuxgpiod)。 - 位级探针:从 RawSwdIo 到 DAP 事务:
polyfill.rs给所有实现了RawSwdIo+JtagAccess的探针一份RawDapAccess;SWD 包的 8 位请求、ACK、32 位数据加奇偶校验、turnaround 逐位对照;AP 读要多读一次 RDBUFF、写要多读一次来确认;WAIT 怎么退避重试。用一个软件模拟的 SWD 目标跑 probe-rs 自己的 polyfill,贴出线上的每一位。 - CMSIS-DAP 驱动:命令集;
batch_add只攒写、遇到读立刻发;块传输;v1(HID)和 v2(bulk);FAULT、WAIT 的处理和 0.32 修过的问题;用模拟目标按同样的规则数一次 attach 要多少条 DAP 命令。 - FakeProbe:没有硬件时能测什么:模拟核只模拟 DHCSR;带 ELF 时按加载地址返回内容;
expect_operation脚本化 AP 读;25 处todo!/unimplemented!划出的边界,和实验里发现的段末尾差一个字的问题。
flowchart TB drivers["DebugProbe 与驱动注册表"] --> cmsis["CMSIS-DAP:固件做 DAP 事务"] drivers --> bits["位级探针:polyfill 拼 SWD 包"] drivers --> fake["FakeProbe:测试与 dry-run"] cmsis --> arm["03 ARM 调试架构"] bits --> arm
💬 关联讨论
发起讨论加载中...