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

Jason Wu jason.wu.misc at gmail.com
Fri Apr 29 18:19:41 PDT 2016



On 30/04/2016 7:22 AM, Alistair Francis wrote:
> On Thu, Apr 28, 2016 at 4:57 PM, Jason Wu <jason.wu.misc at gmail.com> wrote:
>>
>>
>> On 29/04/2016 3:32 AM, Alistair Francis wrote:
>>>
>>> On Wed, Apr 27, 2016 at 12:45 AM, Jason Wu <jason.wu.misc at gmail.com>
>>> wrote:
>>>>
>>>> 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>
>>>
>>>
>>> Hey Jason,
>>>
>>> I couldn't figure out how to select which configuration option to use.
>>
>> by default the first -c option used defines the default option to use.
>>
>> e.g. ./mkits.sh -A arm -v 4.4 -k kernel0 -C none -c 1 -c 2 -c 5 , uses
>> configuration option 1 as default option. If you want option 5 as default,
>> ./mkits.sh -A arm -v 4.4 -k kernel0 -C none -c 5 -c 1 -c 2 will set the
>> default configuration option to conf at 5.
>>
>> hope this answer you questions.
>
> Hey Jason,
>
> Ok, so there is no dynamic way to change the configuration then? The
> user will need to manually edit the command line arguments
You can always change the boot config option at run time. After you load 
the fitimage to ${load_addr}.
	uboot> bootm ${load_addr}#conf at 5
with this command, you will able to boot with conf at 5.

regards,

Jason

>
> Thanks,
>
> Alistair
>
>>
>> Cheers,
>>
>> Jason
>>
>>> How can I pick it?
>>>
>>> Besides that:
>>>
>>> Acked-by: Alistair Francis <alistair.francis at xilinx.com>
>>>
>>> Thanks,
>>>
>>> Alistair
>>>
>>>
>>>> ---
>>>>    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
>>>>
>>>> --
>>>> _______________________________________________
>>>> meta-xilinx mailing list
>>>> meta-xilinx at yoctoproject.org
>>>> https://lists.yoctoproject.org/listinfo/meta-xilinx



More information about the meta-xilinx mailing list