修复 P1-7:MAC 写入顺序改为 INIT_CH395 之前
- 手册 §9.2.1:SET_MAC(步骤①) 必须先于 INIT_CH395(步骤⑤);SET_MAC 写 芯片 EEPROM,INIT 从中加载 MAC——原顺序反了则本次上电 MAC 不生效 (回落芯片内置/上次值),UI 显示与设备在线身份不符 - net_socket.c net_init():SET_MAC 移到 ch395f_init() 之前(对齐步骤①) - ch395f.c:四个 SET(MAC/IP/GWIP/MASK)限定条件注释由"芯片已初始化" 订正为"必须在 ch395f_init() 之前调用" - net_socket.h / BSD_Socket_API_函数调用关系.md:同步顺序描述 - CH395F_Trap_Records.md:新增 Trap 24 沉淀根因与修复 - 待处理内容.md:P1-7 销项(§1/§2 阶段 A/§3.1/§4);阶段 A 清空后重编号 - 验证:Keil 构建 0 错 0 警;pre-commit 17/17 全通过
This commit is contained in:
@@ -182,7 +182,7 @@ CH395F 的 RECV 中断是电平触发的——只要接收缓冲区有数据就
|
||||
## 附:CH395F 驱动关键点
|
||||
|
||||
### 初始化顺序
|
||||
- 必须按手册9.2.1节顺序:`SET_MAC → SET_IP/GWIP/MASK → INIT_CH395 → SET_PHY`
|
||||
- 必须按手册9.2.1节顺序:`SET_MAC → SET_IP/GWIP/MASK → INIT_CH395 → SET_PHY`(**违反此序曾导致 MAC 不生效,见 Trap 24**)
|
||||
- **IP/网关/掩码必须在 `INIT_CH395` 之前设置**,INIT 会读取并锁定当前寄存器值到协议栈
|
||||
- **`SET_PHY` 必须在 `INIT_CH395` 之后**,复位 MAC/PHY 建立物理链路,不影响已锁定的协议栈参数
|
||||
- **`CMD_PING_ENABLE` 不需要显式调用**,INIT 后默认可用
|
||||
@@ -735,3 +735,35 @@ NET 层 TCP Client(阶段 7)`net_connect()` 返回 0,但 `net_poll()` 报
|
||||
| 构建 / 回读 / 启动门禁 / 控制台 / 堆 | 0 错 0 警、`No difference found`、FORBID 0、`CONSOLE dropped 0`、`heap free=8776 min_ever=4816`(不变) |
|
||||
|
||||
**对应文件**:`Drivers/BSP/NET/net_types.h`(`released_abnormal`)、`Drivers/BSP/NET/net_socket.c`(三处置位/清除 + `net_pending_tick` 了结分支)、`Drivers/BSP/NET/lftpd/lftpd.c`(`receive_file` 错误路径 unlink)、`MDK-ARM/ftp_abort_probe.py`(`--check-abort`)。
|
||||
|
||||
---
|
||||
|
||||
## Trap 24:MAC 写入顺序违反手册 §9.2.1(SET_MAC 必须在 INIT_CH395 之前)
|
||||
|
||||
### 现象(静态审查发现;手册确证)
|
||||
`net_init()` 原顺序为 `ch395f_init()`(CMD_INIT_CH395)→ `ch395f_set_mac_addr()`,与手册 §9.2.1 规定的初始化顺序**相反**。后果:INIT_CH395 已按 EEPROM 旧值加载 MAC,其后写入 EEPROM 的新 MAC 本次上电**不生效**(回落芯片内置/上次值,实际"滞后一次上电")→ UI 配置的 MAC 与设备实际在线 MAC 不一致,设备在线身份错误、网口排查困难。本轮未做"UI 改 MAC + 重启"台架复现,结论由手册条文确证。
|
||||
|
||||
### 根因
|
||||
手册 §9.2.1「初始化 CH395,必要操作」顺序为:
|
||||
① `SET_MAC_ADDR` → ② `SET_IP_ADDR` → ③ `SET_GWIP_ADDR` → ④ `SET_MASK_ADDR` → ⑤ `INIT_CH395`。
|
||||
- §5.7:`SET_MAC_ADDR` 把 MAC **写入芯片内部 EEPROM**(约 30us);
|
||||
- §5.13:`INIT_CH395` **初始化 CH395 的 MAC、PHY 以及 TCP/IP 协议栈**(约 5ms)。
|
||||
|
||||
即 INIT_CH395 会从 EEPROM **加载** MAC,故 SET_MAC 必须先于 INIT_CH395。原码把 MAC 放在 INIT 之后。
|
||||
|
||||
**加剧误排的注释**:`ch395f.c` 原把 `set_mac_addr`/`set_ip_addr`/`set_gwip_addr`/`set_mask_addr` 的限定条件标为"芯片已初始化"——与手册矛盾(这四个 SET 实际都在 INIT 之前下发),易被误读为"须在 init 之后调用"。
|
||||
|
||||
### 解决
|
||||
1. `Drivers/BSP/NET/net_socket.c` `net_init()`:把 `ch395f_set_mac_addr()` 从 `ch395f_init()` **之后**移到**之前**(置于 SET_IP/GWIP/MASK 之前,对齐手册步骤①);
|
||||
2. `ch395f.c`:四个 SET 函数的限定条件注释统一改为"必须在 `ch395f_init()` 之前调用";
|
||||
3. `net_socket.h`:`net_init` 注释同步(MAC 于协议栈初始化**之前**下发)。
|
||||
|
||||
### 影响面
|
||||
- 仅 `net_init()` 一处调用(产品路径);改动为**纯顺序调整**,无新增/删除指令、无 RAM 变化;
|
||||
- `net_stack_bring_up()` 在 `net_init` 后回读芯片 MAC 写 UI 影子(`net_cfg_set_active_mac`)——修复后回读值 = 实际在线 MAC,UI 显示与线上身份一致。
|
||||
|
||||
### 对应文件
|
||||
`Drivers/BSP/NET/net_socket.c`(`net_init` SET_MAC 顺序)、`Drivers/BSP/NET/net_socket.h`(`net_init` 注释)、`Drivers/BSP/CH395F/ch395f.c`(四个 SET 的限定条件注释);`docs/网络/BSD_Socket_API_函数调用关系.md`(§4.1 / §7 顺序)。
|
||||
|
||||
### 发现时间
|
||||
2026-10-04(静态审查项 P1-7;依据手册 §9.2.1 / §5.7 / §5.13 定案)。
|
||||
|
||||
Reference in New Issue
Block a user