我正在使用 TI AM64XX 和一个基础项目,该项目在设备树上对电路板的某些 GPIO 进行了有限的定义。我需要比 DTS 中定义的更多的 GPIO,以便稍后在我的 C/C++ 代码中使用并将它们作为简单输出进行操作。根据数据表,我选择了引脚
gpio1_26
、gpio1_25
,但我不知道如何准确修改设备树,以实现这三个GPIO
&gpio1 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&main_gpio1_pins_default>;
gpio-controller;
};
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 标签或路径
我不知道你的CPU,但一般来说应该可以通过额外的GPIO来扩展当前块。
main_gpio1_pins_default: main-gpio1-pins-default { pinctrl-单,引脚 = < AM64X_IOPAD(0x01C8, PIN_OUTPUT, 7) /* gpio1_26 / AM64X_IOPAD(0x01C4, PIN_OUTPUT, 7) / gpio1_25 */ AM64X_IOPAD(0x01C0, PIN_OUTPUT, 7) /*gpio1_24 */ [在此放置更多条目] >; };
查看 CPU 的说明,找到所需 GPIO 的 PIN。还应该有一个计算地址的描述。对于其他 TI CPU,可以使用在线工具完成此操作。 或者可能有一个包含所有可用 GPIO 引脚的映射文件。 Grep 代码。
正如您在编译输出中看到的,
gpio1
节点没有定义。 dts 中的 &
符号引用先前定义的节点,如果默认情况下未定义该节点或者您没有明确定义它,则该引用没有任何意义。
查看您正在使用的 dts“k3-am642-sk.dts”,我发现第 130 行中有一个名为 main_pmx0
的节点,这是主要的 pinmux 模式节点,您应该在其中添加您的配置。
另一种选择(实际上是推荐的)是制作一个 .dtsi
文件并将其包含在您的主文件中,但为了简单起见,您可以修改原始文件。
在主 pinmux 节点内,您可以定义引脚:
&main_pmx0 {
custom_pins: custom_pins {
pinctrl-single,pins = <
AM64X_IOPAD(0x01C8, PIN_OUTPUT, 7)
AM64X_IOPAD(0x01C4, PIN_OUTPUT, 7)
>;
};
在示例中我刚刚添加了 2 个引脚,请随意添加您想要的数量。
这样做,您应该能够使用 gpios
sys/class/gpio
或 gpio char dev 驱动程序(或 libgpiod 等工具)
注意:请务必对 pinmux 模式进行适当的研究(请参阅相应的参考处理器手册),有些引脚不能用作 gpios。我刚刚复制了您在问题中写的引脚方向和 pinmuxmode,假设您已经获得了该信息。
注意 2:如果您使用 bitbake 进行编译,那么您应该重新编译 .wic 映像,否则 nvm
注3(回复您的评论): 如果您没有看到
/sys/class/gpio
,那是因为它已被弃用,新标准是使用 gpio char device
。如果你这样做 ls /dev
,你会发现一些名为 gpiochipX
的角色开发驱动器。
如果你想添加 sys/class/gpio 那么你必须在内核 menuconfig 中配置它:
打开内核菜单配置并激活以下内容:
Symbol: EXPERT [=y]
Location:
General Setup --->
[*] Configure standard kernel features (expert users)
Symbol: SYSFS [=y]
Location:
File systems --->
Pseudo file systems --->
-*- sysfs file system support
Symbol: GPIO_SYSFS [=y]
Location:
Device Drivers --->
[*] GPIO support --->
[*] sys/class/gpio