fix(vd960DBN): 恢复 factory 配置写入 — 换新空片后配置永久丢失

8-13 止血(SPI 写触发复位)根因已 8-17 闭环(栈溢出+printf 重入, 非 SPI 问题),
offlog/snapshot 8-18 起持续 SPI 写入稳定 → 解除止血。
新空片(W25Q128)参数区无 magic + write_net_config 不写 magic → 每次上电
memory defaults, 保存配置永久丢失。恢复: mismatch 分支调 factory_dev_info()
写 magic+默认参数到 flash, 首次上电自动初始化。
This commit is contained in:
wangfq
2026-08-19 15:13:18 +08:00
parent f1d9ac4e48
commit 8e58d5fdd1
2 changed files with 39 additions and 8 deletions
@@ -241,12 +241,15 @@ void load_cfg_from_flash(void)
if(strncmp(mBuff, DEV_USER_FLASH_MAGIC, sizeof(DEV_USER_FLASH_MAGIC)) != 0) if(strncmp(mBuff, DEV_USER_FLASH_MAGIC, sizeof(DEV_USER_FLASH_MAGIC)) != 0)
{ {
free(mBuff); free(mBuff);
/* ===== 止血 (2026-08-13): factory SPI 写触发硬件复位死循环 ===== /* ===== 恢复 factory 写入 (2026-08-19) =====
现场: SPI_Flash_Write(参数区 0x00, 512B) → RST=0x00000000 硬件复位 8-13 止血背景: factory SPI 写触发硬件复位死循环 — 根因已在 8-17 闭环
→ magic 写不进 → 无限复位循环。SPI 写触发硬件复位实锤(与快照区无关)。 (.bss 挤占 RAM → 栈溢出 + printf 重入, 非 SPI 硬件问题);
临时方案: 不写 Flash, 用内存默认配置继续 (恢复原逻辑删本块即可) */ offlog/snapshot 自 8-18 起持续 SPI 写入稳定。
/* 2026-08-17 栈溢出修复后恢复 (栈~4.75KB) */ 换新空片 (W25Q128) 参数区无 magic → 每次上电 memory defaults,
PRINT("CFG: magic mismatch - MEMORY DEFAULTS (factory SPI write disabled)\n"); 且 write_net_config 保存配置不写 magic → 配置永久丢失。
恢复: 首次 mismatch 写出厂默认 (magic+参数) 到 flash, 后续上电正常加载。 */
factory_dev_info();
PRINT("CFG: magic mismatch - factory defaults written\n");
memset(g_dev_number, 0, 6); memset(g_dev_number, 0, 6);
memcpy(g_dev_number, gMacAddr, 6); memcpy(g_dev_number, gMacAddr, 6);
sprintf(g_dev_number_str, "%02X%02X%02X%02X%02X%02X", sprintf(g_dev_number_str, "%02X%02X%02X%02X%02X%02X",
@@ -290,8 +293,7 @@ void load_cfg_from_flash(void)
g_sub_code_enable.dgdus_enable = 0; g_sub_code_enable.dgdus_enable = 0;
g_sub_code_enable.wbdus_enable = 0; g_sub_code_enable.wbdus_enable = 0;
g_sub_code_enable.radar_enable = 0; g_sub_code_enable.radar_enable = 0;
/* 2026-08-17 栈溢出修复后恢复 */ PRINT("CFG: memory defaults OK (factory written)\n");
PRINT("CFG: memory defaults OK (no factory write)\n");
return; return;
} }
+29
View File
@@ -4,6 +4,34 @@
> >
> 项目定位: DLD960 通信板 — BLE 配网、TCP JSON 协议服务、Loop MCU 串口桥接 > 项目定位: DLD960 通信板 — BLE 配网、TCP JSON 协议服务、Loop MCU 串口桥接
## 2026-08-19 — 恢复 factory 配置写入(换新空片后"老是进入出厂初始化配置")
### 背景
换 W25Q128 新片后每次上电日志 `CFG: magic mismatch - MEMORY DEFAULTS (factory SPI write disabled)`,用户保存的配置不生效。
### 根因
1. **8-13 止血禁用了 factory 写入**(当时 SPI 写触发硬件复位死循环,临时方案:不写 Flash 用内存默认)——但该根因已在 8-17 闭环(.bss 挤占 RAM → 栈溢出 + printf 重入,**非 SPI 硬件问题**),offlog/snapshot 自 8-18 起持续 SPI 写入稳定,止血早该解除
2. **新空片(W25Q128)参数区全 0xFF**magicPRODUCT_MODEL 字符串)不匹配 → 每次上电走内存默认
3. **`write_net_config`/`set_ble_safe_pass` 保存配置只改字段不写 magic** → 即使保存过,下次上电 magic 仍 0xFF → 配置"永久丢失"
### 变更(cfig_flash.cUTF-8+CRLF
`load_cfg_from_flash()` mismatch 分支:删除"不写 Flash"止血,恢复调用 `factory_dev_info()`(写 magic + 默认参数 + 网络配置到参数区 0x00),打印改 `factory defaults written`。首次上电自动初始化参数区,后续上电正常加载 + 保存配置生效。
### 验证
- `check_c_balance.py` OK`gcc -fsyntax-only` 无新错误(仅原有 unused warning
- SPI 读写实现对 W25Q128 兼容确认:4KB 扇区擦除 + 256B 页编程分页(storage.c 标准实现),指令集与 W25Q32 相同
### 遗留
- 待板级:新片上电确认 `factory defaults written` + 二次上电不再 mismatch
- 待用户提供新芯片规格书:核对 0x90 设备 ID / JEDEC 容量码 / 指令兼容(如非华邦需重点核对)
---
## 2026-08-19 — SPI Flash 识别去掉厂商代码判断(兼容多厂家同容量型号) ## 2026-08-19 — SPI Flash 识别去掉厂商代码判断(兼容多厂家同容量型号)
### 背景 ### 背景
@@ -1442,6 +1470,7 @@ TCP 超时要等 ~2 分钟才触发 `SINT_STAT_TIM_OUT`,
| 版本 | 时间 | 说明 | | 版本 | 时间 | 说明 |
|------|------|------| |------|------|------|
| V4.6 | 2026-08-19 | 恢复 factory 配置写入: 解除 8-13 止血, 空片首启写 magic+默认参数 (换 W25Q128 后配置永久丢失修复) |
| V4.5 | 2026-08-19 | SPI Flash 识别去厂商代码: W25Qxx 宏去 0XEF 前缀, ReadJEDEC_ID 删厂商校验, storage_init 低字节匹配 (兼容多厂家) | | V4.5 | 2026-08-19 | SPI Flash 识别去厂商代码: W25Qxx 宏去 0XEF 前缀, ReadJEDEC_ID 删厂商校验, storage_init 低字节匹配 (兼容多厂家) |
| V4.4 | 2026-08-19 | UART2 DMA 下 BLE→Loop OTA 修复: lup_feed_byte_ota 0x9F 帧解析+透传回 BLE (停等 ACK), DMA poll OTA 模式切换/溢出阈值/tick 归零, 单测 8 例 | | 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.3 | 2026-08-18 | log_query 改 hex 原始字节上报 (协议 V1.03/V1.07 修订): offlog_evt_to_hex/snap_rec_to_hex, 2 条快照 406B<800B, 快照 count 恢复 2 |