[meta-xilinx] [PATCH 04/19] Add xilinx-fitimage recipe

Jason Wu jason.wu.misc at gmail.com
Wed Apr 27 00:45:58 PDT 2016


this recipe creates a fitimage (fit.itb) that contents:
 - 1 kernel
 - 1 rootfs
 - 1 dtb
 - 2 configs
config at 1: kernel + rootfs + dtb
config at 2: kernel + dtb

The ITS is generated by mkits.sh where it supports:
- multi-configuration (upto 10 with -c option). First -c used defines
the default conf used.
- multi-image support - multiple kernel/fdt/ramdsik image (upto 50 images)
- per image configuration: Tools now reuse the option for each images
  - hash algorithm and generated required subnodes
  - compression
  - signature and generated required subnodes (not tested)

mkits.sh allows user to generate a simple its that only has one configuration
that only boot with 1 kernel + 1 fdt to 4 different boot configuration
with different image combination. For an example:
creating a its with 2 kernel, 1 dtb, 2 rootfs images and has the following
configurations:
	1: kernel0 + dtb0 + rootfs0 (default boot configuration)
	2. kernel0 + dtb0 + rootfs1
	3. kernel1 + dtb0 + rootfs0
	4. kernel1 + dtb0 + rootfs1
	5. kernel0 + dtb1
where kernel1 and rootfs0 is gzip compressed.

The command to generate the its is shown as follows:
	$ ./mkits.sh -A arm -v 4.4 -k kernel0 -C none -c 1 -c 2 -c5 \
	  -k kernel1 -C gzip -c 3 -c 4 -h crc32 \
	  -d dtb0 -c 1 -c 2 -c 3 -c 4 -h sha1 -h crc32\
	  -d dtb1 -c 5 -h sha1 \
	  -r rootfs0 -C gzip -c 1 -c 2 \
	  -r rootfs1 -C none -c3 -c4

First -c option used defines the default boot configuration.

The key benefit is to have more flexible ITS generation. A typical example,
is to create a fitImage with 1 kernel with multiple dtb to provide different
features. E.g. system boot with ramdisk or sdroot or nfsroot and etc.

Signed-off-by: Jason Wu <jason.wu.misc at gmail.com>
---
 classes/xilinx-fitimage.bbclass |  89 ++++++
 scripts/bin/mkits.sh            | 581 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 670 insertions(+)
 create mode 100644 classes/xilinx-fitimage.bbclass
 create mode 100755 scripts/bin/mkits.sh

diff --git a/classes/xilinx-fitimage.bbclass b/classes/xilinx-fitimage.bbclass
new file mode 100644
index 0000000..8a528ae
--- /dev/null
+++ b/classes/xilinx-fitimage.bbclass
@@ -0,0 +1,89 @@
+inherit image_types
+
+#
+# Create an fitImage image that contents:
+#  - 1 kernel image
+#  - 1 rootfs image
+#  - 1 dtb image
+#  - 2 configuration
+#   * conf1: kernel + rootfs + dtb
+#   * conf2: kernel + dtb (prepare for sd-root)
+#
+# Assuming the images are in the ${DEPLOY_DIR_IMAGE} directory
+#
+IMAGE_TYPES_append = " xilinx-fitimage"
+
+# This image depends on the rootfs image
+IMAGE_TYPEDEP_xilinx-fitimage = "${FITIMAGE_ROOTFS_TYPE}"
+
+# Use an uncompressed cpio by default as rootfs
+FITIMAGE_ROOTFS_TYPE ?= "cpio"
+FITIMAGE_ROOTFS_COMPRESSION_TYPE ?= "none"
+FITIMAGE_ROOTFSIMG ?= "${IMAGE_BASENAME}-${MACHINE}.${FITIMAGE_ROOTFS_TYPE}"
+
+FITIMAGE_KERNELIMG ?= ""
+FITIMAGE_KERNEL_COMPRESSION_TYPE ?= "none"
+FITIMAGE_KERNEL_ENTRYPOINT ?= "0x8000"
+FITIMAGE_KERNEL_LOADADDRESS ?= "0x8000"
+
+FITIMAGE_DTBIMG ?= ""
+
+IMAGE_DEPENDS_xilinx-fitimage = " \
+			u-boot-mkimage-native \
+			dtc-native \
+			device-tree \
+			virtual/kernel \
+			"
+
+# Final fitimage name
+FITIMAGE_NAME ?= "fit.itb"
+
+python () {
+    # auto set up the kernel image
+    fitimg = d.getVar('FITIMAGE_KERNELIMG', True)
+    if fitimg is None or fitimg == "":
+        kimg_type = d.getVar('KERNEL_IMAGETYPE', True)
+        if kimg_type == "zImage" or kimg_type == "Image":
+            d.setVar('FITIMAGE_KERNELIMG', "%s" %kimg_type)
+        else:
+            raise bb.parse.SkipPackage("Set KERNEL_IMAGETYPE to zImage|Image to enable xilinx-fitimage")
+
+    # auto set up the dtb (first *.dtb found in DEPLOY_DIR_IMAGE)
+    fitdtb = d.getVar("FITIMAGE_DTBIMG", True)
+    if fitdtb is None or fitdtb == "":
+        import glob
+        for dtb in glob.glob("%s/*.dtb" %d.getVar("DEPLOY_DIR_IMAGE", True)):
+            d.setVar('FITIMAGE_DTBIMG', "%s" %(os.path.basename(dtb)))
+            break
+}
+
+IMAGE_CMD_xilinx-fitimage () {
+	cd ${B}
+	do_assemble_xilinx_fitimage
+
+	echo "Copying fit-image.its source file..."
+	fitimg_bn=fitImage.itb-${PV}-${PR}
+	its_base_name="fitImage.its-${PV}-${PR}"
+	its_symlink_name=fitimage.its
+	install -m 0644 fit-image.its ${DEPLOY_DIR_IMAGE}/${its_base_name}
+	install -m 0644 fitImage ${DEPLOY_DIR_IMAGE}/${fitimg_bn}
+
+	ln -sf ${fitimg_bn} ${DEPLOY_DIR_IMAGE}/${FITIMAGE_NAME}
+	ln -sf ${its_base_name} ${DEPLOY_DIR_IMAGE}/${its_symlink_name}
+}
+
+do_assemble_xilinx_fitimage() {
+	if [ -z "${FITIMAGE_DTBIMG}" ]; then
+		bbfatal "No dtb was defined, Please set FITIMAGE_DTBIMG appropriately."
+	fi
+	${XILINXBASE}/scripts/bin/mkits.sh -v "${MACHINE}" \
+		-k "${DEPLOY_DIR_IMAGE}/${FITIMAGE_KERNELIMG}" -c 1 -c 2 \
+		-C "${FITIMAGE_KERNEL_COMPRESSION_TYPE}" \
+		-e "${FITIMAGE_KERNEL_ENTRYPOINT}" \
+		-a "${FITIMAGE_KERNEL_LOADADDRESS}" \
+		-r "${DEPLOY_DIR_IMAGE}/${FITIMAGE_ROOTFSIMG}" -c 1 \
+		-C "${FITIMAGE_ROOTFS_COMPRESSION_TYPE}" \
+		-d "${DEPLOY_DIR_IMAGE}/${FITIMAGE_DTBIMG}" -c 1 -c 2 \
+		-o fit-image.its
+	uboot-mkimage -f fit-image.its fitImage
+}
diff --git a/scripts/bin/mkits.sh b/scripts/bin/mkits.sh
new file mode 100755
index 0000000..ff6a338
--- /dev/null
+++ b/scripts/bin/mkits.sh
@@ -0,0 +1,581 @@
+#!/usr/bin/env bash
+#
+# Licensed under the terms of the GNU GPL License version 2 or later.
+#
+# Author: Jason Wu <jason.hy.wu at gmail.com>
+#
+# U-Boot firmware supports the booting of images in the Flattened Image
+# Tree (FIT) format.  The FIT format uses a device tree structure to
+# describe a kernel image, device tree blob, ramdisk, etc.  This script
+# creates an Image Tree Source (.its file) which can be passed to the
+# 'mkimage' utility to generate an Image Tree Blob (.itb file).  The .itb
+# file can then be booted by U-Boot (or other bootloaders which support
+# FIT images).  See doc/uImage.FIT/howto.txt in U-Boot source code for
+# additional information on FIT images.
+#
+# This tools supports:
+#   - multi-configuration
+#   - multi-image support - multiple kernel/fdt/ramdsik
+#   - per image configuration:
+#     - hash algorithm and generated required subnodes
+#     - compression
+#     - signature and generated required subnodes
+#
+set -e
+
+# image config limit
+MAX_IMG=50
+# conf config limit
+MAX_CONF=10
+
+# declare main data array
+declare -a img_array
+declare -a conf_array
+
+# initialize array with empty values
+for (( index=1; index<=$MAX_IMG; index++ )); do
+	declare -a img$index
+	for i in {0..13}; do
+		eval img${index}[$i]=""
+	done
+done
+
+for (( index=1; index<=$MAX_CONF; index++ )); do
+	declare -a conf$index
+	for i in {0..9}; do
+		eval conf${index}[$i]=""
+	done
+done
+
+# imgX array index information
+#	0: type of image - kernel, fdt, ramdsik
+#	1: image location
+#	2: image index
+#	3: loadaddr of image
+#	4: entrypoint of image
+#	5: compression
+#	6: hash algorithm
+#	7: part of the configuration
+#	8: Human friend name for the image
+#	9: key file name
+#	10: signature
+
+# confX array index information
+#	0: conf number
+#	1: kernel conf
+#	2: fdt conf
+#	3: rootfs conf
+#	4: kernel key file
+#	5: fdt key file
+#	6: rootfs key file
+#	7: kernel sign_algorithm
+#	8: fdt sign_algorithm
+#	9: rootfs sign_algorithm
+
+usage() {
+	echo "Usage: `basename $0` -A arch -v version -o its_file" \
+		"-k kernel -a addr -e entry [-C none] [-h sha1] [-c conf]"
+	echo -e "Example1:\n\tkernel image ker_img1 with no compression +"
+	echo -e "\tsha1 hash + fdt dtb1 with sha1 and crc32 hash for conf 1"
+	echo -e "\t $ `basename $0` -A arm -v 4.4 \ "
+	echo -e "\t      -k ker_img1 -C none -h sha1 -e 0x8000 -a 0x8000 -c 1 \ "
+	echo -e "\t      -d dtb1 -h sha1 -h crc32 -c 1\n"
+	echo "General settings:"
+	echo -e "\t-A ==> set architecture to 'arch'"
+	echo -e "\t-v ==> set kernel version to 'version'"
+	echo -e "\t-o ==> create output file 'its_file' [optional]"
+	echo "Input image type:"
+	echo -e "\t-k ==> kernel image 'kernel'"
+	echo -e "\t-d ==> Device Tree Blob 'dtb'"
+	echo -e "\t-r ==> ramdisk image 'ramdisk"
+	echo "Per image configurations:"
+	echo -e "\t-C ==> set compression type 'comp'"
+	echo -e "\t-c ==> set image config (multiple -c allowed)"
+	echo -e "\t-a ==> set load address to 'addr' (hex)"
+	echo -e "\t-e ==> set entry point to 'entry' (hex)"
+	echo -e "\t-D ==> human friendly 'name' (one word only)"
+	echo -e "\t-h ==> set hash algorithm (multiple -h allowed)"
+	echo -e "\t-s ==> set signature for given config image"
+	echo -e "\t-K ==> set key file for given config image"
+	exit 1
+}
+
+array_check()
+{
+	local a=999
+	local max_a=0
+	local max_i=0
+
+	if echo $1 | grep -q img; then
+		max_a=$MAX_IMG
+		max_i=13
+		let a=$(echo $1 | awk -F "img" '{print $2}')
+	elif echo $1 | grep -q conf; then
+		max_a=$MAX_CONF
+		max_i=9
+		let a=$(echo $1 | awk -F "conf" '{print $2}')
+	fi
+	if [ ${a} -lt 0 -o ${a} -gt ${max_a} -o \
+		${2} -lt 0 -o ${2} -gt ${max_i} ]; then
+		echo "WARNING: Invalid array name, skipping!!!"
+		return 255
+	fi
+}
+
+#
+# $1:	array name
+# $2:	index
+# $3:	value
+# $4:	append operation
+#
+array_put()
+{
+	# check if array is declared
+	array_check $1 $2 || return 0
+	if [ -z "$4" ]; then
+		eval $1[$2]=$3
+	else
+		eval $1[$2]=\"\${$1[$2]} $3\"
+	fi
+}
+
+#
+# $1:	array name
+# $2:	index
+#
+array_get()
+{
+	local val
+	eval val=\${$1[$2]}
+	echo $val
+}
+
+parse_args() {
+	local i=-1 k=-1 d=-1 r=-1
+	while getopts ":A:a:C:c:D:d:e:h:k:K:o:v:r:s:" OPTION; do
+		case $OPTION in
+			A ) ARCH=$OPTARG;;
+			a ) array_put img$i 3 $OPTARG;;
+			C ) value_sanity_chk compression $OPTARG;
+				array_put img$i 5 $OPTARG;;
+			c ) array_put img$i 7 $OPTARG append;;
+			D ) array_put img$i 8 $OPTARG;;
+			d ) i=$(($i + 1));
+				d=$(($d + 1));
+				img_array[$i]=img$i;
+				array_put img$i 0 fdt;
+				array_put img$i 1 $OPTARG;
+				array_put img$i 2 $d;
+				;;
+			e ) array_put img$i 4 $OPTARG;;
+			h ) value_sanity_chk hash $OPTARG;
+				array_put img$i 6 $OPTARG append;;
+			k ) i=$(($i + 1));
+				k=$(($k + 1));
+				img_array[$i]=img$i;
+				array_put img$i 0 "kernel";
+				array_put img$i 1 $OPTARG;
+				array_put img$i 2 $k;
+				;;
+			K ) array_put img$i 9 $OPTARG;;
+			o ) OUTPUT=$OPTARG;;
+			v ) VERSION=$OPTARG;;
+			r ) i=$(($i + 1));
+				r=$(($r + 1));
+				img_array[$i]=img$i;
+				array_put img$i 0 "ramdisk";
+				array_put img$i 1 $OPTARG;
+				array_put img$i 2 $r;
+				;;
+			s ) value_sanity_chk signature $OPTARG;
+				array_put img$i 10 $OPTARG;
+				;;
+			* ) echo "Invalid option passed to '$0' (options:$@)"
+			usage;;
+		esac
+	done
+	[ -n "${OUTPUT}" ] || OUTPUT=fitimage.its
+	[ -n "${VERSION}" ] || VERSION="Unknown"
+	[ -n "${ARCH}" ] || ARCH=arm
+}
+
+#
+# sanity check for signature, compression and hash
+#
+value_sanity_chk()
+{
+	local valid=""
+	case $1 in
+		signature) valid="sha-1,rsa-2048 sha-256,rsa-2048 sha-256,rsa-4096";;
+		compression) valid="gzip bzip2 none";;
+		hash) valid="sha1 md5 crc32";;
+	esac
+	if ! echo $valid | grep -q "$2"; then
+		echo "Error: Invalid $1 provided '$2'"
+		echo "Valid options are: $valid"
+		exit 255
+	fi
+}
+
+#
+# Emit the fitImage section bits
+#
+# $1: Section bit type: fitstart   - its header
+#                       imagestart - image section start
+#                       confstart  - configuration section start
+#                       sectend    - section end
+#                       fitend     - fitimage end
+# $2: optional variable for confstart section
+#
+emit_its() {
+	case $1 in
+	fitstart)
+		cat << EOF > ${OUTPUT}
+/dts-v1/;
+
+/ {
+	description = "U-Boot fitImage for ${VERSION} kernel";
+	#address-cells = <1>;
+EOF
+	;;
+	imagestart)
+		echo -e "\n\timages {" >> ${OUTPUT};;
+	confstart)
+		echo -e "\tconfigurations {\n\t\tdefault = \"conf@${2:-0}\";" \
+			>> ${OUTPUT};;
+	sectend)
+		echo -e "\t};" >> ${OUTPUT};;
+	fitend)
+		echo -e "};" >> ${OUTPUT};;
+	esac
+}
+
+#
+# Emit kernel image node
+#
+emit_kernel() {
+	local image=${1}
+	local count=${2:-${MAX_IMG}}
+	local loaddaddr=${3:-0x8000}
+	local entrypoint=${4:-0x8000}
+	local compresson=${5:-none}
+	local checksum=${6:-sha1}
+	local name=${7}
+
+	[ -z "${name}" ] || name=" ${name}"
+	cat << EOF >> ${OUTPUT}
+		kernel@${count} {
+			description = "Linux Kernel${name}";
+			data = /incbin/("${image}");
+			type = "kernel";
+			arch = "${ARCH}";
+			os = "linux";
+			compression = "${compresson}";
+			load = <${loaddaddr}>;
+			entry = <${entrypoint}>;
+EOF
+	emit_cksum ${checksum}
+
+	if [ -z "$SIGN_IN_CONF" ] ; then
+		emit_signature "$9" "" "" "$8" "" ""
+	fi
+
+	echo "		};" >> ${OUTPUT}
+}
+
+#
+# Emit fdt node
+#
+emit_fdt() {
+	local image=${1}
+	local count=${2:-${MAX_IMG}}
+	local compresson=${3:-none}
+	local checksum=${4:-sha1}
+	local name=${5}
+
+	[ -z "${name}" ] || name=" ${name}"
+	cat << EOF >> ${OUTPUT}
+		fdt@${count} {
+			description = "Flattened Device Tree blob${name}";
+			data = /incbin/("${image}");
+			type = "flat_dt";
+			arch = "${ARCH}";
+			compression = "none";
+EOF
+	emit_cksum ${checksum}
+	if [ -z "$SIGN_IN_CONF" ] ; then
+		emit_signature "" "$7" "" "" "$6" ""
+	fi
+	echo "		};" >> ${OUTPUT}
+}
+
+#
+# Emit ramdisk node
+#
+emit_ramdisk() {
+	local image=${1}
+	local count=${2:-${MAX_IMG}}
+	local compresson=${3:-none}
+	local checksum=${4:-sha1}
+	local name=${5}
+
+	[ -z "${name}" ] || name=" ${name}"
+	cat << EOF >> ${OUTPUT}
+		ramdisk@${count} {
+			description = "ramdisk${name}";
+			data = /incbin/("${image}");
+			type = "ramdisk";
+			arch = "${ARCH}";
+			os = "linux";
+			compression = "${compresson}";
+EOF
+	emit_cksum ${checksum}
+	if [ -z "$SIGN_IN_CONF" ] ; then
+		emit_signature "" "" "$7" "" "" "$6"
+	fi
+	echo "		};" >> ${OUTPUT}
+}
+
+#
+# Emit check sum sub node
+#
+emit_cksum() {
+	csum_list=$@
+	count=1
+	for csum in ${csum_list}; do
+		cat << EOF >> ${OUTPUT}
+			hash@${count} {
+				algo = "${csum}";
+			};
+EOF
+		count=`expr ${count} + 1`
+	done
+}
+
+#
+# Emit signature sub node
+#
+emit_signature() {
+	local kernel=$1
+	local fdt=$2
+	local rootfs=$3
+	local kernel_key=$4
+	local fdt_key=$5
+	local rootfs_key=$6
+	local imgs=""
+	local count=0
+	local chk_list="" algo="" algos="" i=""
+
+	for i in kernel fdt rootfs; do
+		eval algo=\$$i
+		eval key=\$${i}_key
+		[ -n "$algo" ] || continue
+		if ! echo "$algos" | grep -q $algo; then
+			if [ -z "$algos" ]; then
+				algos=$algo
+			else
+				algos="${algos} $algo"
+			fi
+		fi
+		if ! echo "$keys" | grep -q $key; then
+			if [ -z "$keys" ]; then
+				keys=$key
+			else
+				keys="${keys} $key"
+			fi
+		fi
+	done
+
+	for algo in $algos; do
+		for key in $keys; do
+			img=""
+			for i in kernel fdt rootfs; do
+				eval tmp_algo=\$$i
+				eval tmp_key=\$${i}_key
+				[ "$tmp_algo" == "$algo" ] || continue
+				[ "$tmp_key" == "$key" ] || continue
+				if [ -z "$img" ]; then
+					img=$i
+				else
+					img=${img},$i
+				fi
+			done
+
+			[ -n "$img" ] || continue
+			cat << EOF >> ${OUTPUT}
+			signature@${count} {
+				algo = "${algo}";
+				key-name-hint = "${key}";
+EOF
+			if [ -n "$SIGN_IN_CONF" ] ; then
+				echo "			sign-images = \"$img\";" >> ${OUTPUT}
+			fi
+			echo "			};" >> ${OUTPUT}
+
+			count=`expr ${count} + 1`
+		done
+	done
+}
+
+#
+# Emit config sub nodes
+#
+emit_config() {
+	local conf_csum="sha1"
+
+	if [ -z "${2}" ]; then
+		echo "Error: config has no kernel img, skipping conf node!"
+		return 0
+	fi
+
+	# Test if we have any DTBs at all
+	if [ -z "${3}" ] ; then
+		conf_desc="Boot Linux kernel"
+		fdt_line=""
+	else
+		conf_desc="Boot Linux kernel with FDT blob"
+		fdt_line="
+			fdt = \"fdt@${3}\";"
+	fi
+
+	# Test if we have any ROOTFS at all
+	if [ -n "${4}" ] ; then
+		conf_desc="$conf_desc + ramdisk"
+		fdt_line="${fdt_line}
+			ramdisk = \"ramdisk@${4}\";"
+	fi
+
+	kernel_line="kernel = \"kernel@${2}\";"
+
+	cat << EOF >> ${OUTPUT}
+		conf@${1} {
+			description = "${conf_desc}";
+			${kernel_line}${fdt_line}
+			hash at 1 {
+				algo = "${conf_csum}";
+			};
+EOF
+	if [ -n "$SIGN_IN_CONF" ] ; then
+		emit_signature "$5" "$6" "$7" "$8" "$9" "${10}"
+	fi
+
+	echo "		};" >> ${OUTPUT}
+}
+
+#
+# remove prefix space
+#
+remove_prefix_space()
+{
+	echo "$@" | sed "s:^ ::g"
+}
+
+#
+# generate image nodes and its subnodes
+#
+emit_image_nodes()
+{
+	local t img_c img_i img_index chk
+	local img_type img_path img_count img_loadadr img_entrypoint \
+		img_compression img_hash img_conf img_name img_key img_sign
+
+	emit_its imagestart
+	for t in "kernel" "fdt" "ramdisk"; do
+		img_index=0
+		for a in ${img_array[@]}; do
+			img_type=$(array_get $a 0)
+			img_path=$(array_get $a 1)
+			img_count=$(array_get $a 2)
+			img_loadadr=$(array_get $a 3)
+			img_entrypoint=$(array_get $a 4)
+			img_compression=$(array_get $a 5)
+			img_hash=$(array_get $a 6)
+			img_conf=$(array_get $a 7)
+			img_name=$(array_get $a 8)
+			img_key=$(array_get $a 9)
+			img_sign=$(array_get $a 10)
+
+			img_conf=$(remove_prefix_space $img_conf)
+			img_hash=$(remove_prefix_space $img_hash)
+
+			[ "${img_type}" == $t ] || continue
+			# generate sub nodes
+			eval chk=\$DEF_$t
+			[ -n "${chk}" ] || eval DEF_$t=$img_count
+			case $t in
+				kernel) emit_kernel "$img_path" "$img_count" \
+					"$img_loadadr" "$img_entrypoint" \
+					"$img_compression" "$img_hash" \
+					"$img_name" "$img_key" "$img_sign";;
+				fdt) emit_fdt "$img_path" "$img_count" \
+					"$img_compression" "$img_hash" \
+					"$img_name" "$img_key" "$img_sign";;
+
+				ramdisk) emit_ramdisk "$img_path" "$img_count" \
+					"$img_compression" "$img_hash" \
+					"$img_name" "$img_key" "$img_sign";;
+			esac
+
+			# set up configuration data
+			for img_c in ${img_conf}; do
+				img_i=""
+				#set up default configuration if its not set
+				[ -n "$DEF_CONFIG" ] || DEF_CONFIG=$img_c
+				[ -n "${img_c}" ] || continue
+				[ -z "${img_c}" ] || conf_array[$img_c]=conf$img_c
+				array_put conf$img_c 0 ${img_c}
+				case $t in
+					kernel) img_i=1;;
+					fdt) img_i=2;;
+					ramdisk) img_i=3;;
+				esac
+				array_put conf$img_c $img_i $img_index
+				array_put conf$img_c $(($img_i + 3)) ${img_sign}
+				array_put conf$img_c $(($img_i + 6)) ${img_key}
+			done
+			img_index=$(($img_index + 1))
+		done
+	done
+	emit_its sectend
+}
+
+#
+# generate configuration node and its subnodes
+#
+emit_configuration_nodes ()
+{
+	local count kernel fdt ramdisk ker_file fdt_file rfs_file ker_sign \
+		fdt_sign rfs_sign
+	emit_its confstart $DEF_CONFIG
+	for a in ${conf_array[@]}; do
+		count=$(array_get $a 0)
+		kernel=$(array_get $a 1)
+		fdt=$(array_get $a 2)
+		ramdisk=$(array_get $a 3)
+		er_file=$(array_get $a 4)
+		fdt_file=$(array_get $a 5)
+		rfs_file=$(array_get $a 6)
+		ker_sign=$(array_get $a 7)
+		fdt_sign=$(array_get $a 8)
+		rfs_sign=$(array_get $a 9)
+		emit_config "$count" "$kernel" "$fdt" "$ramdisk" "$ker_file" \
+			"$fdt_file" "$rfs_file" "$ker_sign" "$fdt_sign" \
+			"$rfs_sign"
+	done
+	if [ -z "${DEF_CONFIG}" ]; then
+		emit_config "0" "$DEF_kernel" "$DEF_fdt" "$DEF_ramdisk"
+	fi
+	emit_its sectend
+}
+
+# Set to none empty to create signature sub node under images node
+SIGN_IN_CONF=${SIGN_IN_CONF:-""}
+# Set to default config used
+DEF_CONFIG=${DEF_CONFIG:-""}
+
+parse_args $@
+
+emit_its fitstart
+emit_image_nodes
+emit_configuration_nodes
+emit_its fitend
-- 
1.9.1




More information about the meta-xilinx mailing list