【问题标题】:U-Boot boot-up fail in BeagleboneBlack using my own compiled kernel image?使用我自己编译的内核映像在 BeagleboneBlack 中 U-Boot 启动失败?
【发布时间】:2017-10-02 07:53:58
【问题描述】:

我正在尝试根据以下教程使用 Buildroot 编译内核:http://free-electrons.com/doc/training/buildroot/buildroot-labs.pdf

我严格按照所有步骤操作,当我将 SD 卡插入 BeagleboneBlack(由 USB 电缆供电)时,选择从 SD 卡启动,启动不成功。控制台输出如下:

    U-Boot 2017.09 (Sep 27 2017 - 17:41:38 +0200)

CPU  : AM335X-GP rev 2.1
I2C:   ready
DRAM:  512 MiB
No match for driver 'omap_hsmmc'
No match for driver 'omap_hsmmc'
Some drivers were not found
MMC:   OMAP SD/MMC: 0, OMAP SD/MMC: 1
<ethaddr> not set. Validating first E-fuse MAC
Net:   cpsw, usb_ether
Press SPACE to abort autoboot in 2 seconds
switch to partitions #0, OK
mmc0 is current device
SD/MMC found on device 0
reading boot.scr
** Unable to read file boot.scr **
reading uEnv.txt
98 bytes read in 4 ms (23.4 KiB/s)
Loaded env from uEnv.txt
Importing environment from mmc0 ...
Running uenvcmd ...
** Bad device 0:1 0x82000000 **
reading ramdisk.gz
** Unable to read file ramdisk.gz **
** Bad device 0:1 0x88000000 **
** Bad device 0:1 0x88000000 **
switch to partitions #0, OK
mmc0 is current device
Scanning mmc 0:1...
reading /am335x-boneblack.dtb
35712 bytes read in 10 ms (3.4 MiB/s)
switch to partitions #0, OK
mmc0 is current device
SD/MMC found on device 0
** File not found /zImage **
switch to partitions #0, OK
mmc1(part 0) is current device
Scanning mmc 1:1...
switch to partitions #0, OK
mmc1(part 0) is current device
SD/MMC found on device 1
** File not found /zImage **
## Error: "bootcmd_nand0" not defined
starting USB...
USB0:   Port not available.
cpsw Waiting for PHY auto negotiation to complete......... TIMEOUT !
using musb-hdrc, OUT ep1out IN ep1in STATUS ep2in
MAC 98:84:e3:ae:c4:12
HOST MAC de:ad:be:af:00:00
RNDIS ready
musb-hdrc: peripheral reset irq lost!
high speed config #2: 2 mA, Ethernet Gadget, using RNDIS
USB RNDIS network up!
BOOTP broadcast 1
BOOTP broadcast 2
BOOTP broadcast 3
BOOTP broadcast 4
BOOTP broadcast 5
BOOTP broadcast 6
BOOTP broadcast 7
BOOTP broadcast 8
BOOTP broadcast 9
BOOTP broadcast 10
BOOTP broadcast 11
BOOTP broadcast 12
BOOTP broadcast 13
BOOTP broadcast 14
BOOTP broadcast 15
BOOTP broadcast 16
BOOTP broadcast 17
BOOTP broadcast 18
BOOTP broadcast 19
BOOTP broadcast 20
BOOTP broadcast 21
BOOTP broadcast 22
BOOTP broadcast 23
BOOTP broadcast 24
BOOTP broadcast 25
BOOTP broadcast 26
BOOTP broadcast 27
BOOTP broadcast 28
BOOTP broadcast 29

Retry time exceeded; starting again
missing environment variable: pxeuuid
Retrieving file: pxelinux.cfg/01-98-84-e3-ae-c4-14
using musb-hdrc, OUT ep1out IN ep1in STATUS ep2in
MAC 98:84:e3:ae:c4:12
HOST MAC de:ad:be:af:00:00
RNDIS ready
high speed config #2: 2 mA, Ethernet Gadget, using RNDIS
USB RNDIS network up!
*** ERROR: `serverip' not set
Retrieving file: pxelinux.cfg/00000000
using musb-hdrc, OUT ep1out IN ep1in STATUS ep2in
MAC 98:84:e3:ae:c4:12
HOST MAC de:ad:be:af:00:00
RNDIS ready
high speed config #2: 2 mA, Ethernet Gadget, using RNDIS
USB RNDIS network up!
*** ERROR: `serverip' not set
Retrieving file: pxelinux.cfg/0000000
using musb-hdrc, OUT ep1out IN ep1in STATUS ep2in
MAC 98:84:e3:ae:c4:12
HOST MAC de:ad:be:af:00:00
RNDIS ready
high speed config #2: 2 mA, Ethernet Gadget, using RNDIS
USB RNDIS network up!
*** ERROR: `serverip' not set
Retrieving file: pxelinux.cfg/000000
using musb-hdrc, OUT ep1out IN ep1in STATUS ep2in
MAC 98:84:e3:ae:c4:12
HOST MAC de:ad:be:af:00:00
RNDIS ready
high speed config #2: 2 mA, Ethernet Gadget, using RNDIS
USB RNDIS network up!
*** ERROR: `serverip' not set
Retrieving file: pxelinux.cfg/00000
using musb-hdrc, OUT ep1out IN ep1in STATUS ep2in
MAC 98:84:e3:ae:c4:12
HOST MAC de:ad:be:af:00:00
RNDIS ready
high speed config #2: 2 mA, Ethernet Gadget, using RNDIS
USB RNDIS network up!
*** ERROR: `serverip' not set
Retrieving file: pxelinux.cfg/0000
using musb-hdrc, OUT ep1out IN ep1in STATUS ep2in
MAC 98:84:e3:ae:c4:12
HOST MAC de:ad:be:af:00:00
RNDIS ready
high speed config #2: 2 mA, Ethernet Gadget, using RNDIS
USB RNDIS network up!
*** ERROR: `serverip' not set
Retrieving file: pxelinux.cfg/000
using musb-hdrc, OUT ep1out IN ep1in STATUS ep2in
MAC 98:84:e3:ae:c4:12
HOST MAC de:ad:be:af:00:00
RNDIS ready
high speed config #2: 2 mA, Ethernet Gadget, using RNDIS
USB RNDIS network up!
*** ERROR: `serverip' not set
Retrieving file: pxelinux.cfg/00
using musb-hdrc, OUT ep1out IN ep1in STATUS ep2in
MAC 98:84:e3:ae:c4:12
HOST MAC de:ad:be:af:00:00
RNDIS ready
high speed config #2: 2 mA, Ethernet Gadget, using RNDIS
USB RNDIS network up!
*** ERROR: `serverip' not set
Retrieving file: pxelinux.cfg/0
using musb-hdrc, OUT ep1out IN ep1in STATUS ep2in
MAC 98:84:e3:ae:c4:12
HOST MAC de:ad:be:af:00:00
RNDIS ready
high speed config #2: 2 mA, Ethernet Gadget, using RNDIS
USB RNDIS network up!
*** ERROR: `serverip' not set
Retrieving file: pxelinux.cfg/default-arm-am33xx
using musb-hdrc, OUT ep1out IN ep1in STATUS ep2in
MAC 98:84:e3:ae:c4:12
HOST MAC de:ad:be:af:00:00
RNDIS ready
high speed config #2: 2 mA, Ethernet Gadget, using RNDIS
USB RNDIS network up!
*** ERROR: `serverip' not set
Retrieving file: pxelinux.cfg/default-arm
using musb-hdrc, OUT ep1out IN ep1in STATUS ep2in
MAC 98:84:e3:ae:c4:12
HOST MAC de:ad:be:af:00:00
RNDIS ready
high speed config #2: 2 mA, Ethernet Gadget, using RNDIS
USB RNDIS network up!
*** ERROR: `serverip' not set
Retrieving file: pxelinux.cfg/default
using musb-hdrc, OUT ep1out IN ep1in STATUS ep2in
MAC 98:84:e3:ae:c4:12
HOST MAC de:ad:be:af:00:00
RNDIS ready
high speed config #2: 2 mA, Ethernet Gadget, using RNDIS
USB RNDIS network up!
*** ERROR: `serverip' not set
Config file not found
starting USB...
USB0:   Port not available.
using musb-hdrc, OUT ep1out IN ep1in STATUS ep2in
MAC 98:84:e3:ae:c4:12
HOST MAC de:ad:be:af:00:00
RNDIS ready
high speed config #2: 2 mA, Ethernet Gadget, using RNDIS
USB RNDIS network up!
BOOTP broadcast 1
BOOTP broadcast 2
BOOTP broadcast 3
BOOTP broadcast 4
BOOTP broadcast 5
BOOTP broadcast 6
BOOTP broadcast 7
BOOTP broadcast 8
BOOTP broadcast 9
BOOTP broadcast 10
BOOTP broadcast 11
BOOTP broadcast 12
BOOTP broadcast 13
BOOTP broadcast 14
BOOTP broadcast 15
BOOTP broadcast 16
BOOTP broadcast 17
BOOTP broadcast 18
BOOTP broadcast 19
BOOTP broadcast 20
BOOTP broadcast 21
BOOTP broadcast 22
BOOTP broadcast 23
BOOTP broadcast 24
BOOTP broadcast 25
BOOTP broadcast 26
BOOTP broadcast 27
BOOTP broadcast 28
BOOTP broadcast 29

Retry time exceeded; starting again
using musb-hdrc, OUT ep1out IN ep1in STATUS ep2in
MAC 98:84:e3:ae:c4:12
HOST MAC de:ad:be:af:00:00
RNDIS ready
high speed config #2: 2 mA, Ethernet Gadget, using RNDIS
USB RNDIS network up!
BOOTP broadcast 1
BOOTP broadcast 2
BOOTP broadcast 3
BOOTP broadcast 4
BOOTP broadcast 5
BOOTP broadcast 6
BOOTP broadcast 7
BOOTP broadcast 8
BOOTP broadcast 9
BOOTP broadcast 10
BOOTP broadcast 11
BOOTP broadcast 12
BOOTP broadcast 13
BOOTP broadcast 14
BOOTP broadcast 15
BOOTP broadcast 16
BOOTP broadcast 17
BOOTP broadcast 18
BOOTP broadcast 19
BOOTP broadcast 20
BOOTP broadcast 21
BOOTP broadcast 22
BOOTP broadcast 23
BOOTP broadcast 24
BOOTP broadcast 25
BOOTP broadcast 26
BOOTP broadcast 27
BOOTP broadcast 28
BOOTP broadcast 29

Retry time exceeded; starting again
=> 

这是我在 uEnv.txt 文件中写的内容:

bootdir=
bootpart=0:1
uenvcmd=run loadimage;run loadramdisk;run findfdt;run loadfdt;run mmcloados

谁能告诉我我做错了什么(尽可能具体)?好像开机找不到zImage,但是在/boot分区,我确实有zImage文件。

非常感谢。

【问题讨论】:

    标签: linux-kernel kernel beagleboneblack u-boot buildroot


    【解决方案1】:

    谁能告诉我我做错了什么(尽可能具体)?

    看起来 U-Boot 启动环境与 SD 卡上的内容不一致。
    默认的 U-Boot 环境设置为从 SD 卡第二分区的 /boot 目录加载内核、DT blob 或 FIT 映像。从第一个分区(即 uEnv.txt 文件)加载的修改只是部分有效。

    你声称:

    ...但是在 /boot 分区中,我确实有 zImage 文件。

    /boot 将是一个目录而不是 “分区”。)
    假设以上是准确的,那么内核映像文件的完整路径是根文件系统中的/boot/zImage
    但是引导日志报告说

    switch to partitions #0, OK
    mmc0 is current device
    SD/MMC found on device 0
    ** File not found /zImage **  
    

    这意味着内核正在查找根目录,即第一个分区的 /,而不是根文件系统的 /boot
    您的 SD 卡可能在第一个分区中有 FAT fs,而不是 ext3/4 根文件系统。

    但是启动日志确实表明在根目录中找到了设备树 blob,/

    switch to partitions #0, OK
    mmc0 is current device
    Scanning mmc 0:1...
    reading /am335x-boneblack.dtb
    35712 bytes read in 10 ms (3.4 MiB/s)
    

    通常,内核文件与 DT blob 一起存储(在同一目录中)。
    但您似乎已将这两个文件分开。

    将这两个文件存储在根目录中,/ 的 FAT 文件系统(以及丢失的 ramdisk.gz),

    修复环境中的加载命令和路径将根文件系统安装在 SD 卡上的另一个分区中。
    前者最简单(即复制 zImage)。
    该解决方案需要研究环境变量以进行适当的更改(例如,uEnv.txt 中的 bootdir=/boot 可能是修复的一部分)。


    更新

    我查看了 U-Boot 2017.09 以及它将为您的主板构建的默认环境。可疑的环境变量是

     bootcmd_legacy_mmc0=setenv mmcdev 0; setenv bootpart 0:2 ; run mmcboot
    

    其中setenv bootpart 0:2 指定rootfs 分区(而不是VFAT/“boot”分区)是源分区。
    此 setenv 将覆盖在读取和评估 uEnv.txt 文件时分配的 bootpart=0:1
    相反,指定文件的 /boot 目录的默认 bootdir=/boot 会被 uEnv.txt 文件中的 bootdir= 覆盖。

    最终结果是,当 mmcboot 及其 loadimage 变量运行时,zImage 将从rootfs,因为该文件位于 /boot 目录中而失败。

    在设备 0 上找到 SD/MMC
    ** 找不到文件 /zImage **

    请注意,加载错误之前的“SD/MMC found on device 0”消息来自 mmcboot 变量中的echo 命令:

    mmcboot=mmc dev ${mmcdev}; setenv devnum ${mmcdev}; setenv devtype mmc; \
      if mmc rescan; then \
        echo SD/MMC found on device ${mmcdev}; \
        if run loadimage; then \
          if test ${boot_fit} -eq 1; \
            then run loadfit; \          
            else run mmcloados; \
          fi; \
        fi; \
      fi;
    

    解决方法

    A.要从第一个分区加载,请修改变量 bootcmd_legacy_mmc0 以使用 bootpart 的当前定义加载 zImage,即不要重新定义它。要么编辑 U-Boot 源代码并重建,要么使用以下 U-Boot 命令(after aborting autoboot,before boot failed):

    setenv bootcmd_legacy_mmc0 'setenv mmcdev 0\; run mmcboot'
    bootd
    

    B.修改 uEnv.txt 文件。只需插入新的第一行:

    devtype=mmc
    


    附录

    确实是版本不兼容问题。

    如果您坚持使用 U-Boot 2017.09,那么 Workaround B 就足够了。

    U-Boot 2016.03 有loadimage=load mmc ${bootpart} ...,而
    U-Boot 2017.09 有loadimage=load ${devtype} ${bootpart} ....
    uenvcmduEnv.txt 文件运行时,变量 devtype 未定义。因此,较新版本的 U-Boot 会生成错误消息

    ** 坏设备 0:1 0x82000000 **
    ** 坏设备 0:1 0x88000000 **
    ** 坏设备 0:1 0x88000000 **

    解决方法 B 确保在运行 uenvcmd 时定义了 devtype,因此 load 命令可以像旧版本一样访问 mmc 设备。

    【讨论】:

    • 感谢您的支持,但仍然无法解决我的问题。我有两个分区:一个名为“boot”,另一个名为“rootfs”。我确实将 DT blob 和内核映像 zImage 保存在名为“boot”的同一个可引导分区中(它是“boot”分区中的 /zImage 和 /-boneblack.dtb)。而且我在使用 buildroot 的输出编译内核中没有任何名为 ramdisk.gz 的文件。奇怪的是U-boot找不到/zImage?还有其他可能的问题吗?你能看一下教程链接吗?我完全按照那里写的内容。也许有些地方弄错了。
    • @NguyễnThanhVũ “我完全按照那里写的。” -- 这不是真的。该文档指出You can keep using the default 2016.03 version as the U-Boot version. 文档中没有提及您实际使用的2017.09版本。因此,您没有完全按照所写的内容进行操作。 “也许有什么地方弄错了。”——也许。请尝试解决方法。
    • 确实是版本不兼容的问题。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2013-10-13
    • 2020-04-22
    • 2010-10-23
    • 2015-08-09
    • 2011-06-30
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多