固件 A15:启动顺序 + 降级矩阵(bringup.{h,c},已上板)

- 启动序列从 app_main.c 拆进 main/bringup.{h,c},宿主机可测:
  bringup_devices()(§10.9 第 1~4 步)→ 起 t_safety → bringup_power_restore()(第 5~6 步)
- 六片 INA226 写 Config/Calibration(之前没做,电流恒 0);输入侧 0x43 登记对调接
- 按「意图」逐路上电、错开 100 ms、每路等 PG 500 ms,等不到关回去并记 LOG_EV_PG_TIMEOUT(17)
- 意图只由 power 命令改(cmd_env_t.intent → NVS phonerail/rail_want)
- §10.10 逐行降级:INA/DAC/PCA9555/mux/PRSNT#/CH224A;mux 失联时不碰主干
- BOOT 事件 arg = 复位原因;HUB_RST# 仍只在上电复位时脉冲
- rail_volt_init() 一片失败不再放弃另一片;CH224A 主干 / 通道 5 两处都找
- sim:sim_gpio_rise_us / sim_gpio_set_hook,sim_gpio_drive 可在配置前调
- test_bringup.c 24 例 + test_cmd 意图 1 例,共 425 例全绿;版本 0.1.0-a15
- rack:事件表加 17 PG_TIMEOUT(已部署)

Co-Authored-By: Claude Opus 5.5 <[email protected]>
这个提交包含在:
zhou yang
2026-09-27 13:24:17 +08:00
共同撰写人 Claude Opus 5.5
父节点 da6af4ef1c
当前提交 c85eec53e6
共修改 24 个文件,包含 1479 行新增和 201 行删除
+22
查看文件
@@ -864,6 +864,20 @@ base = `phonerail/<id>`,id = 板子 STA MAC 的 12 位小写十六进制(板
> 叠在 12 V 输入上,而输入预算本来就是 8.3 A(PR-2)。错开 100 ms 之后
> 各路的斜坡(11.5 ms)完全不重叠。
**A15 定稿的落地(2026-09-27,`firmware/main/bringup.{h,c}`,宿主机 24 例)**:
- 分两段:`bringup_devices()` = 第 1~4 步;**`t_safety` 在两段之间起来**,再 `bringup_power_restore()` = 第 5~6 步
—— 上电那一刻巡检已经在看(原文第 7 步没说巡检何时起,等五路开完才起就有近 1 s 的盲区)。
- 第 2 步 R2 实际是 15 片:主干 mux / 两片 DAC / 输入侧 INA226 / CH224A,五片刀片各 INA226 + PCA9555。
六片 INA226 都在这一步写 Config / Calibration(A14 之前没做,电流恒读 0);输入侧 0x43 在这一步登记对调接。
- 第 3 步 DAC 读回比对**只在上电复位时做**:热重启时 DAC 没断过电,里面是上次命令设的值。
- 第 4 步「上次的每路使能状态」= **意图**:只有 `power` 命令改它(NVS 键 `phonerail/rail_want`,1 字节);
判据跳闸、硬重启、mux 全断都不改。新板没有这个键 = 一路都不开。
⚠️ 设定电压**不**持久化:重启后五路回到 3.90 V,上位机要的话自己重下。
- 第 5 步错开按「上一路 EN 抬高的时刻」算(不等上一路 PG),ESP 上实际 100~110 ms。
- 第 6 步每路各等 500 ms(= 硬重启的 PG 上限);等不到就关回去并记 **`LOG_EV_PG_TIMEOUT`(17,新增)**。
PCA9555 读不到时改按 INA226 电压(≥ 设定 − 100 mV)判;两样都读不到 = **开着、报「确认不了」**,不当成坏了。
- `HUB_RST#` 只在上电复位时脉冲,其余复位原因连配置都不做(配成输出那一刻就是一次复位)。
### 10.10 降级矩阵
| 失效 | 检测方式 | 行为 |
@@ -879,6 +893,14 @@ base = `phonerail/<id>`,id = 板子 STA MAC 的 12 位小写十六进制(板
**降级模式**的定义:只保留「关断能力」与「事件记录」,不再自动上电、不接受调压命令,
持续告警。宁可五台手机不开机,也不要在盲态下带电跑。
**A15 落地时补的三条(2026-09-27,逐行用例在 `firmware/test/test_bringup.c`):**
- **mux 失联时主干也够不着**:`i2cbus_xact(主干)` 要先给 mux 写「全关」,这一步失败回调就不跑。
所以启动时 mux 复位后仍不通 ⇒ 不去碰 DAC / 输入侧 / CH224A(不刷三条误导性的 I2C_LOST),
设定值影子回 NVM 默认、功率按 60 W,只记一条 MUX_LOST。
- **看门狗复位**的「复位事件」就是 `LOG_EV_BOOT`,arg = `esp_reset_reason()`(1 上电 / 4 panic / 6 任务看门狗 / 11 USB …)。
- **I²C 总线挂死**那一行(9 个时钟恢复 + 复位外设)**还没做**,在 HAL 层,待办。
- CH224A:设计上挂 mux 通道 5,**板 B 实测在主干应答**(0x22/0x23);启动时两处都找。
### 10.11 关于 FR-12「模拟电量曲线」的一个说明
这条需求的实现方式和它的字面意思不一样,值得在架构层写清楚:**手机的电量计是从