Beaglebone Black Deb 10.3的简单GPIO设备树示例



我的目标是编写一个简单的.dts文件(使用DT 1.4.4编译为.dtbo(,在运行Debian 10.3的Beaglebone Black Rev C上启动时配置GPIO输出我打算将.dtbo放在/lib/firmware中,然后在/boot/uEnv.txt 中指定它

我理解.dts文件的某些部分,并尝试在/lib/firmware/中反编译现有的.dtbo文件以获得指导,但它们都不是一个简单的GPIO输出示例。很多在线资源都涉及制作和安装,但我相信DT现在应该能够处理它了,对吧?

我能够编译以下内容,但有问题:

/* dtc -O dtb -o BB-P8_13-LED.dtbo -b 0 -@ BB-P8_13-LED-00A0.dts */
/dts-v1/;
/plugin/;
/ {
compatible = "ti,beaglebone-black";
/* identification */
part-number = "BB-P8_13-LED";
version = "00A0";
/* state the resources this cape uses */
exclusive-use =
/* the pin header uses */
"P8.13",    /* GPIO_23 */
/* the hardware ip uses */
"gpio23";

fragment@0 {
target = <&am33xx_pinmux>;
__overlay__ {
bb_gpio23_pin: pinmux_bb_gpio23_pin {
pinctrl-single,pins = < 0x024 0x07 >; /*P8_13 GPIO23 MODE7*/
};
};
};

fragment@1 {
target = <&gpio23>;
__overlay__ {
leds {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&bb_gpio23_pin>;
compatible = "gpio-leds";
P8_13 {
label = "P8_13";
default-state = "on";
};
};
};
};
};

Q: 为什么在/boot/uEnv.txt中加载这个.dtbo会导致所有其他gpio从/sys/class/gpio/中消失?我认为fragment0是用于排除单个gpio,而不是所有gpio。

###Additional custom capes
uboot_overlay_addr4=/lib/firmware/BB-P8_13-LED-00A0.dtbo

Q: 控制GPIO(用于测试(的文件在哪里?更确切地说,我可以在.dts文件中添加什么,以便gpio23仍然出现在/sys/class/GPIO甚至/sys/cclass/leds中?最终,我希望能够控制这个GPIO与节点RED。

Q: 我需要与P8.13和P8_13的使用保持一致吗?我想我混淆了用make和DT编译的.dts文件中使用的术语。

Q: 我认为我fragment@1P8_13子节点缺少指定gpio组和活动高/低设置的内容。类似于";gpios=<amp;gpio3 19 GPIO_ ACTIVE_HIGH>quot;我在哪里可以研究GPIO23在哪家银行?那句话中的"19"是什么意思?

所以Derek Molly博士做得很好,我能够在他的报告中使用这个例子。以下是他制作的一个页面,用于解释如何使用设备树覆盖在启动时配置GPIO:http://derekmolloy.ie/beaglebone/beaglebone-gpio-programming-on-arm-embedded-linux/

尽管他的解决方案是针对3.8内核的,但我还是能够在4.19 上编译以下内容

/* dtc -O dtb -o BB-P8_13-LED-00A0.dtbo -b 0 -@ BB-P8_13-LED-00A0.dts */
/dts-v1/;
/plugin/;
/{
compatible = "ti,beaglebone-black";
part-number = "BB-P8_13-LED";
version = "00A0";
fragment@0 {
target = <&am33xx_pinmux>;

__overlay__ {
pinctrl_test: BB-P8_13-LED {
pinctrl-single,pins = <
0x024 0x27  /* P8_13 9 PULLUP ENABLED OUTPUT MODE7 - The LED Output */
>;
};
};
};
fragment@1 {
target = <&ocp>;
__overlay__ {
test_helper: helper {
compatible = "bone-pinmux-helper";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_test>;
status = "okay";
};
};
};
};

所有需要为不同GPIO引脚编辑的是";0x024";(地址偏移(和";0x27";以设置GPIO的各个方面,如上拉与下拉以及引脚复用模式。Derek Molly有一个旧版本的指南,其中有一个用于构建pinmux二进制值的表(需要转换为十六进制(:http://derekmolloy.ie/gpios-on-the-beaglebone-black-using-device-tree-overlays/

Beaglebone SRM中提供了大部分信息,我可能会在某个时候阅读这些信息。

我的第一个答案中的.dts文件没有解决我的问题。GPIO P8_13仍然作为输入引导。经过更多的挖掘和测试,我发现不可能让GPIO方向在重新启动后幸存下来。它将始终引导到默认值,您能做的最好的事情就是启用上拉或下拉电阻器来保持引脚的高电平或低电平,直到自定义服务文件(或程序(可以写入/sys/class/gpio/gpioXXX/方向。我甚至试着反编译am335x-boneblack.dtb,编辑它,然后重新编译,但没有成功。

这是令人悲伤和难以置信的沮丧。重新启动时闪烁的输出有什么好处?我想我将不得不用奇特的外部电路来补偿。

根据最初的问题,您可以编写一个dts文件,其中GPIO保留在/sys/GPIO/class/中。请参阅我在下面写的文章,以获得一个这样工作的示例。

https://takeofftechnical.com/beaglebone-black-led-control/

最新更新