From ad860cb413d1934332de60658d5eb8fb64d19663 Mon Sep 17 00:00:00 2001 From: John Crispin Date: Sun, 9 May 2021 12:23:00 +0200 Subject: [PATCH 11/27] backport: mkits.sh 969083634481c3ab5fb80509f385ef10ab45b55f e991c1b8a2385397fc1e657ed73878938997d951 9f714398e060c6338fbfad44cdbfa8c940dbb84b Signed-off-by: John Crispin --- include/image-commands.mk | 2 +- include/image.mk | 2 +- scripts/mkits.sh | 101 +++++++++++++++++++++++++--- target/linux/ipq40xx/image/Makefile | 1 + target/linux/ipq806x/image/Makefile | 1 + 5 files changed, 95 insertions(+), 12 deletions(-) diff --git a/include/image-commands.mk b/include/image-commands.mk index 2c917d613e..c6e8eb0293 100644 --- a/include/image-commands.mk +++ b/include/image-commands.mk @@ -203,7 +203,7 @@ define Build/fit $(if $(word 3,$(1)),-r $(IMAGE_ROOTFS) -f $(subst _,$(comma),$(DEVICE_NAME))) \ -a $(KERNEL_LOADADDR) -e $(if $(KERNEL_ENTRY),$(KERNEL_ENTRY),$(KERNEL_LOADADDR)) \ $(if $(DEVICE_FDT_NUM),-n $(DEVICE_FDT_NUM)) \ - -c $(if $(DEVICE_DTS_CONFIG),$(DEVICE_DTS_CONFIG),"config@1") \ + -c $(if $(DEVICE_DTS_CONFIG),$(DEVICE_DTS_CONFIG),"config-1") \ -A $(LINUX_KARCH) -v $(LINUX_VERSION) PATH=$(LINUX_DIR)/scripts/dtc:$(PATH) mkimage $(if $(word 3,$(1)),-E -B 0x1000 -p 0x1000) -f $@.its $@.new @mv $@.new $@ diff --git a/include/image.mk b/include/image.mk index b6e8ab3c84..7c2dcf0e8b 100644 --- a/include/image.mk +++ b/include/image.mk @@ -139,7 +139,7 @@ endef define Image/BuildKernel/MkFIT $(TOPDIR)/scripts/mkits.sh \ -D $(1) -o $(KDIR)/fit-$(1).its -k $(2) $(if $(3),-d $(3)) -C $(4) -a $(5) -e $(6) \ - -c $(if $(DEVICE_DTS_CONFIG),$(DEVICE_DTS_CONFIG),"config@1") \ + -c $(if $(DEVICE_DTS_CONFIG),$(DEVICE_DTS_CONFIG),"config-1") \ -A $(LINUX_KARCH) -v $(LINUX_VERSION) PATH=$(LINUX_DIR)/scripts/dtc:$(PATH) mkimage -f $(KDIR)/fit-$(1).its $(KDIR)/fit-$(1)$(7).itb endef diff --git a/scripts/mkits.sh b/scripts/mkits.sh index 3d68fdacbc..7533baf799 100755 --- a/scripts/mkits.sh +++ b/scripts/mkits.sh @@ -24,22 +24,29 @@ usage() { printf "\n\t-a ==> set load address to 'addr' (hex)" printf "\n\t-e ==> set entry point to 'entry' (hex)" printf "\n\t-f ==> set device tree compatible string" + printf "\n\t-i ==> include initrd Blob 'initrd'" printf "\n\t-v ==> set kernel version to 'version'" printf "\n\t-k ==> include kernel image 'kernel'" printf "\n\t-D ==> human friendly Device Tree Blob 'name'" printf "\n\t-n ==> fdt unit-address 'address'" printf "\n\t-d ==> include Device Tree Blob 'dtb'" - printf "\n\t-r ==> include RootFS blob" + printf "\n\t-r ==> include RootFS blob 'rootfs'" printf "\n\t-H ==> specify hash algo instead of SHA1" - printf "\n\t-o ==> create output file 'its_file'\n" + printf "\n\t-o ==> create output file 'its_file'" + printf "\n\t-O ==> create config with dt overlay 'name:dtb'" + printf "\n\t\t(can be specified more than once)\n" exit 1 } FDTNUM=1 ROOTFSNUM=1 +INITRDNUM=1 HASH=sha1 +LOADABLES= +DTOVERLAY= +DTADDR= -while getopts ":A:a:c:C:D:d:e:f:k:n:o:v:r:S" OPTION +while getopts ":A:a:c:C:D:d:e:f:i:k:n:o:O:v:r:S" OPTION do case $OPTION in A ) ARCH=$OPTARG;; @@ -50,9 +57,11 @@ do d ) DTB=$OPTARG;; e ) ENTRY_ADDR=$OPTARG;; f ) COMPATIBLE=$OPTARG;; + i ) INITRD=$OPTARG;; k ) KERNEL=$OPTARG;; n ) FDTNUM=$OPTARG;; o ) OUTPUT=$OPTARG;; + O ) DTOVERLAY="$DTOVERLAY ${OPTARG}";; r ) ROOTFS=$OPTARG;; S ) HASH=$OPTARG;; v ) VERSION=$OPTARG;; @@ -74,14 +83,20 @@ if [ -n "${COMPATIBLE}" ]; then COMPATIBLE_PROP="compatible = \"${COMPATIBLE}\";" fi +[ "$DTOVERLAY" ] && { + dtbsize=$(wc -c "$DTB" | cut -d' ' -f1) + DTADDR=$(printf "0x%08x" $(($LOAD_ADDR - $dtbsize)) ) +} + # Conditionally create fdt information if [ -n "${DTB}" ]; then FDT_NODE=" - fdt@$FDTNUM { + fdt-$FDTNUM { description = \"${ARCH_UPPER} OpenWrt ${DEVICE} device tree blob\"; ${COMPATIBLE_PROP} data = /incbin/(\"${DTB}\"); type = \"flat_dt\"; + ${DTADDR:+load = <${DTADDR}>;} arch = \"${ARCH}\"; compression = \"none\"; hash@1 { @@ -92,13 +107,34 @@ if [ -n "${DTB}" ]; then }; }; " - FDT_PROP="fdt = \"fdt@$FDTNUM\";" + FDT_PROP="fdt = \"fdt-$FDTNUM\";" fi +if [ -n "${INITRD}" ]; then + INITRD_NODE=" + initrd-$INITRDNUM { + description = \"${ARCH_UPPER} OpenWrt ${DEVICE} initrd\"; + ${COMPATIBLE_PROP} + data = /incbin/(\"${INITRD}\"); + type = \"ramdisk\"; + arch = \"${ARCH}\"; + os = \"linux\"; + hash@1 { + algo = \"crc32\"; + }; + hash@2 { + algo = \"${HASH}\"; + }; + }; +" + INITRD_PROP="ramdisk=\"initrd-${INITRDNUM}\";" +fi + + if [ -n "${ROOTFS}" ]; then dd if="${ROOTFS}" of="${ROOTFS}.pagesync" bs=4096 conv=sync ROOTFS_NODE=" - rootfs@$ROOTFSNUM { + rootfs-$ROOTFSNUM { description = \"${ARCH_UPPER} OpenWrt ${DEVICE} rootfs\"; ${COMPATIBLE_PROP} data = /incbin/(\"${ROOTFS}.pagesync\"); @@ -113,9 +149,50 @@ if [ -n "${ROOTFS}" ]; then }; }; " - ROOTFS_PROP="loadables = \"rootfs@${ROOTFSNUM}\";" + LOADABLES="${LOADABLES:+$LOADABLES, }\"rootfs-${ROOTFSNUM}\"" fi +# add DT overlay blobs +FDTOVERLAY_NODE="" +OVCONFIGS="" +[ "$DTOVERLAY" ] && for overlay in $DTOVERLAY ; do + overlay_blob=${overlay##*:} + ovname=${overlay%%:*} + ovnode="fdt-$ovname" + ovsize=$(wc -c "$overlay_blob" | cut -d' ' -f1) + echo "$ovname ($overlay_blob) : $ovsize" >&2 + DTADDR=$(printf "0x%08x" $(($DTADDR - $ovsize))) + FDTOVERLAY_NODE="$FDTOVERLAY_NODE + + $ovnode { + description = \"${ARCH_UPPER} OpenWrt ${DEVICE} device tree overlay $ovname\"; + ${COMPATIBLE_PROP} + data = /incbin/(\"${overlay_blob}\"); + type = \"flat_dt\"; + arch = \"${ARCH}\"; + load = <${DTADDR}>; + compression = \"none\"; + hash@1 { + algo = \"crc32\"; + }; + hash@2 { + algo = \"${HASH}\"; + }; + }; +" + OVCONFIGS="$OVCONFIGS + + config-$ovname { + description = \"OpenWrt ${DEVICE} with $ovname\"; + kernel = \"kernel-1\"; + fdt = \"fdt-$FDTNUM\", \"$ovnode\"; + ${LOADABLES:+loadables = ${LOADABLES};} + ${COMPATIBLE_PROP} + ${INITRD_PROP} + }; + " +done + # Create a default, fully populated DTS file DATA="/dts-v1/; @@ -124,7 +201,7 @@ DATA="/dts-v1/; #address-cells = <1>; images { - kernel@1 { + kernel-1 { description = \"${ARCH_UPPER} OpenWrt Linux-${VERSION}\"; data = /incbin/(\"${KERNEL}\"); type = \"kernel\"; @@ -140,7 +217,9 @@ DATA="/dts-v1/; algo = \"$HASH\"; }; }; +${INITRD_NODE} ${FDT_NODE} +${FDTOVERLAY_NODE} ${ROOTFS_NODE} }; @@ -148,11 +227,13 @@ ${ROOTFS_NODE} default = \"${CONFIG}\"; ${CONFIG} { description = \"OpenWrt ${DEVICE}\"; - kernel = \"kernel@1\"; + kernel = \"kernel-1\"; ${FDT_PROP} - ${ROOTFS_PROP} + ${LOADABLES:+loadables = ${LOADABLES};} ${COMPATIBLE_PROP} + ${INITRD_PROP} }; + ${OVCONFIGS} }; };" diff --git a/target/linux/ipq40xx/image/Makefile b/target/linux/ipq40xx/image/Makefile index 2be262936f..a0d6242a28 100644 --- a/target/linux/ipq40xx/image/Makefile +++ b/target/linux/ipq40xx/image/Makefile @@ -8,6 +8,7 @@ define Device/Default KERNEL_PREFIX := $$(IMAGE_PREFIX) KERNEL_LOADADDR := 0x80208000 DEVICE_DTS = $$(SOC)-$(lastword $(subst _, ,$(1))) + DEVICE_DTS_CONFIG := config@1 IMAGES := sysupgrade.bin IMAGE/sysupgrade.bin = sysupgrade-tar | append-metadata IMAGE/sysupgrade.bin/squashfs := diff --git a/target/linux/ipq806x/image/Makefile b/target/linux/ipq806x/image/Makefile index bab1da0090..3bc60fa931 100644 --- a/target/linux/ipq806x/image/Makefile +++ b/target/linux/ipq806x/image/Makefile @@ -30,6 +30,7 @@ define Device/Default KERNEL_PREFIX := $$(IMAGE_PREFIX) KERNEL_LOADADDR = 0x42208000 DEVICE_DTS = $$(SOC)-$(lastword $(subst _, ,$(1))) + DEVICE_DTS_CONFIG := config@1 IMAGES := sysupgrade.bin IMAGE/sysupgrade.bin = sysupgrade-tar | append-metadata IMAGE/sysupgrade.bin/squashfs := -- 2.25.1