固件 0.1.14~0.1.16-c5:Hub 按需启停(hubctl)、开机长按统一 5 s

Co-Authored-By: Claude Opus 5.5 <[email protected]>
这个提交包含在:
zhou yang
2026-10-04 19:24:31 +08:00
共同撰写人 Claude Opus 5.5
父节点 92f38c2328
当前提交 c41d1ec931
共修改 21 个文件,包含 764 行新增和 18 行删除
+7 -8
查看文件
@@ -73,16 +73,14 @@ static hal_err_t pd_fn(void *arg)
/* ---- 第一段 -------------------------------------------------------------- */
/* USB2517I 的复位脉冲 —— **整个固件里唯一碰 `HUB_RST#` 的地方,而且只在启动调一次**
(A15 从 app_main.c 搬过来的,理由原样保留)。
/* USB2517I 的复位脉冲 —— 启动时的那一次(A15 从 app_main.c 搬过来的)。
低有效(板上 R716 上拉到 +3V3_HUB),给 1 ms 足够:手册要的是几十微秒量级。
⛔⛔ **运行期一个字都不许再写它**(R2 D13 代价 2)。ESP32 自己的
USB-Serial-JTAG 就挂在这个 Hub 的第 6 个下行口上,所以复位 Hub =
**自己把自己的控制台拔了**,而且下一次 `idf.py flash` 也进不来
—— 到那时候唯一的退路是 J33 那个 5P 应急串口(UART0,IO43/IO44),
得拆机接线。写一行 "Hub 卡了就复位一下" 的自愈代码,代价是整机变砖。
⚠️ 运行期**只有 hubctl.c 许碰它**(0.1.14 起按需启停,推翻了 R2 D13 代价 2 的
「运行期一个字都不许写」,退路见 hubctl.h)。ESP32 自己的 USB-Serial-JTAG 就挂在
这个 Hub 的第 6 个下行口上,所以复位 Hub = 自己把自己的控制台拔了 ——
别处写一行 "Hub 卡了就复位一下" 的自愈代码,就绕开了 hubctl 的那几条退路。
⛔ **只在上电复位(`ESP_RST_POWERON`)时脉冲**(2026-09-27 上板改)。
ESP32 的每一次重启都算启动:esptool 经 USB 复位芯片、崩溃 / 看门狗重启、
@@ -100,7 +98,7 @@ static void hub_pulse(void)
}
(void)hal_gpio_write(BOARD_PIN_HUB_RST_N, 0); /* 低 = 复位 */
hal_time_delay_ms(1);
(void)hal_gpio_write(BOARD_PIN_HUB_RST_N, 1); /* 放开,之后再也不动 */
(void)hal_gpio_write(BOARD_PIN_HUB_RST_N, 1); /* 放开;随后 hubctl_init() 把它放成输入 */
}
/* mux:`i2cbus_init()` 认不到 ⇒ 按 §5.8 先脉冲一次 `MUX_RST#` 再判。 */
@@ -212,6 +210,7 @@ hal_err_t bringup_devices(const bringup_in_t *in, bringup_report_t *r)
/* `UP_VBUS_DET`:上游 USB-C 的 VBUS 经 R721/R722 分压进来,高 = 电脑插着。
板上 R722 下拉到地,所以不开内部上下拉。只进遥测(status 的 `host`),不参与任何判据:
Hub 连着电脑时比挂起多吃约 1 W,没有它面板上的「损耗」会无缘无故跳一档。
0.1.14 起 hubctl 也读它:上升沿(电脑刚插上)算一次「需要」。
失败不 abort —— 读不到时 status 报 null。每次启动都配:配成输入没有副作用。 */
(void)hal_gpio_config(BOARD_PIN_UP_VBUS_DET, HAL_GPIO_INPUT);