[PATCH 4/6] image: fit: allow multiple dtbs

Tomasz Maciej Nowak tmn505 at terefe.re
Wed Jun 10 15:40:09 PDT 2026


From: Tomasz Maciej Nowak <tmn505 at gmail.com>

Some older U-Boot versions don't know about Device Tree overlays, which
could be used to accommodate for different variants of single board.
Extend fit command to pack multiple dtb to workaround that shortcoming.

Signed-off-by: Tomasz Maciej Nowak <tmn505 at gmail.com>
---
 include/image-commands.mk           |  2 +-
 scripts/mkits.sh                    | 51 +++++++++++++++++++++--------
 target/linux/airoha/image/an7581.mk |  2 +-
 3 files changed, 39 insertions(+), 16 deletions(-)

diff --git a/include/image-commands.mk b/include/image-commands.mk
index fb5ad8e51e0e..b1c99efe4cb1 100644
--- a/include/image-commands.mk
+++ b/include/image-commands.mk
@@ -438,7 +438,7 @@ define Build/fit-its
 		-D $(DEVICE_NAME) -o $@.its -k $@ \
 		-C $(word 1,$(1)) \
 		$(if $(DEVICE_DTS),\
-			-d $(KERNEL_BUILD_DIR)/image-$$(basename $(firstword $(DEVICE_DTS)).dtb)) \
+			$(foreach dts, $(DEVICE_DTS), -d $(dts):$(KERNEL_BUILD_DIR)/image-$$(basename $(dts)).dtb)) \
 		$(if $(findstring with-rootfs,$(word 2,$(1))),-r $(IMAGE_ROOTFS)) \
 		$(if $(findstring with-initrd,$(word 2,$(1))), \
 			$(if $(CONFIG_TARGET_ROOTFS_INITRAMFS_SEPARATE), \
diff --git a/scripts/mkits.sh b/scripts/mkits.sh
index 33ef3012c5c6..94592b932fce 100755
--- a/scripts/mkits.sh
+++ b/scripts/mkits.sh
@@ -29,7 +29,7 @@ usage() {
 	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-d ==> include Device Tree Blob 'name:dtb'"
 	printf "\n\t-r ==> include RootFS blob 'rootfs'"
 	printf "\n\t-H ==> specify hash algo instead of SHA1"
 	printf "\n\t-l ==> legacy mode character (@ etc otherwise -)"
@@ -48,6 +48,7 @@ HASH=sha1
 LOADABLES=
 DTOVERLAY=
 DTADDR=
+DTB=
 
 while getopts ":A:a:c:C:D:d:e:f:i:k:l:n:o:O:v:r:s:H:" OPTION
 do
@@ -57,7 +58,7 @@ do
 		c ) CONFIG=$OPTARG;;
 		C ) COMPRESS=$OPTARG;;
 		D ) DEVICE=$OPTARG;;
-		d ) DTB=$OPTARG;;
+		d ) DTB="$DTB ${OPTARG}";;
 		e ) ENTRY_ADDR=$OPTARG;;
 		f ) COMPATIBLE=$OPTARG;;
 		i ) INITRD=$OPTARG;;
@@ -117,13 +118,20 @@ if [ -n "${INITRD}" ]; then
 	INITRD_PROP="ramdisk=\"initrd${REFERENCE_CHAR}${INITRDNUM}\";"
 fi
 
+DEFCONFIG="$CONFIG"
+FDT_NODE=""
+CONFIGS=""
 # Conditionally create fdt information
 if [ -n "${DTB}" ]; then
-	FDT_NODE="
+	for dtb in $DTB; do
+		dtb_blob=${dtb##*:}
+		dtb_name=${dtb%%:*}
+		FDT_NODE="$FDT_NODE
+
 		fdt${REFERENCE_CHAR}$FDTNUM {
 			description = \"${ARCH_UPPER} OpenWrt ${DEVICE} device tree blob\";
 			${COMPATIBLE_PROP}
-			data = /incbin/(\"${DTB}\");
+			data = /incbin/(\"${dtb_blob}\");
 			type = \"flat_dt\";
 			${DTADDR:+load = <${DTADDR}>;}
 			arch = \"${ARCH}\";
@@ -136,7 +144,29 @@ if [ -n "${DTB}" ]; then
 			};
 		};
 "
-	FDT_PROP="fdt = \"fdt${REFERENCE_CHAR}$FDTNUM\";"
+		CONFIGS="$CONFIGS
+		${CONFIG:-$dtb_name} {
+			description = \"OpenWrt ${dtb_name}\";
+			kernel = \"kernel${REFERENCE_CHAR}1\";
+			fdt = \"fdt${REFERENCE_CHAR}$FDTNUM\";
+			${LOADABLES:+loadables = ${LOADABLES};}
+			${COMPATIBLE_PROP}
+			${INITRD_PROP}
+		};
+"
+		FDTNUM=$((FDTNUM + 1))
+		CONFIG=""
+	done
+else
+	CONFIGS="
+		${CONFIG} {
+			description = \"OpenWrt ${DEVICE}\";
+			kernel = \"kernel${REFERENCE_CHAR}1\";
+			${LOADABLES:+loadables = ${LOADABLES};}
+			${COMPATIBLE_PROP}
+			${INITRD_PROP}
+		};
+"
 fi
 
 # add DT overlay blobs
@@ -226,15 +256,8 @@ ${ROOTFS_NODE}
 	};
 
 	configurations {
-		default = \"${CONFIG}\";
-		${CONFIG} {
-			description = \"OpenWrt ${DEVICE}\";
-			kernel = \"kernel${REFERENCE_CHAR}1\";
-			${FDT_PROP}
-			${LOADABLES:+loadables = ${LOADABLES};}
-			${COMPATIBLE_PROP}
-			${INITRD_PROP}
-		};
+		default = \"${DEFCONFIG}\";
+		${CONFIGS}
 		${OVCONFIGS}
 	};
 };"
diff --git a/target/linux/airoha/image/an7581.mk b/target/linux/airoha/image/an7581.mk
index fa003c4e472f..214a9610db16 100644
--- a/target/linux/airoha/image/an7581.mk
+++ b/target/linux/airoha/image/an7581.mk
@@ -29,7 +29,7 @@ define Build/an7581-chainloader
     -a 0x80200000 -e 0x80200000 \
     -c conf-uboot \
     -A arm64 -v u-boot \
-    -d $(STAGING_DIR_IMAGE)/an7581_$1-u-boot.dtb \
+    -d $(DEVICE_NAME):$(STAGING_DIR_IMAGE)/an7581_$1-u-boot.dtb \
     -s 0x82000000
   PATH=$(LINUX_DIR)/scripts/dtc:$(PATH) \
     $(STAGING_DIR_HOST)/bin/mkimage \
-- 
2.54.0




More information about the openwrt-devel mailing list