/* 底板 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 个下行口上,误复位 = 自断控制台,而且下一次烧录也进不来。 只在**上电复位**时脉冲一次(其余复位原因不碰,见 bringup.c 的 `hub_pulse()`);真出事的退路是 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 */