sdk-hwV1.3/scripts/pack_img.sh

2349 lines
81 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
#
# pack/pack
# (c) Copyright 2013 - 2016 Allwinner
# Allwinner Technology Co., Ltd. <www.allwinnertech.com>
# James Deng <csjamesdeng@allwinnertech.com>
# Trace Wong <wangyaliang@allwinnertech.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
############################ Notice #####################################
# a. Some config files priority is as follows:
# - xxx_${platform}.{cfg|fex} > xxx.{cfg|fex}
# - ${chip}/${board}/*.{cfg|fex} > ${chip}/default/*.{cfg|fex}
# - ${chip}/default/*.cfg > common/imagecfg/*.cfg
# - ${chip}/default/*.fex > common/partition/*.fex
# e.g. sun8iw7p1/configs/perf/image_linux.cfg > sun8iw7p1/configs/default/image_linux.cfg
# > common/imagecfg/image_linux.cfg > sun8iw7p1/configs/perf/image.cfg
# > sun8iw7p1/configs/default/image.cfg > common/imagecfg/image.cfg
#
# b. Support Nor storages rule:
# - Need to create sys_partition_nor.fex or sys_partition_nor_${platform}.fex
# - Add "{filename = "full_img.fex", maintype = "12345678", \
# subtype = "FULLIMG_00000000",}" to image[_${platform}].cfg
#
# c. Switch uart port
# - Need to add your chip configs into ${LONGAN_COMMON_DIR}/debug/card_debug_pin
# - Call pack with 'debug' parameters
enable_pause=0
function get_char()
{
SAVEDSTTY=`stty -g`
stty -echo
stty cbreak
dd if=/dev/tty bs=1 count=1 2> /dev/null
stty -raw
stty echo
stty $SAVEDSTTY
}
function pause()
{
if [ "x$1" != "x" ] ;then
echo "$1"
fi
if [ $enable_pause -eq 1 ] ; then
echo "Press any key to continue!"
char=`get_char`
fi
}
function pack_error()
{
echo -e "\033[47;31mERROR: $*\033[0m"
}
function pack_warn()
{
echo -e "\033[47;34mWARN: $*\033[0m"
}
function pack_info()
{
echo -e "\033[47;30mINFO: $*\033[0m"
}
source scripts/shflags
# define option, format:
# 'long option' 'default value' 'help message' 'short option'
DEFINE_string 'chip' '' 'chip to build, e.g. sun7i' 'c'
DEFINE_string 'platform' '' 'platform to build, e.g. linux, android, camdroid' 'p'
DEFINE_string 'board' '' 'board to build, e.g. evb' 'b'
DEFINE_string 'kernel' '' 'kernel to build, e.g. linux-3.4, linux-3.10' 'k'
DEFINE_string 'debug_mode' 'uart0' 'config debug mode, e.g. uart0, card0' 'd'
DEFINE_string 'signture' 'none' 'pack boot signture to do secure boot' 's'
DEFINE_string 'secure' 'none' 'pack secure boot with -v arg' 'v'
DEFINE_string 'mode' 'normal' 'pack dump firmware' 'm'
DEFINE_string 'function' 'android' 'pack private firmware' 'f'
DEFINE_string 'topdir' 'none' 'sdk top dir' 't'
#create img for emmc programmer
DEFINE_string 'programmer' '' 'creat programmer img or not' 'w'
#create img for nand programmer
DEFINE_string 'tar_image' '' 'creat downloadfile img .tar.gz or not' 'i'
# parse the command-line
FLAGS "$@" || exit $?
eval set -- "${FLAGS_ARGV}"
PACK_CHIP=${FLAGS_chip}
PACK_PLATFORM=${FLAGS_platform}
PACK_BOARD=${FLAGS_board}
PACK_PLAN=${PACK_BOARD##*-}
PACK_KERN=${FLAGS_kernel}
PACK_DEBUG=${FLAGS_debug_mode}
PACK_SIG=${FLAGS_signture}
PACK_SECURE=${FLAGS_secure}
PACK_MODE=${FLAGS_mode}
PACK_FUNC=${FLAGS_function}
PACK_PROGRAMMER=${FLAGS_programmer}
PACK_TAR_IMAGE=${FLAGS_tar_image}
PACK_TOPDIR=${FLAGS_topdir}
function show_args
{
echo --==========--
echo "PACK_CHIP " ${FLAGS_chip}
echo "PACK_PLATFORM " ${FLAGS_platform}
echo "PACK_BOARD " ${FLAGS_board}
echo "PACK_KERN " ${FLAGS_kernel}
echo "PACK_DEBUG " ${FLAGS_debug_mode}
echo "PACK_SIG " ${FLAGS_signture}
echo "PACK_SECURE " ${FLAGS_secure}
echo "PACK_MODE " ${FLAGS_mode}
echo "PACK_FUNC " ${FLAGS_function}
echo "PACK_PROGRAMMER " ${FLAGS_programmer}
echo "PACK_TAR_IMAGE " ${FLAGS_tar_image}
echo "PACK_TOPDIR " ${FLAGS_topdir}
echo --==========--
}
show_args
ROOT_DIR=${PACK_TOPDIR}/out/${PACK_BOARD}
OTA_TEST_NAME="ota_test"
export PATH=${PACK_TOPDIR}/out/host/bin/:$PATH
if [ "x${PACK_CHIP}" = "xsun5i" ]; then
PACK_BOARD_PLATFORM=unclear
ARCH=arm
elif [ "x${PACK_CHIP}" = "xsun8iw5p1" ]; then
PACK_BOARD_PLATFORM=${PACK_BOARD%%-*}
ARCH=arm
elif [ "x${PACK_CHIP}" = "xsun8iw6p1" ]; then
PACK_BOARD_PLATFORM=${PACK_BOARD%%-*}
ARCH=arm
elif [ "x${PACK_CHIP}" = "xsun8iw7p1" ]; then
PACK_BOARD_PLATFORM=${PACK_BOARD%%-*}
ARCH=arm
elif [ "x${PACK_CHIP}" = "xsun8iw8p1" ]; then
PACK_BOARD_PLATFORM=${PACK_BOARD%%-*}
ARCH=arm
elif [ "x${PACK_CHIP}" = "xsun8iw11p1" ]; then
PACK_BOARD_PLATFORM=${PACK_BOARD%%-*}
ARCH=arm
elif [ "x${PACK_CHIP}" = "xsun8iw10p1" ]; then
PACK_BOARD_PLATFORM=${PACK_BOARD%%-*}
ARCH=arm
elif [ "x${PACK_CHIP}" = "xsun8iw15p1" ]; then
PACK_BOARD_PLATFORM=${PACK_BOARD%%-*}
ARCH=arm
elif [ "x${PACK_CHIP}" = "xsun8iw17p1" ]; then
PACK_BOARD_PLATFORM=${PACK_BOARD%%-*}
ARCH=arm
elif [ "x${PACK_CHIP}" = "xsun8iw18p1" ]; then
PACK_BOARD_PLATFORM=${PACK_BOARD%%-*}
ARCH=arm
elif [ "x${PACK_CHIP}" = "xsun8iw20p1" ]; then
PACK_BOARD_PLATFORM=${PACK_BOARD%%-*}
ARCH=arm
elif [ "x${PACK_CHIP}" = "xsun8iw21p1" ]; then
PACK_BOARD_PLATFORM=${PACK_BOARD%%-*}
ARCH=arm
elif [ "x${PACK_CHIP}" = "xsun8iw19p1" ]; then
PACK_BOARD_PLATFORM=${PACK_BOARD%%-*}
ARCH=arm
elif [ "x${PACK_CHIP}" = "xsun3iw1p1" ]; then
PACK_BOARD_PLATFORM=${PACK_BOARD%%-*}
ARCH=arm
elif [ "x${PACK_CHIP}" = "xsun50iw1p1" ]; then
PACK_BOARD_PLATFORM=${PACK_BOARD%%-*}
ARCH=arm64
elif [ "x${PACK_CHIP}" = "xsun50iw3p1" ]; then
PACK_BOARD_PLATFORM=${PACK_BOARD%%-*}
ARCH=arm64
elif [ "x${PACK_CHIP}" = "xsun8iw12p1" ]; then
PACK_BOARD_PLATFORM=${PACK_BOARD%%-*}
ARCH=arm
elif [ "x${PACK_CHIP}" = "xsun8iw16p1" ]; then
PACK_BOARD_PLATFORM=${PACK_BOARD%%-*}
ARCH=arm
elif [ "x${PACK_CHIP}" = "xsun50iw6p1" -o "x${PACK_CHIP}" = "xsun50iw9p1" ]; then
PACK_BOARD_PLATFORM=${PACK_BOARD%%-*}
ARCH=arm64
elif [ "x${PACK_CHIP}" = "xsun50iw10p1" ]; then
PACK_BOARD_PLATFORM=${PACK_BOARD%%-*}
ARCH=arm64
elif [ "x${PACK_CHIP}" = "xsun50iw11p1" ]; then
PACK_BOARD_PLATFORM=${PACK_BOARD%%-*}
ARCH=arm64
elif [ "x${PACK_CHIP}" = "xsun20iw1p1" ]; then
PACK_BOARD_PLATFORM=${PACK_BOARD%-*}
ARCH=riscv
else
echo "board_platform($PACK_CHIP) not support"
fi
TINA_CONFIG_DIR="${PACK_TOPDIR}/target/allwinner"
LONGAN_CONFIG_DIR="${PACK_TOPDIR}/device/config/chips/${PACK_BOARD_PLATFORM}/configs"
LONGAN_COMMON_DIR="${PACK_TOPDIR}/device/config/common"
LICHEE_CHIP_CONFIG_DIR="${PACK_TOPDIR}/device/config/chips/${PACK_BOARD_PLATFORM}"
PACK_PLATFORM_IMAGE_CFG=$PACK_PLATFORM
[ x"$PACK_PLATFORM" = x"tina" ] && PACK_PLATFORM_IMAGE_CFG="linux"
tools_file_list=(
${TINA_CONFIG_DIR}/generic/tools/split_xxxx.fex
${TINA_CONFIG_DIR}/generic/tools/usbtool_test.fex
${TINA_CONFIG_DIR}/generic/tools/usbtool_crash.fex
${TINA_CONFIG_DIR}/generic/tools/cardscript.fex
${TINA_CONFIG_DIR}/generic/tools/cardscript_secure.fex
${TINA_CONFIG_DIR}/generic/tools/cardtool.fex
${TINA_CONFIG_DIR}/generic/tools/usbtool.fex
${TINA_CONFIG_DIR}/generic/tools/aultls32.fex
${TINA_CONFIG_DIR}/generic/tools/aultools.fex
${LONGAN_COMMON_DIR}/tools/split_xxxx.fex
${LONGAN_COMMON_DIR}/tools/usbtool_test.fex
${LONGAN_COMMON_DIR}/tools/usbtool_crash.fex
${LONGAN_COMMON_DIR}/tools/cardscript.fex
${LONGAN_COMMON_DIR}/tools/cardscript_secure.fex
${LONGAN_COMMON_DIR}/tools/cardtool.fex
${LONGAN_COMMON_DIR}/tools/usbtool.fex
${LONGAN_COMMON_DIR}/tools/aultls32.fex
${LONGAN_COMMON_DIR}/tools/aultools.fex
${TINA_CONFIG_DIR}/${PACK_BOARD_PLATFORM}-common/tools/split_xxxx.fex
${TINA_CONFIG_DIR}/${PACK_BOARD_PLATFORM}-common/tools/usbtool_test.fex
${TINA_CONFIG_DIR}/${PACK_BOARD_PLATFORM}-common/tools/usbtool_crash.fex
${TINA_CONFIG_DIR}/${PACK_BOARD_PLATFORM}-common/tools/cardscript.fex
${TINA_CONFIG_DIR}/${PACK_BOARD_PLATFORM}-common/tools/cardscript_secure.fex
${TINA_CONFIG_DIR}/${PACK_BOARD_PLATFORM}-common/tools/cardtool.fex
${TINA_CONFIG_DIR}/${PACK_BOARD_PLATFORM}-common/tools/usbtool.fex
${TINA_CONFIG_DIR}/${PACK_BOARD_PLATFORM}-common/tools/aultls32.fex
${TINA_CONFIG_DIR}/${PACK_BOARD_PLATFORM}-common/tools/aultools.fex
${LONGAN_CONFIG_DIR}/../tools/split_xxxx.fex
${LONGAN_CONFIG_DIR}/../tools/usbtool_test.fex
${LONGAN_CONFIG_DIR}/../tools/usbtool_crash.fex
${LONGAN_CONFIG_DIR}/../tools/cardscript.fex
${LONGAN_CONFIG_DIR}/../tools/cardscript_secure.fex
${LONGAN_CONFIG_DIR}/../tools/cardtool.fex
${LONGAN_CONFIG_DIR}/../tools/usbtool.fex
${LONGAN_CONFIG_DIR}/../tools/aultls32.fex
${LONGAN_CONFIG_DIR}/../tools/aultools.fex
)
configs_file_list=(
${TINA_CONFIG_DIR}/generic/toc/toc1.fex
${TINA_CONFIG_DIR}/generic/toc/toc0.fex
${TINA_CONFIG_DIR}/generic/toc/boot_package.fex
${TINA_CONFIG_DIR}/generic/dtb/sunxi.fex
${TINA_CONFIG_DIR}/generic/configs/*.fex
${TINA_CONFIG_DIR}/generic/configs/*.cfg
${TINA_CONFIG_DIR}/generic/version/version_base.mk
${LONGAN_COMMON_DIR}/toc/*.fex
${LONGAN_COMMON_DIR}/hdcp/esm.fex
${LONGAN_COMMON_DIR}/dtb/sunxi.fex
${LONGAN_COMMON_DIR}/imagecfg/*.cfg
${LONGAN_COMMON_DIR}/partition/sys_partition_dump.fex
${LONGAN_COMMON_DIR}/partition/sys_partition_private.fex
${LONGAN_COMMON_DIR}/version/version_base.mk
${TINA_CONFIG_DIR}/${PACK_BOARD_PLATFORM}-common/configs/*.fex
${TINA_CONFIG_DIR}/${PACK_BOARD_PLATFORM}-common/configs/*.cfg
${TINA_CONFIG_DIR}/${PACK_BOARD_PLATFORM}-common/configs/*.its
${TINA_CONFIG_DIR}/${PACK_BOARD}/configs/*.fex
${TINA_CONFIG_DIR}/${PACK_BOARD}/configs/*.cfg
${LONGAN_CONFIG_DIR}/default/*.fex
${LONGAN_CONFIG_DIR}/default/*.cfg
${LONGAN_CONFIG_DIR}/default/*.its
${LONGAN_CONFIG_DIR}/default/version_base.mk
${LONGAN_CONFIG_DIR}/${PACK_PLAN}/*.fex
${LONGAN_CONFIG_DIR}/${PACK_PLAN}/*.cfg
${LONGAN_CONFIG_DIR}/${PACK_PLAN}/linux/*.fex
${LONGAN_CONFIG_DIR}/${PACK_PLAN}/linux/*.cfg
)
boot_resource_list=(
${TINA_CONFIG_DIR}/generic/boot-resource/boot-resource:image/
${TINA_CONFIG_DIR}/generic/boot-resource/boot-resource.ini:image/
${TINA_CONFIG_DIR}/${PACK_BOARD_PLATFORM}-common/boot-resource:image/
${TINA_CONFIG_DIR}/${PACK_BOARD_PLATFORM}-common/boot-resource.ini:image/
${TINA_CONFIG_DIR}/${PACK_BOARD}/configs/*.bmp:image/boot-resource/
${LONGAN_CONFIG_DIR}/default/boot-resource:image/
${LONGAN_CONFIG_DIR}/default/boot-resource.ini:image/
${LONGAN_CONFIG_DIR}/${PACK_PLAN}/configs/*.bmp:image/boot-resource/
)
possible_bin_path=(
bin
configs/${PACK_PLAN}/bin
configs/${PACK_PLAN}/${PACK_PLATFORM_IMAGE_CFG}/bin
)
boot_file_list=(
${LONGAN_CONFIG_DIR}/../\${BIN_PATH}/boot0_nand_${PACK_CHIP}.bin:${ROOT_DIR}/image/boot0_nand.fex
${LONGAN_CONFIG_DIR}/../\${BIN_PATH}/boot0_sdcard_${PACK_CHIP}.bin:${ROOT_DIR}/image/boot0_sdcard.fex
${LONGAN_CONFIG_DIR}/../\${BIN_PATH}/boot0_spinor_${PACK_CHIP}.bin:${ROOT_DIR}/image/boot0_spinor.fex
${LONGAN_CONFIG_DIR}/../\${BIN_PATH}/boot0_spinorfastboot_${PACK_CHIP}.bin:${ROOT_DIR}/image/boot0_spinorfastboot.fex
${LONGAN_CONFIG_DIR}/../\${BIN_PATH}/boot0_mmcfastboot_${PACK_CHIP}.bin:${ROOT_DIR}/image/boot0_mmcfastboot.fex
${LONGAN_CONFIG_DIR}/../\${BIN_PATH}/fes1_${PACK_CHIP}.bin:${ROOT_DIR}/image/fes1.fex
${LONGAN_CONFIG_DIR}/../\${BIN_PATH}/u-boot-${PACK_CHIP}.bin:${ROOT_DIR}/image/u-boot.fex
${LONGAN_CONFIG_DIR}/../\${BIN_PATH}/u-boot-crashdump-${PACK_CHIP}.bin:${ROOT_DIR}/image/u-boot-crash.fex
${LONGAN_CONFIG_DIR}/../\${BIN_PATH}/u-boot-crashdump-spinor-${PACK_CHIP}.bin:${ROOT_DIR}/image/u-boot-spinor-crash.fex
${LONGAN_CONFIG_DIR}/../\${BIN_PATH}/bl31.bin:${ROOT_DIR}/image/monitor.fex
${LONGAN_CONFIG_DIR}/../\${BIN_PATH}/scp.bin:${ROOT_DIR}/image/scp.fex
${LONGAN_CONFIG_DIR}/../\${BIN_PATH}/optee_${PACK_CHIP}.bin:${ROOT_DIR}/image/optee.fex
${LONGAN_CONFIG_DIR}/../\${BIN_PATH}/optee_${PACK_CHIP}-monitor.bin:${ROOT_DIR}/image/optee.fex
${LONGAN_CONFIG_DIR}/../\${BIN_PATH}/opensbi_${PACK_CHIP}.bin:${ROOT_DIR}/image/opensbi.fex
${LONGAN_CONFIG_DIR}/../\${BIN_PATH}/u-boot-spinor-${PACK_CHIP}.bin:${ROOT_DIR}/image/u-boot-spinor.fex
${LONGAN_CONFIG_DIR}/../\${BIN_PATH}/boot0_nand_${PACK_CHIP}-${OTA_TEST_NAME}.bin:${ROOT_DIR}/image/boot0_nand-${OTA_TEST_NAME}.fex
${LONGAN_CONFIG_DIR}/../\${BIN_PATH}/boot0_sdcard_${PACK_CHIP}-${OTA_TEST_NAME}.bin:${ROOT_DIR}/image/boot0_sdcard-${OTA_TEST_NAME}.fex
${LONGAN_CONFIG_DIR}/../\${BIN_PATH}/boot0_spinor_${PACK_CHIP}-${OTA_TEST_NAME}.bin:${ROOT_DIR}/image/boot0_spinor-${OTA_TEST_NAME}.fex
${LONGAN_CONFIG_DIR}/../\${BIN_PATH}/u-boot-${PACK_CHIP}-${OTA_TEST_NAME}.bin:${ROOT_DIR}/image/u-boot-${OTA_TEST_NAME}.fex
${LONGAN_CONFIG_DIR}/../\${BIN_PATH}/u-boot-spinor-${PACK_CHIP}-${OTA_TEST_NAME}.bin:${ROOT_DIR}/image/u-boot-spinor-${OTA_TEST_NAME}.fex
${LONGAN_CONFIG_DIR}/../\${BIN_PATH}/dsp0.bin:${ROOT_DIR}/image/dsp0.fex
${LONGAN_CONFIG_DIR}/../\${BIN_PATH}/dsp1.bin:${ROOT_DIR}/image/dsp1.fex
)
arm_boot_file_secure=(
${TINA_CONFIG_DIR}/${PACK_BOARD_PLATFORM}-common/\${BIN_PATH}/semelis_${PACK_CHIP}.bin:${ROOT_DIR}/image/semelis.bin
${TINA_CONFIG_DIR}/${PACK_BOARD_PLATFORM}-common/\${BIN_PATH}/optee_${PACK_CHIP}.bin:${ROOT_DIR}/image/optee.fex
${TINA_CONFIG_DIR}/${PACK_BOARD_PLATFORM}-common/\${BIN_PATH}/optee_${PACK_CHIP}-secure.bin:${ROOT_DIR}/image/optee.fex
${TINA_CONFIG_DIR}/${PACK_BOARD_PLATFORM}-common/\${BIN_PATH}/u-boot-${PACK_CHIP}-secure.bin:${ROOT_DIR}/image/u-boot.fex
${TINA_CONFIG_DIR}/${PACK_BOARD_PLATFORM}-common/\${BIN_PATH}/sboot_${PACK_CHIP}.bin:${ROOT_DIR}/image/sboot.bin
${TINA_CONFIG_DIR}/${PACK_BOARD_PLATFORM}-common/\${BIN_PATH}/sboot_${PACK_CHIP}-${OTA_TEST_NAME}.bin:${ROOT_DIR}/image/sboot-${OTA_TEST_NAME}.bin
${TINA_CONFIG_DIR}/${PACK_BOARD}/\${BIN_PATH}/semelis_${PACK_CHIP}.bin:${ROOT_DIR}/image/semelis.bin
${TINA_CONFIG_DIR}/${PACK_BOARD}/\${BIN_PATH}/optee_${PACK_CHIP}.bin:${ROOT_DIR}/image/optee.fex
${TINA_CONFIG_DIR}/${PACK_BOARD}/\${BIN_PATH}/optee_${PACK_CHIP}-secure.bin:${ROOT_DIR}/image/optee.fex
${TINA_CONFIG_DIR}/${PACK_BOARD}/\${BIN_PATH}/sboot_${PACK_CHIP}.bin:${ROOT_DIR}/image/sboot.bin
${TINA_CONFIG_DIR}/${PACK_BOARD}/\${BIN_PATH}/u-boot-${PACK_CHIP}-secure.bin:${ROOT_DIR}/image/u-boot.fex
${TINA_CONFIG_DIR}/${PACK_BOARD}/\${BIN_PATH}/sboot_${PACK_CHIP}-${OTA_TEST_NAME}.bin:${ROOT_DIR}/image/sboot-${OTA_TEST_NAME}.bin
${LONGAN_CONFIG_DIR}/../\${BIN_PATH}/semelis_${PACK_CHIP}.bin:${ROOT_DIR}/image/semelis.bin
${LONGAN_CONFIG_DIR}/../\${BIN_PATH}/optee_${PACK_CHIP}.bin:${ROOT_DIR}/image/optee.fex
${LONGAN_CONFIG_DIR}/../\${BIN_PATH}/optee_${PACK_CHIP}-secure.bin:${ROOT_DIR}/image/optee.fex
${LONGAN_CONFIG_DIR}/../\${BIN_PATH}/u-boot-${PACK_CHIP}-secure.bin:${ROOT_DIR}/image/u-boot.fex
${LONGAN_CONFIG_DIR}/../\${BIN_PATH}/u-boot-spinor-secure-${PACK_CHIP}.bin:${ROOT_DIR}/image/u-boot-spinor-secure.fex
${LONGAN_CONFIG_DIR}/../\${BIN_PATH}/sboot_${PACK_CHIP}.bin:${ROOT_DIR}/image/sboot.bin
${LONGAN_CONFIG_DIR}/../\${BIN_PATH}/sboot_nor_${PACK_CHIP}.bin:${ROOT_DIR}/image/sboot_nor.bin
${LONGAN_CONFIG_DIR}/../\${BIN_PATH}/sboot_${PACK_CHIP}-${OTA_TEST_NAME}.bin:${ROOT_DIR}/image/sboot-${OTA_TEST_NAME}.bin
${LONGAN_CONFIG_DIR}/${PACK_PLAN}/\${BIN_PATH}/semelis_${PACK_CHIP}.bin:${ROOT_DIR}/image/semelis.bin
${LONGAN_CONFIG_DIR}/${PACK_PLAN}/\${BIN_PATH}/optee_${PACK_CHIP}.bin:${ROOT_DIR}/image/optee.fex
${LONGAN_CONFIG_DIR}/${PACK_PLAN}/\${BIN_PATH}/optee_${PACK_CHIP}-secure.bin:${ROOT_DIR}/image/optee.fex
${LONGAN_CONFIG_DIR}/${PACK_PLAN}/\${BIN_PATH}/sboot_${PACK_CHIP}.bin:${ROOT_DIR}/image/sboot.bin
${LONGAN_CONFIG_DIR}/${PACK_PLAN}/\${BIN_PATH}/u-boot-${PACK_CHIP}-secure.bin:${ROOT_DIR}/image/u-boot.fex
${LONGAN_CONFIG_DIR}/${PACK_PLAN}/\${BIN_PATH}/sboot_${PACK_CHIP}-${OTA_TEST_NAME}.bin:${ROOT_DIR}/image/sboot-${OTA_TEST_NAME}.bin
${LONGAN_CONFIG_DIR}/${PACK_PLAN}/\${BIN_PATH}/sboot_nor_${PACK_CHIP}.bin:${ROOT_DIR}/image/sboot_nor.bin
${LONGAN_CONFIG_DIR}/${PACK_PLAN}/\${BIN_PATH}/u-boot-spinor-secure-${PACK_CHIP}.bin:${ROOT_DIR}/image/u-boot-spinor-secure.fex
)
arm64_boot_file_secure=(
${TINA_CONFIG_DIR}/${PACK_BOARD_PLATFORM}-common/\${BIN_PATH}/optee_${PACK_CHIP}.bin:${ROOT_DIR}/image/optee.fex
${TINA_CONFIG_DIR}/${PACK_BOARD_PLATFORM}-common/\${BIN_PATH}/optee_${PACK_CHIP}-secure.bin:${ROOT_DIR}/image/optee.fex
${TINA_CONFIG_DIR}/${PACK_BOARD_PLATFORM}-common/\${BIN_PATH}/sboot_${PACK_CHIP}.bin:${ROOT_DIR}/image/sboot.bin
# ${TINA_CONFIG_DIR}/${PACK_BOARD_PLATFORM}-common/\${BIN_PATH}/sboot_${PACK_CHIP}-${OTA_TEST_NAME}.bin:${ROOT_DIR}/image/sboot-${OTA_TEST_NAME}.bin
${LONGAN_CONFIG_DIR}/../\${BIN_PATH}/optee_${PACK_CHIP}.bin:${ROOT_DIR}/image/optee.fex
${LONGAN_CONFIG_DIR}/../\${BIN_PATH}/optee_${PACK_CHIP}-secure.bin:${ROOT_DIR}/image/optee.fex
${LONGAN_CONFIG_DIR}/../\${BIN_PATH}/sboot_${PACK_CHIP}.bin:${ROOT_DIR}/image/sboot.bin
# ${LONGAN_CONFIG_DIR}/../\${BIN_PATH}/sboot_${PACK_CHIP}-${OTA_TEST_NAME}.bin:${ROOT_DIR}/image/sboot-${OTA_TEST_NAME}.bin
)
riscv_boot_file_secure=(
${LONGAN_CONFIG_DIR}/../\${BIN_PATH}/sboot_${PACK_CHIP}.bin:${ROOT_DIR}/image/sboot.bin
)
function get_partition_downfile_size()
{
local downloadfile_name=`echo $1 | awk -F '=' '{print $2}'`
if [ x${downloadfile_name: 0-4} != x".fex" ]; then
pack_error "downloadfile format is wrong, it should be end with .fex"
exit -1
fi
if [ ! -f ${downloadfile_name} ]; then
echo " file ${downloadfile_name} not find"
else
if [ -L ${downloadfile_name} ]; then
local downloadfile_name_link=`readlink -f ${downloadfile_name}`
local linkfile_name=${downloadfile_name_link##*/}
echo " ${downloadfile_name} -> ${downloadfile_name_link}"
if [ ! -f ${downloadfile_name_link} ]; then
echo " link file ${linkfile_name} not find"
else
local linkfile_size=`ls -lh ${downloadfile_name_link} | awk '{print $5}'`
echo " ${linkfile_name} size : ${linkfile_size} byte"
fi
else
local downloadfile_size=`ls -lh ${downloadfile_name} | awk '{print $5}'`
echo " ${downloadfile_name} size : ${downloadfile_size} byte"
fi
fi
}
function get_partition_mbr_size()
{
local partition_size_name=`echo $1 | awk -F '=' '{print $1}' | sed 's/partition/mbr/g'`
local partition_size=`echo $1 | awk -F '=' '{print $2}'`
echo " ${partition_size_name} : ${partition_size} Kbyte"
}
function show_partition_message()
{
grep -c '[mbr]' $1 > /dev/null
if [ $? -eq 0 ]; then
cp $1 ./show_sys_partition.tmp;
sed -i '/^[\r;]/d' ./show_sys_partition.tmp;
sed -i '/partition_start/d' ./show_sys_partition.tmp;
sed -i '/user_type/d' ./show_sys_partition.tmp;
sed -i 's/\[partition\]/------------------------------------/g' ./show_sys_partition.tmp;
sed -i 's/[ "\r]//g' ./show_sys_partition.tmp;
sed -i '/^[;]/d' ./show_sys_partition.tmp;
sed -i 's/name/partition_name/g' ./show_sys_partition.tmp;
sed -i 's/size/partition_size/g' ./show_sys_partition.tmp;
echo "------------------------------------"
while read line
do
if [ "$line" == "------------------------------------" ];then
echo "$line"
else
echo " $line" | sed 's/=/ : /g'
echo " $line" | grep "mbr" >> /dev/null
if [ $? -eq 0 ]; then
read line
get_partition_mbr_size $line
fi
echo "$line" | grep "downloadfile" >> /dev/null
if [ $? -eq 0 ]; then
get_partition_downfile_size $line
fi
fi
done < ./show_sys_partition.tmp
echo "------------------------------------"
rm ./show_sys_partition.tmp
else
echo "==========input is not a partition file=========="
fi
}
function show_boards()
{
printf "\nAll avaiable chips, platforms and boards:\n\n"
printf "Chip Board\n"
for chipdir in $(find chips/ -mindepth 1 -maxdepth 1 -type d) ; do
chip=`basename ${chipdir}`
printf "${chip}\n"
for boarddir in $(find chips/${chip}/configs/${platform} \
-mindepth 1 -maxdepth 1 -type d) ; do
board=`basename ${boarddir}`
printf " ${board}\n"
done
done
printf "\nFor Usage:\n"
printf " $(basename $0) -h\n\n"
}
function do_platform_pack_hook()
{
PWD=$(pwd)
if [ -e ${TINA_CONFIG_DIR}/${PACK_BOARD}/hooks/pack_${1}_hook.sh ] ; then
pack_info "--Call platform pack ${1} hook now--"
cd ${TINA_CONFIG_DIR}/${PACK_BOARD}/hooks/
./pack_${1}_hook.sh
cd ${PWD}
fi
}
function call_platform_pack_hook()
{
hook_type=$1
do_platform_pack_hook $hook_type
}
function call_platform_pack_prepare_hook()
{
call_platform_pack_hook prepare
}
function uart_switch()
{
local DEBUG_DIR="${LONGAN_COMMON_DIR}/debug"
rm -rf ${ROOT_DIR}/image/awk_debug_card0
touch ${ROOT_DIR}/image/awk_debug_card0
TX=`awk '$0~"'$PACK_CHIP'"{print $2}' ${DEBUG_DIR}/card_debug_pin`
RX=`awk '$0~"'$PACK_CHIP'"{print $3}' ${DEBUG_DIR}/card_debug_pin`
PORT=`awk '$0~"'$PACK_CHIP'"{print $4}' ${DEBUG_DIR}/card_debug_pin`
MS=`awk '$0~"'$PACK_CHIP'"{print $5}' ${DEBUG_DIR}/card_debug_pin`
CK=`awk '$0~"'$PACK_CHIP'"{print $6}' ${DEBUG_DIR}/card_debug_pin`
DO=`awk '$0~"'$PACK_CHIP'"{print $7}' ${DEBUG_DIR}/card_debug_pin`
DI=`awk '$0~"'$PACK_CHIP'"{print $8}' ${DEBUG_DIR}/card_debug_pin`
BOOT_UART_ST=`awk '$0~"'$PACK_CHIP'"{print $2}' ${DEBUG_DIR}/card_debug_string`
BOOT_PORT_ST=`awk '$0~"'$PACK_CHIP'"{print $3}' ${DEBUG_DIR}/card_debug_string`
BOOT_TX_ST=`awk '$0~"'$PACK_CHIP'"{print $4}' ${DEBUG_DIR}/card_debug_string`
BOOT_RX_ST=`awk '$0~"'$PACK_CHIP'"{print $5}' ${DEBUG_DIR}/card_debug_string`
UART0_ST=`awk '$0~"'$PACK_CHIP'"{print $6}' ${DEBUG_DIR}/card_debug_string`
UART0_USED_ST=`awk '$0~"'$PACK_CHIP'"{print $7}' ${DEBUG_DIR}/card_debug_string`
UART0_PORT_ST=`awk '$0~"'$PACK_CHIP'"{print $8}' ${DEBUG_DIR}/card_debug_string`
UART0_TX_ST=`awk '$0~"'$PACK_CHIP'"{print $9}' ${DEBUG_DIR}/card_debug_string`
UART0_RX_ST=`awk '$0~"'$PACK_CHIP'"{print $10}' ${DEBUG_DIR}/card_debug_string`
UART1_ST=`awk '$0~"'$PACK_CHIP'"{print $11}' ${DEBUG_DIR}/card_debug_string`
JTAG_ST=`awk '$0~"'$PACK_CHIP'"{print $12}' ${DEBUG_DIR}/card_debug_string`
MS_ST=`awk '$0~"'$PACK_CHIP'"{print $13}' ${DEBUG_DIR}/card_debug_string`
CK_ST=`awk '$0~"'$PACK_CHIP'"{print $14}' ${DEBUG_DIR}/card_debug_string`
DO_ST=`awk '$0~"'$PACK_CHIP'"{print $15}' ${DEBUG_DIR}/card_debug_string`
DI_ST=`awk '$0~"'$PACK_CHIP'"{print $16}' ${DEBUG_DIR}/card_debug_string`
MMC0_ST=`awk '$0~"'$PACK_CHIP'"{print $17}' ${DEBUG_DIR}/card_debug_string`
MMC0_USED_ST=`awk '$0~"'$PACK_CHIP'"{print $18}' ${DEBUG_DIR}/card_debug_string`
echo '$0!~";" && $0~"'$BOOT_TX_ST'"{if(C)$0="'$BOOT_TX_ST' = '$TX'"} \' >> ${ROOT_DIR}/image/awk_debug_card0
echo '$0!~";" && $0~"'$BOOT_RX_ST'"{if(C)$0="'$BOOT_RX_ST' = '$RX'"} \' >> ${ROOT_DIR}/image/awk_debug_card0
echo '$0!~";" && $0~"'$BOOT_PORT_ST'"{if(C)$0="'$BOOT_PORT_ST' = '$PORT'"} \' >> ${ROOT_DIR}/image/awk_debug_card0
if [ "`grep "auto_print_used" "${ROOT_DIR}/image//sys_config.fex" | grep "1"`" ]; then
echo '$0!~";" && $0~"'$MMC0_USED_ST'"{if(A)$0="'$MMC0_USED_ST' = 1";A=0} \' >> ${ROOT_DIR}/image/awk_debug_card0
else
echo '$0!~";" && $0~"'$MMC0_USED_ST'"{if(A)$0="'$MMC0_USED_ST' = 0";A=0} \' >> ${ROOT_DIR}/image/awk_debug_card0
fi
echo '$0!~";" && $0~"\\['$MMC0_ST'\\]"{A=1} \' >> ${ROOT_DIR}/image/awk_debug_card0
echo '$0!~";" && $0~"'$UART0_TX_ST'"{if(B)$0="'$UART0_TX_ST' = '$TX'"} \' >> ${ROOT_DIR}/image/awk_debug_card0
echo '$0!~";" && $0~"'$UART0_RX_ST'"{if(B)$0="'$UART0_RX_ST' = '$RX'"} \' >> ${ROOT_DIR}/image/awk_debug_card0
echo '$0!~";" && $0~"\\['$UART0_ST'\\]"{B=1} \' >> ${ROOT_DIR}/image/awk_debug_card0
echo '$0!~";" && $0~"'$UART0_USED_ST'"{if(B)$0="'$UART0_USED_ST' = 1"} \' >> ${ROOT_DIR}/image/awk_debug_card0
echo '/^'$UART0_PORT_ST'/{next} \' >> ${ROOT_DIR}/image/awk_debug_card0
echo '$0!~";" && $0~"\\['$UART1_ST'\\]"{B=0} \' >> ${ROOT_DIR}/image/awk_debug_card0
echo '$0!~";" && $0~"\\['$BOOT_UART_ST'\\]"{C=1} \' >> ${ROOT_DIR}/image/awk_debug_card0
echo '$0!~";" && $0~"\\['$JTAG_ST'\\]"{C=0} \' >> ${ROOT_DIR}/image/awk_debug_card0
echo '$0!~";" && $0~"'$MS_ST'"{$0="'$MS_ST' = '$MS'"} \' >> ${ROOT_DIR}/image/awk_debug_card0
echo '$0!~";" && $0~"'$CK_ST'"{$0="'$CK_ST' = '$CK'"} \' >> ${ROOT_DIR}/image/awk_debug_card0
echo '$0!~";" && $0~"'$DO_ST'"{$0="'$DO_ST' = '$DO'"} \' >> ${ROOT_DIR}/image/awk_debug_card0
echo '$0!~";" && $0~"'$DI_ST'"{$0="'$DI_ST' = '$DI'"} \' >> ${ROOT_DIR}/image/awk_debug_card0
echo '1' >> ${ROOT_DIR}/image/awk_debug_card0
if [ "`grep "auto_print_used" "${ROOT_DIR}/image/sys_config.fex" | grep "1"`" ]; then
sed -i -e '/^uart0_rx/a\pinctrl-1=' ${ROOT_DIR}/image/sys_config.fex
sed -i -e '/^uart0_rx/a\pinctrl-0=' ${ROOT_DIR}/image/sys_config.fex
fi
awk -f ${ROOT_DIR}/image/awk_debug_card0 ${ROOT_DIR}/image/sys_config.fex > ${ROOT_DIR}/image/sys_config_debug.fex
rm -f ${ROOT_DIR}/image/sys_config.fex
mv ${ROOT_DIR}/image/sys_config_debug.fex ${ROOT_DIR}/image/sys_config.fex
echo "uart -> card0"
}
function copy_ota_test_file()
{
printf "ota test bootloader by diff bootlogo\n"
mv ${ROOT_DIR}/image/boot-resource/bootlogo_ota_test.bmp ${ROOT_DIR}/image/boot-resource/bootlogo.bmp
printf "copying ota test boot file\n"
if [ -f ${ROOT_DIR}/image/sys_partition_nor.fex -o \
-f ${ROOT_DIR}/image/sys_partition_nor_${PACK_PLATFORM}.fex ]; then
mv ${ROOT_DIR}/image/boot0_spinor-${OTA_TEST_NAME}.fex ${ROOT_DIR}/image/boot0_spinor.fex
mv ${ROOT_DIR}/image/u-boot-spinor-${OTA_TEST_NAME}.fex ${ROOT_DIR}/image/u-boot-spinor.fex
else
mv ${ROOT_DIR}/image/boot0_nand-${OTA_TEST_NAME}.fex ${ROOT_DIR}/image/boot0_nand.fex
mv ${ROOT_DIR}/image/boot0_sdcard-${OTA_TEST_NAME}.fex ${ROOT_DIR}/image/boot0_sdcard.fex
mv ${ROOT_DIR}/image/u-boot-${OTA_TEST_NAME}.fex ${ROOT_DIR}/image/u-boot.fex
fi
if [ "x${PACK_SECURE}" = "xsecure" -o "x${PACK_SIG}" = "prev_refurbish"] ; then
printf "Copying ota test secure boot file\n"
mv ${ROOT_DIR}/image/sboot-${OTA_TEST_NAME}.bin ${ROOT_DIR}/image/sboot.bin
fi
printf "OTA test env by bootdelay(10) and logolevel(8)\n"
sed -i 's/\(logolevel=\).*/\18/' ${ROOT_DIR}/image/env.cfg
sed -i 's/\(bootdelay=\).*/\110/' ${ROOT_DIR}/image/env.cfg
}
function add_lzma_header()
{
lzma_file=$1
original_file=$2
file_size=$(printf "%.8x\n" `stat -c%s ${lzma_file}`)
original_file_size=$(printf "%.8x\n" `stat -c%s ${original_file}`)
bin_str=""
file_size_len=${#file_size}
#"LZMA"+size+origin_size
bin_str="\x4c\x5a\x4d\x41\x${file_size:6:2}\x${file_size:4:2}\x${file_size:2:2}\x${file_size:0:2}"
bin_str+="\x${original_file_size:6:2}\x${original_file_size:4:2}\x${original_file_size:2:2}\x${original_file_size:0:2}"
printf "%b" ${bin_str} > tempbin
cat ${lzma_file} >> tempbin
mv tempbin "${lzma_file}.head"
}
function update_mbr_to_sys_config()
{
cd ${ROOT_DIR}/image
#use sys_partition_tmp
cp $1 sys_partition_tmp.fex
#convert sys_partition.fex to sunxi_mbr.fex
#don't care about downloadfile
sed -i '/^[ \t]*downloadfile/d' sys_partition_tmp.fex
/bin/busybox unix2dos sys_partition_tmp.fex
script sys_partition_tmp.fex > /dev/null
update_mbr sys_partition_tmp.bin 1 sunxi_mbr_tmp.fex > /dev/null
#get size and offset
local PART_INDEX
local PART_NAME
local PART_SIZE
local PART_OFFSET
echo "" >> ${ROOT_DIR}/image/sys_config.fex
echo "[partitions]" >> ${ROOT_DIR}/image/sys_config.fex
echo "" >> ${ROOT_DIR}/image/sys_config.fex
# add one partition to sys_config
# PART_NAME="vital"
# PART_SIZE=`parser_mbr sunxi_mbr_tmp.fex get_size_by_name ${PART_NAME}`
# PART_OFFSET=`parser_mbr sunxi_mbr_tmp.fex get_offset_by_name ${PART_NAME}`
# #update to sys_config
# echo "[partitions/vital]" >> ${ROOT_DIR}/image/sys_config.fex
# echo "offset = ${PART_OFFSET}" >> ${ROOT_DIR}/image/sys_config.fex
# echo "size = ${PART_SIZE}" >> ${ROOT_DIR}/image/sys_config.fex
# add all partitions to sys_config
total_num=`parser_mbr sunxi_mbr_tmp.fex get_total_num`
let total_num--
for PART_INDEX in $( /usr/bin/seq 0 ${total_num} )
do
PART_NAME=`parser_mbr sunxi_mbr_tmp.fex get_name_by_index ${PART_INDEX}`
PART_SIZE=`parser_mbr sunxi_mbr_tmp.fex get_size_by_index ${PART_INDEX}`
PART_OFFSET=`parser_mbr sunxi_mbr_tmp.fex get_offset_by_index ${PART_INDEX}`
echo "[partitions/${PART_NAME}]" >> ${ROOT_DIR}/image/sys_config.fex
echo "offset = ${PART_OFFSET}" >> ${ROOT_DIR}/image/sys_config.fex
echo "size = ${PART_SIZE}" >> ${ROOT_DIR}/image/sys_config.fex
echo "" >> ${ROOT_DIR}/image/sys_config.fex
done
#clean
rm -f sys_partition_tmp.fex sys_partition_tmp.bin sunxi_mbr_tmp.fex dlinfo.fex
cd - > /dev/null
}
function sparse_ext4()
{
local img=$1
local sparse_img=$2
if file $img | grep -q ext4 ;then
echo "now make sparse ext4 img: $img"
else
echo "$img is not ext4 img"
file $img
return
fi
img2simg $img $sparse_img
}
# pack user resources to a vfat filesystem
# To use this, please add a folder "user-resource" in configs to save files, and add a partition to sys_partition.fex/sys_partition_nor.fex like this:
# [partition]
# name = user-res
# size = 1024
# downloadfile = "user-resource.fex"
# user_type = 0x8000
function make_user_res()
{
printf "make user resource for : $1\n"
local USER_RES_SYS_PARTITION=$1
local USER_RES_PART_NAME=user-res
local USER_RES_FILE=user-resource
printf "handle partition ${USER_RES_PART_NAME}\n"
local USER_RES_PART_DOWNLOAD_FILE=`awk 'BEGIN {FS="\n"; RS=""} /'${USER_RES_PART_NAME}'/{print $0}' ${USER_RES_SYS_PARTITION} | awk '{if($1 == "downloadfile"){print $3}}' | sed 's/"//g'`
local USER_RES_PART_SIZE=`awk 'BEGIN {FS="\n"; RS=""} /'${USER_RES_PART_NAME}'/{print $0}' $1 | awk '$0~"size"{print $3/2}'`
local USER_RES_FILE_PATH=${TINA_CONFIG_DIR}/${PACK_BOARD}/configs/${USER_RES_FILE}
if [ x${USER_RES_PART_DOWNLOAD_FILE} != x'' -a x${USER_RES_PART_SIZE} != x'' ];then
rm -f ${ROOT_DIR}/image/user-resource.fex
mkfs.vfat ${ROOT_DIR}/image/user-resource.fex -C ${USER_RES_PART_SIZE}
if [ -d ${USER_RES_FILE_PATH} ];then
USER_RES_FILE_SIZE=`du --summarize "${USER_RES_FILE_PATH}" | awk '{print $1}'`
printf "file size: ${USER_RES_FILE_SIZE}\n"
printf "partition size: ${USER_RES_PART_SIZE}\n"
if [ ${USER_RES_PART_SIZE} -le ${USER_RES_FILE_SIZE} ]; then
printf "file size is larger than partition size, please check your configuration\n"
printf "please enlarge size of ${USER_RES_PART_NAME} in sys_partition or remove some files in $USER_RES_FILE_PATH\n"
exit -1
fi
mcopy -s -v -i ${ROOT_DIR}/image/${USER_RES_PART_DOWNLOAD_FILE} ${USER_RES_FILE_PATH}/* ::
if [ $? -ne 0 ]; then
printf "mcopy file fail, exit\n"
exit -1
fi
else
printf "can not find ${USER_RES_FILE_PATH}, ignore it\n"
fi
else
printf "no user resource partitions\n"
fi
}
function make_app_res()
{
cd ${ROOT_DIR}/image
local APP_PART_NAME=app
cp $1 sys_partition_tmp_app.fex
sed -i '/^[ \t]*downloadfile/d' sys_partition_tmp_app.fex
/bin/busybox unix2dos sys_partition_tmp_app.fex
script sys_partition_tmp_app.fex > /dev/null
update_mbr sys_partition_tmp_app.bin 1 sunxi_mbr_tmp_app.fex > /dev/null
local APP_PART_DOWNLOAD_FILE=app.fex
local APP_PART_FILE_PATH=${PACK_TOPDIR}/out/${TARGET_BOARD}/compile_dir/target/app
local APP_PART_SIZE_IN_SECTOR=`parser_mbr sunxi_mbr_tmp_app.fex get_size_by_name ${APP_PART_NAME}`
if [ x${APP_PART_DOWNLOAD_FILE} != x'' -a x${APP_PART_SIZE_IN_SECTOR} != x'' ]; then
let APP_PART_SIZE_IN_K=$APP_PART_SIZE_IN_SECTOR/2
echo "APP_PART_DOWNLOAD_FILE = ${ROOT_DIR}/image/${APP_PART_DOWNLOAD_FILE}"
rm -f ${ROOT_DIR}/image/${APP_PART_DOWNLOAD_FILE}
${PACK_TOPDIR}/out/host/bin/make_ext4fs -l ${APP_PART_SIZE_IN_K}k -b 1024 -m 0 -j 1024 ${ROOT_DIR}/image/${APP_PART_DOWNLOAD_FILE} ${APP_PART_FILE_PATH}
else
printf "no app resource partitions\n"
fi
cd - > /dev/null
}
function make_data_res()
{
cd ${ROOT_DIR}/image
local DATA_PART_NAME=data
cp $1 sys_partition_tmp_data.fex
sed -i '/^[ \t]*downloadfile/d' sys_partition_tmp_data.fex
/bin/busybox unix2dos sys_partition_tmp_data.fex
script sys_partition_tmp_data.fex > /dev/null
update_mbr sys_partition_tmp_data.bin 1 sunxi_mbr_tmp_data.fex > /dev/null
local DATA_PART_DOWNLOAD_FILE=data.fex
local DATA_PART_DOWNLOAD_FILE_SPARSE=data_s.fex
local DATA_PART_FILE_PATH=${PACK_TOPDIR}/out/${TARGET_BOARD}/compile_dir/target/data
local DATA_PART_SIZE_IN_SECTOR=`parser_mbr sunxi_mbr_tmp_data.fex get_size_by_name ${DATA_PART_NAME}`
if [ x${DATA_PART_DOWNLOAD_FILE} != x'' -a x${DATA_PART_SIZE_IN_SECTOR} != x'0' ]; then
let DATA_PART_SIZE_IN_K=$DATA_PART_SIZE_IN_SECTOR/2
echo "DATA_PART_DOWNLOAD_FILE = ${ROOT_DIR}/image/${DATA_PART_DOWNLOAD_FILE}"
rm -f ${ROOT_DIR}/image/${DATA_PART_DOWNLOAD_FILE}
rm -f ${ROOT_DIR}/image/${DATA_PART_DOWNLOAD_FILE_SPARSE}
${PACK_TOPDIR}/out/host/bin/make_ext4fs -l ${DATA_PART_SIZE_IN_K}k -b 1024 -m 0 -j 1024 ${ROOT_DIR}/image/${DATA_PART_DOWNLOAD_FILE} ${DATA_PART_FILE_PATH}
sparse_ext4 ${ROOT_DIR}/image/${DATA_PART_DOWNLOAD_FILE} ${ROOT_DIR}/image/${DATA_PART_DOWNLOAD_FILE_SPARSE}
else
printf "no data resource partitions\n"
fi
cd - > /dev/null
}
function make_logo_res()
{
cd ${ROOT_DIR}/image
#指定分区名字,需要与新增的分区名相同
local APP_PART_NAME=logo
cp $1 sys_partition_tmp_app.fex
sed -i '/^[ \t]*downloadfile/d' sys_partition_tmp_app.fex
/bin/busybox unix2dos sys_partition_tmp_app.fex
script sys_partition_tmp_app.fex > /dev/null
update_mbr sys_partition_tmp_app.bin 1 sunxi_mbr_tmp_app.fex > /dev/null
#指定下载镜像名字需要与新增的分区的downloadfile相同
local APP_PART_DOWNLOAD_FILE=logo.fex
#将被打包的文件
local APP_PART_FILE_PATH=${TINA_CONFIG_DIR}/${PACK_BOARD}/logo/logo.bmp
echo "logo file-----------${APP_PART_FILE_PATH}----"
local APP_PART_SIZE_IN_SECTOR=`parser_mbr sunxi_mbr_tmp_app.fex get_size_by_name ${APP_PART_NAME}` # 获取分区大小
if [ x${APP_PART_DOWNLOAD_FILE} != x'' -a x${APP_PART_SIZE_IN_SECTOR} != x'' ]; then
echo "APP_PART_DOWNLOAD_FILE = ${ROOT_DIR}/image/${APP_PART_DOWNLOAD_FILE}"
rm -f ${ROOT_DIR}/image/${APP_PART_DOWNLOAD_FILE}
cp ${APP_PART_FILE_PATH} ${ROOT_DIR}/image/${APP_PART_DOWNLOAD_FILE}
else
printf "no logo resource partitions\n"
fi
cd - > /dev/null
}
function make_boottone_fex()
{
local BOOTTONE_FILE_PATH=${TINA_CONFIG_DIR}/${PACK_BOARD}/configs/boottone_res
if [ -e $BOOTTONE_FILE_PATH ];then
echo "make boottone.fex"
${PACK_TOPDIR}/out/host/bin/make_ext4fs -l 512k -b 1024 -m 0 -J ${ROOT_DIR}/image/boottone.fex $BOOTTONE_FILE_PATH
fi
}
ENV_SUFFIX=
function get_kernel
{
local f="${TINA_CONFIG_DIR}/${PACK_BOARD}/Makefile"
[ -f "$f" ] || return -1
awk -F":=" '/KERNEL_PATCHVER/{print $2}' $f
}
function do_prepare()
{
if [ -z "${PACK_CHIP}" -o -z "${PACK_PLATFORM}" -o -z "${PACK_BOARD}" ] ; then
pack_error "Invalid parameters Chip: ${PACK_CHIP}, \
Platform: ${PACK_PLATFORM}, Board: ${PACK_BOARD}"
show_boards
exit 1
fi
[ -d ${TINA_CONFIG_DIR}/${PACK_BOARD}/configs -o -d ${LONGAN_CONFIG_DIR}/${PACK_PLAN}/linux ] || {
pack_error "Board's directory \
\"${TINA_CONFIG_DIR}/${PACK_BOARD}/configs or ${LONGAN_CONFIG_DIR}/${PACK_PLAN}/linux\" not exist."
show_boards
exit 1
}
if [ -z "${PACK_KERN}" ] ; then
printf "No kernel param, parse it from ${PACK_BOARD_PLATFORM}\n"
[ "x$(get_kernel)" != "x" ] && {
PACK_KERN="linux-$(get_kernel)"
ENV_SUFFIX=$(get_kernel)
}
if [ -z "${PACK_KERN}" ] ; then
pack_error "Failed to parse kernel param from ${PACK_BOARD_PLATFORM}"
exit 1
fi
fi
# Cleanup
rm -rf ${ROOT_DIR}/image
mkdir -p ${ROOT_DIR}/image
call_platform_pack_prepare_hook
printf "copying tools file\n"
for file in ${tools_file_list[@]} ; do
cp -f $file ${ROOT_DIR}/image/ 2> /dev/null
done
if [ "x${PACK_KERN}" = "xlinux-3.4" ]; then
if [ -f ${LONGAN_COMMON_DIR}/tools/cardscript.fex ]; then
cp -f ${LONGAN_COMMON_DIR}/tools/cardscript.fex ${ROOT_DIR}/image/ 2> /dev/null
else
cp -f ${TINA_CONFIG_DIR}/generic/tools/cardscript.fex ${ROOT_DIR}/image/ 2> /dev/null
fi
fi
printf "copying configs file\n"
for file in ${configs_file_list[@]} ; do
cp -f $file ${ROOT_DIR}/image/ 2> /dev/null
done
if [ -f ${ROOT_DIR}/image/sys_config_${PACK_KERN}.fex ]; then
cp ${ROOT_DIR}/image/sys_config_${PACK_KERN}.fex ${ROOT_DIR}/image/sys_config.fex
fi
# get storage_type value from sys_config.fex
if [ ! -f ${ROOT_DIR}/image/sys_config.fex ];then
echo "sys_config.fex is not exist."
exit 1
fi
# If platform config files exist, we will cover the default files
# For example, mv out/image_linux.cfg out/image.cfg
cd ${ROOT_DIR}
find image/* -type f -a \( -name "*.fex" -o -name "*.cfg" \) -print | \
sed "s#\(.*\)_${PACK_PLATFORM_IMAGE_CFG}\(\..*\)#mv -fv & \1\2#e" > /dev/null
cd - > /dev/null
local storage_type
storage_type=`sed -e '/^$/d' -e '/^;/d' -e '/^\[/d' -n -e '/^storage_type/p' ${ROOT_DIR}/image/sys_config.fex | sed 's/=/ /g' | awk '{ print $2;}'`
echo "storage_type value is ${storage_type}"
image_instruction="image is for nand/emmc"
case ${storage_type} in
3)
echo "storage type is nor"
if [ -f ${ROOT_DIR}/image/image_nor.cfg ];then
echo "image_nor.cfg is exist"
mv ${ROOT_DIR}/image/image_nor.cfg ${ROOT_DIR}/image/image.cfg && echo "mv image_nor.cfg image.cfg"
image_instruction="image is for nor"
IMG_FLASH="_nor"
PACK_NOR="nor"
fi
;;
-1)
;;
*)
if [ -f ${ROOT_DIR}/image/sys_partition_nor.fex ];then
rm ${ROOT_DIR}/image/sys_partition_nor.fex && echo "rm ${ROOT_DIR}/image/sys_partition_nor.fex"
fi
if [ -f ${ROOT_DIR}/image/image_nor.cfg ];then
rm ${ROOT_DIR}/image/image_nor.cfg && echo "rm ${ROOT_DIR}/image/image_nor.cfg"
fi
;;
esac
# amend env copy
mv ${ROOT_DIR}/image/env-${ENV_SUFFIX}.cfg ${ROOT_DIR}/image/env.cfg 2> /dev/null
if [ "x${PACK_MODE}" = "xdump" ] ; then
cp -vf ${ROOT_DIR}/image/sys_partition_dump.fex ${ROOT_DIR}/image/sys_partition.fex
cp -vf ${ROOT_DIR}/image/usbtool_test.fex ${ROOT_DIR}/image/usbtool.fex
elif [ "x${PACK_FUNC}" = "xprvt" ] ; then
cp -vf ${ROOT_DIR}/image/sys_partition_private.fex ${ROOT_DIR}/image/sys_partition.fex
fi
grep "CONFIG_USE_DM_VERITY=y" ${PACK_TOPDIR}/.config > /dev/null
if [ $? -eq 0 ]; then
cp -vf ${ROOT_DIR}/image/sys_partition_secure.fex ${ROOT_DIR}/image/sys_partition.fex
fi
printf "copying boot resource\n"
for file in ${boot_resource_list[@]} ; do
cp -rf `echo $file | awk -F: '{print $1}'` \
${ROOT_DIR}/`echo $file | awk -F: '{print $2}'` 2>/dev/null
done
# Support boot0 load bmp logo to kernel
if [ -f "${ROOT_DIR}/image/boot-resource/bootlogo.bmp" ]; then
xz --format=lzma -k ${ROOT_DIR}/image/boot-resource/bootlogo.bmp
add_lzma_header "${ROOT_DIR}/image/boot-resource/bootlogo.bmp.lzma" "${ROOT_DIR}/image/boot-resource/bootlogo.bmp"
mv ${ROOT_DIR}/image/boot-resource/bootlogo.bmp.lzma.head ${ROOT_DIR}/image/bootlogo.bmp.lzma
rm ${ROOT_DIR}/image/boot-resource/bootlogo.bmp.lzma
fi
# Support boot0 load bmp logo to uboot
# lzma e ${ROOT_DIR}/image/boot-resource/bootlogo.bmp ${ROOT_DIR}/image/bootlogo.bmp.lzma
printf "copying boot file\n"
for d in ${possible_bin_path[@]}; do
[ ! -d ${LICHEE_CHIP_CONFIG_DIR}/$d ] && continue
BIN_PATH=$d
for file in ${boot_file_list[@]} ; do
eval cp -f $(echo $file | sed -e 's/:/ /g') 2>/dev/null
done
done
if [[ ${TARGET_PLAN} == *fastboot* ]] ; then
mv -v ${ROOT_DIR}/image/boot0_spinorfastboot.fex ${ROOT_DIR}/image/boot0_spinor.fex
mv -v ${ROOT_DIR}/image/boot0_mmcfastboot.fex ${ROOT_DIR}/image/boot0_sdcard.fex
fi
[ -z "${BIN_PATH}" ] &&
pack_error "No BIN_PATH found!" && exit 1
if [ "x${PACK_SECURE}" = "xsecure" -o "x${PACK_SIG}" = "xsecure" -o "x${PACK_SIG}" = "xprev_refurbish" ] ; then
printf "copying ${ARCH}_boot_file_secure secure boot file\n"
for d in ${possible_bin_path[@]}; do
BIN_PATH=$d
for file in $(eval echo '$'"{${ARCH}_boot_file_secure[@]}"); do
eval cp -f $(echo $file | sed -e 's/:/ /g') 2>/dev/null
done
done
# if nor flash need copy sboot_nor.bin to sboot.bin
if [ ${IMG_FLASH} = "_nor" ] ; then
echo "mv sboot_nor.bin to sboot.bin"
mv ${ROOT_DIR}/image/sboot_nor.bin ${ROOT_DIR}/image/sboot.bin
fi
fi
# If longan platform config use
if [ -f ${LONGAN_CONFIG_DIR}/../tools/plat_config.sh ] ; then
${LONGAN_CONFIG_DIR}/../tools/plat_config.sh
fi
# If tina platform config use
if [ -f ${TINA_CONFIG_DIR}/${PACK_BOARD_PLATFORM}-common/tools/plat_config.sh ] ; then
${TINA_CONFIG_DIR}/${PACK_BOARD_PLATFORM}-common/tools/plat_config.sh
fi
if [ "x${PACK_SECURE}" = "xsecure" -o "x${PACK_SIG}" = "xsecure" ] ; then
printf "add burn_secure_mode in target in sys config\n"
sed -i -e '/^\[target\]/a\burn_secure_mode=1' ${ROOT_DIR}/image/sys_config.fex
sed -i -e '/^\[platform\]/a\secure_without_OS=0' ${ROOT_DIR}/image/sys_config.fex
elif [ "x${PACK_SIG}" = "xprev_refurbish" ] ; then
printf "add burn_secure_mode in target in sys config\n"
sed -i -e '/^\[target\]/a\burn_secure_mode=1' ${ROOT_DIR}/image/sys_config.fex
sed -i -e '/^\[platform\]/a\secure_without_OS=1' ${ROOT_DIR}/image/sys_config.fex
else
sed -i '/^burn_secure_mod/d' ${ROOT_DIR}/image/sys_config.fex
sed -i '/^secure_without_OS/d' ${ROOT_DIR}/image/sys_config.fex
fi
if [ "x${PACK_MODE}" = "xota_test" ] ; then
printf "copy ota test file\n"
copy_ota_test_file
fi
if [ "x${PACK_PROGRAMMER}" = "xprogrammer" ]; then
printf "add programmer img info target in sys config\n"
sed -i -e '/^\[target\]/a\programmer=1' out/sys_config.fex
fi
# Here, we can switch uart to card or normal
if [ "x${PACK_DEBUG}" = "xcard0" -a "x${PACK_MODE}" != "xdump" \
-a "x${PACK_FUNC}" != "xprvt" ] ; then \
uart_switch
else
sed -i -e '/^auto_print_used/s\1\0\' ${ROOT_DIR}/image/sys_config.fex
fi
sed -i 's/\\boot-resource/\/boot-resource/g' ${ROOT_DIR}/image/boot-resource.ini
sed -i 's/\\\\/\//g' ${ROOT_DIR}/image/image.cfg
sed -i 's/^imagename/;imagename/g' ${ROOT_DIR}/image/image.cfg
IMG_NAME="${PACK_PLATFORM}_${PACK_BOARD}_${PACK_DEBUG}"
if [ "x${PACK_SIG}" != "xnone" ]; then
IMG_NAME="${IMG_NAME}_${PACK_SIG}"
fi
if [ "x${PACK_MODE}" = "xdump" -o "x${PACK_MODE}" = "xota_test" -o "x${PACK_MODE}" = "xcrashdump" ] ; then
IMG_NAME="${IMG_NAME}_${PACK_MODE}"
fi
if [ "x${PACK_FUNC}" = "xprvt" ] ; then
IMG_NAME="${IMG_NAME}_${PACK_FUNC}"
fi
if [ "x${PACK_SECURE}" = "xsecure" ] ; then
IMG_NAME="${IMG_NAME}_${PACK_SECURE}"
fi
if [ "x${PACK_FUNC}" = "xprev_refurbish" ] ; then
IMG_NAME="${IMG_NAME}_${PACK_FUNC}"
fi
IMG_NAME="${IMG_NAME}${IMG_FLASH}"
IMG_PROGRAMMER_NAME="${IMG_NAME}_programmer.img"
if [ "x${PACK_SECURE}" != "xnone" -o "x${PACK_SIG}" != "xnone" ]; then
MAIN_VERION=`awk '$0~"MAIN_VERSION"{printf"%d", $3}' ${ROOT_DIR}/image/version_base.mk`
IMG_NAME="${IMG_NAME}_v${MAIN_VERION}.img"
else
IMG_NAME="${IMG_NAME}.img"
fi
echo "imagename = $IMG_NAME" >> ${ROOT_DIR}/image/image.cfg
echo "" >> ${ROOT_DIR}/image/image.cfg
cp ${ROOT_DIR}/image/env.cfg ${ROOT_DIR}/image/env_bk.cfg
# boot time optimization:
# 1.remove uboot uart log;
# 2.do not check kernel image crc.
# 3.remove kernel uart log.
# 4.set rootfstype.
grep "CONFIG_BOOT_TIME_OPTIMIZATION=y" ${PACK_TOPDIR}/.config > /dev/null
if [ $? -eq 0 ]; then
sed -i "/debug_mode/d" ${ROOT_DIR}/image/sys_config.fex && sed -i '/^\[platform\]$/a\debug_mode\ \ =\ 0' ${ROOT_DIR}/image/sys_config.fex
sed -i "/^verify=/d" ${ROOT_DIR}/image/env.cfg && sed -i '/^init=/a\verify=no' ${ROOT_DIR}/image/env.cfg
sed -i "/^loglevel=/d" ${ROOT_DIR}/image/env.cfg && sed -i '/^init=/a\loglevel=0' ${ROOT_DIR}/image/env.cfg
grep "CONFIG_TARGET_ROOTFS_SQUASHFS=y" ${PACK_TOPDIR}/.config > /dev/null
if [ $? -eq 0 ]; then
rootfstype=squashfs
fi
grep "CONFIG_TARGET_ROOTFS_EXT4FS=y" ${PACK_TOPDIR}/.config > /dev/null
if [ $? -eq 0 ]; then
rootfstype=ext4
fi
grep "CONFIG_TARGET_ROOTFS_EROFS=y" ${PACK_TOPDIR}/.config > /dev/null
if [ $? -eq 0 ]; then
rootfstype=erofs
fi
if [ "x${rootfstype}" != "x" ]; then
sed -i "s/setargs_.*=.*/& rootfstype=${rootfstype}/" ${ROOT_DIR}/image/env.cfg
fi
fi
# for busybox init, default use /pseudo_init as init process.
grep "CONFIG_SYSTEM_INIT_BUSYBOX=y" ${PACK_TOPDIR}/.config > /dev/null
if [ $? -eq 0 ]; then
sed -i "/^init=/d" ${ROOT_DIR}/image/env.cfg && sed -i '/^mmc_root=/a\init=\/pseudo_init' ${ROOT_DIR}/image/env.cfg
fi
# for small storage ota, no recovery partition, recovery system store in extend partition.
grep "CONFIG_SUNXI_SMALL_STORAGE_OTA=y" ${PACK_TOPDIR}/.config > /dev/null
if [ $? -eq 0 ]; then
sed -i '/^boot_recovery.*/s/ recovery/ extend/g' ${ROOT_DIR}/image/env.cfg
fi
# if CONFIG_USE_SELINUX is enabled, set selinux=1
grep "CONFIG_USE_SELINUX=y" ${PACK_TOPDIR}/.config > /dev/null
if [ $? -eq 0 ]; then
sed -i 's/^selinux=0/selinux=1/g' ${ROOT_DIR}/image/env.cfg
fi
make_boottone_fex
if [ -e ${ROOT_DIR}/image/sys_partition_nor.fex ];then
make_user_res ${ROOT_DIR}/image/sys_partition_nor.fex
make_app_res ${ROOT_DIR}/image/sys_partition_nor.fex
make_data_res ${ROOT_DIR}/image/sys_partition_nor.fex
make_logo_res ${ROOT_DIR}/image/sys_partition_nor.fex
update_mbr_to_sys_config ${ROOT_DIR}/image/sys_partition_nor.fex
else
make_user_res ${ROOT_DIR}/image/sys_partition.fex
make_app_res ${ROOT_DIR}/image/sys_partition.fex
make_data_res ${ROOT_DIR}/image/sys_partition.fex
update_mbr_to_sys_config ${ROOT_DIR}/image/sys_partition.fex
fi
}
function mkdtbo()
{
local DTBO_DIR=${LONGAN_CONFIG_DIR}/${PACK_PLAN}/dtbo
[ ! -d "${DTBO_DIR}" ] && DTBO_DIR=${LONGAN_CONFIG_DIR}/../dtbo
if [ -d $DTBO_DIR ]; then
echo "build dtbo ..."
local DTC_FLAGS="-W no-unit_address_vs_reg"
local DTS_DIR=${DTBO_DIR}
local DTO_COMPILER=${DTBO_DIR}/dtco
if [ ! -f $DTO_COMPILER ]; then
echo "mkdtbo: Can not find dtco compiler."
exit 1
fi
local out_file_name=0
for dts_file in ${DTS_DIR}/*.dts; do
out_file_name=${dts_file%.*}
$DTO_COMPILER ${DTC_FLAGS} -a 4 -@ -O dtb -o ${out_file_name}.dtbo ${dts_file}
if [ $? -ne 0 ]; then
echo "mkdtbo:create dtbo file failed"
exit 1
fi
done
local MKDTIMG=$DTBO_DIR/mkdtimg
local DTBOIMG_CFG_FILE=$DTBO_DIR/dtboimg.cfg
local DTBOIMG_OUT_DIR=${ROOT_DIR}/image
if [ -f ${MKDTIMG} ]; then
if [ -f ${DTBOIMG_CFG_FILE} ]; then
echo "mkdtbo: make dtboimg start."
cd ${DTS_DIR}
${MKDTIMG} cfg_create ${DTBOIMG_OUT_DIR}/dtbo.img ${DTBOIMG_CFG_FILE}
${MKDTIMG} dump ${DTBOIMG_OUT_DIR}/dtbo.img
else
echo "mkdtbo: Can not find dtboimg.cfg"
exit 1
fi
else
echo "mkdtbo: Can not find mkdtimg"
exit 1
fi
mv *.dtbo ${ROOT_DIR}/image/
cd -
else
echo "don't build dtbo ..."
fi
}
function uboot_ini_to_dts()
{
local TARGET_UBOOT_BIN
if [ "x${PACK_NOR}" = "xnor" ]; then
TARGET_UBOOT_BIN=${LICHEE_PACK_OUT_DIR}/u-boot-spinor.fex
else
TARGET_UBOOT_BIN=${LICHEE_PACK_OUT_DIR}/u-boot.fex
fi
sunxi_ubootools split ${TARGET_UBOOT_BIN} > /dev/null
if [ $? -ne 0 ]
then
pack_error "split uboot and fdt failed!!"
return
fi
mv temp_fdt.dtb ${LICHEE_PACK_OUT_DIR}
mv temp_ubootnodtb.bin ${LICHEE_PACK_OUT_DIR}
# get update_to_ubootfdt value from sysconfig
sunxi_ubootools subkey_value sys_config.bin sunxi_ubootools update_to_ubootfdt > /dev/null
if [ $? -eq 1 ]; then
echo "uboot ini to dts"
# split uboot and fdt
$DTC_COMPILER ${DTC_FLAGS} -I dtb -O dts -o ${LICHEE_PACK_OUT_DIR}/.uboot.dtb.dts.tmp ${LICHEE_PACK_OUT_DIR}/temp_fdt.dtb
$DTC_COMPILER -p 2048 ${DTC_FLAGS} -@ -O dtb -o ${LICHEE_PACK_OUT_DIR}/new_fdt.dtb \
-b 0 \
-i ${LICHEE_PACK_OUT_DIR} \
-F $DTC_INI_FILE \
-d ${LICHEE_PACK_OUT_DIR}/temp_fdt.dtb ${LICHEE_PACK_OUT_DIR}/.uboot.dtb.dts.tmp
sunxi_ubootools merge ${LICHEE_PACK_OUT_DIR}/temp_ubootnodtb.bin ${LICHEE_PACK_OUT_DIR}/new_fdt.dtb > /dev/null
cp -vf ${LICHEE_PACK_OUT_DIR}/temp_ubootnodtb.bin ${TARGET_UBOOT_BIN}
else
mv ${LICHEE_PACK_OUT_DIR}/temp_fdt.dtb ${LICHEE_PACK_OUT_DIR}/new_fdt.dtb
fi
# .uboot.dts is the last dts of uboot
$DTC_COMPILER ${DTC_FLAGS} -I dtb -O dts -o ${LICHEE_PACK_OUT_DIR}/.uboot.dts ${LICHEE_PACK_OUT_DIR}/new_fdt.dtb
}
function check_partitions()
{
local DTS_DIR=${LONGAN_CONFIG_DIR}/${PACK_PLAN}/board.dts
local PARTITION_DIR
local partitions=`grep "partitions=" ${DTS_DIR}`
local root_part=`grep "root=" ${DTS_DIR}`
local mtdparts=`grep "mtdparts=" ${DTS_DIR}`
if [[ -n "$mtdparts" ]];then
echo "now do not support check mtdparts"
return
fi
if [[ -n "$partitions" ]];then
partitions=${partitions#*partitions=}
if [ "x${PACK_NOR}" = "xnor" ]; then
PARTITION_DIR=${LONGAN_CONFIG_DIR}/${PACK_PLAN}/linux/sys_partition_nor.fex
partitions=${partitions%mtdblock*}
root_part=${root_part#*root=/dev/mtdblock}
else
PARTITION_DIR=${LONGAN_CONFIG_DIR}/${PACK_PLAN}/linux/sys_partition.fex
partitions=${partitions%mmcblk0p*}
root_part=${root_part#*root=/dev/mmcblk0p}
fi
root_part=${root_part:0:1}
for line in `grep "name" ${PARTITION_DIR} | sed '/;/d'`
do
if [[ $line != "=" && $line != "name" ]];then
((i++))
if [[ $line == "rootfs" && $i != $root_part ]];then
pack_error "The root partition specified by the command line does not match the partition table"
pack_error "Please be on the DTS chosen/bootargs node Detect variable root= "
exit 1
fi
if [[ ! ${partitions} =~ $line ]];then
pack_error "The partition table does not correspond to the partions environment variable."
pack_error "Please be on the DTS chosen/bootargs node add $line to the partitions variable"
exit 1
fi
fi
done
fi
}
function do_ini_to_dts()
{
cd ${LICHEE_PACK_OUT_DIR}/
busybox unix2dos sys_config.fex
script sys_config.fex > /dev/null
if [ "x${PACK_KERN}" == "xlinux-3.4" ]; then
return
fi
if [ "x${PACK_KERN}" == "xlinux-4.4" -a "x${ARCH}" == "xarm64" ]; then
local extra_path=sunxi
elif [ "x${PACK_KERN}" == "xlinux-4.9" -a "x${ARCH}" == "xarm64" ]; then
local extra_path=sunxi
elif [ "x${PACK_KERN}" == "xlinux-5.4" -a "x${ARCH}" == "xriscv" ]; then
local extra_path=sunxi
else
local extra_path=
fi
local DTC_SRC_PATH=${PACK_TOPDIR}/lichee/$PACK_KERN/arch/$ARCH/boot/dts/${extra_path}/
local DTC_DEP_FILE=${DTC_SRC_PATH}/.${PACK_CHIP}-${PACK_BOARD}.dtb.d.dtc.tmp
local DTC_SRC_FILE=${DTC_SRC_PATH}/.${PACK_CHIP}-${PACK_BOARD}.dtb.dts.tmp
local DTC_DEP_BOARD1=${DTC_SRC_PATH}/.board.dtb.d.dtc.tmp
local DTC_SRC_BOARD1=${DTC_SRC_PATH}/.board.dtb.dts.tmp
if [ -f ${DTC_DEP_BOARD1} -a -f ${DTC_SRC_BOARD1} ]; then
DTC_DEP_FILE=${DTC_DEP_BOARD1}
DTC_SRC_FILE=${DTC_SRC_BOARD1}
fi
local DTC_COMPILER=${PACK_TOPDIR}/lichee/$PACK_KERN/scripts/dtc/dtc
local DTC_INI_FILE_BASE=${ROOT_DIR}/image/sys_config.fex
local DTC_INI_FILE=${ROOT_DIR}/image/sys_config_fix.fex
local DTC_FLAGS=""
#export symbols
if [ "x${PACK_KERN}" == "xlinux-4.9" ]; then
DTC_FLAGS="-@"
fi
if [ "x${PACK_KERN}" == "xlinux-5.4" ]; then
cp ${DTC_SRC_PATH}/board.dtb ${ROOT_DIR}/image/sunxi.dtb
$DTC_COMPILER ${DTC_FLAGS} -I dtb -O dts -o ${ROOT_DIR}/image/.sunxi.dts ${ROOT_DIR}/image/sunxi.dtb &> /dev/null
return
fi
cp $DTC_INI_FILE_BASE $DTC_INI_FILE
sed -i "s/\(\[dram\)_para\(\]\)/\1\2/g" $DTC_INI_FILE
sed -i "s/\(\[nand[0-9]\)_para\(\]\)/\1\2/g" $DTC_INI_FILE
if [ ! -f $DTC_COMPILER ]; then
pack_error "Script_to_dts: Can not find dtc compiler.\n"
exit 1
fi
if [ ! -f $DTC_DEP_FILE ]; then
printf "Script_to_dts: Can not find [%s-%s.dts]. Will use common dts file instead.\n" ${PACK_CHIP} ${PACK_BOARD}
if [ "x${PACK_BOARD_PLATFORM}" = "xr6" ] ; then
DTC_DEP_FILE=${PACK_TOPDIR}/lichee/$PACK_KERN/arch/$ARCH/boot/dts/.${PACK_CHIP}-r6-soc.dtb.d.dtc.tmp
DTC_SRC_FILE=${PACK_TOPDIR}/lichee/$PACK_KERN/arch/$ARCH/boot/dts/.${PACK_CHIP}-r6-soc.dtb.dts.tmp
elif [ "x${PACK_BOARD_PLATFORM}" = "xc200s" -o "x${PACK_BOARD_PLATFORM}" = "xv133" -o "x${PACK_BOARD_PLATFORM}" = "xc600" ] ; then
DTC_DEP_FILE=${PACK_TOPDIR}/lichee/$PACK_KERN/arch/$ARCH/boot/dts/.${PACK_CHIP}-${PACK_BOARD}.dtb.d.dtc.tmp
DTC_SRC_FILE=${PACK_TOPDIR}/lichee/$PACK_KERN/arch/$ARCH/boot/dts/.${PACK_CHIP}-${PACK_BOARD}.dtb.dts.tmp
else
if [ "x${PACK_KERN}" == "xlinux-4.4" -a "x${ARCH}" == "xarm64" ]; then
DTC_DEP_FILE=${PACK_TOPDIR}/lichee/$PACK_KERN/arch/$ARCH/boot/dts/sunxi/.${PACK_CHIP}-soc.dtb.d.dtc.tmp
DTC_SRC_FILE=${PACK_TOPDIR}/lichee/$PACK_KERN/arch/$ARCH/boot/dts/sunxi/.${PACK_CHIP}-soc.dtb.dts.tmp
elif [ "x${PACK_KERN}" == "xlinux-4.9" -a "x${ARCH}" == "xarm64" ]; then
DTC_DEP_FILE=${PACK_TOPDIR}/lichee/$PACK_KERN/arch/$ARCH/boot/dts/sunxi/.${PACK_CHIP}-soc.dtb.d.dtc.tmp
DTC_SRC_FILE=${PACK_TOPDIR}/lichee/$PACK_KERN/arch/$ARCH/boot/dts/sunxi/.${PACK_CHIP}-soc.dtb.dts.tmp
else
DTC_DEP_FILE=${PACK_TOPDIR}/lichee/$PACK_KERN/arch/$ARCH/boot/dts/.${PACK_CHIP}-soc.dtb.d.dtc.tmp
DTC_SRC_FILE=${PACK_TOPDIR}/lichee/$PACK_KERN/arch/$ARCH/boot/dts/.${PACK_CHIP}-soc.dtb.dts.tmp
fi
fi
#Disbale noisy checks
if [[ "x${PACK_KERN}" == "xlinux-4.9" || "x${PACK_KERN}" == "xlinux-5.4" ]]; then
DTC_FLAGS="-W no-unit_address_vs_reg -@"
fi
fi
if [ "x${PACK_KERN}" == "xlinux-5.4" -a "x${ARCH}" == "xriscv" ]; then
$DTC_COMPILER ${DTC_FLAGS} -O dtb -o ${ROOT_DIR}/image/sunxi.dtb \
-b 0 \
-i $DTC_SRC_PATH \
-d $DTC_DEP_FILE $DTC_SRC_FILE
else
$DTC_COMPILER -p 2048 ${DTC_FLAGS} -O dtb -o ${ROOT_DIR}/image/sunxi.dtb \
-b 0 \
-i $DTC_SRC_PATH \
-F $DTC_INI_FILE \
-d $DTC_DEP_FILE $DTC_SRC_FILE
fi
if [ $? -ne 0 ]; then
pack_error "Conver script to dts failed"
exit 1
fi
uboot_ini_to_dts
printf "Conver script to dts ok.\n"
# It'is used for debug dtb
$DTC_COMPILER ${DTC_FLAGS} -I dtb -O dts -o ${ROOT_DIR}/image/.sunxi.dts ${ROOT_DIR}/image/sunxi.dtb &> /dev/null
grep "TARGET_ROOTFS_INITRAMFS=y" ${PACK_TOPDIR}/.config > /dev/null
if [ $? -ne 0 ]; then
check_partitions
fi
return
}
function mkenv()
{
local env_cfg=$1
local env_fex=$2
grep "CONFIG_SUNXI_MAKE_REDUNDANT_ENV=y" ${PACK_TOPDIR}/.config > /dev/null
if [ $? -eq 0 ]; then
#config in tina defconfig
local env_size=0x0
local env_size=`grep "CONFIG_SUNXI_REDUNDANT_ENV_SIZE" ${PACK_TOPDIR}/.config | awk -F '=' '{print $2}' | sed 's/\"//g'`
echo "CONFIG_SUNXI_REDUNDANT_ENV_SIZE=y in defconfig"
echo "--mkenvimage create redundant env data!--"
echo "---redundant env data size ${env_size}---"
mkenvimage -r -p 0x00 -s ${env_size} -o ${env_fex} ${env_cfg}
elif [ "x${LICHEE_REDUNDANT_ENV_SIZE}" != x"" ]; then
#config in BoardConfig.mk
local env_size=${LICHEE_REDUNDANT_ENV_SIZE}
echo "LICHEE_REDUNDANT_ENV_SIZE config in BoardConfig.mk"
echo "--mkenvimage create redundant env data!--"
echo "---redundant env data size ${env_size}---"
mkenvimage -r -p 0x00 -s ${env_size} -o ${env_fex} ${env_cfg}
else
u_boot_env_gen ${env_cfg} ${env_fex} >/dev/null
fi
}
function do_common()
{
cd ${ROOT_DIR}/image
if [ ! -f board_config.fex ]; then
echo "[empty]" > board_config.fex
fi
#busybox unix2dos sys_config.fex
#busybox unix2dos# board_config.fex
#script sys_config.fex > /dev/null
cp -f sys_config.bin config.fex
script board_config.fex > /dev/null
cp -f board_config.bin board.fex
busybox unix2dos sys_partition.fex
script sys_partition.fex > /dev/null
if [ -f fastbootpkg_cardproduct.cfg ]; then
echo "pack fastboot boot package"
busybox unix2dos boot_package.cfg
dragonsecboot -pack fastbootpkg_cardproduct.cfg
cp -v boot_package.fex fastbootpkg_cardproduct.fex
fi
# Those files for SpiNor. We will try to find sys_partition_nor.fex
if [ -f sys_partition_nor.fex ]; then
if [ -f "sunxi.dtb" ]; then
cp sunxi.dtb sunxi.fex
fi
if [ -f "scp.fex" ]; then
echo "update scp"
update_scp scp.fex sunxi.fex
fi
# Here, will create sys_partition_nor.bin
busybox unix2dos sys_partition_nor.fex
script sys_partition_nor.fex > /dev/null
update_boot0 boot0_spinor.fex sys_config.bin SPINOR_FLASH new_fdt.dtb> /dev/null
if [ $? -ne 0 ]; then
pack_error "update_boot0 run error"
exit 1
fi
echo update_chip
update_chip boot0_spinor.fex > /dev/null
if [ "x${PACK_KERN}" = "xlinux-3.4" ] ; then
update_uboot -merge u-boot-spinor.fex sys_config.bin > /dev/null
else
update_uboot -no_merge u-boot-spinor.fex sys_config.bin > /dev/null
if [ "x${PACK_SIG}" = "xsecure" ] ; then
update_uboot -no_merge u-boot-spinor-secure.fex sys_config.bin > /dev/null
fi
fi
while read line
do
compress_name=(`echo $line | awk '($1 !~ ";" && ($2 ~ "lzma" || $2 ~ "lz4" || $2 ~ "gz")) {print $2}'`)
source_name=(`echo $compress_name | cut -d \. -f 1,2 | cut -d \ -f 2`)
compress_type=(`echo $compress_name | cut -d \. -f 3 | cut -d \ -f 2`)
[ -z "$compress_name" ] && continue
case $compress_type in
"gz")
[ -f $source_name ] && gzip -c $source_name > $compress_name || echo "no exist $source_name"
echo "compress name: $compress_name"
;;
"lzma")
[ -f $source_name ] && lzma e $source_name $compress_name || echo "no exist $source_name"
echo "compress name: $compress_name"
;;
"lz4")
[ -f $source_name ] && lz4 -f $source_name $compress_name || echo "no exist $source_name"
echo "compress name: $compress_name"
;;
*)
echo "no match compress type"
;;
esac
echo "compress type: $compress_type"
done < boot_package_nor.cfg
if [ -f boot_package_nor.cfg ]; then
mv u-boot-spinor-crash.fex u-boot-crash.fex
echo "pack boot package"
busybox unix2dos boot_package.cfg
dragonsecboot -pack boot_package_nor.cfg
cp boot_package.fex boot_package_nor.fex
fi
# Ugly, but I don't have a better way to change it.
# We just set env's downloadfile name to env_nor.cfg in sys_partition_nor.fex
# And if env_nor.cfg is not exist, we should copy one.
if [ ! -f env_nor.cfg ]; then
cp -f env.cfg env_nor.cfg >/dev/null 2<&1
fi
#card sprite
if [ -f "boot0_sdcard.fex" ]; then
update_boot0 boot0_sdcard.fex sys_config.bin SDMMC_CARD new_fdt.dtb> /dev/null
update_chip boot0_sdcard.fex > /dev/null
fi
# Fixup boot mode for SPINor, just can bootm
sed -i '/^boot_normal/s#\<boota\>#bootm#g' env_nor.cfg
mkenv env_nor.cfg env_nor.fex
else
update_boot0 boot0_nand.fex sys_config.bin NAND new_fdt.dtb> /dev/null
update_boot0 boot0_sdcard.fex sys_config.bin SDMMC_CARD new_fdt.dtb> /dev/null
echo update_chip
update_chip boot0_nand.fex > /dev/null
update_chip boot0_sdcard.fex > /dev/null
fi
if [ ! -f "u-boot-crash.fex" ]; then
touch "u-boot-crash.fex"
echo "ensure u-boot-crash.fex is not empty" > u-boot-crash.fex
fi
if [ -f "sunxi.dtb" ]; then
cp sunxi.dtb sunxi.fex
update_dtb sunxi.fex 4096
fi
if [ -f "scp.fex" ]; then
echo "update scp"
update_scp scp.fex sunxi.fex
fi
# Those files for Nand or Card
if [ -e boot0_nand.fex ]; then
update_boot0 boot0_nand.fex sys_config.bin NAND > /dev/null
if [ $? -ne 0 ]; then
pack_error "update_boot0 boot0_nand.fex run error"
exit 1
fi
else
echo "boot0_nand.fex" > boot0_nand.fex
fi
if [ -e boot0_sdcard.fex ]; then
update_boot0 boot0_sdcard.fex sys_config.bin SDMMC_CARD > /dev/null
if [ $? -ne 0 ]; then
pack_error "update_boot0 boot0_sdcard.fex run error"
exit 1
fi
else
echo "boot0_sdcard.fex" > boot0_sdcard.fex
fi
if [ "x${PACK_KERN}" = "xlinux-3.4" ] ; then
update_uboot -merge u-boot.fex sys_config.bin > /dev/null
else
update_uboot -no_merge u-boot.fex sys_config.bin > /dev/null
fi
update_fes1 fes1.fex sys_config.bin > /dev/null
if [ -f ${PACK_TOPDIR}/tools/pack-bintools/src/update_sboot ];then
if [ "x${PACK_NOR}" = "xnor" ] ; then
update_sboot sboot.bin sys_config.bin SPINOR_FLASH new_fdt.dtb > /dev/null
else
update_sboot sboot.bin sys_config.bin SDMMC_CARD new_fdt.dtb > /dev/null
fi
if [ $? -ne 0 ]
then
pack_error "update sboot run error"
exit 1
fi
fi
fsbuild boot-resource.ini split_xxxx.fex > /dev/null
if [ -f boot_package.cfg ]; then
echo "pack boot package"
busybox unix2dos boot_package.cfg
dragonsecboot -pack boot_package.cfg
if [ $? -ne 0 ]
then
pack_error "dragon pack run error"
exit 1
fi
fi
if [ "x${PACK_FUNC}" = "xprvt" ] ; then
mkenv env_burn.cfg env.fex
else
mkenv env.cfg env.fex
fi
if [ -f "arisc" ]; then
ln -s arisc arisc.fex
fi
}
function img_to_programmer()
{
local out_img=$1
local in_img=$2
if [ "x${PACK_SIG}" = "xprev_refurbish" -o "x${PACK_SIG}" = "xsecure" ]; then
programmer_img toc0.fex toc1.fex ${out_img} > /dev/null
else
programmer_img boot0_sdcard.fex boot_package.fex ${out_img} > /dev/null
fi
if [ -f sunxi_gpt.fex ] ; then
#create_img for sunxi_gpt.fex
programmer_img sys_partition.bin sunxi_mbr.fex ${out_img} ${in_img} sunxi_gpt.fex > /dev/null
else
#create_img for sunxi_mbr.fex
programmer_img sys_partition.bin sunxi_mbr.fex ${out_img} ${in_img} > /dev/null
fi
}
function do_finish()
{
# Yeah, it should contain all files into full_img.fex for spinor
# Because, as usually, spinor image size is very small.
# If fail to create full_img.fex, we should fake it empty.
# WTF, it is so ugly!!! It must be sunxi_mbr.fex & sys_partition.bin,
# not sunxi_mbr_xxx.fex & sys_partition_xxx.bin. In order to advoid this
# loathsome thing, we need to backup & copy files. Check whether
# sys_partition_nor.bin is exist, and create sunxi_mbr.fex for Nor.
#
#[spinor] update_mbr sys_partition_nor.bin 1 sunxi_mbr_nor.bin dlinfo.fex flash size logical_offset 1
#default flash size 32M = 65535 sector ,logical offset = 2016 sector
if [ -f sys_partition_nor.bin ]; then
update_mbr sys_partition_nor.bin 1 sunxi_mbr_nor.fex dlinfo.fex 65535 2016 1
if [ $? -ne 0 ]; then
pack_error "update_mbr failed"
exit 1
fi
#update mbr info to env.cfg
mbr2env sunxi_mbr_nor.fex env_nor.fex
#only uboot2011&linux-3.4 bsp used full img
if [ "x${PACK_KERN}" = "xlinux-3.4" ] ; then
BOOT1_FILE=u-boot-spinor.fex
#Need to set LOGIC_START and UBOOT_START in .hooks/pre-pack script
#if not set , will use default
if [ -z "$LOGIC_START" ] ; then
LOGIC_START=496 #496+16=512K
fi
if [ -z "$UBOOT_START" ] ; then
UBOOT_START=24 #24K
fi
#if use uboot-2018, it not use mbr, but gpt
if [ "x${TARGET_UBOOT}" = "xu-boot-2018" ] ; then
mbr_file=sunxi_gpt.fex
else
mbr_file=sunxi_mbr_nor.fex
fi
#create img for nor programmer
merge_full_img --out full_img.fex \
--boot0 boot0_spinor.fex \
--boot1 ${BOOT1_FILE} \
--mbr ${mbr_file} \
--logic_start ${LOGIC_START} \
--uboot_start ${UBOOT_START} \
--partition sys_partition_nor.bin
if [ $? -ne 0 ]; then
pack_error "merge_full_img failed"
exit 1
fi
rm -f sys_partition_for_dragon.fex
else
#the img for Phoenixsuit/Livesuit do not need full_img
#but we need to make one for flash programmer
BOOT1_FILE=boot_package_nor.fex
if [ -z "$LOGIC_START" ] ; then
LOGIC_START=1008 #1008+16=1024K
fi
if [ -z "$UBOOT_START" ] ; then
UBOOT_START=64 #24K
fi
#if use uboot-2018, it not use mbr, but gpt
if [ "x${TARGET_UBOOT}" = "xu-boot-2018" ] ; then
mbr_file=sunxi_gpt.fex
else
mbr_file=sunxi_mbr_nor.fex
fi
#create img for nor programmer
merge_full_img --out full_img.fex \
--boot0 boot0_spinor.fex \
--boot1 ${BOOT1_FILE} \
--mbr ${mbr_file} \
--logic_start ${LOGIC_START} \
--uboot_start ${UBOOT_START} \
--partition sys_partition_nor.bin
if [ $? -ne 0 ]; then
pack_error "merge_full_img failed"
exit 1
fi
cp sys_partition_nor.fex sys_partition_for_dragon.fex
fi
cp sys_partition_nor.fex sys_partition.fex
else
if [ "x${PACK_KERN}" = "xlinux-3.4" -a ! -f full_img.fex ] ; then
echo "full_img.fex is empty" > full_img.fex
fi
update_mbr sys_partition.bin 4
if [ $? -ne 0 ]; then
pack_error "update_mbr failed"
exit 1
fi
#15269888 is from emmc datasheet, sec_count in Extended CSD is 0xe90000 = 15269888.
#40960 is the mbr location for emmc
#0 is emmc/nand ; 1 is spinor
update_mbr sys_partition.bin 4 sunxi_mbr.fex dlinfo.fex 15269888 40960 0
if [ $? -ne 0 ]; then
pack_error "update_mbr_gpt failed"
exit 1
fi
cp sys_partition.fex sys_partition_for_dragon.fex
fi
mkdir -p tinaconf
cp ${PACK_TOPDIR}/.config tinaconf/tina_config.fex
cp ${PACK_TOPDIR}/lichee/$PACK_KERN/.config tinaconf/kernel_config.fex
tar -czf tinaconf.fex tinaconf
local tinaconf="$(sed -n '/^\s*{\s*filename\s*=\s*"tinaconf.tar.gz"\s*,/p' image.cfg)"
local fileend="$(sed -n '/^\s*{\s*filename\s*=/=' image.cfg | tail -1)"
if [ -z "$tinaconf" ] && [ -n "$fileend" ]; then
tinaconf+=' {filename = "tinaconf.fex",'
tinaconf+=' maintype = "12345678",'
tinaconf+=' subtype = "TINACONF00000000",},'
sed -i -e ''"${fileend}"'a\' -e "$tinaconf" image.cfg
fi
if [ -f sys_partition_for_dragon.fex ]; then
do_dragon image.cfg sys_partition_for_dragon.fex
else
do_dragon image.cfg
fi
if [ "x${PACK_PROGRAMMER}" = "xprogrammer" ]; then
echo "waiting to ceate programmer img..."
img_to_programmer ${IMG_PROGRAMMER_NAME} ../${IMG_NAME}
if [ $? -eq 0 ]; then
if [ -e ${IMG_PROGRAMMER_NAME} ]; then
mv ${IMG_PROGRAMMER_NAME} ../${IMG_PROGRAMMER_NAME}
echo '----------programmer image is at----------'
echo -e '\033[0;31;1m'
echo ${ROOT_DIR}/${IMG_PROGRAMMER_NAME}
echo -e '\033[0m'
fi
fi
fi
cd ..
printf "pack finish\n"
}
# In order to adapt to multiple platforms,
# some files are allowed to be invalid files when making images
# But some files cannot be invalid files at the same time
# This function is mainly to check the situation that those files
# cannot be invalid files at the same time
function do_check_pack_file()
{
local boot0_nand_valid_flag=0
local boot0_sdcard_valid_flag=0
local boot0_spinor_valid_flag=0
local toc0_valid_flag=0
local boot0_nand_size=0
local boot0_sdcard_size=0
local boot0_spinor_size=0
local toc0_size=0
local valid_file_siez=1024
if [ -e boot0_nand.fex ]; then
boot0_nand_size=`ls -l boot0_nand.fex | awk '{ print $5 }'`
if [ $boot0_nand_size -gt $valid_file_siez ]; then
boot0_nand_valid_flag=1
fi
fi
if [ -e boot0_sdcard.fex ]; then
boot0_sdcard_size=`ls -l boot0_sdcard.fex | awk '{ print $5 }'`
if [ $boot0_sdcard_size -gt $valid_file_siez ]; then
boot0_sdcard_valid_flag=1
fi
fi
if [ -e boot0_spinor.fex ]; then
boot0_spinor_size=`ls -l boot0_spinor.fex | awk '{ print $5 }'`
if [ $boot0_spinor_size -gt $valid_file_siez ]; then
boot0_spinor_valid_flag=1
fi
fi
if [ -e toc0.fex ]; then
toc0_size=`ls -l toc0.fex | awk '{ print $5 }'`
if [ $toc0_size -gt $valid_file_siez ]; then
toc0_valid_flag=1
fi
fi
if [ $boot0_nand_valid_flag == "0" ] && \
[ $boot0_sdcard_valid_flag == "0" ] && \
[ $boot0_spinor_valid_flag == "0" ] && \
[ $toc0_valid_flag == "0" ]; then
pack_error "boot0 files are all invalid files, now exit"
exit 1
fi
}
function do_dragon()
{
local partition_file_name="x$2"
if [ $partition_file_name != "x" ]; then
echo "===================================="
echo "show \"$2\" message"
show_partition_message $2
fi
do_check_pack_file
dragon $@
if [ $? -eq 0 ]; then
if [ -e ${IMG_NAME} ]; then
mv ${IMG_NAME} ../${IMG_NAME}
echo "----------${image_instruction}----------"
echo '----------image is at----------'
echo -e '\033[0;31;1m'
echo ${ROOT_DIR}/${IMG_NAME}
echo -e '\033[0m'
if [ $PACK_HOOK ]
then
$PACK_HOOK ${ROOT_DIR}/${IMG_NAME}
fi
fi
fi
# you can add scripts/.hooks/post-dragon to do something after dragon
# for example, you can copy img to another dir, add post-dragon like this:
#
# echo "==========post-dragon========"
# cp ${ROOT_DIR}/${IMG_NAME} ~/myimgs/
# echo "==========post-dragon done========"
#
[ -e ${PACK_TOPDIR}/scripts/.hooks/post-dragon ] &&
source ${PACK_TOPDIR}/scripts/.hooks/post-dragon
}
function do_signature_ft()
{
local FT_BIN=${LICHEE_CHIP_CONFIG_DIR}/${BIN_PATH}/ft_${PACK_CHIP}.bin;
if [ -f ${FT_BIN} ] ; then
cp -v ${LICHEE_CHIP_CONFIG_DIR}/${BIN_PATH}/ft_${PACK_CHIP}.bin ft.bin
else
printf "can not found ft bin\n"
return 1
fi
if [ -f ${LICHEE_CHIP_CONFIG_DIR}/configs/default/dragon_toc_ft.cfg ] ; then
cp -v ${LICHEE_CHIP_CONFIG_DIR}/configs/default/dragon_toc_ft.cfg dragon_toc_ft.cfg
else
if [ -f ${LICHEE_COMMON_CONFIG_DIR}/sign_config/dragon_toc_ft.cfg ] ; then
cp -v ${LICHEE_COMMON_CONFIG_DIR}/sign_config/dragon_toc_ft.cfg dragon_toc_ft.cfg
else
printf "can not found dragon_toc_ft cfg\n"
return 2
fi
fi
printf "prepare for signature for ft bin\n"
dragonsecboot -toc0 dragon_toc_ft.cfg ${ROOT_DIR}/keys ${LICHEE_PACK_OUT_DIR}/version_base.mk > /dev/null
if [ $? -ne 0 ]
then
pack_error "dragon toc0_ft run error\n"
exit 1
fi
mv toc0.fex toc0_ft.fex
}
function do_signature_dsp()
{
local DSP0_BIN=${ROOT_DIR}/image/dsp0.fex;
local DSP1_BIN=${ROOT_DIR}/image/dsp1.fex;
local CFG_FILE=${LICHEE_CHIP_CONFIG_DIR}/configs/default/image_header_secure.cfg;
if [ ! -f ${DSP0_BIN} ]; then
printf "can not find ${DSP0_BIN}"
return 3
fi
if [ -f ${CFG_FILE} ]; then
cp -v ${CFG_FILE} image_header_secure.cfg
else
printf "can not found image_header_secure cfg\n"
return 2
fi
mkimage_header -C 5 -c image_header_secure.cfg -s rsa -k ${ROOT_DIR}/keys
if [ $? -ne 0 ]; then
pack_error "mkimage signature dsp error\n"
exit 1
fi
mv dsp0.fex.pack dsp0.fex
if [ -f ${DSP1_BIN} ]; then
mv dsp1.fex.pack dsp1.fex
fi
}
function do_signature()
{
# merge flag: '1' - merge atf/scp/uboot/optee in one package, '0' - do not merge.
local merge_flag=0
printf "prepare for signature by openssl\n"
if [ "x${PACK_SIG}" = "xprev_refurbish" ] ; then
if [ "x${ARCH}" = "xarm64" ] ; then
if [ -f ${LONGAN_COMMON_DIR}/sign_config/dragon_toc_a64_no_secureos.cfg ]; then
cp -v ${LONGAN_COMMON_DIR}/sign_config/dragon_toc_a64_no_secureos.cfg dragon_toc.cfg
else
cp -v ${TINA_CONFIG_DIR}/generic/sign_config/dragon_toc_a64_no_secureos.cfg dragon_toc.cfg
fi
else
if [ -f ${LONGAN_COMMON_DIR}/sign_config/dragon_toc_no_secureos.cfg ]; then
cp -v ${LONGAN_COMMON_DIR}/sign_config/dragon_toc_no_secureos.cfg dragon_toc.cfg
else
cp -v ${TINA_CONFIG_DIR}/generic/sign_config/dragon_toc_no_secureos.cfg dragon_toc.cfg
fi
fi
else
if [ "x${ARCH}" = "xarm64" ] ; then
if [ -f ${LONGAN_CONFIG_DIR}/default/dragon_toc.cfg ] ; then
cp -v ${LONGAN_CONFIG_DIR}/default/dragon_toc.cfg dragon_toc.cfg
elif [ -f ${LONGAN_COMMON_DIR}/sign_config/dragon_toc_a64.cfg dragon_toc.cfg ] ; then
cp -v ${LONGAN_COMMON_DIR}/sign_config/dragon_toc_a64.cfg dragon_toc.cfg
else
cp -v ${TINA_CONFIG_DIR}/generic/sign_config/dragon_toc_a64.cfg dragon_toc.cfg
fi
grep -r "\[package\]" dragon_toc.cfg > /dev/null
if [ $? -eq 0 ]; then
merge_flag=1
fi
else
if [ ${IMG_FLASH} = "_nor" ] ; then
echo "secure flash type is nor"
if [ -f ${LONGAN_CONFIG_DIR}/default/dragon_toc_nor.cfg ] ; then
cp -v ${LONGAN_CONFIG_DIR}/default/dragon_toc_nor.cfg dragon_toc.cfg
elif [ -f ${LONGAN_COMMON_DIR}/sign_config/dragon_toc_nor.cfg dragon_toc.cfg ] ; then
cp -v ${LONGAN_COMMON_DIR}/sign_config/dragon_toc_nor.cfg dragon_toc.cfg
else
cp -v ${TINA_CONFIG_DIR}/generic/sign_config/dragon_toc_nor.cfg dragon_toc.cfg
fi
else
echo "secure flash type is nand/emmc"
if [ -f ${LONGAN_CONFIG_DIR}/default/dragon_toc.cfg ] ; then
cp -v ${LONGAN_CONFIG_DIR}/default/dragon_toc.cfg dragon_toc.cfg
elif [ -f ${LONGAN_COMMON_DIR}/sign_config/dragon_toc.cfg dragon_toc.cfg ] ; then
cp -v ${LONGAN_COMMON_DIR}/sign_config/dragon_toc.cfg dragon_toc.cfg
else
cp -v ${TINA_CONFIG_DIR}/generic/sign_config/dragon_toc.cfg dragon_toc.cfg
fi
fi
fi
fi
if [ $? -ne 0 ]
then
pack_error "dragon toc config file is not exist"
exit 1
fi
if [ ! -f ${ROOT_DIR}/boot_initramfs_recovery.img ]; then
printf "recovery img is not exist, remove recovery cert from dragon_toc.cfg\n"
sed -i '/recovery/d' dragon_toc.cfg > /dev/null
else
local recovery_buf=$(grep "recovery" -nr dragon_toc.cfg)
if [ x"${recovery_buf}" = x"" ]; then
recovery_buf="onlykey=recovery, recovery.fex, SCPFirmwareContentCertPK"
local reco_line=$(grep "u-boot.fex" -nr dragon_toc.cfg | awk -F ':' '{print $1}')
sed -i "$reco_line i $recovery_buf" dragon_toc.cfg
fi
fi
# add squashfs to dragon_toc.cfg
grep "CONFIG_TARGET_ROOTFS_SQUASHFS=y" ${PACK_TOPDIR}/.config > /dev/null && \
grep "CONFIG_USE_UBOOT_VERIFY_SQUASHFS=y" ${PACK_TOPDIR}/.config > /dev/null
if [ $? -eq 0 ]; then
sed -i '/^onlykey=boot/a\onlykey=rootfs, rootfs-extract.fex, SCPFirmwareContentCertPK' dragon_toc.cfg
fi
rm -f cardscript.fex
mv cardscript_secure.fex cardscript.fex
if [ $? -ne 0 ]
then
pack_error "dragon cardscript_secure.fex file is not exist"
exit 1
fi
if [ ! -d ${ROOT_DIR}/keys ]; then
echo ""
pack_error "No key exist, please run './scripts/createkeys' to generate keys first."
exit 1
fi
do_signature_ft
update_chip sboot.bin > /dev/null
dragonsecboot -toc0 dragon_toc.cfg ${ROOT_DIR}/keys ${ROOT_DIR}/image/version_base.mk
if [ $? -ne 0 ]
then
pack_error "dragon toc0 run error"
exit 1
fi
update_toc0 toc0.fex sys_config.bin
if [ $? -ne 0 ]
then
pack_error "update toc0 run error"
exit 1
fi
if [ ${merge_flag} == 1 ]; then
printf "dragon boot package\n"
dragonsecboot -pack dragon_toc.cfg
if [ $? -ne 0 ]
then
pack_error "dragon boot_package run error"
exit 1
fi
fi
# update optee pubkey
if [ -f ${ROOT_DIR}/staging_dir/target/usr/dev_kit/arm-plat-${PACK_CHIP}/export-ta_arm32/keys/default_ta.pem ]; then
${PACK_TOPDIR}/scripts/update_optee_pubkey.py \
--in_file optee.fex --out_file optee-new.fex \
--key ${ROOT_DIR}/staging_dir/target/usr/dev_kit/arm-plat-${PACK_CHIP}/export-ta_arm32/keys/default_ta.pem
if [ $? -eq 0 ]; then
mv optee-new.fex optee.fex
else
pack_error "update optee pubkey error!"
exit 1
fi
fi
if [ -f ${LONGAN_COMMON_DIR}/sign_config/cnf_base.cnf ] ; then
CNF_BASE_FILE=${LONGAN_COMMON_DIR}/sign_config/cnf_base.cnf
else
CNF_BASE_FILE=${TINA_CONFIG_DIR}/generic/sign_config/cnf_base.cnf
fi
dragonsecboot -toc1 dragon_toc.cfg ${ROOT_DIR}/keys \
${CNF_BASE_FILE} \
${ROOT_DIR}/image/version_base.mk
if [ $? -ne 0 ]
then
pack_error "dragon toc1 run error"
exit 1
fi
local correct_boot_img_magic=$(echo -n "ANDROID!" | md5sum | cut -d " " -f 1)
local boot_fex_magic=$(dd if=boot.fex bs=1 count=8 | md5sum | cut -d " " -f 1)
if [ x$correct_boot_img_magic != x$boot_fex_magic ] ; then
pack_error "boot.fex format error, magic not ANDROID!"
exit 1
fi
sigbootimg --image boot.fex --cert toc1/cert/boot.der --output boot_sig.fex
if [ $? -ne 0 ] ; then
pack_error "Pack cert to image error"
exit 1
else
mv -f boot_sig.fex boot.fex
fi
do_signature_dsp
# add cert behind recovery image
if [ -f ${ROOT_DIR}/boot_initramfs_recovery.img ]; then
local recovery_fex_magic=$(dd if=recovery.fex bs=1 count=8 | md5sum | cut -d " " -f 1)
if [ x$correct_boot_img_magic != x$recovery_fex_magic ] ; then
pack_error "recovery.fex format error, magic not ANDROID!"
exit 1
fi
du -b -L recovery.fex
sigbootimg --image recovery.fex --cert toc1/cert/recovery.der --output recovery_sig.fex
if [ $? -ne 0 ] ; then
pack_error "Pack cert to image error"
exit 1
else
mv -f recovery_sig.fex recovery.fex
fi
du -b recovery.fex
fi
echo "secure signature ok!"
}
function do_pack_tina()
{
printf "packing for tina linux\n"
rm -rf vmlinux.fex
rm -rf boot.fex
rm -rf rootfs.fex
rm -rf rootfs_nor.fex
rm -rf kernel.fex
rm -rf rootfs_squashfs.fex
rm -rf usr.fex
rm -rf recovery.fex
rm -rf rootfs-extract.fex
#ln -s ${ROOT_DIR}/vmlinux.tar.bz2 vmlinux.fex
if [ ! -f vmlinux.fex ]; then
echo "vmlinux" > vmlinux.fex
fi
if [ -f ${ROOT_DIR}/boot_initramfs.img ]; then
ln -s ${ROOT_DIR}/boot_initramfs.img boot.fex
else
ln -s ${ROOT_DIR}/boot.img boot.fex
fi
# sys_partition_nor.fex in longan may use kernel.fex
ln -s boot.fex kernel.fex
if [ -f ${ROOT_DIR}/${PACK_BOARD}-Image.gz ] ; then
cp ${ROOT_DIR}/${PACK_BOARD}-Image.gz Image.gz
fi
if [ -f Image.gz -a -f fit-image.its ] ; then
mkimage -f fit-image.its fit-image.fex
fi
if [ "x${PACK_SIG}" = "xsecure" ] ; then
cp -vf ${ROOT_DIR}/rootfs.img rootfs.fex
[ -f dtbo.img ] &&
cp -vf dtbo.img dtbo.fex
# get sample from squashfs rootfs
grep "CONFIG_TARGET_ROOTFS_SQUASHFS=y" ${PACK_TOPDIR}/.config > /dev/null && \
grep "CONFIG_USE_UBOOT_VERIFY_SQUASHFS=y" ${PACK_TOPDIR}/.config > /dev/null
if [ $? -eq 0 ]; then
# get sample from squashfs rootfs
local rootfs_per_MB=`grep "^rootfs_per_MB=" ${ROOT_DIR}/image/env.cfg | awk -F = '{printf $2}'`
if [ -z $rootfs_per_MB ]; then
echo "rootfs_per_MB is not defined in ${ROOT_DIR}/image/env.cfg, use default value 4096"
rootfs_per_MB=4096
fi
extract_squashfs $rootfs_per_MB rootfs.fex rootfs-extract.fex
if [ $? -ne 0 ]; then
echo "extract squashfs error"
exit 1;
fi
fi
else
ln -s ${ROOT_DIR}/rootfs.img rootfs.fex
[ -f dtbo.img ] &&
ln -s dtbo.img dtbo.fex
fi
# tina don't need rootfs_nor.fex and rootfs-ubifs.fex, but some sys_partition.fex for longan use it, so add one for compatibility
ln -s rootfs.fex rootfs_nor.fex
ln -s rootfs.fex rootfs-ubifs.fex
if [ -f ${ROOT_DIR}/usr.img ]; then
ln -s ${ROOT_DIR}/usr.img usr.fex
fi
if [ -f ${ROOT_DIR}/boot_initramfs_recovery.img ]; then
ln -s ${ROOT_DIR}/boot_initramfs_recovery.img recovery.fex
else
touch recovery.fex
echo "recovery part not used!" > recovery.fex
fi
# Those files is ready for SPINor.
#ln -s ${ROOT_DIR}/uImage kernel.fex
#ln -s ${ROOT_DIR}/rootfs.squashfs rootfs_squashfs.fex
# add for dm-verity block
grep "CONFIG_USE_DM_VERITY=y" ${PACK_TOPDIR}/.config > /dev/null
if [ $? -eq 0 ]; then
cp -vf ${ROOT_DIR}/rootfs.img rootfs.fex
${PACK_TOPDIR}/scripts/dm-verity-block.sh ${ROOT_DIR}/image/rootfs.fex
if [ $? -ne 0 ]; then
echo "error: generate verity block error!"
exit
fi
fi
if [ "x${PACK_SIG}" = "xsecure" ] ; then
echo "secure"
do_signature
elif [ "x${PACK_SIG}" = "xprev_refurbish" ] ; then
echo "prev_refurbish"
do_signature
else
echo "normal"
fi
if [ "x${PACK_SIG}" = "xsecure" ] ; then
# append the signature to the behind of rootfs.fex
grep "CONFIG_TARGET_ROOTFS_SQUASHFS=y" ${PACK_TOPDIR}/.config > /dev/null && \
grep "CONFIG_USE_UBOOT_VERIFY_SQUASHFS=y" ${PACK_TOPDIR}/.config > /dev/null
if [ $? -eq 0 ]; then
update_squashfs ${ROOT_DIR}/image/rootfs.fex ${ROOT_DIR}/image/toc1/cert/rootfs.der
if [ $? -ne 0 ]
then
pack_error "signature squashfs rootfs error."
exit 1
fi
fi
fi
}
function do_pack_partition_file()
{
#use sys_partition_tmp
cp $1 sys_partition_tmp.fex
#don't care about ; line
sed -i '/^[ \t]*;/d' sys_partition_tmp.fex
sed -i 's/"/ /g' sys_partition_tmp.fex
/bin/busybox unix2dos sys_partition_tmp.fex
script sys_partition_tmp.fex > /dev/null
#rm img_*.tar.gz readme
rm -f img_[0-9]*.tar.gz
rm -f readme
#touch readme
touch readme
local tarimg_name=`date +"%Y%m%d_%H%M%S"`
echo "[create time]" >> readme
echo "${tarimg_name}" >> readme
echo "" >> readme
local tar_file="${IMG_NAME} ./image/sunxi_mbr.fex ./image/sys_partition.fex"
if [ "x${PACK_SIG}" = "xsecure" ];then
tar_boot_file="./image/boot0_nand.fex ./image/toc0.fex ./image/toc1.fex"
else
tar_boot_file="./image/boot0_nand.fex ./image/boot_package.fex"
fi
tar_file="$tar_file $tar_boot_file"
downloadfile=(`grep -rn "downloadfile" sys_partition_tmp.fex | awk '{print $4}'`)
for file in ${downloadfile[@]} ; do
if [[ $tar_file =~ "./image/$file" ]]; then
echo "tar_file already have $file, skip it"
else
tar_file="$tar_file ./image/$file"
fi
done
echo "[image md5sum]" >> readme
for file in $tar_file ; do
echo "file:$file"
echo `md5sum --binary $file` >> readme
done
#delete "*./image/"
sed -i 's/\*\.\/image\///g' readme
tar -zcv -h -f img_${tarimg_name}.tar.gz $tar_file readme > /dev/null
#clean
rm -f sys_partition_tmp.fex readme
#announce
echo '---------- tar image is at----------'
echo -e '\033[0;31;1m'
echo "${ROOT_DIR}/img_${tarimg_name}.tar.gz"
echo -e '\033[0m'
}
function do_mkbootimg_add_dtb()
{
if [ "x${ARCH}" = "xarm64" ]; then
local LOAD_ADDRESS=0x40080000
local ENTRY_POINT=0x40080000
local BASE_ADDRESS=0x40000000
local KERNEL_OFFSET=0x80000
local IMAGE_DATA=Image.gz
local BOOTIMG_IMAGE_DATA=bImage
elif [ "x${ARCH}" == "xriscv" ]; then
local LOAD_ADDRESS=0x40080000
local ENTRY_POINT=0x40080000
local BASE_ADDRESS=0x40000000
local KERNEL_OFFSET=0x0
local IMAGE_DATA=Image.gz
local BOOTIMG_IMAGE_DATA=bImage
else
local LOAD_ADDRESS=0x40008000
local ENTRY_POINT=0x40008000
local BASE_ADDRESS=0x40000000
local KERNEL_OFFSET=0x8000
local IMAGE_DATA=zImage
local BOOTIMG_IMAGE_DATA=zImage
fi
local RAMDISK_OFFSET=0x01000000
local DTB_OFFSET=0x01008000
local RAMDISK=ramdisk.img
local DTB=sunxi.dtb
local UIMAGE_NAME=uImage
local BOOTIMG_NAME=boot.img
local KDIR=${ROOT_DIR}/compile_dir/target/linux-${PACK_BOARD}
# it is a fake ramdisk, because the Android image must have a ramdisk
local RDIR=${TINA_CONFIG_DIR}/generic/image
local DDIR=${ROOT_DIR}/image
# Only version 2 can add dtb
local HEADER_VERSION=0x2
echo "====================mkbootimg add dtb start===================="
if [ -e ${ROOT_DIR}/boot.img ]; then
rm ${ROOT_DIR}/boot.img
fi
if [ ${#PACK_BOARD} -gt 16 ]; then
CUT_PACK_BOARD_NAME=${PACK_BOARD:0:16}
else
CUT_PACK_BOARD_NAME=${PACK_BOARD}
fi
echo "mkbootimg --kernel ${KDIR}/${BOOTIMG_IMAGE_DATA} --ramdisk ${RDIR}/${RAMDISK} --dtb ${DTB} --board ${CUT_PACK_BOARD_NAME} --base ${BASE_ADDRESS} --kernel_offset ${KERNEL_OFFSET} --ramdisk_offse ${RAMDISK_OFFSET} --dtb_offset ${DTB_OFFSET} --header_version ${HEADER_VERSION} -o ${ROOT_DIR}/boot.img"
mkbootimg --kernel ${KDIR}/${BOOTIMG_IMAGE_DATA} --ramdisk ${RDIR}/${RAMDISK} --dtb ${DTB} --board ${CUT_PACK_BOARD_NAME} --base ${BASE_ADDRESS} --kernel_offset ${KERNEL_OFFSET} --ramdisk_offse ${RAMDISK_OFFSET} --dtb_offset ${DTB_OFFSET} --header_version ${HEADER_VERSION} -o ${ROOT_DIR}/boot.img
echo "=====================mkbootimg add dtb end====================="
}
################## command #########################
[ -e ${PACK_TOPDIR}/scripts/.hooks/pre-pack ] &&
source ${PACK_TOPDIR}/scripts/.hooks/pre-pack
do_prepare
echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
do_ini_to_dts
mkdtbo
do_common
grep "CONFIG_SUNXI_MKBOOTIMG_ADD_DTB=y" ${PACK_TOPDIR}/.config > /dev/null
if [ $? -eq 0 ]; then
do_mkbootimg_add_dtb
fi
do_pack_${PACK_PLATFORM}
do_finish
if [ "x${PACK_TAR_IMAGE}" = "xtar_image" ]; then
do_pack_partition_file ${ROOT_DIR}/image/sys_partition.fex
fi
[ -e ${PACK_TOPDIR}/scripts/.hooks/post-pack ] &&
source ${PACK_TOPDIR}/scripts/.hooks/post-pack