# MCU OTA 升级验证套件



## 1. 套件内容

| 文件 | 说明 |
|---|---|
| `mcu_ota_upgrader` | ARM64 可执行文件，直连串口执行 OTA |
| `mcu_app.bin` | MCU 固件包，目标版本 `E112C069XZA0120016` |
| `mcu_ota_upgrader.c` | 源码（供参考） |
| `out.txt` | 升级成功日志样例 |

---

## 2. 前置条件

- 车机已 root（`adb root` 可用）
- 串口 `/dev/ttyS7` 存在且可访问
- **网络通畅**（WiFi/Ethernet adb 或 USB adb）

---

## 3. 推送文件到车机

```bash
# 推送升级工具和固件到设备
adb push mcu_ota_upgrader /data/local/tmp/mcu_ota_upgrader
adb push mcu_app.bin /data/local/tmp/mcu_app.bin

# 给可执行文件加权限
adb shell chmod +x /data/local/tmp/mcu_ota_upgrader
```

---

## 4. ⚠️ 关键：检查串口占用

**这一步不能跳过！**

如果设备上安装了 `qsmw-service-dev.apk`（或产线版 `qsmw-service`），这些 Service 会**自动启动**并长期占用 `/dev/ttyS7`，导致 `mcu_ota_upgrader` 无法打开串口。

### 4.1 检查哪些进程在占用串口

```bash
adb shell ps -A | grep -E "qsjnic|mcu"
```

**如果有以下进程在运行，必须先全部停止：**

| 包名 | 说明 |
|---|---|
| `com.qsjnic.mcu.service` | 产线版 Service（系统预置，删不掉） |
| `com.qsjnic.mcu.service.dev` | Dev 测试版 Service（开机自启动） |
| `com.qsjnic.demo.ota` | OTA Demo 应用 |

### 4.2 停止占用串口的进程

```bash
# 停止产线版 Service（如果有）
adb shell am force-stop com.qsjnic.mcu.service

# 停止 Dev 测试版 Service（开机自启动，必须停）
adb shell am force-stop com.qsjnic.mcu.service.dev

# 停止 OTA Demo
adb shell am force-stop com.qsjnic.demo.ota

# 再次确认没有 qsjnic 进程残留
adb shell ps -A | grep qsjnic
# 预期：无任何输出（表示全部已停止）
```

> **为什么 Dev 版也要停？**
> `com.qsjnic.mcu.service.dev` 注册了 `BOOT_COMPLETED` 广播接收器，**设备重启后会自动启动**。即使之前没手动启动它，它也可能已经在后台运行并重试连接串口。

---

## 5. 修复串口权限

```bash
# 获取 root
adb root
adb wait-for-device

# 修复串口权限（让普通进程可读写）
adb shell chmod 666 /dev/ttyS7

# 关闭 SELinux（避免 JNI/Native 层被拦截）
adb shell setenforce 0

# 验证权限
adb shell ls -la /dev/ttyS7
# 预期：crw-rw-rw- 1 root root ... /dev/ttyS7
```

---

## 6. 执行 OTA 升级

```bash
# 执行升级，输出保存到 out.txt
adb shell "cd /data/local/tmp && ./mcu_ota_upgrader 2>&1" > out.txt
```

**预期行为：**
- 三步握手 → UPDATE_REQ → UPDATE_BEGIN → 数据传输（211 chunks）→ UPDATE_END
- 耗时约 60~70 秒
- 重试次数为 0

**成功标志：**
```
[SUCCESS] OTA升级完成！耗时 69.0s 重试 0
=== 升级成功 ===
```

---

## 7. 常见问题

| 现象 | 原因 | 解决 |
|---|---|---|
| `三步握手失败` | 串口被 Service 占用 | 执行第 4 节停止所有 qsjnic 进程 |
| `open(/dev/ttyS7) failed: Permission denied` | 串口权限未修复 | 执行第 5 节 `chmod 666 /dev/ttyS7` |
| `三步握手超时` | MCU 未上电或串口线未接 | 确认 MCU 已上电，串口线连接正常 |
| 升级过程中卡住（某 chunk 超时） | MCU 端处理异常 | 断电重启 MCU 后重试 |
| OTA 成功但版本未变 | MCU 需要断电重启才能切换到新固件 | 整车断电 ≥10s 后重新上电 |

---

## 8. 验证升级结果

OTA 完成后，验证 MCU 版本是否已更新：

```bash
# 1. 先确认设备已重新上线（OTA 完成后 MCU 可能复位导致 adb 断开）
adb devices

# 2. 修复权限并启动 demo 查版本
adb root && adb wait-for-device
adb shell chmod 666 /dev/ttyS7
adb shell setenforce 0
adb shell am force-stop com.qsjnic.mcu.service.dev
adb shell am start -n com.qsjnic.demo.ota/.MainActivity

# 3. 等 3~5 秒后查版本
adb logcat -d | grep "MCU Version"
# 预期：MCU Version: E112C069XZA0120016
```

---

## 9. 结果判定

| 场景 | 结论 |
|---|---|
| `mcu_ota_upgrader` 成功，版本变为 `0016` | ✅ **MCU 端正常**，问题在 Android Service 层 |
| `mcu_ota_upgrader` 成功，但 demo 升级失败 | ✅ **确认是 Service 层问题**，需检查 `service.dev` 状态机/时序 |
| `mcu_ota_upgrader` 也失败 | ⚠️ **MCU 端或串口硬件有问题**，需排查 |

---

*文档版本：v1.0 | 配套 MCU 固件：E112C069XZA0120016 | 生成时间：2026-05-19*
