文件
phonerail/firmware/main/board_pins.h
T
zhou yang和Claude Opus 5.5 b8ad69681f 固件:R2 迁移 R-0 ~ R-6(底板 + 5 片同构刀片)
2026-09-16 完成、当时未提交,这里补提交(原样,不含 09-27 上板的修改)。

- 器件层 / 拓扑层整体从 R1 换到 R2:TCA9548A 分通道、五路同址 INA226 0x40 + 输入侧 0x43、
  刀片 PCA9555(VBUS_EN 挪到 P0.4)、CH224A 只读驱动、风扇闭环 t_thermal
- 新增 i2cbus(mux 原子事务)、slot(刀片 I/O 门面)、host/qtest.sh
- 74HC595 链退役(代码与测试保留)
- 判据阈值与时间常量未动;19 个 ctest 全绿,idf.py build 通过

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-27 10:26:24 +08:00

117 行
6.1 KiB
C
原始文件 Blame 文件历史

此文件含有模棱两可的 Unicode 字符
此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。
/* 底板 ESP32-S3 引脚分配 —— 全固件唯一一份(**R2 底板**,计划 §5.1)。
⚠️ **引脚号是从「板上要去哪儿」倒推的,不是逻辑顺序。** 和 INA226 地址、
PCA9555 位号一样:查表,不要算。
⚠️ **模组脚号 ≠ GPIO 号。** 下面每一行的注释里都写着模组脚号,那是给对着
原理图 / PCB 核对用的;`#define` 的值是 **GPIO 号**,那是给 `hal_gpio_*` 用的。
两者在 WROOM-1 上没有任何规律(脚 17 = IO9,脚 34 = IO41)。
五路各自的 `EFUSE_EN` / `PRSNT#` **不在这里**,在 `rail_cfg.h` 的那张五路表里
(它们是「每路一个」的东西)。本文件只放**全板独一份**的那些脚。
`rail_selftest()` 会把两边合起来查重。
⚠️ 这里的值与 `.claude/r2/_base_pcb_nets.json` 里 `U20`(WROOM-1 模组)的真实
焊盘网络逐脚核对过(2026-09-16),并与 `.claude/_esp32_pinmap.json` 的
`r2_base` 对上。改动之前先回去核一遍,别照着记忆改。
---- R1 → R2 变了什么(别拿老记忆改这个文件)----------------------------
· `VBUS_EN1~5` 五根 GPIO **没有了** —— 挪到刀片的 PCA9555 P0.4(计划 §5.4);
· 74HC595 的四根线**没有了** —— 整条链退役(R2 D9);
· 新增 `PRSNT#×5` / `MUX_RST#` / `INA_ALERT` / `HUB_RST` / `FAN_EN` / 第二路 TACH;
· I²C 从 IO14/15 挪到 IO41/42,NTC 从 IO1/2 挪到 IO4/5。 */
#ifndef BOARD_PINS_H
#define BOARD_PINS_H
#ifdef __cplusplus
extern "C" {
#endif
/* ---- 全板独一份的信号(模组脚号 → GPIO) -------------------------------- */
/* I²C 主干:TCA9548A(0x70) + 输入侧 INA226(0x43) + 两片 DAC63204(0x4A/0x4B)。
五片刀片的 INA226/PCA9555 在 mux 的分支上,不直接挂在这条线上。 */
#define BOARD_PIN_I2C_SDA 41 /* 模组脚 34 */
#define BOARD_PIN_I2C_SCL 42 /* 模组脚 35 */
/* TCA9548A 的 `RESET#`:板上 R611 上拉到 +3V3 ⇒ **低有效**。
ESP32 复位期间高阻 = mux 正常工作。 */
#define BOARD_PIN_MUX_RST_N 40 /* 模组脚 33 → U35.3 */
/* 五片刀片 PCA9555 的 `INT#` **线或**(R604 上拉)⇒ 低 = 有某一片报中断,
**看不出是哪一片**。中断只是加速路径:`t_safety` 每 20 ms 无条件读一圈,
因为 PCA9555 的 INT# 要读走输入端口才释放(漏掉一次就再也等不到下一个沿)。 */
#define BOARD_PIN_IOEXP_INT_N 39 /* 模组脚 32 → 五个插槽的 B11 */
/* 底板输入侧 INA226(U13, 0x43)的 ALERT,R605 上拉 ⇒ 低有效。
⚠️ R1 里这根是「六片线或进 PCA9555」,R2 只有这一片,而且直连 GPIO。 */
#define BOARD_PIN_INA_ALERT_N 38 /* 模组脚 31 → U13.3 */
/* USB2517I 的复位,上拉到 +3V3_HUB ⇒ 低有效。
⛔⛔ **运行期一个字都不许写它**(R2 D13 代价 2):ESP32 自己的控制台与烧录口
就挂在这个 Hub 的第 6 个下行口上,误复位 = 自断控制台,而且下一次烧录也进不来。
只在启动自检时脉冲一次;真出事的退路是 J33 那个 5P 应急串口。 */
#define BOARD_PIN_HUB_RST_N 8 /* 模组脚 12 → U32.43 */
#define BOARD_PIN_UP_VBUS_DET 6 /* 模组脚 6 → R721/R722 分压,上游 USB-C 插没插 */
/* 两路 NTC。**必须落在 ADC1(IO1~IO10)**:ADC2 在 WiFi 开着时读不了,
而本板 WiFi 常开。挪到 ADC2 不会报错,只会在连上 WiFi 之后开始读失败。 */
#define BOARD_PIN_NTC1 4 /* 模组脚 4,ADC1_CH3 → RT601 */
#define BOARD_PIN_NTC2 5 /* 模组脚 5,ADC1_CH4 → RT602 */
/* 风扇:一路 PWM 喂两个座(J26/J27),一个 12V 总开关,两路独立测速。
⚠️ `FAN_EN` 复位时高阻 + 下拉 = **风扇不转**,固件必须主动开(Q8 → Q7 两级)。
⚠️ 两路 TACH 各经一级开集三极管(Q9/Q10)**反相**后上拉 ⇒ 数边沿没问题,
但任何「按电平判它转没转」的写法都是反的。 */
#define BOARD_PIN_FAN_PWM 47 /* 模组脚 24 → R733 */
#define BOARD_PIN_FAN_EN 48 /* 模组脚 25 → R748 → Q8 */
#define BOARD_PIN_FAN_TACH_IN 21 /* 模组脚 23 → Q9 集电极(进风扇) */
#define BOARD_PIN_FAN_TACH_OUT 14 /* 模组脚 22 → Q10 集电极(出风扇) */
/* USB-Serial-JTAG 的 D±。**S3 上是硬连线,动不了**(模组脚 13/14)。
R2 里它接的是 **Hub 的第 6 个下行口**(D13:全机只剩一根线到电脑),
不再是一个独立的 USB-C 座。下载 / 调试 / 上位机 CDC 都走它。
⚠️ 永远别烧 `DIS_USB_JTAG` eFuse —— 烧了引脚 JTAG 和 USB 两边都没有。 */
#define BOARD_PIN_USB_DM 19
#define BOARD_PIN_USB_DP 20
/* ---- 不许占用的脚 -------------------------------------------------------- */
/* strapping:挂负载会影响上电模式(S3 只有这四个是)。
⚠️ IO0 在 R2 上接着 J33 应急口的下载脚,**更加不能当普通 GPIO 用**。 */
#define BOARD_PINS_STRAPPING \
{ \
0, 3, 45, 46 \
}
/* WROOM-1-**N16R8** 的八线 PSRAM 占用(2026-09-13 定的料号)。 */
#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 \
}
/* UART0(J33 应急口)。**不许当 GPIO 用**:它是 Hub 挂掉之后唯一进得来的路。 */
#define BOARD_PINS_UART0 \
{ \
43, 44 \
}
/* ESP32-S3 的 GPIO 编号上限(IO48 **存在**,`FAN_EN` 就在上面)。
⚠️ HAL 两侧的边界都写成 `pin <= BOARD_PIN_NUM_MAX`;A7 之前那里写的是
`pin < 48`,正好把 IO48 关在门外。 */
#define BOARD_PIN_NUM_MAX 48
#ifdef __cplusplus
}
#endif
#endif /* BOARD_PINS_H */