Files
firmware-lowlevel-development/skills/firmware-lowlevel-bsp-development/references/cv18-gpio-dts.md
T

87 lines
5.1 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.
# CV18 GPIO、Pinmux 与 Kernel DTS
## 适用范围
CV180*、CV181*、CV182*、CV183*、CV184* 项目先以实际 `buildEnvConfig.sh` 和配置布局确认芯片与有效文件。目录名和相近项目只能作为线索。
CV18 项目的 GPIO 复用、方向和启动安全初值通常由实际生效的 `cvi_board_init.c` 实现;Kernel DTS/DTSI 仍可能在 Linux 启动后声明同一 IO,必须同时检查。
## 内置 GPIO 资料查询
按 [内置 GPIO 资料目录](builtin-gpio-pinout.md)从项目 `buildEnvConfig.sh` 的 `EP_CHIP` 自动选择设计表,不要求用户重复提供已覆盖芯片的 PINOUT 文档。对 GPIO List 或原理图中的每个目标 Pad/GPIO/FMUX 执行 `scripts/bsp/query_builtin_pinout.py`,用返回的 Excel 行、Pad、Bank/Bit 复用项、FMUX 寄存器和默认值建立芯片侧证据。内置资料没有覆盖、查询无匹配或封装脚号冲突时停止;不得根据项目目录名或相近芯片猜测。
## `cvi_board_init.c` 语义
修改前读取整个相关函数,保留原有签名、调用阶段和代码风格:
- `PINMUX_CONFIG(pad, function)`:选择 Pad 复用功能;
- `Gpio_Set_Dir(base, bit, 1)`:按现有 CV18 实现配置输出;
- `Gpio_Set_Dir(base, bit, 0)`:按现有 CV18 实现配置输入;
- `Gpio_Set_Value(base, bit, value)`:设置输出状态或安全初值;
- `Gpio_Get_Value(base, bit)`:读取输入状态;
- `cvi_board_init()`:启动期复用、方向和初值;
- `cvi_update_led_control*()`、`cvi_get_key_status()` 等:运行期业务钩子,只修改与其功能相符的 GPIO;
- `ep_flash_bootidx()` 等启动钩子:只有需求确实涉及其 GPIO 时修改。
不得只按函数名或文本位置替换。对每个目标信号建立:功能名、Pad、复用功能、Bank/Bit、方向、有效电平、启动初值、运行期钩子和来源证据。
## 新增、移除与“无 GPIO”
- 参考项目没有、目标项目需要:只有 Pad、复用功能、Bank/Bit、方向和初值完整时才新增真实代码。
- 目标项目明确“无 GPIO”“未装配”或“不需要控制”:移除参考项目的旧复用、方向、初值及运行期控制,并在对应位置留下包含功能名的说明,例如:
```c
// IR_LED: no GPIO on this board; no initialization required.
```
- 信息不完整时禁止猜测寄存器、Bank/Bit 或初始电平;在报告中列为阻塞。
## Kernel DTS/DTSI 占用检查
先按 [调查范围与验证模式](scope-and-validation-modes.md)确定验证模式。两种模式都从实际构建使用的板级 `.dts` 开始,递归读取允许范围内的有效 `.dts`/`.dtsi`,不能扫描无关项目后把非生效引用当成冲突。
完整 DTS 审核模式下,SDK include 文件或条件编译上下文不可读时,不能得出“Kernel 未占用该 GPIO”的结论,并阻塞完整审核通过。EmxRes 配置模式下,只核对项目 Overlay 并明确降低验证等级;它不阻塞配置项目最终化,但在统一编译及最终 DTB 核对前不能声明 Kernel GPIO 占用已验证。
按 GPIO Bank/Bit 检查:
- `*-gpio`、`*-gpios` 和厂商自定义 GPIO 属性;
- `scl-pinmux`、`sda-pinmux` 等厂商 Pinmux 属性;
- 节点覆盖、子设备和 `status`;
- 被条件编译或注释掉的定义,区分生效与非生效;
- 新旧消费者和 `cvi_board_init.c` 之间的用途与有效电平。
## 释放旧消费者
优先最小化释放,沿用项目现有 Device Tree 语法:
1. 只冲突单个 GPIO 属性时,在最接近板级的有效节点覆盖中使用 `/delete-property/`,保留模块其他功能。
2. 软件 I2C 等成组配置中,相关 `scl/sda-pinmux` 与 `scl/sda-gpios` 必须成对处理,不能留下半套声明。
3. 只有用户明确不使用整个模块,或释放 IO 后模块已经无法成立时,才设置 `status = "disabled"`。
4. 只停用总线下某个设备时,禁用对应子节点,不牺牲整个控制器。
5. 若模块仍有必要功能且无法安全释放单个 IO,停止并报告冲突。
示例:
```dts
/* Release GPIOC_13 for LCD_DC; old board used it as display reset. */
&old_display {
/delete-property/ reset-gpios;
};
```
若新 GPIO 只用于 U-Boot 启动期初始化,DTS 只解除旧消费者,不虚构新设备节点。若它属于 Kernel 驱动管理的新设备,则在释放旧消费者后声明给正确新节点。
## 验证
逐个目标信号确认:
- Pad 复用与 GPIO Bank/Bit 一致;
- 输入没有无意义的输出初值,输出有明确安全初值;
- 同一 Pad 或 GPIO 没有重复用途;
- 运行期函数与启动期初始化引用一致;
- 明确无 GPIO 的功能没有残留旧控制代码;
- 项目 Overlay 与 SDK 的完整有效 DTS/DTSI include 链中,旧消费者、Pinmux 和 GPIO 属性已解除;
- 新 Kernel 消费者与 U-Boot 的用途和极性不冲突。
完整 DTS 审核模式检查整个有效 include 链;EmxRes 配置模式检查项目 Overlay,并在统一构建后尽量从最终 DTB 核对。不能执行对应验证时记录准确的未验证项,不得声称 Kernel 已验证。