genode/tool/run/image/uboot
Alice Domage e384381942 tool/run/image/uboot: provide dtb for FIT images
Our new U-BOOT for the imx8mp_iot_gate complains about the size
of the device tree being zero bytes. This is because it no longer
provides the kernel boot arguments via ATAGS, but passes them via
by injecting them in the flattened device tree..

This commit adds a minimal dtb file to the FIT image to satisfy U-BOOT.

Issue  #5354
2024-12-10 14:11:57 +01:00

91 lines
2.6 KiB
Plaintext

##
# Build U-boot bootloader specific uImage/image.itb
#
# \param --image-uboot-no-gzip do not gzip the uImage
# \param --image-uboot-fit build image.itb FIT image
#
##
# Check if the uImage should be gzipped
#
proc image_uboot_use_no_gzip { } { return [get_cmd_switch --image-uboot-no-gzip] }
proc image_uboot_use_fit { } { return [get_cmd_switch --image-uboot-fit] }
##
# Make gzip compression more aggressive
#
# Using this option reduces the image size by circa 10%. But it comes at the
# cost of significantly slowing down the gzip step for large images (e.g., 6
# seconds instead of 2 seconds for a image of 13 MiB). The option is suitable
# when building a release. But for quick build-test cycles, it is best keep
# it disabled.
#
proc image_uboot_gzip_opt { } {
if {[get_cmd_switch --image-uboot-gzip-best]} {
return "--best"
} else {
return "--fast"
}
}
##
# Build U-boot bootloader specific uImage
#
proc run_image { } {
set dtc [installed_command dtc]
set elf_img [file join [run_dir] boot [kernel_specific_binary image.elf]]
# parse ELF entrypoint and load address
set entrypoint [exec [cross_dev_prefix]readelf -h $elf_img | \
grep "Entry point address: " | \
sed -e "s/.*Entry point address: *//"]
set load_addr [exec [cross_dev_prefix]readelf -l $elf_img | \
grep -m 1 "LOAD"]
set load_addr [lindex [regexp -inline -all -- {\S+} $load_addr] 3]
set bin_img [file join [run_dir] boot image.bin]
exec [cross_dev_prefix]objcopy -O binary $elf_img $bin_img
set use_gzip [expr ![image_uboot_use_no_gzip]]
set compress_type none
set bin_ext ""
# compress ELF
if $use_gzip {
exec gzip [image_uboot_gzip_opt] --force $bin_img
set bin_ext .gz
set compress_type gzip
}
set arch "arm"
if {[have_spec arm_64]} { set arch "arm64" }
if {[image_uboot_use_fit]} {
# create image.itb
set uboot_img [file join [run_dir] boot image.itb]
# create dummy dtb for version of u-boot requiring it in the fit image
set fd [open [run_dir]/dummy.dts w]
puts $fd "/dts-v1/;\n / {};"
close $fd
exec $dtc [run_dir]/dummy.dts -o [run_dir]/dummy.dtb
exec mkimage -f auto -A $arch -O linux -T kernel -C $compress_type -a $load_addr \
-e $entrypoint -b [run_dir]/dummy.dtb -d $bin_img$bin_ext $uboot_img
# cleanup dummy files
file delete -force [run_dir]/dummy.dts [run_dir]/dummy.dtb
} else {
# create uImage
set uboot_img [file join [run_dir] boot uImage]
exec mkimage -A $arch -O linux -T kernel -C $compress_type -a $load_addr \
-e $entrypoint -d $bin_img$bin_ext $uboot_img
}
exec rm -rf $bin_img$bin_ext $elf_img
}