文件
phonerail/firmware/main/board_pins.h
T
zhou yang和Claude Opus 5 45de84ed3c A7:五路配置表 + 表驱动遍历 + 启动自检
六组编号(INA 地址 / DAC 片通道 / 三个按键位 / EDL 位 / 两根 EN 的 GPIO)拼成
一张 const 表 rail_cfg(1..5),没有一列是顺排的。开机 rail_selftest() 把它和
A3~A6 四个驱动的表逐格对账,再查全板引脚重复 / 越界,不过就 abort ——
那四个自检谓词至此全部有了调用点。

判据拎成 rail_selftest_table(t) 单独可调:真表是 const 的,不这么做就没法证明
「真有事的时候查得出来」。测试复制一张表出来逐样改坏,六种坏法都验过。

顺带修一个真 bug:HAL 两侧 GPIO 边界写的是 pin < 48,而 EFUSE_EN2 就在 IO48
上 —— CH2 的 eFuse 既开不了也关不掉。sim 与 ESP 两份都改成 0~48 含。

9 条 ctest(131 个用例)全绿,idf.py build 通过,16 条注错 15 条变红
(唯一没红的那条与原因记在 HANDOFF.md)。

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-07 07:13:04 +08:00

68 行
3.2 KiB
C
原始文件 Blame 文件历史

此文件含有模棱两可的 Unicode 字符
此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。
/* ESP32-S3 引脚分配 —— 全固件唯一一份(设计文档 §8.1,2026-09-06 按 PCB 几何
重排的那一版,§26.18)。
⚠️ **引脚号是从「板上要去哪儿」倒推的,不是逻辑顺序。** 和 INA226 地址、
595 位号一样:查表,不要算。哪怕看上去像顺排(IO9~IO14 那一段),
也是巧合 —— `EFUSE_EN` 那五根就一个规律都没有(39 / 48 / 6 / 41 / 8)。
五路各自的 `EFUSE_ENn` / `VBUS_ENn` **不在这里**,在 `rail_cfg.h` 的那张五路表里
(它们是「每路一个」的东西,和 INA 地址、DAC 通道、按键位号是同一类)。
本文件只放**全板独一份**的那些脚。`rail_selftest()` 会把两边合起来查重。
⚠️ 这里的值与 `.claude/pcb1-parts.json` 里 U20(WROOM-1 模组)的真实焊盘网络
逐脚核对过(2026-09-07)。改动之前先回去核一遍,别照着记忆改。 */
#ifndef BOARD_PINS_H
#define BOARD_PINS_H
#ifdef __cplusplus
extern "C" {
#endif
/* ---- 全板独一份的信号(模组脚号 → GPIO) -------------------------------- */
#define BOARD_PIN_I2C_SDA 14 /* 模组脚 22 —— 6×INA226 + 2×DAC + PCA9555(+ 载板 LM75) */
#define BOARD_PIN_I2C_SCL 15 /* 模组脚 8 */
#define BOARD_PIN_FAN_TACH 16 /* 模组脚 9 → R731/R732 分压 */
#define BOARD_PIN_FAN_PWM 18 /* 模组脚 11 → R733 */
#define BOARD_PIN_UP_VBUS_DET 47 /* 模组脚 24 → J24.25,上游 VBUS 有没有插 */
#define BOARD_PIN_NTC1 1 /* 模组脚 39,ADC1_CH0 —— 必须是 IO1~IO10 */
#define BOARD_PIN_NTC2 2 /* 模组脚 38,ADC1_CH1 */
/* USB-Serial-JTAG 的 D±。**S3 上是硬连线,动不了**(模组脚 13/14 → J22)。
下载 / 调试口就是它,板上没有 JTAG 排针、也没有 USB 转串口芯片。
⚠️ 永远别烧 `DIS_USB_JTAG` eFuse —— 烧了引脚 JTAG 和 USB 两边都没有。 */
#define BOARD_PIN_USB_DM 19
#define BOARD_PIN_USB_DP 20
/* ---- 不许占用的脚 -------------------------------------------------------- */
/* strapping:挂负载会影响上电模式(S3 只有这四个是)。 */
#define BOARD_PINS_STRAPPING \
{ \
0, 3, 45, 46 \
}
/* WROOM-1 的 **R8 版(八线 PSRAM)占用**,留空以便换料。 */
#define BOARD_PINS_RESERVED \
{ \
35, 36, 37 \
}
/* ⚠️ **IO22~IO25 在 ESP32-S3 上根本不存在**(编号是连续的,芯片不是),
IO26~IO32 是模组内部的 SPI flash / PSRAM,引不出来。
写进配置表不会报错 —— `gpio_config()` 对不存在的脚只是无声无息什么也不做。 */
#define BOARD_PINS_ABSENT \
{ \
22, 23, 24, 25, \
26, 27, 28, 29, 30, 31, 32 \
}
/* ESP32-S3 的 GPIO 编号上限(IO48 **存在**,`EFUSE_EN2` 就在上面)。
⚠️ HAL 两侧的边界都写成 `pin <= BOARD_PIN_NUM_MAX`;A7 之前那里写的是
`pin < 48`,正好把 IO48 关在门外 —— 现象是 CH2 的 eFuse 既开不了也**关不掉**。 */
#define BOARD_PIN_NUM_MAX 48
#ifdef __cplusplus
}
#endif
#endif /* BOARD_PINS_H */