4

如果我从 shell 加载我自己的设备树覆盖,它加载正常,但如果我尝试在启动时加载它,它不会这样做。我错过了什么?

这是我使用 bone-debian-7.4-2014-04-23-2gb.img.xz
Linux beaglebone 3.8.13-bone47 #1 SMP Fri Apr 11 01:36:09 UTC 2014 armv7l GNU设置的 debian BeagleBone Black /Linux

这是我对 /boot/uboot/uEnv.txt 所做的更改:

optargs=capemgr.enable_partno=BB-FOO-GPIO

这是dmesg |的输出 grep 骨capemgr

底板:'A335BNLT,00A5,4049BBBK7400'
compatible-baseboard=ti,beaglebone-black
slot #0: No cape found
slot #1: No Cape found
slot #2: No Cape found
slot #3: No Cape found
slot #4:特定覆盖
骨骼:在插槽 4 处使用覆盖 eeprom 数据
插槽 #4:'Bone-LT-eMMC-2G,00A0,Texas Instrument,BB-BONE-EMMC-2G'
插槽 #5:特定覆盖
骨骼:在插槽 4 处使用覆盖 eeprom 数据插槽 5
插槽 #5:'Bone-Black-HDMI,00A0,Texas Instrument,BB-BONELT-HDMI'
插槽 #6:特定覆盖
骨骼:在插槽 6 上使用覆盖 eeprom 数据
插槽 #6:'Bone-Black-HDMIN, 00A0,德州仪器,BB-BONELT-HDMIN'
enabled_pa​​rtno part_number 'BB-FOO-GPIO', version 'N/A', prio '0'
slot #7: generic override
bone: Using override eeprom data at slot 7
slot #7: 'Override Board Name,00A0,Override Manuf, BB-FOO-GPIO'
加载器:在 slot-4 之前 BB-BONE-EMMC-2G:00A0 (prio 1)
加载器:检查 slot-4 BB-BONE-EMMC-2G:00A0 (prio 1)
加载器:在 slot-5 之前BB-BONELT-HDMI:00A0 (prio 1)
loader: 检查 slot-5 BB-BONELT-HDMI:00A0 (prio 1)
loader: 在 slot-6 之前 BB-BONELT-HDMIN:00A0 (prio 2)
loader: 检查 slot- 6 BB-BONELT-HDMIN:00A0 (prio 2)
初始化正常。
加载程序:检查插槽 4 BB-BONE-EMMC-2G:00A0 (prio 1)
加载程序:检查插槽 5 BB-BONELT-HDMI:00A0 (prio 1)
加载程序:检查 slot-6 BB-BONELT-HDMIN:00A0 (prio 2)
加载程序:在 slot-7 之前 BB-FOO-GPIO:00A0 (prio 0)
加载程序:检查 slot-7 BB-FOO-GPIO:00A0 (prio 0 ) )
loader: 在 slot-7 BB-FOO-GPIO:00A0 (prio 0)
slot #7: Requesting part number/version based 'BB-FOO-GPIO-00A0.dtbo
slot #7: 请求固件 'BB-FOO-GPIO -00A0.dtbo' for board-name 'Override Board Name', version '00A0'
failed to load firmware 'BB-FOO-GPIO-00A0.dtbo'
loader: failed to load slot-7 BB-FOO-GPIO:00A0 ( prio 0)
loader: 检查 slot-6 BB-BONELT-HDMIN:00A0 (prio 2)
loader: 检查 slot-5 BB-BONELT-HDMI:00A0 (prio 1)
loader: 在 slot-5 BB-BONELT-HDMI:00A0 之后(优先 1)
插槽#5:为板名'Bone-Black-HDMI',版本'00A0'请求固件'cape-boneblack-hdmi-00A0.dtbo'
插槽#5:加载dtbo'cape-boneblack-hdmi-00A0.dtbo' ; 转换为活树
槽 #5:#4 覆盖
加载器:检查 slot-4 BB-BONE-EMMC-2G:00A0 (prio 1)
加载器:在 slot-4 BB-BONE-EMMC-2G:00A0 (prio 1)
槽之后#4:为板名“Bone-LT-eMMC-2G”、版本“00A0”
插槽请求固件“cape-bone-2g-emmc1.dtbo”#4:dtbo“cape-bone-2g-emmc1.dtbo”已加载;转换为活树
插槽#4:#2 覆盖
插槽#4:应用#2 覆盖。
加载器:完成 slot-4 BB-BONE-EMMC-2G:00A0 (prio 1)
加载器:检查 slot-6 BB-BONELT-HDMIN:

加载程序:完成 slot-5 BB-BONELT-HDMI:00A0 (prio 1)
加载程序:检查 slot-6 BB-BONELT-HDMIN:00A0 (prio 2)
加载程序:在 slot-6 之后 BB-BONELT-HDMIN:00A0 (prio 2 ) )
插槽 #6:请求固件 'cape-boneblack-hdmin-00A0.dtbo' 板名'Bone-Black-HDMIN',版本 '00A0'
插槽 #6: dtbo 'cape-boneblack-hdmin-00A0.dtbo'已加载;转换为 live tree
插槽 #6:BB-BONELT-HDMIN 冲突 P8.45 (#5:BB-BONELT-HDMI)
插槽 #6:验证
加载程序失败:无法加载 slot-6 BB-BONELT-HDMIN:00A0 (prio 2)

这是我的设备树覆盖的源文件:

/dts-v1/;
/plugin/;

/ {
    compatible = "ti,beaglebone", "ti,beaglebone-black";

    /* Identification */
    part-number = "BB-FOO-GPIO";
    version = "00A0";

    /* Resources required */
    exclusive-use =
        "P9.27",        /* XXX */
        "P9.23",        /* XXX */
        "gpio3_19",     /* XXX */
        "gpio1_17";     /* XXX */

    fragment@0 {
        target = <&am33xx_pinmux>;
        __overlay__ {
            foo_gpio_pins: pinmux_gpio_helper_pins {
                pinctrl-single,pins = <
                    0x1a4 0x0f      /* P9.27 GPIO3_19: MODE7 - OUTPUT */
                    0x044 0x2f      /* P9.23 GPIO1_17: MODE7 - INPUT */
                >;
            };
        };
    };

    fragment@1 {
        target = <&ocp>;    /* On-chip Peripherals */
        __overlay__ {

            foo_gpio_helper {
                compatible = "gpio-of-helper";
                pinctrl-names = "default";
                pinctrl-0 = <&foo_gpio_pins>;
                status = "okay";

                foo_test_output {
                    gpio-name = "foo_test_output";
                    gpio = <&gpio4 19 0x00>;            /* gpio4 => GPIO-3 */
                    output;
                    init-high;
                };

                foo_test_input {
                    gpio-name = "foo_test_input";
                    gpio = <&gpio2 17 0x00>;            /* gpio2 => GPIO-1 */
                    input;
                    count-rising-edge;
                    count-falling-edge;
                };
            };
        };
    };
};

~
(我是这样编译的:dtc -O dtb -o BB-FOO-GPIO-00A0.dtbo -b 0 -@ BB-FOO-GPIO-00A0.dts }

现在使用echo BB-FOO-GPIO > $SLOTS"手动加载它加载正常..
dmesg -c给我:

bone-capemgr bone_capemgr.9:part_number 'BB-FOO-GPIO',版本 'N/A'
bone-capemgr bone_capemgr.9:插槽 #8:通用覆盖
bone-capemgr bone_capemgr.9:骨骼:在插槽中使用覆盖 eeprom 数据8
bone-capemgr bone_capemgr.9:插槽 #8:'覆盖板名称,00A0,覆盖 Manuf,BB-FOO-GPIO'
bone-capemgr bone_capemgr.9:插槽 #8:请求基于部件号/版本的 'BB-FOO- GPIO-00A0.dtbo
bone-capemgr bone_capemgr.9:插槽 #8:请求固件“BB-FOO-GPIO-00A0.dtbo”以获取板名“覆盖板名”,版本“00A0”
bone-capemgr bone_capemgr.9:插槽#8:加载了 dtbo 'BB-FOO-GPIO-00A0.dtbo';转换为活树
bone-capemgr bone_capemgr.9: slot #8:

gpio-of-helper foo_gpio_helper.15:分配的 GPIO id=0
of_get_named_gpio_flags 以状态 115 退出
gpio-of-helper foo_gpio_helper.15:分配的 GPIO id=1
gpio-of-helper foo_gpio_helper.15:准备好
bone-capemgr bone_capemgr.9:插槽#8:应用#2 覆盖。

cat /sys/devices/bone_capemgr.9/slots给了我我想要的东西:

0: 54:PF---
1: 55:PF---
2: 56:PF---
3: 57:PF---
4: ff:POL Bone-LT-eMMC-2G,00A0,Texas Instrument, BB-BONE-EMMC-2G
5: ff:POL Bone-Black-HDMI,00A0,Texas Instrument,BB-BONELT-HDMI
8: ff:POL Override Board Name,00A0,Override Manuf,BB-FOO-GPIO

那么,我错过了什么?为什么它不会在启动时加载,但它会从 shell 加载?该问题似乎与未加载固件有关...我不明白。

4

5 回答 5

5

这是一个在链接中描述了解决方案的问题:http ://elinux.org/Beagleboard:BeagleBoneBlack_Debian#Loading_custom_capes

我希望它有帮助,乔治

于 2014-07-08T12:54:22.777 回答
2

问题是由于内核尝试加载覆盖时尚未安装根文件系统(在我的情况下是在 eMMC 上)。我通过手动修改initramfs解决了这个问题:

在下次重新启动时,应该加载 dtbo:

 0: 54:P---L BEAGLE-GO-CAPE,00A0,FH-Aachen/FZJ,cape-beaglego
 1: 55:PF--- 
 2: 56:PF--- 
 3: 57:PF--- 
 4: ff:P-O-L Bone-LT-eMMC-2G,00A0,Texas Instrument,BB-BONE-EMMC-2G
 5: ff:P-O-- Bone-Black-HDMI,00A0,Texas Instrument,BB-BONELT-HDMI
 6: ff:P-O-- Bone-Black-HDMIN,00A0,Texas Instrument,BB-BONELT-HDMIN
于 2015-05-08T20:56:07.653 回答
1

我刚刚解决了相同的问题,消除了 dtc 命令中的“-b 0”子句。我没有花太多时间进行深入调查,但是 -b 表示“设置物理启动 CPU”(如手册页所示),并且可能在启动期间发生冲突。

于 2014-06-14T18:15:01.190 回答
1

George 提供了一个链接,其中包含解决方法的详细信息。这是实际的解决方法:

add "CAPE=BB-FOO-GPIO" to /etc/default/capemgr

.. 并从 /boot/uboot/uEnv.txt 中删除代码

于 2014-10-30T15:29:25.613 回答
0

这里有一些混合的想法,我刚刚完成并想更新这个答案,这样下一个人就不必像我一样花那么多时间了。

首先,似乎 Beaglebone Black 上的最新版本的 Ubuntu 或 Debian(截至今天)不支持 uEnv.txt 标志,原因是加载自定义披风中描述的原因,因为从不兼容的文件系统启动时会出现先有鸡还是先有蛋的问题还没有加载。因此,根据链接,说明说要添加CAPE=<CAPE NAME HERE>/etc/default/capemgr.

其次,您需要确保您运行的操作系统尊重这个新文件,例如,@RobertCNelson 的 Ubuntu 构建提供了尊重/etc/default/capemgr. 看一个例子

因此,简而言之,您需要确保/etc/default/capemgr在盲目地进行这些更改之前运行其中一个尊重的自定义操作系统,就像我所做的那样。

于 2014-11-26T07:20:01.510 回答