简体   繁体   English

Raspberry Pi 4 U-Boot 在启动时挂在启动内核中

[英]Raspberry Pi 4 U-Boot on booting hanging in Starting Kernel

I am working on a project where I want to create my own embedded linux with U-Boot.我正在做一个项目,我想用 U-Boot 创建我自己的嵌入式 linux。 Therefore I am working with buildroot, which i recently start learning.因此,我正在使用我最近开始学习的 buildroot。 After successfully creating my own rasberrypi4_defconfig i am currently struggling at the problem to get u-boot work correctly.在成功创建我自己的 rasberrypi4_defconfig 后,我目前正在努力解决这个问题以使 u-boot 正常工作。

What versions I am working with:我正在使用哪些版本:

  1. Rpi 4转速 4
  2. buildroot-2019.11 buildroot-2019.11
  3. u-boot (therefore i pull everyday the new changes) u-boot(因此我每天都会拉新的变化)

Current State of the work:工作现状:

I build on a Ubuntu(32bit).我在 Ubuntu(32 位)上构建。 I configure buildroot with the raspberrypi4_defconfig and make it without changes.我配置的buildroot与raspberrypi4_defconfig并使其无需改动。 Then i make a u-boot defconfig for rpi_4_32b_defconfig and create the u-boot.bin with make CROSS_COMPILE=arm-linux-gnueabihf- u-boot.bin Now my next step was to configure the config.txt and exchange the content with following:然后我为rpi_4_32b_defconfig创建了一个 u-boot defconfig 并使用make CROSS_COMPILE=arm-linux-gnueabihf- u-boot.bin现在我的下一步是配置 config.txt 并与以下内容交换内容:

enable_uart=1
kernel=u-boot.bin

In addition i copyied my u-boot.bin into my sd-card.此外,我将我的 u-boot.bin 复制到我的 SD 卡中。

The last step that i actually did is to build my own boot.scr.uimg with following content我实际做的最后一步是使用以下内容构建我自己的 boot.scr.uimg

mmc dev 0
fatload mmc O:1 ${fdt_addr_r} bcm2711-rpi-4-b.dtb
fatload mmc 0:1 ${kernel_addr_r} zImage
setenv bootargs console=ttyS0,115200 \
root=/dev/mmcblk0p2 rootfstype=ext4 rootwait rw
bootz ${kernel_addr_r} - ${fdt_addr_r}

Problem So far i am archieving to reach the U-boot menu but on booting i get stucked in Starting Kernel I actually thing that my boot.scr.uimg is maybe not correct but dont get it.问题到目前为止,我正在归档以访问 U-boot 菜单,但在启动时我被困在启动内核中 我实际上认为我的 boot.scr.uimg 可能不正确,但没有得到它。

Environment环境

arch=arm
baudrate=115200
board=rpi
board_name=4 Model B
board_rev=0x11
board_rev_scheme=1
board_revision=0xC03111
boot_a_script=load ${devtype} ${devnum}:${distro_bootpart} ${scriptaddr} ${prefix}${script}; source ${scriptaddr}
boot_efi_binary=if fdt addr ${fdt_addr_r}; then bootefi bootmgr ${fdt_addr_r};else bootefi bootmgr ${fdtcontroladdr};fi;load ${devty
pe} ${devnum}:${distro_bootpart} ${kernel_addr_r} efi/boot/bootarm.efi; if fdt addr ${fdt_addr_r}; then bootefi ${kernel_addr_r} ${f
dt_addr_r};else bootefi ${kernel_addr_r} ${fdtcontroladdr};fi
boot_extlinux=sysboot ${devtype} ${devnum}:${distro_bootpart} any ${scriptaddr} ${prefix}${boot_syslinux_conf}
boot_prefixes=/ /boot/
boot_script_dhcp=boot.scr.uimg
boot_scripts=boot.scr.uimg boot.scr
boot_syslinux_conf=extlinux/extlinux.conf
boot_targets=mmc0 mmc1 pxe dhcp
bootargs=console=ttyS0,115200 \
root=/dev/mmcblk0p2 rootfstype=ext4 rootwait rw
bootcmd=run distro_bootcmd
bootcmd_dhcp=if dhcp ${scriptaddr} ${boot_script_dhcp}; then source ${scriptaddr}; fi;setenv efi_fdtfile ${fdtfile}; if test -z "${f
dtfile}" -a -n "${soc}"; then setenv efi_fdtfile ${soc}-${board}${boardver}.dtb; fi; setenv efi_old_vci ${bootp_vci};setenv efi_old_
arch ${bootp_arch};setenv bootp_vci PXEClient:Arch:00010:UNDI:003000;setenv bootp_arch 0xa;if dhcp ${kernel_addr_r}; then tftpboot $
{fdt_addr_r} dtb/${efi_fdtfile};if fdt addr ${fdt_addr_r}; then bootefi ${kernel_addr_r} ${fdt_addr_r}; else bootefi ${kernel_addr_r
} ${fdtcontroladdr};fi;fi;setenv bootp_vci ${efi_old_vci};setenv bootp_arch ${efi_old_arch};setenv efi_fdtfile;setenv efi_old_arch;s
etenv efi_old_vci;
bootcmd_mmc0=devnum=0; run mmc_boot
bootcmd_mmc1=devnum=1; run mmc_boot
bootcmd_pxe=dhcp; if pxe get; then pxe boot; fi
bootdelay=2
bootfstype=fat
cpu=armv7
dhcpuboot=usb start; dhcp u-boot.uimg; bootm
distro_bootcmd=for target in ${boot_targets}; do run bootcmd_${target}; done
efi_dtb_prefixes=/ /dtb/ /dtb/current/
ethaddr=dc:a6:32:45:1f:d1
fdt_addr=2eff5d00
fdt_addr_r=0x02600000
fdt_high=ffffffff
fdtcontroladdr=3af6ac98
fdtfile=bcm2711-rpi-4-b.dtb
fileaddr=2600000
filesize=9e6f
initrd_high=ffffffff
kernel_addr_r=0x00080000
load_efi_dtb=load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} ${prefix}${efi_fdtfile}
loadaddr=0x00200000
mmc_boot=if mmc dev ${devnum}; then devtype=mmc; run scan_dev_for_boot_part; fi
pxefile_addr_r=0x02500000
ramdisk_addr_r=0x02700000
scan_dev_for_boot=echo Scanning ${devtype} ${devnum}:${distro_bootpart}...; for prefix in ${boot_prefixes}; do run scan_dev_for_extlinux; run scan_dev_for_scripts; done;run scan_dev_for_efi;
scan_dev_for_boot_part=part list ${devtype} ${devnum} -bootable devplist; env exists devplist || setenv devplist 1; for distro_bootpart in ${devplist}; do if fstype ${devtype} ${devnum}:${distro_bootpart} bootfstype; then run scan_dev_for_boot; fi; done; setenv devplist
scan_dev_for_efi=setenv efi_fdtfile ${fdtfile}; if test -z "${fdtfile}" -a -n "${soc}"; then setenv efi_fdtfile ${soc}-${board}${boardver}.dtb; fi; for prefix in ${efi_dtb_prefixes}; do if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}${efi_fdtfile}; then run load_efi_dtb; fi;done;if test -e ${devtype} ${devnum}:${distro_bootpart} efi/boot/bootarm.efi; then echo Found EFI removable media binary efi/boot/bootarm.efi; run boot_efi_binary; echo EFI LOAD FAILED: continuing...; fi; setenv efi_fdtfile
scan_dev_for_extlinux=if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}${boot_syslinux_conf}; then echo Found ${prefix}${boot_syslinux_conf}; run boot_extlinux; echo SCRIPT FAILED: continuing...; fi
scan_dev_for_scripts=for script in ${boot_scripts}; do if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}${script}; then echo Found U-Boot script ${prefix}${script}; run boot_a_script; echo SCRIPT FAILED: continuing...; fi; done
scriptaddr=0x02400000
serial#=10000000f58b842c
soc=bcm283x
stderr=serial,vidconsole
stdin=serial,usbkbd
stdout=serial,vidconsole
usbethaddr=dc:a6:32:45:1f:d1
vendor=raspberrypi

Environment size: 3996/16380 bytes

Boot Log启动日志

U-Boot 2020.01-rc4-00066-g7e5ee346fc (Dec 05 2019 - 16:55:27 +0100)

DRAM:  948 MiB
RPI 4 Model B (0xc03111)
MMC:   emmc2@7e340000: 0, mmcnr@7e300000: 1
Loading Environment from FAT... *** Warning - bad CRC, using default environment

In:    serial
Out:   serial
Err:   serial
Net:   Net Initialization Skipped
No ethernet found.
Hit any key to stop autoboot:  0 
switch to partitions #0, OK
mmc0 is current device
Scanning mmc 0:1...
Found U-Boot script /boot.scr.uimg
297 bytes read in 18 ms (15.6 KiB/s)
## Executing script at 02400000
switch to partitions #0, OK
mmc0 is current device
40559 bytes read in 29 ms (1.3 MiB/s)
5601344 bytes read in 1084 ms (4.9 MiB/s)
Kernel image @ 0x080000 [ 0x000000 - 0x557840 ]
## Flattened Device Tree blob at 02600000
   Booting using the fdt blob at 0x2600000
   Using Device Tree in place at 02600000, end 0260ce6e

Starting kernel ...
  1. Try the bootargs without any line continuation () to make sure you're not confusing U-Boot.尝试不带任何续行 () 的 bootargs 以确保您不会混淆 U-Boot。
  2. This could be an issue with the initrd contents (got all the right drivers included? built correctly? loaded into memory?).这可能是 initrd 内容的问题(包含所有正确的驱动程序?正确构建?加载到内存中?)。
  3. See note in https://stackoverflow.com/a/58832898/7158800 re the chosen line in your .dts/.dtb file.请参阅https://stackoverflow.com/a/58832898/7158800 中的注释,重新选择.dts/.dtb 文件中的行。 Once you decide on the console device you want to specify, make sure the .dtb matches the U-Boot bootargs.一旦决定了要指定的控制台设备,请确保 .dtb 与 U-Boot 引导参数匹配。
  4. If you have a JTAG debugger, make sure you're even getting to start_kernel() in Linux.如果您有 JTAG 调试器,请确保您甚至可以在 Linux 中使用 start_kernel()。 I've gotten hung up before when using grub wrappers, so you think you're transferring control to Linux but you're actually jumping into deep space or at least code that's not ready for prime time.我以前在使用 grub 包装器时挂断了电话,所以您认为您正在将控制权转移到 Linux,但实际上您正在跳入深空或至少是尚未准备好黄金时间的代码。 Ensure that you're hitting Linux at all if you are seeing none of the early statements printed (ie Booting Linux on physical CPU 0x0 ).如果您没有看到任何早期的语句打印出来(即在物理 CPU 0x0 上启动 Linux ),请确保您正在使用 Linux。

I had the same confusing problem on raspberry pi 4 and finally I found out solution.我在 raspberry pi 4 上遇到了同样令人困惑的问题,最后我找到了解决方案。

  1. Make sure "enable_uart=1" is in config.txt in first partition.确保“enable_uart=1”在第一个分区的 config.txt 中。

  2. Raspberry pi 4 supports both 32-bit and 64-bit mode. Raspberry pi 4 支持 32 位和 64 位模式。 The firmware config.txt, u-boot and kernel should be same configuration.固件 config.txt、u-boot 和 kernel 应该是相同的配置。

Here is my config.txt for 64-bit system.这是我的 64 位系统的 config.txt。

[pi4]
kernel=u-boot.bin
max_framebuffers=2

[all]
arm_64bit=1
enable_uart=1
dtparam=i2c=on
dtparam=spi=on
dtparam=act_led_trigger=heartbeat
dtparam=pwr_led_trigger=mmc0
dtparam=audio=on
device_tree_address=0x02000000
dtoverlay=vc4-fkms-v3d,cma-128

Just remove "arm_64bit=1" for 32-bit system, working with 32-bit u-boot and kernel and device tree binary (dtb).只需删除 32 位系统的“arm_64bit=1”,使用 32 位 u-boot 和内核以及设备树二进制文件 (dtb)。

Please make sure you're using correct toolchain for each system.请确保您为每个系统使用正确的工具链。

Here is my toolchain for u-boot, kernel and buildroot:这是我用于 u-boot、内核和 buildroot 的工具链:

64-bit: gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu
32-bit: gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf
  1. Add "8250.nr_uarts=1" in u-boot bootargs.在 u-boot 引导参数中添加“8250.nr_uarts=1”。 Then you'll get full kernel boot log, and it will help you to find out where it is stuck.然后你会得到完整的内核启动日志,它会帮助你找出它卡在哪里。

Here is my bootargs to load rootfs on second partition.这是我的引导参数,用于在第二个分区上加载 rootfs。

setenv bootargs 8250.nr_uarts=1 console=ttyS0,115200 root=/dev/mmcblk0p2 rootwait rw
  1. Load kernel and device tree, and start kernel加载内核和设备树,并启动内核

For 64-bit system对于 64 位系统

fatload mmc 0:1 ${kernel_addr_r} Image
fatload mmc 0:1 ${fdt_addr} bcm2711-rpi-4-b.dtb
booti ${kernel_addr_r} - ${fdt_addr}

For 32-bit system对于 32 位系统

fatload mmc 0:1 ${kernel_addr_r} zImage
fatload mmc 0:1 ${fdt_addr} bcm2711-rpi-4-b.dtb
bootz ${kernel_addr_r} - ${fdt_addr}

Note that we need use fdt_addr instead of fdt_addr_r, although fdt_addr_t also works for me.请注意,我们需要使用 fdt_addr 而不是 fdt_addr_r,尽管 fdt_addr_t 也适用于我。 See https://elinux.org/RPi_U-Boot for fdt_addr vs fdt_addr_t.有关 fdt_addr 与 fdt_addr_t 的信息,请参阅https://elinux.org/RPi_U-Boot

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM