fix(vd960DBN): BLE→Loop OTA 失效修复 — 0x9F 帧透传回 BLE
DMA 改造(fed4335)后 UART2 RX 走 lup_feed_byte 只认 0x7F, Loop bootloader
回的 0x9F 响应帧(pre_ok/addr_ok/data ACK)全被吞; OTA 是停等协议
(0xA7 WITH_BACK 每块必回 ACK), 工具等不到 ACK 升级必然卡死。
- loop_uart_proto: 新增 lup_feed_byte_ota() 0x9F 帧状态机 (SUM 校验无 XOR,
复用 g_lup_parser), 枚举追加 OTA 专用状态
- usart_biz: uart2_dma_poll 按 g_flag_counter_ota.flag 切换 0x9F/0x7F 解析器,
模式切换 reset, OTA 溢出阈值放宽整缓冲, 补收帧 tick 归零;
uart_srv OTA 分支 0x9F 帧透传回 BLE + 清 flag
- 单测 tests/test_lup_ota_parser.c 8 断言全过 (bootloader 真实帧向量)
- 遗留: g_flag_counter_ota.flag 无退出机制, 升级后需断电重启
This commit is contained in:
@@ -4,6 +4,47 @@
|
||||
>
|
||||
> 项目定位: DLD960 通信板 — BLE 配网、TCP JSON 协议服务、Loop MCU 串口桥接
|
||||
|
||||
## 2026-08-19 — UART2 RX DMA 下 BLE→Loop OTA 失效修复:0x9F 帧透传回 BLE
|
||||
|
||||
### 背景
|
||||
|
||||
DMA 改造(fed4335)后通过 BLE 给地感(Loop MCU)OTA 升级失效。代码排查 + DLD960LoopBootloader 源码确认根因。
|
||||
|
||||
### 根因
|
||||
|
||||
1. **`lup_feed_byte()` IDLE 态只认 `0x7F`**,Loop bootloader 回的 0x9F 响应帧(pre_ok/addr_ok/data ACK)第一个字节就被丢弃
|
||||
2. **OTA 是停等协议**:`0xA7` (TRAN_PKG_WITH_BACK) 每收一块必须回 `back_9F_data()` ACK,工具等不到 ACK 不发下一块 → DBN 吞掉 ACK = 升级必然卡死
|
||||
3. **`uart_srv` OTA 分支"忽略 Loop MCU 数据"**——即使解析成功也不透传回 BLE
|
||||
4. DMA 版相对中断版丢失"收帧中 tick 归零";溢出保护 256B 阈值在 TX 阻塞窗口可能误杀 ACK
|
||||
|
||||
### 0x9F 帧格式(DLD960LoopBootloader 源码确认)
|
||||
|
||||
| 方向 | 帧格式 | 说明 |
|
||||
|------|--------|------|
|
||||
| 下行 | `9F SubL SubH LEN CMD DATA(LEN-1) CHECK` | CHECK = SUM(SubL..DATA),**无 XOR**;LEN 含 CMD |
|
||||
| 上行 | `9F SubL SubH 02 CMD Status CHECK` | 例:pre_ok = `9F 01 00 02 A5 00 A8` |
|
||||
| CMD | `A5` READY / `A6` ADDR_START / `A7` TRAN_WITH_BACK(回ACK) / `A8` TRAN_WITHOUT_BACK(不回) | 总帧长 = LEN+5 与 0x7F 相同 |
|
||||
|
||||
### 变更
|
||||
|
||||
| 文件 | 变更 |
|
||||
|------|------|
|
||||
| `loop_uart_proto.h` | `LUP_FrameState` 追加 OTA 专用状态(OTA_LEN/OTA_CMD/OTA_CHECK);声明 `lup_feed_byte_ota()` |
|
||||
| `loop_uart_proto.c` | 实现 `lup_feed_byte_ota()`:0x9F 帧状态机(SUM 校验,复用 `g_lup_parser` 缓冲);`lup_feed_byte` 加 default 防御性 reset |
|
||||
| `usart_biz.c` | `uart2_dma_poll`:OTA 模式切换时 reset 解析器 + 按 `g_flag_counter_ota.flag` 选 0x9F/0x7F 解析器 + OTA 模式溢出阈值放宽到整缓冲(0x9F ACK 仅 7B,停等协议同刻至多 1 帧)+ 收帧中 tick 归零(对齐中断版);`uart_srv` OTA 分支:0x9F 帧 `set_response_tran_to_notify` 透传回 BLE + `InitPkgUart` 清 flag |
|
||||
|
||||
### 验证
|
||||
|
||||
- gcc 隔离单测 `tests/test_lup_ota_parser.c`:**8 断言全过**(bootloader 真实帧向量 pre_ok/addr_ok/addr_err/data ACK、错误校验拒绝并复位、0x7F 帧隔离、两帧粘包独立解析)
|
||||
- `gcc -fsyntax-only`:`loop_uart_proto.c`/`usart_biz.c` 无新错误(仅 RISC-V interrupt attribute 假阳性 + 原有 unused warning)
|
||||
|
||||
### 遗留
|
||||
|
||||
- **`g_flag_counter_ota.flag` 无退出机制**:升级完成后 DBN 仍卡 OTA 透传态,只能断电重启恢复 0x7F 通信——待定加"OTA 超时/完成帧自动退出"
|
||||
- 待板级:MRS 编译 + 真机 BLE OTA 全流程回归
|
||||
|
||||
---
|
||||
|
||||
## 2026-08-18 — log_query 改为 hex 原始字节上报(协议 V1.03/V1.07 修订)
|
||||
|
||||
### 背景
|
||||
@@ -1370,6 +1411,7 @@ TCP 超时要等 ~2 分钟才触发 `SINT_STAT_TIM_OUT`,
|
||||
|
||||
| 版本 | 时间 | 说明 |
|
||||
|------|------|------|
|
||||
| V4.4 | 2026-08-19 | UART2 DMA 下 BLE→Loop OTA 修复: lup_feed_byte_ota 0x9F 帧解析+透传回 BLE (停等 ACK), DMA poll OTA 模式切换/溢出阈值/tick 归零, 单测 8 例 |
|
||||
| V4.3 | 2026-08-18 | log_query 改 hex 原始字节上报 (协议 V1.03/V1.07 修订): offlog_evt_to_hex/snap_rec_to_hex, 2 条快照 406B<800B, 快照 count 恢复 2 |
|
||||
| V4.2 | 2026-08-18 | MQTT 命令集补齐: ssc_net_query/iot_net_query/iot_topic_query 只读组包 (协议 V1.02 对齐), 工具禁用未实现按钮 |
|
||||
| V4.1 | 2026-08-18 | TCP/MQTT 脱机日志快照流: log_stat/log_query/log_clear 支持 stream=snapshot (协议 V1.03/V1.07), snap_rec_to_json 序列化, 事件流 count=0 按上限 |
|
||||
|
||||
Reference in New Issue
Block a user