通过Device Tree中的Chosen节点传递Bootargs在Beaglebone Black上不起作用

7
根据我的理解,选定的节点用于向内核发送引导参数。 以下是现有设备代码(am335x-bone-common.dtsi)的选定节点。
chosen {
  stdout-path = &uart0;
  };

因此,我修改了所选节点以传递内核参数。

chosen {
        bootargs = "console=ttyO0,115200 root=/dev/mmcblk0p2 rootfstype=ext3 rw rootwait";
        stdout-path = &uart0;
    };

在启动板子时,我遇到了KERNEL PANIC的问题,以下是日志{https://pastebin.com/XHyrsmfG}

提供信息:这些是在串行控制台(minicom)上发出的u-boot命令,用于通过SD卡移植内核和设备树。

fatload mmc 0:1 0x81000000 zImage
fatload mmc 0:1 0x82000000 am335x-boneblack.dtb
bootz 0x81000000 - 0x82000000 

请问您能否附上/粘贴您已经构建的dtb文件。注意(在粘贴时,请将您的am335x-boneblack.dtb转换为dts格式) - Prabhakar Lad
@Prabhakar Lad 我已经附上了从dtb转换为dts的文件(https://pastebin.com/m03AXaxd) - E V Ravi
2个回答

6
据我了解,所选节点用于向内核发送引导参数。
您的理解是不完整的。 如另一个答案中已经提到的,由引导加载程序(即U-Boot)提供的内核命令行是在启动板时实际使用的参数列表。
对于ARM Linux,默认内核配置优先考虑引导加载程序的命令行,而不是默认内核命令字符串和设备树中所选节点中的bootargs。 根据U-Boot的作者/维护者Wolfgang Denk的解释,原因似乎是任何硬编码的内置bootargs都不如可以轻松定制和提供的bootargs。 这正是您看到的情况。
实际上,有三种可能的ARM内核引导配置选择:
Kernel command line type:
  (X) Use bootloader kernel arguments if available  
  ( ) Extend bootloader kernel arguments
  ( ) Always use the default kernel command string

如果你想忽略U-Boot的bootargs变量(以及来自DT的命令行),并且独占使用CONFIG_CMDLINE中定义的默认内核命令字符串,则内核应配置为该列表上第三个选择(CONFIG_CMDLINE_FORCE)。
请注意,这些选择只在启用了CONFIG_ATAGS时才可用(“传递传统ATAGS引导数据的支持”)。
选择DT bootargs的方案是使用现有的内核配置,但只需删除U-Boot环境变量即可(即setenv bootargs)。
如果你按另一个回答中提到的将U-Boot的bootargs变量更改为空字符串,那么内核将使用其默认的内核命令字符串(CONFIG_CMDLINE)而不是DT。
另请参见在ARM上设置Linux内核命令行的方法?

我启用了CONFIG_CMDLINE_FORCE和CONFIG_ATAGS,但内核仍然使用默认的内核引导字符串(root=/dev/mmcblk0p2 rootwait console=ttyO2,115200)进行引导。它没有采用传递给DT选择节点的bootargs值。 - E V Ravi
1
@EVRavi -- 抱歉,显然第三个选项中提到的“默认内核命令字符串”仅指CONFIG_CMDLINE。DT中所选择节点的bootargs仍被视为外部来源。 - sawdust

3
据我理解,所选节点用于向内核发送启动参数。以下是现有设备代码(am335x-bone-common.dtsi)的所选节点。
chosen {
        bootargs = "console=ttyO0,115200 root=/dev/mmcblk0p2 rootfstype=ext3 rw rootwait";
        stdout-path = &uart0;
    };

看到您的pastie,引导日志显示命令行如下:

Kernel command line: console=ttyO0,115200 ip=10.0.0.111:10.0.0.4::255.255. 255.0 rw root=/dev/nfs nfsroot=10.0.0.4:/home/dileep/beaglebone/rootfs,

既然您还在设备树中设置了"bootargs = "console=ttyO0,115200 root=/dev/mmcblk0p2 rootfstype=ext3 rw rootwait";",则不会影响uboot已经设置的参数。也就是说,如果设备树和标签(uboot)中都设置了相同的参数,则将选择uboot标签中的参数。

因此,您需要清除u-boot设置的bootargs。

1] setenv bootargs "";
2] saveenv
3] fatload mmc 0:1 0x81000000 zImage
4] fatload mmc 0:1 0x82000000 am335x-boneblack.dtb
5 bootz 0x81000000 - 0x82000000 

对于新建的uboot,在板子还未编程时,请确保在u-boot的配置中没有定义bootargs变量。


这个u-boot配置在哪里可以找到? - Owl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接