Beaglebone Black Deb 10.3 的简单 GPIO 设备树示例
Simple GPIO Device Tree Example for Beaglebone Black Deb 10.3
提前为一般性的 HELP ME 问题道歉。我已经尝试研究这个:
我的目标是编写一个简单的 .dts 文件(使用 DT 1.4.4 编译为 .dtbo)以在 Beaglebone Black Rev C 上启动时配置 GPIO 输出 运行 Debian 10.3
我打算将 .dtbo 放在 /lib/firmware 中,然后在 /boot/uEnv.txt
中指定它
我了解 .dts 文件的某些部分,并尝试反编译 /lib/firmware/ 中现有的 .dtbo 文件作为指导,但其中 none 是一个简单的 GPIO 输出示例。很多在线资源都涉及 make 和 make install 但我相信 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";
};
};
};
};
};
问:为什么在 /boot/uEnv.txt 中加载此 .dtbo 会导致所有其他 GPIO 从 /sys/class/gpio/ 中消失?我以为fragment0是为了排除单个gpio,而不是全部。
###Additional custom capes
uboot_overlay_addr4=/lib/firmware/BB-P8_13-LED-00A0.dtbo
问:用于控制 GPIO(用于测试)的文件在哪里,或者更确切地说,我可以将什么添加到我的 .dts 文件中,以便 gpio23 仍然出现在 /sys/class/gpio 甚至 /sys/class/leds 中?最终我希望能够使用 Node-RED 控制这个 GPIO。
问:P8.13 与 P8_13 的使用是否需要保持一致?我想我混淆了用 make 和 DT 编译的 .dts 文件中使用的术语。
问:我认为我的 fragment@1 P8_13 子节点缺少指定 gpio bank 和活动 high/low 设置的内容。类似于“gpios = <&gpio3 19 GPIO_ACTIVE_HIGH>;”我在哪里可以研究 GPIO23 在哪个银行?该声明中的“19”是什么意思?
我不是想偷懒,只是厌倦了我的 tires/getting 无处可去。
所以 Derek Molly 博士在布局方面做得非常好,我能够在他的 repo 中使用这个例子。这是他为解释如何使用设备树覆盖在启动时配置 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 的各个方面,如上拉与下拉和 pinmux 模式。 Derek Molly 有他的指南的旧版本,其中包含 table 用于构建 pinmux 二进制值(需要转换为十六进制):http://derekmolloy.ie/gpios-on-the-beaglebone-black-using-device-tree-overlays/
Beaglebone SRM 中提供了大部分信息,我可能应该在某个时候阅读它。
这是我最后一次就这个话题说。
我第一个答案中的 .dts 文件没有解决我的问题。 GPIO P8_13 仍然作为输入启动。经过更多的挖掘和测试后,我发现不可能让 GPIO 方向在重启后继续存在。它将始终启动到默认值,您可以做的最好的事情是启用上拉或下拉电阻以保持引脚高电平或低电平,直到自定义服务文件(或程序)可以写入 /sys/class/gpio/gpioXXX/direction。我什至尝试反编译 am335x-boneblack.dtb,编辑它,然后重新编译,但没有成功。
这令人难过,令人难以置信的沮丧。重启时闪烁的输出有什么好处?我想我得用花哨的外部电路来补偿。
提前为一般性的 HELP ME 问题道歉。我已经尝试研究这个:
我的目标是编写一个简单的 .dts 文件(使用 DT 1.4.4 编译为 .dtbo)以在 Beaglebone Black Rev C 上启动时配置 GPIO 输出 运行 Debian 10.3 我打算将 .dtbo 放在 /lib/firmware 中,然后在 /boot/uEnv.txt
中指定它我了解 .dts 文件的某些部分,并尝试反编译 /lib/firmware/ 中现有的 .dtbo 文件作为指导,但其中 none 是一个简单的 GPIO 输出示例。很多在线资源都涉及 make 和 make install 但我相信 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";
};
};
};
};
};
问:为什么在 /boot/uEnv.txt 中加载此 .dtbo 会导致所有其他 GPIO 从 /sys/class/gpio/ 中消失?我以为fragment0是为了排除单个gpio,而不是全部。
###Additional custom capes
uboot_overlay_addr4=/lib/firmware/BB-P8_13-LED-00A0.dtbo
问:用于控制 GPIO(用于测试)的文件在哪里,或者更确切地说,我可以将什么添加到我的 .dts 文件中,以便 gpio23 仍然出现在 /sys/class/gpio 甚至 /sys/class/leds 中?最终我希望能够使用 Node-RED 控制这个 GPIO。
问:P8.13 与 P8_13 的使用是否需要保持一致?我想我混淆了用 make 和 DT 编译的 .dts 文件中使用的术语。
问:我认为我的 fragment@1 P8_13 子节点缺少指定 gpio bank 和活动 high/low 设置的内容。类似于“gpios = <&gpio3 19 GPIO_ACTIVE_HIGH>;”我在哪里可以研究 GPIO23 在哪个银行?该声明中的“19”是什么意思?
我不是想偷懒,只是厌倦了我的 tires/getting 无处可去。
所以 Derek Molly 博士在布局方面做得非常好,我能够在他的 repo 中使用这个例子。这是他为解释如何使用设备树覆盖在启动时配置 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 的各个方面,如上拉与下拉和 pinmux 模式。 Derek Molly 有他的指南的旧版本,其中包含 table 用于构建 pinmux 二进制值(需要转换为十六进制):http://derekmolloy.ie/gpios-on-the-beaglebone-black-using-device-tree-overlays/
Beaglebone SRM 中提供了大部分信息,我可能应该在某个时候阅读它。
这是我最后一次就这个话题说。
我第一个答案中的 .dts 文件没有解决我的问题。 GPIO P8_13 仍然作为输入启动。经过更多的挖掘和测试后,我发现不可能让 GPIO 方向在重启后继续存在。它将始终启动到默认值,您可以做的最好的事情是启用上拉或下拉电阻以保持引脚高电平或低电平,直到自定义服务文件(或程序)可以写入 /sys/class/gpio/gpioXXX/direction。我什至尝试反编译 am335x-boneblack.dtb,编辑它,然后重新编译,但没有成功。
这令人难过,令人难以置信的沮丧。重启时闪烁的输出有什么好处?我想我得用花哨的外部电路来补偿。