From 77543d1eb9708893b4ac9cff34f44a94e33ce51e Mon Sep 17 00:00:00 2001 From: "Ycarus (Yannick Chabanois)" Date: Thu, 24 Feb 2022 13:18:23 +0100 Subject: [PATCH] Fix mkits script --- root/scripts/mkits.sh | 190 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 157 insertions(+), 33 deletions(-) diff --git a/root/scripts/mkits.sh b/root/scripts/mkits.sh index 7ee39edb..5a585dc6 100755 --- a/root/scripts/mkits.sh +++ b/root/scripts/mkits.sh @@ -23,18 +23,32 @@ usage() { printf "\n\t-c ==> set config name 'config'" 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-o ==> create output file 'its_file'\n" + 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 -)" + 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 } +REFERENCE_CHAR='-' FDTNUM=1 +ROOTFSNUM=1 +INITRDNUM=1 +HASH=sha1 +LOADABLES= +DTOVERLAY= +DTADDR= -while getopts ":A:a:c:C:D:d:e:k:n:o:v:" OPTION +while getopts ":A:a:c:C:D:d:e:f:i:k:l:n:o:O:v:r:H:" OPTION do case $OPTION in A ) ARCH=$OPTARG;; @@ -44,9 +58,15 @@ do D ) DEVICE=$OPTARG;; d ) DTB=$OPTARG;; e ) ENTRY_ADDR=$OPTARG;; + f ) COMPATIBLE=$OPTARG;; + i ) INITRD=$OPTARG;; k ) KERNEL=$OPTARG;; + l ) REFERENCE_CHAR=$OPTARG;; n ) FDTNUM=$OPTARG;; o ) OUTPUT=$OPTARG;; + O ) DTOVERLAY="$DTOVERLAY ${OPTARG}";; + r ) ROOTFS=$OPTARG;; + H ) HASH=$OPTARG;; v ) VERSION=$OPTARG;; * ) echo "Invalid option passed to '$0' (options:$*)" usage;; @@ -62,30 +82,43 @@ fi ARCH_UPPER=$(echo "$ARCH" | tr '[:lower:]' '[:upper:]') +if [ -n "${COMPATIBLE}" ]; then + COMPATIBLE_PROP="compatible = \"${COMPATIBLE}\";" +fi + # Conditionally create fdt information if [ -n "${DTB}" ]; then if [ -f "$DTB" ]; then + [ "$DTOVERLAY" ] && { + dtbsize=$(wc -c "$DTB" | cut -d' ' -f1) + DTADDR=$(printf "0x%08x" $(($LOAD_ADDR - $dtbsize)) ) + } FDT_NODE=" - fdt@$FDTNUM { - description = \"${ARCH_UPPER} OpenWrt ${DEVICE} device tree blob\"; - data = /incbin/(\"${DTB}\"); - type = \"flat_dt\"; - arch = \"${ARCH}\"; - compression = \"none\"; - hash@1 { - algo = \"crc32\"; - }; - hash@2 { - algo = \"sha1\"; - }; + fdt${REFERENCE_CHAR}$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 { + algo = \"crc32\"; }; + hash@2 { + algo = \"${HASH}\"; + }; + }; " - + FDT_PROP="fdt = \"fdt${REFERENCE_CHAR}$FDTNUM\";" CONFIG_NODE=" ${CONFIG} { - description = \"OpenWrt\"; - kernel = \"kernel@1\"; - fdt = \"fdt@$FDTNUM\"; + description = \"OpenWrt ${DEVICE}\"; + kernel = \"kernel${REFERENCE_CHAR}1\"; + ${FDT_PROP} + ${LOADABLES:+loadables = ${LOADABLES};} + ${COMPATIBLE_PROP} + ${INITRD_PROP} }; " else @@ -107,39 +140,126 @@ if [ -n "${DTB}" ]; then rm -f "${OUTPUT}" exit 1 } - + [ "$DTOVERLAY" ] && { + dtbsize=$(wc -c "$ff" | cut -d' ' -f1) + DTADDR=$(printf "0x%08x" $(($LOAD_ADDR - $dtbsize)) ) + } FDT_NODE="${FDT_NODE} - - fdt@$FDTNUM { + fdt${REFERENCE_CHAR}$FDTNUM { description = \"${f}\"; + ${COMPATIBLE_PROP} data = /incbin/(\"${ff}\"); type = \"flat_dt\"; + ${DTADDR:+load = <${DTADDR}>;} arch = \"${ARCH}\"; compression = \"none\"; hash@1 { algo = \"crc32\"; }; hash@2 { - algo = \"sha1\"; + algo = \"${HASH}\"; }; }; " - # extract XYZ from image-qcom-ipq4018-rutx-XYZ.dtb - f=${f##*-} - f=${f%.*} - + FDT_PROP="fdt = \"fdt${REFERENCE_CHAR}$FDTNUM\";" CONFIG_NODE="${CONFIG_NODE} - + conf_mdtb@${FDTNUM} { description = \"${f}\"; - kernel = \"kernel@1\"; - fdt = \"fdt@$FDTNUM\"; + kernel = \"kernel${REFERENCE_CHAR}1\"; + ${FDT_PROP} + ${LOADABLES:+loadables = ${LOADABLES};} + ${COMPATIBLE_PROP} + ${INITRD_PROP} }; " done fi fi +if [ -n "${INITRD}" ]; then + INITRD_NODE=" + initrd${REFERENCE_CHAR}$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${REFERENCE_CHAR}${INITRDNUM}\";" +fi + + +if [ -n "${ROOTFS}" ]; then + dd if="${ROOTFS}" of="${ROOTFS}.pagesync" bs=4096 conv=sync + ROOTFS_NODE=" + rootfs-$ROOTFSNUM { + description = \"${ARCH_UPPER} OpenWrt ${DEVICE} rootfs\"; + ${COMPATIBLE_PROP} + data = /incbin/(\"${ROOTFS}.pagesync\"); + type = \"filesystem\"; + arch = \"${ARCH}\"; + compression = \"none\"; + hash@1 { + algo = \"crc32\"; + }; + hash@2 { + algo = \"${HASH}\"; + }; + }; +" + LOADABLES="${LOADABLES:+$LOADABLES, }\"rootfs${REFERENCE_CHAR}${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${REFERENCE_CHAR}1\"; + fdt = \"fdt${REFERENCE_CHAR}$FDTNUM\", \"$ovnode\"; + ${LOADABLES:+loadables = ${LOADABLES};} + ${COMPATIBLE_PROP} + ${INITRD_PROP} + }; + " +done + # Create a default, fully populated DTS file DATA="/dts-v1/; @@ -148,7 +268,7 @@ DATA="/dts-v1/; #address-cells = <1>; images { - kernel@1 { + kernel${REFERENCE_CHAR}1 { description = \"${ARCH_UPPER} OpenWrt Linux-${VERSION}\"; data = /incbin/(\"${KERNEL}\"); type = \"kernel\"; @@ -161,15 +281,19 @@ DATA="/dts-v1/; algo = \"crc32\"; }; hash@2 { - algo = \"sha1\"; + algo = \"$HASH\"; }; }; +${INITRD_NODE} ${FDT_NODE} +${FDTOVERLAY_NODE} +${ROOTFS_NODE} }; configurations { - default = \"${DEFAULT_CONFIG}\"; -${CONFIG_NODE} + default = \"${CONFIG}\"; + ${CONFIG_NODE} + ${OVCONFIGS} }; };"