5.1 KiB
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 资料目录从项目 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”“未装配”或“不需要控制”:移除参考项目的旧复用、方向、初值及运行期控制,并在对应位置留下包含功能名的说明,例如:
// IR_LED: no GPIO on this board; no initialization required. -
信息不完整时禁止猜测寄存器、Bank/Bit 或初始电平;在报告中列为阻塞。
Kernel DTS/DTSI 占用检查
先按 调查范围与验证模式确定验证模式。两种模式都从实际构建使用的板级 .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 语法:
- 只冲突单个 GPIO 属性时,在最接近板级的有效节点覆盖中使用
/delete-property/,保留模块其他功能。 - 软件 I2C 等成组配置中,相关
scl/sda-pinmux与scl/sda-gpios必须成对处理,不能留下半套声明。 - 只有用户明确不使用整个模块,或释放 IO 后模块已经无法成立时,才设置
status = "disabled"。 - 只停用总线下某个设备时,禁用对应子节点,不牺牲整个控制器。
- 若模块仍有必要功能且无法安全释放单个 IO,停止并报告冲突。
示例:
/* 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 已验证。