如何在Yocto中为TI AM64XX设备树添加GPIO定义?
解决TI AM64XX设备树中“gpio1 not found”的问题
错误原因分析
你遇到的“label or path gpio1 not found”错误有两个核心原因:
- 基础设备树中未定义
gpio1别名,也未直接引用GPIO1控制器的正确节点路径 - 引脚配置节点直接放在根节点下,未挂载到AM64XX主域对应的引脚复用控制器(
main_pmx0)上
具体解决步骤
1. 确认GPIO1控制器的节点路径
打开项目依赖的TI官方设备树文件(如k3-am64-main.dtsi),找到GPIO1对应的标准节点定义:
gpio@6001000 { compatible = "ti,am64-gpio", "ti,keystone-gpio"; reg = <0x00 0x6001000 0x00 0x100>; interrupts = <GIC_SPI 166 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 167 IRQ_TYPE_LEVEL_HIGH>; gpio-controller; #gpio-cells = <2>; interrupt-controller; #interrupt-cells = <2>; ti,ngpio = <32>; ti,davinci-gpio-unbanked = <0>; status = "disabled"; };
2. 添加GPIO1别名(可选,简化引用)
在你的板级设备树的aliases节点中添加gpio1别名,方便后续代码引用:
aliases { // 保留原有别名,新增以下配置 gpio1 = &gpio@6001000; };
3. 启用GPIO1控制器并绑定引脚配置
在板级设备树中添加GPIO1的启用配置:
// 若已添加别名,用&gpio1;否则直接用&gpio@6001000 &gpio1 { status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&main_gpio1_pins_default>; // 若官方dtsi已定义#gpio-cells,可省略此行 #gpio-cells = <2>; };
4. 将引脚配置挂载到pinctrl控制器下
找到板级设备树中的&main_pmx0节点(AM64XX主域引脚复用控制器),将你的引脚配置作为子节点添加:
&main_pmx0 { main_gpio1_pins_default: main-gpio1-pins-default { pinctrl-single,pins = < AM64X_IOPAD(0x01C8, PIN_OUTPUT, 7) /* GPIO1_26 */ AM64X_IOPAD(0x01C4, PIN_OUTPUT, 7) /* GPIO1_25 */ AM64X_IOPAD(0x01C0, PIN_OUTPUT, 7) /* GPIO1_24 */ >; }; };
验证
重新编译设备树,“gpio1 not found”的错误会消失,配置的引脚会被设置为输出模式,后续C/C++代码可通过GPIO编号(如GPIO1_25对应编号25)控制这些引脚。
内容的提问来源于stack exchange,提问作者AnswerAndGetaCandy
相关产品推荐
相关产品推荐

