# MCU 0x82 升级调试报告

## 当前状态

- **JLink 连接问题**: 复位 MCU 后，JLink 出现 "Out of sync" 错误，无法连接。需要**物理拔插 JLink USB** 恢复。
- **adb 连接**: 正常，车机 WiFi 已连接 QS_5G，IP 192.168.0.55
- **车机串口**: /dev/ttyS7 存在，但 MCU 复位后 SetupAck 收不到（可能 MCU 未完全初始化或串口配置需恢复）

## 关键发现

### 1. deepseek 的 "NULL 指针" 假设不成立

通过 JLink 读取内存：
- `0x1FFE999C` = `0x00000001` → 升级状态 = 1（不是 0）
- `0x1FFE19B8` = `0x1FFF7470` → gMcuUpgradeMsgQueue **指针非 NULL**
- `0x1FFF7470` = `0x1FFF74C0` → 队列 handle 有效

结论：**消息队列存在且有效**，0x82 无响应不是因为队列为 NULL。

### 2. 0x81 前置检查#2 是卡点（CAN 环境相关）

反汇编分析 0x1A350（升级命令处理函数）：

```
1a36c:  bl  0x1a1a0      ; 前置检查#1：检查队列非满
1a370:  cmp r0, #0
1a372:  bne.n 0x1a462    ; 如果非0则失败（队列满）

1a376:  bl  0x19fec      ; 前置检查#2：检查队列非空
1a37a:  cmp r0, #0
1a37c:  bne.n 0x1a462    ; 如果非0则失败（队列空）← 疑点！
```

**0x19FEC → 0x239F6 逻辑**：
- 比较环形缓冲区的读指针和写指针 `[r4+8] == [r4+4]`
- 如果相等（队列为空）→ 返回 1 → 0x1A37C 的 `bne.n` 跳转到 0x1A462 → **0x81 被静默丢弃**

**为什么这与 CAN 环境有关？**
- 正常 CAN 环境下，CAN 接收任务持续向队列填充消息，队列**非空**
- 没有 CAN 环境时，队列为空，0x81 在前置检查#2 处被拒绝
- 这就是 "需要 CAN 环境才能进入 0x82" 的根本原因

### 3. "ARM force upgrade enable" 强制升级命令

反汇编中发现了 Public 命令（MsgType=0x01）处理函数：
- 字符串: `"ARM force upgrade enable."` @ 0x91B8
- 对应的 Public 命令会设置 `0x4005380A` 寄存器的 bit7
- 可能用于绕过正常检查强制进入升级模式

### 4. 已准备的 Patch 方案

脚本: `jlink_patch_0x81_queue_check.py`

**Patch 1**: 0x1A37C —— 绕过队列非空检查
- 原指令: `d171` (bne.n 0x1a462)
- Patch: `e7ff` (b.n 0x1a37e) —— 无条件继续执行

**Patch 2**: 0x1A466 —— 绕过状态=0 检查（deepseek 已分析）
- 原指令: `b360` (cbz r0, 0x1a4c2)
- Patch: `e7ff` (b.n 0x1a468) —— 无条件走正常分支

## 下一步操作建议

1. **恢复 JLink**: 物理拔插 JLink USB，重新连接
2. **恢复 MCU 串口**: MCU 复位后可能未正确初始化，可尝试：
   - 重新上电车机/MCU
   - 或等待 MCU 完成初始化后再运行测试
3. **运行 Patch 脚本**:
   ```bash
   python3 /Users/admin/workspace/jyq/update/jlink_patch_0x81_queue_check.py
   ```
4. **触发测试**: 在另一个终端运行
   ```bash
   adb shell "su 0 sh -c 'cd /data/local/tmp && ./mcu_upgrade_bug_repro'"
   ```
5. **观察结果**: 如果 0x81 回复 UPDATE_LEN + IND_AQUIRE，说明 Patch 成功

## 备选方案

如果 Patch 后仍有问题：
1. **发送 Public 命令 "ARM force upgrade enable"**: 尝试强制启用升级模式
2. **在 0x1A350 入口设置断点**: 确认 0x81 是否到达处理函数
3. **单步追踪**: 从 0x1A350 开始单步，精确定位拒绝位置
