4.3 KiB
4.3 KiB
feature, status, updated, branch, commits
| feature | status | updated | branch | commits |
|---|---|---|---|---|
| warm-jump-ecat-probe | delivered | 2026-09-16 | master | 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
根因
- BOOT
bootEcatDeinit()最后一条writeReg32(IRQ_CFG)把 LAN9252 的HBI_IDX_0留在 0x0054(索引模式残值,DS 9.5.4.2 复位默认才是 0x1234)。 - 跳转前硬复位在 BOOT 1.1.0.18 被刻意短路(1.1.0.13/14 实测那发复位会打死 warm jump),warm 路径芯片 不会 回到 POR 默认态。
- APP
EscLan9252::init()旧放行门是HBI_IDX_0==0x1234。该值只证明 「芯片刚出过复位」,证明不了 HBI 通路。warm 路径上探针必然假阴性 →s_busReady=false→ SSC 跳过 → 降级 ethercat。 - 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
- T1: 改
EscLan9252::init探针 — 放行门改为 BYTE_TEST,IDX 残值 WARN 放行,失败补一发 RST# 重探 — acceptance: 代码与 [S2] 契约一致 (covers: S2) - T2: 同步
esc_lan9252.h的isBusReady文档语义 — acceptance: 注释与实现一致 (covers: S2; depends: T1) - T3:
config.h版本 bump 1.6.40 + 来由注释 — acceptance: PATCH=40 且注释写明 warm-jump 根因 (covers: S2) - T4: 逻辑核对探针与调用方 — acceptance: 无 ARM 交叉编译环境,完成静态审查;
initial.cpp仍用isBusReady()&&isCoreReady()门控,语义兼容 (covers: S2; depends: T1)
工作区说明
用户选择隔离 worktree,但本环境拦截了 git worktree add(共享 ref store 保护)。改动落在主工作区未提交 diff,分支意图为 fix/warm-jump-ecat-probe。验收通过后需用户确认是否提交到 master。