编译树莓派的uboot固件
下载uboot源码和切换分支(应该也可以不切换)
git clone git://git.denx.de/u-boot.git
git checkout v2021.10 -b u-boot-2021-10
下载arm编译器
从上面的链接中下载自己对应的编译器
我的编译器信息:
gcc version 10.3.1 20210621 (GNU Toolchain for the A-profile Architecture 10.3-2021.07 (arm-10.29))
配置编译环境和编译uboot
export CROSS_COMPILE=/usr/local/aarch64-linux-gnu/bin/aarch64-none-linux-gnu-
make rpi_4_defconfig
make -j 8
如果执行make menuconfig和make rpi_4_defconfig及make -j 8报错,请看文章最后
uboot在树莓派上的启动展示
U-Boot> print
arch=arm
baudrate=115200
board=rpi
board_name=4 Model B
board_rev=0x11
board_rev_scheme=1
board_revision=0xB03114
boot_a_script=load ${devtype} ${devnum}:${distro_bootpart} ${scriptaddr} ${prefi
x}${script}; source ${scriptaddr}
boot_efi_binary=if fdt addr ${fdt_addr_r}; then bootefi bootmgr ${fdt_addr_r};el
se bootefi bootmgr ${fdtcontroladdr};fi;load ${devtype} ${devnum}:${distro_bootp
art} ${kernel_addr_r} efi/boot/bootaa64.efi; if fdt addr ${fdt_addr_r}; then boo
tefi ${kernel_addr_r} ${fdt_addr_r};else bootefi ${kernel_addr_r} ${fdtcontrolad
dr};fi
boot_extlinux=sysboot ${devtype} ${devnum}:${distro_bootpart} any ${scriptaddr}
${prefix}${boot_syslinux_conf}
boot_net_usb_start=usb start
boot_pci_enum=pci enum
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 usb0 pxe dhcp
bootcmd=run distro_bootcmd
bootcmd_dhcp=run boot_net_usb_start; run boot_pci_enum; if dhcp ${scriptaddr} ${
boot_script_dhcp}; then source ${scriptaddr}; fi;setenv efi_fdtfile ${fdtfile};
setenv efi_old_vci ${bootp_vci};setenv efi_old_arch ${bootp_arch};setenv bootp_v
ci PXEClient:Arch:00011:UNDI:003000;setenv bootp_arch 0xb;if dhcp ${kernel_addr_
r}; then tftpboot ${fdt_addr_r} dtb/${efi_fdtfile};if fdt addr ${fdt_addr_r}; th
en bootefi ${kernel_addr_r} ${fdt_addr_r}; else bootefi ${kernel_addr_r} ${fdtco
ntroladdr};fi;fi;setenv bootp_vci ${efi_old_vci};setenv bootp_arch ${efi_old_arc
h};setenv efi_fdtfile;setenv efi_old_arch;setenv efi_old_vci;
bootcmd_mmc0=devnum=0; run mmc_boot
bootcmd_mmc1=devnum=1; run mmc_boot
bootcmd_pxe=run boot_net_usb_start; run boot_pci_enum; dhcp; if pxe get; then px
e boot; fi
bootcmd_usb0=devnum=0; run usb_boot
bootdelay=2
cpu=armv8
dfu_alt_info=u-boot.bin fat 0 1;uboot.env fat 0 1;config.txt fat 0 1;Image fat 0
1
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:f1:84:55
fdt_addr=2eff4200
fdt_addr_r=0x02600000
fdt_high=ffffffffffffffff
fdtcontroladdr=3af48ff0
fdtfile=broadcom/bcm2711-rpi-4-b.dtb
gatewayip=192.168.1.1
initrd_high=ffffffffffffffff
ipaddr=192.168.1.10
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
netmask=255.255.255.0
preboot=pci enum; usb start;
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_scrip
ts; done;run scan_dev_for_efi;
scan_dev_for_boot_part=part list ${devtype} ${devnum} -bootable devplist; env ex
ists devplist || setenv devplist 1; for distro_bootpart in ${devplist}; do if fs
type ${devtype} ${devnum}:${distro_bootpart} bootfstype; then run scan_dev_for_b
oot; fi; done; setenv devplist
scan_dev_for_efi=setenv efi_fdtfile ${fdtfile}; 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_bootpa
rt} efi/boot/bootaa64.efi; then echo Found EFI removable media binary efi/boot/b
ootaa64.efi; run boot_efi_binary; echo EFI LOAD FAILED: continuing...; fi; seten
v efi_fdtfile
scan_dev_for_extlinux=if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefi
x}${boot_syslinux_conf}; then echo Found ${prefix}${boot_syslinux_conf}; run boo
t_extlinux; echo SCRIPT FAILED: continuing...; fi
scan_dev_for_scripts=for script in ${boot_scripts}; do if test -e ${devtype} ${d
evnum}:${distro_bootpart} ${prefix}${script}; then echo Found U-Boot script ${pr
efix}${script}; run boot_a_script; echo SCRIPT FAILED: continuing...; fi; done
scriptaddr=0x02400000
serial#=10000000a0ce333e
serverip=192.168.1.43
soc=bcm283x
stderr=serial,vidconsole
stdin=serial,usbkbd
stdout=serial,vidconsole
usb_boot=usb start; if usb dev ${devnum}; then devtype=usb; run scan_dev_for_boo
t_part; fi
usbethaddr=dc:a6:32:f1:84:55
vendor=raspberrypi
Environment size: 4166/16380 bytes
U-Boot>
在编译时需要安装以下组件
sudo apt install libc6-dev
sudo apt install libncurses-dev
sudo apt install libssl-dev
在编译是遇到的报错信息如下,使用上面的办法解决
:~/opt/u-boot$ make rpi_4_defconfig ///sudo apt install libc6-dev
HOSTCC scripts/basic/fixdep
scripts/basic/fixdep.c:92:10: fatal error: sys/types.h: No such file or directory
92 | #include <sys/types.h>
| ^~~~~~~~~~~~~
compilation terminated.
make[1]: *** [scripts/Makefile.host:95: scripts/basic/fixdep] Error 1
make: *** [Makefile:488: scripts_basic] Error 2
:~/opt/u-boot$ make menuconfig ///sudo apt install libncurses-dev
*
* Unable to find the ncurses package.
* Install ncurses (ncurses-devel or libncurses-dev
* depending on your distribution).
*
make[1]: *** [scripts/kconfig/Makefile:224: scripts/kconfig/.mconf-cfg] Error 1
make: *** [Makefile:569: menuconfig] Error 2
:~/opt/u-boot$ make -j 8 //sudo apt install libssl-dev
UPD include/generated/timestamp_autogenerated.h
CFGCHK u-boot.cfg
HOSTCC tools/lib/crc8.o
HOSTCC tools/mkenvimage.o
HOSTCC tools/aisimage.o
HOSTCC tools/atmelimage.o
HOSTCC tools/fit_common.o
HOSTCC tools/fit_image.o
HOSTCC tools/image-host.o
HOSTCC tools/common/image-fit.o
In file included from tools/aisimage.c:9:
include/image.h:1178:12: fatal error: openssl/evp.h: No such file or directory
1178 | # include <openssl/evp.h>
| ^~~~~~~~~~~~~~~
compilation terminated.
In file included from tools/atmelimage.c:10:
include/image.h:1178:12: fatal error: openssl/evp.h: No such file or directory
1178 | # include <openssl/evp.h>
| ^~~~~~~~~~~~~~~
compilation terminated.
In file included from tools/fit_common.h:11,
from tools/fit_common.c:22:
include/image.h:1178:12: fatal error: openssl/evp.h: No such file or directory
1178 | # include <openssl/evp.h>
| ^~~~~~~~~~~~~~~
compilation terminated.
In file included from tools/fit_common.h:11,
from tools/fit_image.c:17:
include/image.h:1178:12: fatal error: openssl/evp.h: No such file or directory
1178 | # include <openssl/evp.h>
| ^~~~~~~~~~~~~~~
compilation terminated.
In file included from include/bootm.h:10,
from tools/image-host.c:12:
include/image.h:1178:12: fatal error: openssl/evp.h: No such file or directory
1178 | # include <openssl/evp.h>
| ^~~~~~~~~~~~~~~
compilation terminated.
In file included from include/bootm.h:10,
from ./tools/../common/image-fit.c:31,
from tools/common/image-fit.c:1:
include/image.h:1178:12: fatal error: openssl/evp.h: No such file or directory
1178 | # include <openssl/evp.h>
| ^~~~~~~~~~~~~~~
compilation terminated.
make[1]: *** [scripts/Makefile.host:112: tools/fit_common.o] Error 1
make[1]: *** Waiting for unfinished jobs....
make[1]: *** [scripts/Makefile.host:112: tools/aisimage.o] Error 1
make[1]: *** [scripts/Makefile.host:112: tools/atmelimage.o] Error 1
make[1]: *** [scripts/Makefile.host:112: tools/fit_image.o] Error 1
make[1]: *** [scripts/Makefile.host:112: tools/image-host.o] Error 1
make[1]: *** [scripts/Makefile.host:112: tools/common/image-fit.o] Error 1
make: *** [Makefile:1817: tools] Error 2