Files
DCU_APP/docs/compose/spec/warm-jump-ecat-probe.md

82 lines
4.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
feature: warm-jump-ecat-probe
status: delivered
updated: 2026-09-16
branch: master
commits: 7d9d9c7..uncommitted
---
# Warm Jump 后 EtherCAT 起板探针修复
## Report
**What was built** — APP 1.6.40:`EscLan9252::init` 起板探针放行门从
`HBI_IDX_0==0x1234` 改为 `BYTE_TEST==0x87654321`。warm jump 残留的
`HBI_IDX_0=0x0054` 只打 WARN 并放行;BYTE_TEST 不过才补一发 RST# 重探一轮。
cold 路径行为不变(仍等芯片出复位到 0x1234 再测 BYTE_TEST)。
**Verification** — 无 ARM 交叉编译环境;静态审查通过(spec 合规 / 正确性 /
代码风格),reviewer 无 critical。上板验收:ECAT 刷完 warm jump 后串口应见
`[ECAT][ESC] init: OK`(可带 `WARN idx0=0x0054`),`[APP] init` 不再报
`skipped/failed: ethercat`,主站可建连;reset 路径回归不破坏。
**Journey log**
- BOOT 1.1.0.18 短路 `escResetForJump` 是刻意实验;APP 侧旧探针把「复位默认值」
当成通路判据,在 warm 残值上必然假阴性。
- 主工作区曾有一份未完成的 1.6.40 草稿;本任务收口并跳过 warm 残值的 300ms 空等。
- 用户选了隔离 worktree,但本环境拦截 `git worktree add`,改动落在主工作区未提交 diff。
## [S1] Problem
刷完固件后 BOOT(1.1.0.18,跳转前 `escResetForJump()` 已短路)warm jump 进 APP:
APP banner 正常,但 EtherCAT 不可用(自检降级 / 主站无法建连)。按复位键走 cold
jump 后 EtherCAT 恢复。同一镜像、同一 APP 启动链,差异只在进入 APP 前 ESC 的
HBI 索引寄存器状态。
## [S2] Design
### 根因
1. BOOT `bootEcatDeinit()` 最后一条 `writeReg32(IRQ_CFG)` 把 LAN9252 的
`HBI_IDX_0` 留在 **0x0054**(索引模式残值,DS 9.5.4.2 复位默认才是 0x1234)。
2. 跳转前硬复位在 BOOT 1.1.0.18 被刻意短路(1.1.0.13/14 实测那发复位会打死
warm jump),warm 路径芯片 **不会** 回到 POR 默认态。
3. APP `EscLan9252::init()` 旧放行门是 `HBI_IDX_0==0x1234`。该值只证明
「芯片刚出过复位」,证明不了 HBI 通路。warm 路径上探针必然假阴性 →
`s_busReady=false` → SSC 跳过 → 降级 ethercat。
4. cold 路径芯片自带 POR,`IDX_0` 天然 0x1234,与 PB10 那发复位无关 ——
这正是「reset 能好、刷完不行」的分界。
### 修复契约
- **BYTE_TEST(0x064==0x87654321)是唯一物理通路门**。`readReg32` 每次访问前
都 `setHbiIndex(addr)`,完整「索引写 + 数据低/高字读」往返,与复位态无关。
- `HBI_IDX_0` 降级为诊断读数:异常时打 WARN 并放行,不再导致 `return false`。
- 任一判据不过 → 补一发 `hardwareReset()` 再探一轮(此刻 SSC 未 MainInit,
二次复位零配置代价)。两轮仍不通 = 总线物理不通,维持降级。
- `s_busReady` 语义同步:EXMC + BYTE_TEST 通过即 true(与 `initial.cpp` 的
`isBusReady()&&isCoreReady()` 门控一致)。
### 不做的事
- 不改 BOOT(1.1.0.18 保持 RST# 短路);APP 侧已能兜住 warm 残值。
- 不把 `HBI_IDX_0==0x1234` 恢复为硬门。
- 不动 PDO/SII/主站解码。
## [S3] Out of Scope
- BOOT `bootEcatDeinit` 的 PD/PE 浮空注释错误、`escResetForJump` 时序重设计。
- PHY 链路重协商窗口与主站 probe 重试(另见 `ecat_boot_handoff_link_issue.md`)。
- 1.6.35~38 启动链实验回退项(已在 1.6.39 完成)。
## Tasks
- [x] T1: 改 `EscLan9252::init` 探针 — 放行门改为 BYTE_TEST,IDX 残值 WARN 放行,失败补一发 RST# 重探 — acceptance: 代码与 [S2] 契约一致 (covers: S2)
- [x] T2: 同步 `esc_lan9252.h` 的 `isBusReady` 文档语义 — acceptance: 注释与实现一致 (covers: S2; depends: T1)
- [x] T3: `config.h` 版本 bump 1.6.40 + 来由注释 — acceptance: PATCH=40 且注释写明 warm-jump 根因 (covers: S2)
- [x] T4: 逻辑核对探针与调用方 — acceptance: 无 ARM 交叉编译环境,完成静态审查;`initial.cpp` 仍用 `isBusReady()&&isCoreReady()` 门控,语义兼容 (covers: S2; depends: T1)
### 工作区说明
用户选择隔离 worktree,但本环境拦截了 `git worktree add`(共享 ref store 保护)。改动落在主工作区未提交 diff,分支意图为 `fix/warm-jump-ecat-probe`。验收通过后需用户确认是否提交到 master。