Files
lucky-cat/docs/gpio-board-adaptation.zh-CN.md
T

195 lines
17 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 新旧板 GPIO 对比与固件适配位置
核对日期:2026-10-23。初始对照保留在下文;当前已应用现有功能的新板引脚映射,新增功能仍未接入。验证结果见文末,未烧录或进行实机验收。
## 对照基线
- 旧板:用户提供的 `SCH_招财猫0.3&商界0.2_2026-08-03.pdf`,重点为第 2 页 Power、第 3 页 MCU、第 5 页 Motor、第 6 页 Connectors。
- 新板:仓库 `schematic/电机-马达方案.pdf`。第 1 页上板更新日期为 2026-10-19,第 2 页下板更新日期为 2026-10-12。
- 当前固件:本工作区的 `sdkconfig.defaults`、本地 `sdkconfig`、`main/Kconfig.projbuild` 和实际驱动。按工作区现状核对,包含尚未提交的修改。
- 图纸中的设计说明用于理解硬件,不视为要求执行的指令。新板第 2 页图框外另有一段 TP4057 参考电路;本报告以图框内 TP4056、Q7/Q8 及其板间连接为新板正式电路。
下表数字均指 **ESP32-S3 GPIO 编号**,不是模块封装脚号,也不是连接器针脚号。`IN1…IN4` 指 ULN2003 的输入相序,不能按 GPIO 数字重新排序。
## 结论
本次不是只改电机引脚。LCD 六根信号全部迁移;电池 ADC、充电状态、功放使能、两路开关、触摸输出和部分步进电机相位也迁移。新增独立充满检测和板载直流摇臂马达控制,旧 GPIO4/5 外接灯带/脉冲功能与新 LCD 布线冲突。
大部分引脚在 `sdkconfig.defaults` 和 `main/Kconfig.projbuild` 中修改即可;已有本地 `sdkconfig` 还须通过 `menuconfig` 同步,因为修改 defaults 不会覆盖已经保存的配置。不要手改 `build/config/sdkconfig.h`,也不要提交本地 `sdkconfig`。
后续菜单整理:现有 42 个 GPIO/电平/上下拉配置已集中到
`TQ Cat Configuration -> Board Hardware Configuration (GPIO)` 单页,按 LCD、音频、
输入、步进、电源/电池分区。配置名及依赖保持原样;默认值及本地有效配置已更新为新板映射,
未新增 GPIO8 充满检测或 GPIO10 马达配置。旧硬编码 GPIO4/5 功能保留源码,
平台初始化已移除其启动调用,不再创建这些任务。
下文 Kconfig 旧行号属于对照时快照,搬迁后应按配置名定位。
## 逐信号对照及修改入口
表中的配置名省略 `CONFIG_` 前缀;“适配前值”记录修改前本地 `sdkconfig` 和 defaults 的共同值。
| 信号/功能 | 旧板 GPIO | 适配前固件值 | 新板 GPIO | 要修改的配置或源码 |
| --- | ---: | ---: | ---: | --- |
| LCD 背光 BLK | 7 | 7 | **4** | `TQ_SCREEN_BACKLIGHT_GPIO`;`lcd_direct.c` 背光初始化 |
| LCD CS | 15 | 15 | **5** | `TQ_SCREEN_SPI_CS_GPIO`;`lcd_direct.c` SPI panel IO |
| LCD DC | 16 | 16 | **6** | `TQ_SCREEN_DC_GPIO`;`lcd_direct.c` GPIO/panel IO |
| LCD RES | 17 | 17 | **7** | `TQ_SCREEN_RESET_PIN`;`lcd_direct.c` 面板复位 |
| LCD 数据 MOSI / 新板 SDA | 18 | 18 | **15** | `TQ_SCREEN_SPI_MOSI_GPIO`;`lcd_direct.c` SPI bus |
| LCD 时钟 CLK / 新板 SCL | 8 | 8 | **16** | `TQ_SCREEN_SPI_CLK_GPIO`;`lcd_direct.c` SPI bus |
| LCD MISO | 未接 | -1 | 未接 | `TQ_SCREEN_SPI_MISO_GPIO=-1` 保持 |
| 电池电压检测 Power_t / 电量检测 | 9 | 9 | **17** | `TQ_BATTERY_ADC_GPIO`;`platform_battery_driver.c` |
| 充电状态 Charge / 充电检测 | 10 | 10 | **18** | `TQ_BATTERY_CHARGE_GPIO`;电池驱动、充电边沿中断及深睡唤醒链路 |
| 独立充满检测 | 未接入 MCU | 无 | **8** | 当前无配置项;需新增采样配置和状态映射,见后文 |
| 功放 PA_CTRL | 11 | 11 | **9** | `MULTIMODAL_AUDIO_PA_GPIO`;音频 codec 初始化及运行时使能 |
| 开关1 / 原 SW1 | 12 | 校准输入 12 | **11** | 若保持开关1作校准:`TQ_CALIBRATION_SWITCH_GPIO` |
| 开关2 / 原 SW2 | 13 | 抽签输入 13 | **12** | 若保持开关2作抽签:`TQ_SLOT_SWITCH_GPIO` |
| TTP223 触摸输出 | 3 | PTT 输入 3 | **13** | 若保持触摸作 PTT:`MULTIMODAL_PTT_BUTTON_GPIO`;有效电平另核对 |
| ULN2003 IN1 | 45 | 45 | **14** | `TQ_STEPPER_IN1_GPIO`;`platform_stepper_driver.c` |
| ULN2003 IN2 | 48 | 48 | **21** | `TQ_STEPPER_IN2_GPIO`;同上 |
| ULN2003 IN3 | 47 | 47 | **47** | `TQ_STEPPER_IN3_GPIO`;保持 |
| ULN2003 IN4 | 21 | 21 | **48** | `TQ_STEPPER_IN4_GPIO`;不能与 IN2 互换 |
| 直流摇臂马达控制 | 旧图 Swing 与 LCD CLK 共 GPIO8 | 外接脉冲输出 GPIO5 | **10** | 当前无独立 Kconfig;改造 `platform_io_effects.c` 脉冲输出及初始化策略 |
| 外接 WS2812 灯带 | 旧 TP_INT/GPIO4 被固件复用 | 硬编码 4 | 新图无专用接口 | 必须禁用或另行确认外接布线,不能继续占用 GPIO4 |
| 旧外接脉冲输出 | 旧 TP_SDA/GPIO5 被固件复用 | 硬编码 5 | GPIO5 已作 LCD CS | 必须迁移/禁用;是否由新 GPIO10 马达替代,由实际机械用途确认 |
按键语义不是原理图决定的:图纸只定义开关1、开关2和触摸输出;上表延续当前固件“校准 / 抽签 / PTT”分工。如果产品要调整按键用途,应另改控制层事件策略。
## 按 GPIO 看新板占用
| GPIO | 新板功能 | 适配动作 |
| --- | --- | --- |
| 0 | BOOT | 保持系统下载用途,不分配业务功能 |
| 1 / 2 | ES8311 I2C SDA / SCL | 保持音频 I2C 配置 |
| 3 | MCU 标 NC | 迁走当前 PTT;不再等候 GPIO3 触摸事件 |
| 4 / 5 / 6 / 7 | LCD BLK / CS / DC / RES | 修改显示配置;释放旧 GPIO4/5 输出;不要恢复旧 GPIO6 开关飞线配置 |
| 8 | 充满检测 | 输入;不得再输出 LCD 时钟 |
| 9 | PA_CTRL | 输出;不得再按电池 ADC 初始化 |
| 10 | 摇臂马达 MOS 控制 | 输出;不得再按充电输入初始化 |
| 11 / 12 | 开关1 / 开关2 | 输入;不得把 GPIO11 继续交给功放 |
| 13 | TTP223 触摸输出 | 输入;迁移 PTT 后释放原抽签占用 |
| 14 | 步进 IN1 | 输出;不得启用旧默认 GPIO14 Wi-Fi 重置键 |
| 15 / 16 | LCD SDA(MOSI) / SCL(SCK) | 保持 SPI 协议,SDA/SCL 命名不表示改成 I2C |
| 17 | 电池 ADC | 模拟输入;不得再作为 LCD RESET 输出 |
| 18 | 充电检测 | 输入;不得再输出 LCD MOSI |
| 19 / 20 | USB D- / D+ | GPIO 不变;新板经 33Ω 电阻到板间 USB 网络 |
| 21 / 47 / 48 | 步进 IN2 / IN3 / IN4 | 按相位名称配置 |
| 35 / 36 / 37 / 45 / 46 | MCU 标 NC | GPIO45 已不再连接步进 IN1;其余不新增业务配置 |
| 38 / 39 / 40 / 41 / 42 | I2S MCLK / BCLK / DOUT / WS / DIN | 保持原配置 |
| TXD0 / RXD0 | UART0 | 管脚不变;CN5 的 TX/RX 网络名与 MCU 收发方向交叉,不按网络名盲目交换固件方向 |
以上只描述图纸连接;NC 不等于已经确认可自由使用,仍须核对模块与 PCB。
## 修改文件导航
| 文件 | 具体位置/职责 | 本次适配建议 |
| --- | --- | --- |
| [sdkconfig.defaults](../sdkconfig.defaults) | PTT 约 195 行;音频约 211 行;LCD/电机/电池约 298–346 行 | 保存新板默认引脚;保持其他未提交配置 |
| [main/Kconfig.projbuild](../main/Kconfig.projbuild) | 文件顶部 `Board Hardware Configuration (GPIO)` 菜单 | 已同步现有项新板默认值及帮助文案;新功能未加选项 |
| [lcd_direct.c](../components/platform/src/lcd_direct.c) | 约 1634 行背光、1660 行 GPIO、1680 行后 SPI/panel 初始化 | 引脚已有配置化,通常不改驱动;新图注明 BLK 仅作使能,先用 0/100% 验证,不能直接认定支持调光 |
| [platform_io_effects.c](../components/platform/src/platform_io_effects.c) | 30/31 行 GPIO4/5 硬编码;186 行脉冲任务;277 行初始化 | 这是必须处理的代码冲突。先禁用旧 RMT/脉冲启动,再决定马达 GPIO10 的受控实现 |
| [platform_core_runtime.c](../components/platform/src/runtime/platform_core_runtime.c) | `platform_init()` 电源保持初始化之后 | 已移除旧 GPIO4/5 功能的启动调用;GPIO10 马达未启用 |
| [platform_stepper_driver.c](../components/platform/src/platform_stepper_driver.c) | 34–37 行相位宏;331 行 GPIO 初始化 | 使用 Kconfig,不应改相位表来代替正确引脚配置 |
| [platform_battery_driver.c](../components/platform/src/platform_battery_driver.c) | 约 136 行状态输入;158 行 ADC 映射;296 行采样状态 | 迁移 ADC/充电输入;新增独立充满输入及原始样本处理 |
| [platform.h](../components/platform/include/platform.h) | 约 406 行电池硬件样本契约 | 如接入充满检测,扩展平台硬件样本,保留未知/无效状态 |
| [domain.h](../components/domain/include/domain.h) / [domain_battery_service.c](../components/domain/src/battery/domain_battery_service.c) | 领域电池语义;样本到领域状态映射;约 363 行深睡调用 | 领域层拥有充电/满电语义,不能由显示层直接读取 GPIO8 判断 |
| [control_plane_battery_service.c](../components/control_plane/src/runtime/control_plane_battery_service.c) | 104 行起充电中断;约 400 行后满电推断/提示 | 迁移充电引脚配置自动覆盖现有中断;若新增满电检测,调整确认/提示策略和相应事件来源 |
| [domain_runtime_adapters.c](../components/domain/src/runtime/domain_runtime_adapters.c) | 807 / 836 / 865 行三路数字输入映射 | 已读取配置,单纯迁脚通常无需改;核对 PTT 有效电平 |
| [control_plane_key_input.c](../components/control_plane/src/runtime/control_plane_key_input.c) | 158 行起 `s_key_configs` | 同步核对三路按键及可选 reset,不把两个功能配置到同一 GPIO |
| [audio_pipeline_codec_impl.c](../components/platform/src/multimodal/audio_pipeline/audio_pipeline_codec_impl.c) | 148 行 I2C;223 行 I2S;318 行 PA | I2C/I2S 不变,PA 配置迁移到 9 |
| [audio_pipeline_runtime_impl.c](../components/platform/src/multimodal/audio_pipeline/audio_pipeline_runtime_impl.c) | 约 1536 行 PA 开关 | 已使用 PA 配置;与 codec 初始化共同核对 |
| [platform_behavior_stubs.c](../components/platform/src/platform_behavior_stubs.c) | 57 行起 power hold | 保持 `TQ_POWER_HOLD_GPIO=-1`,新板没有 MCU 电源保持控制网 |
| [gpio-map.md](gpio-map.md) / [firmware-pin-usage.md](firmware-pin-usage.md) | 原有板级/固件引脚表 | 实施时按板型注明适用版本并同步,不把旧表直接当新板事实 |
行号为本次工作区快照,后续应优先按配置名或函数名搜索。
## 适配注意事项(原理与后续工作)
### 1. GPIO4/5 的后台输出冲突
保留的旧 `platform_io_effects_init()` 实现会创建 GPIO5 脉冲任务和 GPIO4 RMT 灯带任务。即使 LCD 已改成新引脚,这些任务仍可能持续改写 BLK/CS。因此只改屏幕六个配置不够,也不能只把 `PLATFORM_PULSE_GPIO` 改为 10 后继续让 RMT 占 GPIO4。
新图没有专用 WS2812 连接;不能自行选择一个 NC 引脚作为灯带接口。若迁移摇臂马达,应明确启动、停止、默认关闭和有界退出,不能把旧的无限脉冲循环直接视为已经完成的新电机驱动。
### 2. 电池电压采样
旧板为 GPIO9 的 Power_t。新板 GPIO17 对应 ESP32-S3 的 ADC2 通道6。驱动已去掉仅接受 ADC1 的旧限制,ADC 初始化与校准均使用 ESP-IDF 返回的单元/通道;读取失败继续返回错误,不把无效值当作低电量。
GPIO17 的“电量检测”来自下板 Q5/Q6 控制后的电池分压:R6、R11 均为 100kΩ,名义比例仍为 1:2;上板还有 C31 100nF 滤波。
`TQ_BATTERY_DIVIDER_HIGH_OHM/LOW_OHM` 可先保留 100000/100000。新电路有 MOS 开关,需实测上电、深睡和负载时检测点电压与真实 VBAT 的对应关系,再决定校准增益/偏移。不要因 GPIO 换位就修改 SOC 曲线。
### 3. 充电与充满检测
新下板正式电路使用 TP4056,CHRG#/STDBY# 经 Q7/Q8、3.3V 上拉后送至 GPIO18/GPIO8。按电路作用可预期状态拉低时对应输入低有效,但这属于图纸推断:首次上板应记录“未插电 / 正在充电 / 充满 / 无电池”的两路实际电平,再确定配置和异常组合处理。不能仅凭换了充电芯片就反转电平。
现有固件只有“未知 / 未充电 / 充电中”硬件充电状态,满电提示依赖电压、百分比、时间确认。`TQ_BATTERY_FULL_MIN_*` 是满电推断阈值,**不是 GPIO8 配置项**。
最小迁移可以先只使用 GPIO18,保留旧满电推断,并明确 GPIO8 尚未使用。要利用独立充满检测,需增加配置、平台原始采样、领域状态解释及控制层提示策略;不在上层 facade 复制平台类型,也不在 LCD 内读取原始 GPIO。
充电 GPIO 同时参与中断和深睡唤醒:`domain_battery_service.c` 将 `CONFIG_TQ_BATTERY_CHARGE_GPIO` 传给 `platform_power_enter_deep_sleep()`,实施时一并检查唤醒驱动对新引脚及有效电平的处理。
### 4. 两个机械开关与触摸 PTT
开关1/2均有外部 10kΩ 上拉、闭合接地,可沿用有效电平 0、内部上拉开启、下拉关闭。TTP223 是主动输出,触摸有效电平取决于实际模式/焊接配置;不能因当前 PTT 设置为低有效,就认定新 GPIO13 也低有效。需要实测空闲/触摸电平,并同步 `MULTIMODAL_PTT_BUTTON_ACTIVE_LEVEL` 及上下拉。
现有 `firmware-pin-usage.md` 写 PTT=13、抽签开关=6,但适配前 defaults、本地 sdkconfig 和 Kconfig 实际为 PTT=3、抽签=13。新板现已改为 PTT=13、抽签=12。新板 GPIO6 是 LCD DC,GPIO13 是触摸输出,旧文档的 GPIO6 飞线方案不可沿用。
`TQ_RESET_BUTTON_ENABLE` 当前关闭;其默认 GPIO14 已成为新步进 IN1。新板没有独立 reset 键接线时保持关闭,不要只因该配置存在就启用。
### 5. 电机电源与顺序
新板步进电机由下板 Boost-5V、ULN2003 驱动;直流摇臂马达由上板 3.3V、Q3 AO3400A 低侧控制,GPIO10 高电平导通,R30 100kΩ 下拉提供关断偏置。二者不是同一驱动,不能把 GPIO10 加进四相步进表。
新板步进顺序必须为 IN1=14、IN2=21、IN3=47、IN4=48。原 GPIO45 在新图为 NC。首次验证需确认方向、校准开关及有界停止;供电变化不能仅靠 GPIO 表验证。
## 已应用的新板配置
以下已有配置项均已写入 Kconfig 默认值、sdkconfig.defaults 和本地 sdkconfig。PTT 有效电平仍待实测,新增 GPIO8/10 功能未接入。
```ini
CONFIG_TQ_SCREEN_BACKLIGHT_GPIO=4
CONFIG_TQ_SCREEN_SPI_CS_GPIO=5
CONFIG_TQ_SCREEN_DC_GPIO=6
CONFIG_TQ_SCREEN_RESET_PIN=7
CONFIG_TQ_SCREEN_SPI_MOSI_GPIO=15
CONFIG_TQ_SCREEN_SPI_CLK_GPIO=16
CONFIG_TQ_SCREEN_SPI_MISO_GPIO=-1
CONFIG_TQ_BATTERY_ADC_GPIO=17
CONFIG_TQ_BATTERY_CHARGE_GPIO=18
CONFIG_MULTIMODAL_AUDIO_PA_GPIO=9
CONFIG_TQ_POWER_HOLD_GPIO=-1
CONFIG_TQ_CALIBRATION_SWITCH_GPIO=11
CONFIG_TQ_SLOT_SWITCH_GPIO=12
CONFIG_MULTIMODAL_PTT_BUTTON_GPIO=13
# CONFIG_TQ_RESET_BUTTON_ENABLE is not set
CONFIG_TQ_STEPPER_IN1_GPIO=14
CONFIG_TQ_STEPPER_IN2_GPIO=21
CONFIG_TQ_STEPPER_IN3_GPIO=47
CONFIG_TQ_STEPPER_IN4_GPIO=48
```
平台初始化已停止调用旧 GPIO4/5 输出模块;GPIO8 满电和 GPIO10 马达没有新增配置项。音频 SDA=1、SCL=2、MCLK=38、BCLK=39、DOUT=40、WS=41、DIN=42 保持。
## 实施顺序与验证边界
1. 先在新板配置下禁用旧 GPIO4/5 任务,保持马达默认关闭;必要时首次调试暂时关闭开机转盘校准。
2. 同步 defaults、Kconfig 和本地有效配置,核对 GPIO8/17/18 全部为输入用途、GPIO9 为 PA、GPIO14 无 reset 冲突。
3. 验证 LCD、音频、开关1/2及触摸有效电平,再分别验证步进相序和摇臂马达,最后启用开机校准。
4. 测量 ADC 与 VBAT、充电/充满两路真值表,验证拔插充电、满电提示、低电量及深睡唤醒。
5. 实施后执行 ESP-IDF 5.5.4 构建;修改显示配置/机制后执行仓库列出的五个显示回归脚本,并按实际变更补充检查。检查联网、语音与电机同时运行时的稳定性。
6. 同步 GPIO 两份说明和受影响的中文开发指南;保留旧板版本信息。涉及新增跨层状态时遵守现有电池契约所有权,不在 composition 添加硬件策略。
本次证据层级:两份 PDF 文本提取及关键连线视觉核对、工作区配置和源码静态核对。新板配置的构建与回归记录见下方;没有设备验证结果。
### 2026-10-23 重新切换新板后的验证记录
本次在保留 VAD 重复 PTT 修复和 kikivok.com 域名迁移的基础上重新应用;以下主机测试与构建均已重新执行。
- 现有 27 个 GPIO/PIN 选项数量未变;Kconfig 默认值、sdkconfig.defaults、本地 sdkconfig 一致,已启用的 GPIO 无重复,GPIO8/10 未分配新功能。
- 主机:五个显示回归脚本全部通过,包括脚本自带 profiling 开/关分支;`tools/test_battery_adc_init.py` 通过实际 C 初始化函数的 ADC2/ADC1 单元和通道传递、重复初始化、锁失败、通道/校准失败释放与重试。
- 构建:ESP-IDF 5.5.4 新板有效配置构建通过;应用镜像 3,154,064 B。首次受沙箱 sysctl 权限限制,放宽本地构建权限后完成;未修改工具链或组件管理器。
- 未增加运行时任务、像素/音频缓存或 DMA 缓冲;旧 GPIO4/5 输出任务不再创建。未烧录,尚未确认触摸电平、ADC2 在 Wi-Fi 负载下采样、充电/唤醒、步进方向及显示并行稳定性。