Linux kernel 使用我自己编译的内核映像在BeagleboneBlack中U-Boot启动失败?

Linux kernel 使用我自己编译的内核映像在BeagleboneBlack中U-Boot启动失败?,linux-kernel,kernel,beagleboneblack,u-boot,buildroot,Linux Kernel,Kernel,Beagleboneblack,U Boot,Buildroot,我正试图根据下面的教程使用Buildroot编译内核: 我严格遵循所有步骤,当我将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 dr

我正试图根据下面的教程使用Buildroot编译内核:

我严格遵循所有步骤,当我将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
=> 
谁能告诉我我做错了什么(尽可能具体)?似乎引导程序找不到zImage,但在/boot分区中,我确实有zImage文件

非常感谢你

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

看起来用于引导的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)。
解决方案需要研究环境变量以进行适当的更改(例如,
bootdir=/boot
inuEnv.txt可能是修复的一部分)


更新

我回顾了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变量时,将从rootfs的根目录加载zImage,这将失败,因为该文件位于/boot目录中

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

请注意,加载错误之前的“SD/MMC在设备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\u legacy\u mmc0以使用当前定义的bootpart加载zImage,即不重新定义它。编辑U-Boot源代码并重新生成,或者使用以下U-Boot命令(在中止自动启动后,在启动失败之前):

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

devtype=mmc


附录


这确实是版本不兼容的问题

如果您坚持使用U-Boot 2017.09,那么解决方案B就足够了

U-Boot 2016.03具有
loadimage=load mmc${bootpart}…
,而
U-Boot 2017.09具有
loadimage=load${devtype}${bootpart}…

uEnv.txt文件运行uenvcmd时,变量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ũ“我完全按照上面写的去做。”——那不是真的。该文档声明
您可以继续使用默认的2016.03版本作为U-Boot版本。
文档中没有提到您实际使用的2017.09版本。所以你没有完全按照上面写的去做。“也许出了什么问题。”——也许。请尝试解决方法。这确实是版本不兼容的问题。谢谢你的帮助。
setenv bootcmd_legacy_mmc0 'setenv mmcdev 0\; run mmcboot'
bootd
devtype=mmc