---
name: re-hardware-io
description: >
  硬件接口：JTAG/UART/flash 读取。
  触发词：JTAG、UART、串口、flash芯片、硬件提取、逻辑分析仪
capabilities: [hardware-interface]
---

# 硬件接口（JTAG / UART / Flash 读取）

## 何时使用 / 何时不用

- 用：有实物板子，需要提取固件、抓启动日志、硬件调试
- 用：JTAG/SWD 调试、UART 串口、flash 芯片直读、逻辑分析仪抓信号
- 不用：只有固件文件（走 [[re-fw-extract]]，硬件提取是最后手段）
- 不用：已解出 rootfs 只需静态分析（走 [[re-fw-rootfs]]）
- 不用：需要运行固件（先试 [[re-fw-emulate]] 更安全、更便宜）

## 工具准备

所有工具先验证再使用。硬件操作风险高：先万用表测电平、共地、核对丝印再上电（见坑 3/4）。遵循 [[re-analyze/platform-tips]] 先给最轻可行方案：软件手段（文件→解包→仿真）耗尽后再上硬件。

### openocd —— JTAG/SWD 调试

- Linux: `apt install openocd` / `dnf install openocd` / `pacman -S openocd`
- macOS: `brew install openocd`
- Windows: `choco install openocd`（或官方 Windows 构建）
- 验证: `openocd --version`

### picocom / minicom —— 串口终端

- Linux: `apt install picocom`（或 `apt install minicom`）/ `dnf install picocom` / `pacman -S picocom`
- macOS: `brew install picocom`
- Windows: `choco install putty`（PuTTY 支持串口）或 WSL 内 Linux 版
- 验证: `picocom --version`

### flashrom —— flash 芯片读取

- Linux: `apt install flashrom` / `dnf install flashrom` / `pacman -S flashrom`
- macOS: `brew install flashrom`
- Windows: 官方构建或 WSL（编程器 ch341a 在 WSL 内用 `flashrom -p ch341a_spi`）
- 验证: `flashrom --version`

### 逻辑分析仪（sigrok-cli / pulseview）

- Linux: `apt install sigrok-cli pulseview` / `dnf install sigrok-cli pulseview` / `pacman -S sigrok-cli pulseview`
- macOS: `brew install sigrok-cli pulseview`
- Windows: sigrok 官方 Windows 安装包（sigrok.org）
- 验证: `sigrok-cli --version` / `pulseview --version`

### JTAGulator —— 引脚识别板（开源硬件）

- 开源硬件项目 `git clone https://github.com/grandideastudio/JTAGulator`（含固件与文档）；需自行购买/打样 JTAGulator 板
- 验证: 串口连接后发送 `help` 显示命令清单
- 用它对未知板自动枚举 UART/JTAG 引脚（步骤 1/2 的得力工具）

### 硬件选购指引（常见方案与电平）

- USB-UART 适配器: CH340 / CP2102 / FTDI 三种芯片方案均可，选支持 3.3V TTL 电平的型号（带 3.3V/5V 跳线更通用）——3.3V 板上插 5V TTL 会烧接口（见坑 3）
- 调试器: ST-Link v2（STM32 系，SWD/JTAG 都支持）、J-Link（通用，授权收费）、CMSIS-DAP/DAPLink（开源固件方案）——按目标芯片厂牌选
- SPI flash 编程器: ch341a（最便宜的 SOIC8 方案）+ 夹子/测试座；多协议需求用 RT809H 类编程器
- 逻辑分析仪: 采样率按信号速率选——UART 115200 与低速 SPI 用 8 通道 24MHz 级别够用；高速 SPI（数十 MHz）需要 100MHz+ 采样（经验值：采样率至少为信号速率的 4 倍）
- 电平转换: 1.8V/2.5V 板子与 3.3V 工具混接时用 TXS0108 类双向电平转换模块

## 操作步骤

按顺序执行，每步记下结果。

1. **板子拆解与接口定位**：
   - 拆壳观察 PCB：丝印（TX/RX、VCC、GND、JTAG/SWD 测试点）、插针、flash 芯片型号（如 W25Q128、MX25L、GD25Q）
   - 万用表：测供电电平（3.3V 常见，也有 5V / 1.8V）、找 GND；UART TX 脚特征——上电瞬间拉高到逻辑高电平的方波
   - 拍照存档：丝印、引脚编号、flash 型号，供后续接线核对
2. **UART 串口调试（波特率枚举）**：
   ```sh
   picocom -b 115200 /dev/ttyUSB0        # 先试 115200
   # 乱码 → Ctrl+A Ctrl+X 退出，换 9600 / 57600 / 38400 / 19200 / 230400
   # 或 minicom -D /dev/ttyUSB0
   ```
   - TX/RX 需交叉接线（板子 TX ↔ 适配器 RX）；共地必须
   - 上电瞬间抓启动日志——是了解系统最快途径（见坑 4）
3. **JTAG/SWD 连接（openocd）**：
   ```sh
   openocd -f interface/stlink.cfg -f target/stm32f1x.cfg   # ST-Link + SWD 示例
   # 其他适配器在 /usr/share/openocd/scripts/interface/ 下选对应 cfg
   ```
   - 确认接口类型（JTAG 4/5 线 vs SWD 2 线）与电平（1.8V 板子需电平适配器）
   - 连上后 `halt` 暂停、读寄存器、dump flash（`flash read_bank 0 dump.bin`）
   - 一行命令模式（脚本化/无交互）: `openocd -f interface/stlink.cfg -f target/stm32f1x.cfg -c "init; halt; flash read_bank 0 dump.bin; exit"`
4. **flash 芯片读取（flashrom/编程器）**：
   ```sh
   # 板载 SPI flash（linux_spi 需内核 spidev 支持）：
   flashrom -p linux_spi:dev=/dev/spidev0.0 -r backup.bin
   # 离线读取（ch341a 编程器 + SOIC8 夹子，先断电）：
   flashrom -p ch341a_spi -r backup.bin
   ```
   - 核对芯片型号与封装（SOIC8 夹子/测试座），引脚方向别接反
   - 读出的镜像转 [[re-fw-extract]] 解包
5. **启动日志抓取**：
   - 串口连好 → 板子上电 → 全量抓日志（`picocom` 输出 `tee log.txt`，或 minicom 捕获）
   - 日志含 bootloader、内核启动、文件系统挂载、服务自启信息；与 [[re-fw-rootfs]] 的启动脚本对照定位
   - UART 没输出 → 回到步骤 1 复查接线/波特率，或用逻辑分析仪抓 TX 脚波形验证

## 跨域联合

- [[re-firmware]]：工作流第 5 步（需实物时）调用本技能
- 提取的 flash 镜像 → [[re-fw-extract]] 解包 → [[re-fw-rootfs]] 分析；需要运行 → [[re-fw-emulate]]
- 硬件上抓到的通信/协议 → [[re-protocol]]
- 硬件提取是固件分析的最后手段：软件手段（文件 → 解包 → 仿真）全部耗尽后再上
- 物理层芯片/PCB 分析（decap/裸片/木马检测）→ [[re-hw-chip]]

## 常见坑与陷阱

- **波特率不对 → 乱码**：现象——串口输出全是乱码或无输出；原因——波特率/数据位不匹配、TX/RX 接反；对策——按 9600 / 115200 优先枚举（57600 / 38400 / 230400 兜底），用逻辑分析仪看 TX 波形验证，共地必须
- **JTAG 被熔断/锁定**：现象——openocd 连不上，IDCODE 全 0 或超时；原因——量产板熔断 JTAG、读保护（RDP）开启；对策——试 SWD、`stm32f1x unlock` 类解锁序列，或放弃 JTAG 改走 UART + flash 直读（步骤 4）
- **5V/3.3V 电平误接烧板**：现象——接线后板子发热/冒烟/永久损坏；原因——电平不匹配（3.3V 板上接 5V TTL）、供电接错、VCC/GND 反接；对策——先万用表测电平与 GND 再接线；3.3V 系统用 3.3V 适配器；绝不带电插拔
- **先看启动日志再动手**：现象——盲目拆焊 flash / 连 JTAG 导致损坏或数据丢失；原因——跳过低成本观察直接上硬件手段；对策——先 UART 抓启动日志了解系统（步骤 2/5），再决定是否硬件读取——这是 [[re-analyze/platform-tips]] 先给最轻可行方案在硬件域的执行
- **Intel DCI 调试工具链兼容性坑**：现象——Intel System Studio 2019（System Debugger）在 Win10/11 安装/运行失败，DCI 线缆连不上 CPU；原因——该软件基于 Win7 开发且带环境检测与 License 校验：Win11 提示缺 Win7 安全补丁、公开 License 文件在 Windows 版无效；对策——安装用兼容模式；运行加 `--noprereq` 跳过环境检查；License 校验核心在 `issa.dll` 导出函数中（三个校验函数），patch 后替换即可；DCI 配置按平台选型（如 KBL=Kaby Lake、SPT=200 系主板、DBC=Debug Class 线缆），CLI 调试用 DAL 目录的 `PythonConsole.cmd`（Python 2.7 环境，`itp.cores`/`itp.halt()` 等命令）；ME 端需 UTOK 解锁才响应调试命令（见 [[re-fw-extract]]）
- 命令族速查与操作序列见 [[commands]]；工具特有坑与版本差异见 [[gotchas]]
