sdk-hwV1.3/lichee/melis-v3.0/source/tools/scripts/pack_img.sh

1005 lines
36 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.
# If you see the following export command, do not change the sequence of
#
#
# the PATH, we must put our pack routine at the first, to avoid customer's
# runing environment has some excutes which have the same name with out tools.
export PATH=${MELIS_BASE}/tools/packtool/:$PATH
############################ 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
source ${MELIS_BASE}/tools/scripts/shflags
SUPPORT_8M=1
SUPPORT_16M=0
SUPPORT_64M=0
enable_pause=0
align_size=256
fs_align_size=256
# 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 '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 'topdir' 'none' 'sdk top dir' 't'
DEFINE_string 'programmer' '' 'creat programmer img or not' 'w'
DEFINE_string 'tar_image' '' 'creat downloadfile img .tar.gz or not' 'i'
DEFINE_string 'nor_volume' '' 'pack norflash volume , e.g. 8(MBytes)' 'n'
DEFINE_string 'storage_type' '' 'pack storage type , e.g. nor, sdcard, sdcard_product, nand' 'a'
# parse the command-line
FLAGS "$@" || exit $?
eval set -- "${FLAGS_ARGV}"
PACK_CHIP=${FLAGS_chip}
PACK_PLATFORM=${FLAGS_platform}
PACK_BOARD=${FLAGS_board}
PACK_DEBUG=${FLAGS_debug_mode}
PACK_SIG=${FLAGS_signture}
PACK_SECURE=${FLAGS_secure}
PACK_MODE=${FLAGS_mode}
PACK_PROGRAMMER=${FLAGS_programmer}
PACK_TAR_IMAGE=${FLAGS_tar_image}
PACK_TOPDIR=${FLAGS_topdir}
PACK_NORVOL=${FLAGS_nor_volume}
PACK_STORAGE_TYPE=${FLAGS_storage_type}
MULTI_CONFIG_INDEX=0
UART_PORT=$(cat ${PACK_TOPDIR}/projects/${PACK_BOARD}/configs/*_nor.fex | fgrep -w "uart_debug_port" | fgrep -v ";" | sed s/[[:space:]]//g | awk -F'=' '{ print $2 }')
#if uart_port is not exit or uboot_nor_uartx.bin is nor exit. set uart is defult port
if [ ! $UART_PORT -o ! -f "${PACK_TOPDIR}/projects/${PACK_BOARD}/bin/u-boot_${PACK_CHIP}_nor_uart${UART_PORT}.bin" ];then
UART_PORT=0
fi
# the size for user space is 114432 KB for nand
# the mbr size is 256K default
LOGICAL_PARTS_KB_FOR_128Mnand=$(( 114432 - 256 ))
LOGICAL_UDISK_PARTS_KB_REMAIN_FOR_128Mnand=0
LOGICAL_PARTS_KB_FOR_64M=$(( 64 * 1024 - 64))
LOGICAL_PARTS_KB_FOR_16M=$(( 16 * 1024 - 64))
LOGICAL_PARTS_KB_FOR_8M=$(( 8 * 1024 - 64))
LOGICAL_UDISK_PARTS_KB_REMAIN_FOR_64M=0
LOGICAL_UDISK_PARTS_KB_REMAIN_FOR_16M=0
LOGICAL_UDISK_PARTS_KB_REMAIN_FOR_8M=0
current_rtos_full_img_size=0
SUFFIX=""
storage_type=""
IMG_NAME=""
phoenixplugin_file_list=(
${PACK_TOPDIR}/tools/phoenixplugin/*.fex
)
configs_file_list=(
${PACK_TOPDIR}/projects/${PACK_BOARD}/configs/*.fex
${PACK_TOPDIR}/projects/${PACK_BOARD}/configs/*.cfg
${PACK_TOPDIR}/projects/${PACK_BOARD}/configs/rootfs.ini
${PACK_TOPDIR}/projects/${PACK_BOARD}/version/version_base.mk
)
img_storage_type=("nor" "card" "card_product" "nand" )
boot_file_list=(
${PACK_TOPDIR}/projects/${PACK_BOARD}/bin/boot0_${PACK_CHIP}_nand.bin:boot0_nand.fex
${PACK_TOPDIR}/projects/${PACK_BOARD}/bin/boot0_${PACK_CHIP}_nor.bin:boot0_nor.fex
${PACK_TOPDIR}/projects/${PACK_BOARD}/bin/boot0_${PACK_CHIP}_card.bin:boot0_card.fex
${PACK_TOPDIR}/projects/${PACK_BOARD}/bin/boot0_${PACK_CHIP}_card.bin:boot0_card_product.fex
${PACK_TOPDIR}/projects/${PACK_BOARD}/bin/fes1_${PACK_CHIP}.bin:fes1.fex
${PACK_TOPDIR}/projects/${PACK_BOARD}/bin/u-boot_${PACK_CHIP}_nand.bin:u-boot_nand.fex
${PACK_TOPDIR}/projects/${PACK_BOARD}/bin/u-boot_${PACK_CHIP}_card.bin:u-boot_card.fex
${PACK_TOPDIR}/projects/${PACK_BOARD}/bin/u-boot_${PACK_CHIP}_nor_uart${UART_PORT}.bin:u-boot_nor.fex
${PACK_TOPDIR}/projects/${PACK_BOARD}/epos.img:epos.img
)
boot_file_secure=(${PACK_TOPDIR}/projects/${PACK_BOARD}/bin/sboot_${PACK_CHIP}.bin:sboot.bin)
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"
}
function size() {
ls -l $1 | awk '{print $5}'
}
# get_part_info <totol_KB_for_all_partitions> <path_of_sys_partition>
function get_part_info()
{
sed -e '/^;/d' -e '/^ *;/d' -e 's/\r//g' $1 | awk -v total=$2 '
BEGIN {
i = 0
}
/^\[partition\]/ {
info["name"] = "None"
info["size"] = 0
info["downloadfile"] = "\"None\""
while (getline && $0 ~ /=/)
{
info[$1] = $3
}
info["size"] /= 2
if (info["name"] != "UDISK")
sum += info["size"]
if (info["name"] == "UDISK")
info["size"] = (int( total - sum))
info[i] = info["name"] ":" info["size"] ":" info["downloadfile"]
i++
};
END {
for (j = 0; j < i; j++)
print info[j]
}'
}
function get_partition_downfile_size()
{
local downloadfile_name=`echo $1 | awk -F '=' '{print $2}'`
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
}
#mkspiffs <size_in_bytes> <input_directory> <output_file>
function mkspiffs()
{
${PACK_TOPDIR}/tools/scripts/spiffsgen.py --meta-len 0 --obj-name-len 128 --page-size 256 --block-size $((64 * 1024)) $1 $2 $3
}
function mklittlefs()
{
echo "--- creating littlefs image ---"
if [ ${storage_type} = "3" ]; then #nor
${PACK_TOPDIR}/tools/packtool/mklfs -c $2 -b $((4 * 1024)) -r 256 -p 256 -s $1 -i $3
else #nand
${PACK_TOPDIR}/tools/packtool/mklfs -c $2 -b $((4 * 1024)) -r $((4 * 1024)) -p $((4 * 1024)) -s $1 -i $3
fi
echo "--- create littlefs image end ---"
}
function mkminfs()
{
minfs make $1 $2 rootfs.ini
}
#parse the sys_partition.fex and only downloadfile name with string 'data' be made to filesystem image[see line 269].
function make_data_image()
{
pack_info "running the function make_data_image for partition data"
local part name size downloadfile
echo `sed -e '/^ *;/d' -e 's/\r//g' $1`
for part in $(get_part_info ${1} ${2})
do
echo "*******"
echo "=${part}="
echo "*******"
name="$(awk -F: '{print $1}' <<< "${part}")"
size="$(awk -F: '{print $2}' <<< "${part}")"
downloadfile="$(awk -F: '{print $3}' <<< "${part}" | sed 's/"//g')"
if [ "x${name}" == "xUDISK" ] ; then
part_name=${name}
part_size=$(( ${size} * 1024 / 512 ))
eval ${3}=${part_size}
fi
grep "^data_udisk.fex" <<< "${downloadfile}" || continue
size=$(( ${size} * 1024 ))
echo "try to create image: ${name} to ${downloadfile} with size ${size}"
name="${PACK_TOPDIR}/projects/${PACK_BOARD}/data/UDISK"
if [ ! -d ${name} ]; then
pack_error "not found ${name} for creating ${downloadfile}"
continue
fi
#downloadfile="${PACK_TOPDIR}/out/${PACK_BOARD}/image/${downloadfile}"
#mkspiffs ${size} ${name} ${downloadfile}
#echo `whereis mklittlefs`
set -e
if [ ! -z $(grep "^CONFIG_ROOTFS_LITTLEFS=y" "${MELIS_BASE}/.config") ] ;
then mklittlefs ${size} ${name} ${downloadfile}
fi
if [ ! -z $(grep "^CONFIG_ROOTFS_MINFS=y" "${MELIS_BASE}/.config") ] ;
then mkminfs ${name} ${downloadfile}
fi
set +e
if [ x"${4}" == x"cut_zero" ]; then
echo "cut zero to reduce fs size"
mv ${downloadfile} ${downloadfile}.ori
sed '$ s/\x00*$//' ${downloadfile}.ori > ${downloadfile}.cut
dd if=${downloadfile}.cut of=${downloadfile} bs=$fs_align_size conv=sync
fi
done
}
function do_rootfs_ini_tmp()
{
cp -f ${PACK_TOPDIR}/projects/${PACK_BOARD}/configs/rootfs.ini ${PACK_TOPDIR}/projects/${PACK_BOARD}/data/UDISK/rootfs_ini.tmp
[ -f ${PACK_TOPDIR}/projects/${PACK_BOARD}/data/UDISK/rootfs_ini.tmp ] || {
pack_warn "rootfs_ini.tmp not exist!"
continue;
}
echo ${PACK_TOPDIR}/projects/${PACK_BOARD}/data/UDISK/rootfs_ini.tmp
}
function change_bootA_partition_size()
{
#Set the compression mode according to the configuration
fileSize=0
if [ ! -z $(grep "^CONFIG_EPOS_COMPRESS_NONE=y" "${MELIS_BASE}/.config") ] ;
then
fileSize=`ls -l epos.img | awk '{print $5}'` #get filesize
elif [ ! -z $(grep "^CONFIG_EPOS_COMPRESS_GZ=y" "${MELIS_BASE}/.config") ];
then
fileSize=`ls -l epos-gz.img | awk '{print $5}'` #get filesize
elif [ ! -z $(grep "^CONFIG_EPOS_COMPRESS_LZ4=y" "${MELIS_BASE}/.config") ];
then
fileSize=`ls -l epos-lz4.img | awk '{print $5}'` #get filesize
elif [ ! -z $(grep "^CONFIG_EPOS_COMPRESS_LZMA=y" "${MELIS_BASE}/.config") ];
then
fileSize=`ls -l epos.img.lzma | awk '{print $5}'` #get filesize
fi
fileSize=$(( ($fileSize / 1024) + 1)) #get k size
fileSize=$(( ($fileSize/64 +1) * 64 * 2)) #align 64K
echo "---------------------------------------booA size = $fileSize-----------------------------------"
sed -i "/bootA/,/\"melis_pkg_nor\.fex\"/{s/.*size.*/ size = $fileSize/}" $1
}
function update_package_boot_cfg()
{
#Cancel all compression methods
sed -i "s/^item=freertos/;item=freertos/g" package_boot0.cfg
sed -i "s/^item=melis-gz/;item=melis-gz/g" package_boot0.cfg
sed -i "s/^item=melis-lz4/;item=melis-lz4/g" package_boot0.cfg
sed -i "s/^item=melis-lzma/;item=melis-lzma/g" package_boot0.cfg
#Set the compression mode according to the configuration
echo "*******************************************************"
if [ ! -z $(grep "^CONFIG_EPOS_COMPRESS_NONE=y" "${MELIS_BASE}/.config") ] ;
then
echo "epos compress mode is : none"
sed -i "s/^;item=freertos/item=freertos/g" package_boot0.cfg
elif [ ! -z $(grep "^CONFIG_EPOS_COMPRESS_GZ=y" "${MELIS_BASE}/.config") ];
then
echo "epos compress mode is : GZ"
sed -i "s/^;item=melis-gz/item=melis-gz/g" package_boot0.cfg
elif [ ! -z $(grep "^CONFIG_EPOS_COMPRESS_LZ4=y" "${MELIS_BASE}/.config") ];
then
echo "epos compress mode is : LZ4"
sed -i "s/^;item=melis-lz4/item=melis-lz4/g" package_boot0.cfg
elif [ ! -z $(grep "^CONFIG_EPOS_COMPRESS_LZMA=y" "${MELIS_BASE}/.config") ];
then
echo "epos compress mode is : LZMA"
sed -i "s/^;item=melis-lzma/item=melis-lzma/g" package_boot0.cfg
fi
echo "*******************************************************"
}
function do_prepare()
{
pack_info "copying config/boot binary/phoenix plugin files"
do_rootfs_ini_tmp
for file in ${phoenixplugin_file_list[@]} ; do
echo ${file} ; cp -f $file ./
done
for file in ${configs_file_list[@]} ; do
echo ${file} ; cp -f $file ./
done
for file in ${boot_file_list[@]} ; do
echo ${file} ; cp -f `echo $file | awk -F: '{print $1}'` `echo $file | awk -F: '{print $2}'` 2>/dev/null
done
if [ "x${PACK_SECURE}" = "xsecure" -o "x${PACK_SIG}" = "xsecure" -o "x${PACK_SIG}" = "xprev_refurbish" ] ; then
printf "copying secure boot file\n"
for file in ${boot_file_secure[@]} ; do
echo ${file} | sed 's/${MELIS_BASE}//g'; cp -f `echo $file | awk -F: '{print $1}'` `echo $file | awk -F: '{print $2}'`
done
fi
if [ "x${PACK_MODE}" = "xdump" ] ; then
cp -vf sys_partition_nor_dump.fex sys_partition_nor.fex
cp -vf sys_partition_card_dump.fex sys_partition_card.fex
cp -vf sys_partition_nand_dump.fex sys_partition_nand.fex
cp -vf usbtool_test.fex usbtool.fex
fi
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" ] ; then
IMG_NAME="${IMG_NAME}_${PACK_MODE}"
fi
if [ "x${PACK_SECURE}" = "xsecure" ] ; then
IMG_NAME="${IMG_NAME}_${PACK_SECURE}"
fi
[ -f epos.img ] && gzip -c epos.img > epos-gz.img
[ -f epos.img ] && lz4 -f epos.img epos-lz4.img
[ -f epos.img ] && lzma -zfk epos.img
}
function do_common()
{
local img_name="${IMG_NAME}"
local update_type="SPINOR_FLASH"
sed -i 's/\\\\/\//g' image_$1.cfg
sed -i 's/^imagename/;imagename/g' image_$1.cfg
img_name="${img_name}_$1"
if [ "x${PACK_SECURE}" != "xnone" -o "x${PACK_SIG}" != "xnone" ]; then
MAIN_VERION=`awk '$0~"MAIN_VERSION"{printf"%d", $3}' version_base.mk`
img_name="${img_name}_v${MAIN_VERION}.img"
else
img_name="${img_name}.img"
fi
echo "imagename = $img_name" >> image_$1.cfg
echo "" >> image_$1.cfg;
pack_info "define image file name is:$img_name"
[ -f sys_config_$1${SUFFIX}.fex ] || {
pack_warn "sys_config_$1.fex not exist!"
continue;
}
storage_type=`sed -e '/^$/d' -e '/^;/d' -e '/^\[/d' -n -e '/^storage_type/p' "sys_config_$1${SUFFIX}.fex" | sed -e 's/[a-z,A-Z,_, ,=,\r,\n]//g'`
echo "storage type value is *${storage_type}*"
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' sys_config_$1${SUFFIX}.fex
sed -i -e '/^\[platform\]/a\secure_without_OS=0' sys_config_$1${SUFFIX}.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' sys_config_$1${SUFFIX}.fex
sed -i -e '/^\[platform\]/a\secure_without_OS=1' sys_config_$1${SUFFIX}.fex
else
sed -i '/^burn_secure_mod/d' sys_config_$1${SUFFIX}.fex
sed -i '/^secure_without_OS/d' sys_config_$1${SUFFIX}.fex
fi
[ -f sys_partition_$1.fex ] || {
pack_warn "sys_partition_$1.fex not exist!"
continue
}
#Set the compression mode according to the configuration
if [ ! -z $(grep "^CONFIG_CHANGE_COMPRESS_METHOD=y" "${MELIS_BASE}/.config") ] ;
then
update_package_boot_cfg
change_bootA_partition_size sys_partition_$1.fex
fi
busybox unix2dos sys_config_$1${SUFFIX}.fex
script sys_config_$1${SUFFIX}.fex > /dev/null
cp -f sys_config_$1${SUFFIX}.bin config_$1${SUFFIX}.fex
[ -f boot0_$1.fex ] && {
if [ "$1" = "nor" ] ; then update_boot0 boot0_$1.fex sys_config_$1${SUFFIX}.bin "SPINOR_FLASH" > /dev/null
elif [ "$1" = "card" ] ; then update_boot0 boot0_$1.fex sys_config_$1${SUFFIX}.bin "SDMMC_CARD" > /dev/null
elif [ "$1" = "card_product" ] ; then update_boot0 boot0_$1.fex sys_config_$1${SUFFIX}.bin "SDMMC_CARD" > /dev/null
elif [ "$1" = "nand" ] ; then update_boot0 boot0_$1.fex sys_config_$1${SUFFIX}.bin "NAND" > /dev/null
else pack_warn "please check, img_storage_type is \"${img_storage_type[@]}\""
fi
update_chip_melis boot0_$1.fex
}
busybox unix2dos sys_partition_$1.fex
script sys_partition_$1.fex > /dev/null
# Those files for SpiNor. We will try to find sys_partition_nor.fex
if [ -f package_boot0.cfg ] ; then
echo "pack boot $1 package"
cp sys_config_$1${SUFFIX}.bin sys_config.bin
busybox unix2dos package_boot0.cfg
dragonsecboot -pack package_boot0.cfg
if [ $? -ne 0 ] ; then
pack_error "dragon pack nor run error" ; exit 1
fi
mv boot_package.fex melis_pkg_nor.fex
dd if=melis_pkg_nor.fex of=boot_package_nor.fex bs=1k count=32
else
update_rtos --image epos-gz.img --output epos-gz-update.img
if [ $? -ne 0 ]; then
pack_error "add rtos header error!"
exit 1
fi
cp epos-gz-update.img melis_pkg_nor.fex
fi
[ -f fes1.fex ] && update_fes1 fes1.fex sys_config_$1${SUFFIX}.bin > /dev/null
[ -f u-boot_$1.fex ] && {
update_uboot -no_merge u-boot_${1}.fex sys_config_$1${SUFFIX}.bin > /dev/null
#gzip -c u-boot_${1}.fex > u-boot_${1}-gz.fex
}
[ -f package_uboot_$1.cfg ] && {
busybox unix2dos package_uboot_${1}.cfg
dragonsecboot -pack package_uboot_${1}.cfg
[ $? -ne 0 ] && {
pack_error "dragon pack run error" ; exit 1
}
update_toc1 boot_package.fex sys_config_$1${SUFFIX}.bin
[ $? -ne 0 ] && {
pack_error "update toc1 run error" ; exit 1
}
mv boot_package.fex boot_pkg_uboot_${1}.fex
}
rm sys_config.bin
cp sys_config_$1${SUFFIX}.bin sys_config_bin.fex
[ -f env.cfg ] && {
env_size=4096
mkenvimage -r -p 0x00 -s ${env_size} -o env.fex env.cfg
}
}
function do_finish()
{
pack_info "running the function do_finish \"sys_partition_$1.bin\""
if [ -f sys_partition_$1.bin ] ; then
if [ $1 = "nor" ] ; then
update_mbr sys_partition_$1.bin 1 sunxi_mbr_$1.fex
elif [ $1 = "card" ] ; then
update_mbr sys_partition_$1.bin 4 sunxi_mbr_$1.fex
elif [ $1 = "card_product" ] ; then
update_mbr sys_partition_$1.bin 4 sunxi_mbr_$1.fex
elif [ $1 = "nand" ] ; then
update_mbr sys_partition_$1.bin 4 sunxi_mbr_$1.fex
else
pack_error "do_finish error, check the storage para is [$1]"
fi
if [ $? -ne 0 ]; then
pack_error "update_mbr failed"
exit 1
fi
if [ "x${PACK_MODE}" = "xdump" ] ; then
printf "pack dump image, don't need to create full_img\n"
else
if [ "x$1" = "xnor" ] ; then
if [ ${current_rtos_full_img_size} -eq 8 ]; then
pack_warn "2021-01-19 do not create full binary because new uboot";create_rtos_full_img ${LOGICAL_UDISK_PARTS_KB_REMAIN_FOR_8M} ${current_rtos_full_img_size}
elif [ ${current_rtos_full_img_size} -eq 16 ]; then
pack_warn "2021-01-19 do not create full binary because new uboot";create_rtos_full_img ${LOGICAL_UDISK_PARTS_KB_REMAIN_FOR_16M} ${current_rtos_full_img_size}
elif [ ${current_rtos_full_img_size} -eq 64 ]; then
pack_warn "2021-01-19 do not create full binary because new uboot";#create_rtos_full_img ${LOGICAL_UDISK_PARTS_KB_REMAIN_FOR_64M} ${current_rtos_full_img_size}
else
pack_error "full img size ${current_rtos_full_img_size} is not 8/16M"
exit 1;
fi
fi
fi
do_dragon image_$1.cfg sys_partition_$1.fex
fi
#source ${PACK_TOPDIR}/../../../../aligenie/host/tools/otatool/pack_update_zip_allwinner.sh
#pack_update_zip
pack_info "pack finish\n"
}
function pack_update_zip()
{
local RTOSFS_IMG=rtosfs.img
local DATA_OUT=${PACK_TOPDIR}/out/${PACK_BOARD}/compile_dir/target/data
rm -fr update.zip
ln -fs image/melis_pkg_nor.fex ${RTOSFS_IMG}
# if [ "x${PACK_SIG}" = "xsecure" ]; then
${PACK_TOPDIR}/../../../../aligenie/host/tools/otatool/md5byslice md5.list ${RTOSFS_IMG} #*.mp3 #toc0.fex toc1.fex
# else
# ${PACK_TOPDIR}/../../../../aligenie/host/tools/otatool/md5byslice md5.list ${RTOSFS_IMG} boot_package.fex boot0_nand.fex config.zip config2.zip
# fi
# temp disable should revert when key is ready ${PACK_TOPDIR}/../../../../aligenie/host/tools/otatool/rsa_encrypt_file md5.list md5.encrypt ${PACK_TOPDIR}/tools/target/product/security/alitvsec_priv.pem
# mv md5.list md5.encrypt
# if [ "x${PACK_SIG}" = "xsecure" ]; then
zip -0 update.zip ${RTOSFS_IMG} md5.list #toc0.fex toc1.fex
# else
# zip -0 update.zip ${RTOSFS_IMG} boot_package.fex boot0_nand.fex config.zip config2.zip md5.encrypt
# fi
# [ -e ${RECOVERY_IMG} ] &amp;&amp; zip -r update.zip ${RECOVERY_IMG}
echo '----------update.zip is at----------'
echo -e '\033[0;31;1m'
echo ${PACK_TOPDIR}/out/${PACK_BOARD}/update.zip
echo -e '\033[0m'
}
function do_dragon()
{
pack_info "running the function do_dragon with file \"$@\""
local partition_file_name="x$2"
if [ $partition_file_name != "x" ]; then
echo ====================================
echo show \"$2\" message
show_partition_message $2
fi
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 ${PACK_TOPDIR}/out/${PACK_BOARD}/${IMG_NAME}
echo -e '\033[0m'
fi
fi
[ -e ${PACK_TOPDIR}/tools/scripts/.hooks/post-dragon ] &&
source ${PACK_TOPDIR}/tools/scripts/.hooks/post-dragon
}
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"
cp -v ${PACK_TOPDIR}/projects/${PACK_BOARD}/sign_config/dragon_toc.cfg dragon_toc.cfg
if [ $? -ne 0 ]
then
pack_error "dragon toc config file is not exist"
exit 1
fi
if [ x${SUFFIX} == x'' ]; then
dragonsecboot -toc0 dragon_toc.cfg ${PACK_TOPDIR}/out/${PACK_BOARD}/keys ${PACK_TOPDIR}/out/${PACK_BOARD}/image/version_base.mk
if [ $? -ne 0 ]
then
pack_error "dragon toc0 run error"
exit 1
fi
fi
update_toc0 toc0.fex sys_config${SUFFIX}.bin
if [ $? -ne 0 ]
then
pack_error "update toc0 run error"
exit 1
fi
if [ x${SUFFIX} == x'' ]; then
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
dragonsecboot -toc1 dragon_toc.cfg ${PACK_TOPDIR}/out/${PACK_BOARD}/keys \
${PACK_TOPDIR}/projects/${PACK_BOARD}/sign_config/cnf_base.cnf \
${PACK_TOPDIR}/out/${PACK_BOARD}/image/version_base.mk
if [ $? -ne 0 ]
then
pack_error "dragon toc1 run error"
exit 1
fi
fi
update_toc1 toc1.fex sys_config${SUFFIX}.bin
if [ $? -ne 0 ]
then
pack_error "update toc1 run error"
exit 1
fi
echo "secure signature ok!"
}
function do_pack_melis()
{
pack_info "packing for melis\n"
<<'COMMENT'
COMMENT
}
function do_pack_rtos()
{
pack_info "packing for rtos\n"
# boot_package/toc1 limit to 4Mbut rtos may large then 4M
rm -f melis_pkg_nor.fex
rm -f rtos_pkg.fex
rm -f freertos-gz-update.fex
rm -f uboot_toc1.fex
#init default value
echo "" > subimg0.fex; subimg0_size=0; subimg0_name="img0"; subimg0_file="";
echo "" > subimg1.fex; subimg1_size=0; subimg1_name="img1"; subimg1_file="";
echo "" > subimg2.fex; subimg2_size=0; subimg2_name="img2"; subimg2_file="";
echo "" > subimg3.fex; subimg3_size=0; subimg3_name="img3"; subimg3_file="";
echo "" > subimg4.fex; subimg4_size=0; subimg4_name="img4"; subimg4_file="";
echo "" > subimg5.fex; subimg5_size=0; subimg5_name="img5"; subimg5_file="";
echo "" > subimg6.fex; subimg6_size=0; subimg6_name="img6"; subimg6_file="";
echo "" > subimg7.fex; subimg7_size=0; subimg7_name="img7"; subimg7_file="";
echo "" > subimg8.fex; subimg8_size=0; subimg8_name="img8"; subimg8_file="";
echo "" > subimg9.fex; subimg9_size=0; subimg9_name="img9"; subimg9_file="";
#config by user
subimg0_file_name="rtos_gz"
subimg0_file="epos-gz.img"
#compatible with old uboot, it get dst_len from tail
let dd_size=$align_size-4
dd if=/dev/zero of=./end.fex bs=1 count=$dd_size
echo -e -n "\xFF\xFF\xFF\xFF" >> end.fex
<<'COMMENT'
#merge all subimgs to be new freertos-gz.fex
cat subimg0.fex subimg1.fex subimg2.fex subimg3.fex subimg4.fex subimg5.fex subimg6.fex subimg7.fex subimg8.fex subimg9.fex end.fex > freertos-gz.fex
if [ "x${PACK_SIG}" = "xsecure" ] ; then
echo "secure"
do_signature
update_rtos --image freertos-gz.fex \
--cert toc1/cert/freertos-gz.der \
--name0 $subimg0_name --size0 $subimg0_size \
--name1 $subimg1_name --size1 $subimg1_size \
--name2 $subimg2_name --size2 $subimg2_size \
--name3 $subimg3_name --size3 $subimg3_size \
--name4 $subimg4_name --size4 $subimg4_size \
--name5 $subimg5_name --size5 $subimg5_size \
--name6 $subimg6_name --size6 $subimg6_size \
--name7 $subimg7_name --size7 $subimg7_size \
--name8 $subimg8_name --size8 $subimg8_size \
--name9 $subimg9_name --size9 $subimg9_size \
--output freertos-gz-update.fex
if [ $? -ne 0 ]; then
pack_error "add rtos header error!"
exit 1
fi
ln -s freertos-gz-update.fex melis_pkg_nor.fex
ln -s freertos-gz-update.fex rtos_pkg.fex
cp toc1.fex uboot_toc1.fex #toc1.fex for nand, uboot_toc1.fex for nor
if [ "x${storage_type}" = "x3" ] ; then
echo "boot_package_nor.fex" > boot_package_nor.fex
echo "boot_package.fex" > boot_package.fex
# for nor, keep small toc1.fex to make uboot happy, won't write to flash
dd if=uboot_toc1.fex of=toc1.fex bs=1k count=32
fi
elif [ "x${PACK_SIG}" = "xprev_refurbish" ] ; then
echo "prev_refurbish"
do_signature
update_rtos --image freertos-gz.fex \
--cert toc1/cert/freertos-gz.der \
--name0 $subimg0_name --size0 $subimg0_size \
--name1 $subimg1_name --size1 $subimg1_size \
--name2 $subimg2_name --size2 $subimg2_size \
--name3 $subimg3_name --size3 $subimg3_size \
--name4 $subimg4_name --size4 $subimg4_size \
--name5 $subimg5_name --size5 $subimg5_size \
--name6 $subimg6_name --size6 $subimg6_size \
--name7 $subimg7_name --size7 $subimg7_size \
--name8 $subimg8_name --size8 $subimg8_size \
--name9 $subimg9_name --size9 $subimg9_size \
--output freertos-gz-update.fex
if [ $? -ne 0 ]; then
pack_error "add rtos header error!"
exit 1
fi
ln -s freertos-gz-update.fex melis_pkg_nor.fex
ln -s freertos-gz-update.fex rtos_pkg.fex
cp toc1.fex uboot_toc1.fex #toc1.fex for nand, uboot_toc1.fex for nor
if [ "x${storage_type}" = "x3" ] ; then
echo "boot_package_nor.fex" > boot_package_nor.fex
echo "boot_package.fex" > boot_package.fex
# for nor, keep small toc1.fex to make uboot happy, won't write to flash
dd if=uboot_toc1.fex of=toc1.fex bs=1k count=32
fi
else
echo "normal"
update_rtos --image freertos-gz.fex \
--name0 $subimg0_name --size0 $subimg0_size \
--name1 $subimg1_name --size1 $subimg1_size \
--name2 $subimg2_name --size2 $subimg2_size \
--name3 $subimg3_name --size3 $subimg3_size \
--name4 $subimg4_name --size4 $subimg4_size \
--name5 $subimg5_name --size5 $subimg5_size \
--name6 $subimg6_name --size6 $subimg6_size \
--name7 $subimg7_name --size7 $subimg7_size \
--name8 $subimg8_name --size8 $subimg8_size \
--name9 $subimg9_name --size9 $subimg9_size \
--output freertos-gz-update.fex
if [ $? -ne 0 ]; then
pack_error "add rtos header error!"
exit 1
fi
ln -s freertos-gz-update.fex melis_pkg_nor.fex
ln -s freertos-gz-update.fex rtos_pkg.fex
if [ "x${storage_type}" = "x3" ] ; then
mv boot_package_nor.fex uboot_pkg_nor.fex
mv boot_package.fex uboot_pkg.fex
# keep small boot_package.fex/boot_package_nor.fex to make uboot happy, won't write to flash
dd if=uboot_pkg_nor.fex of=boot_package_nor.fex bs=1k count=32
dd if=uboot_pkg.fex of=boot_package.fex bs=1k count=32
fi
ln -s uboot_pkg_nor.fex uboot_toc1.fex
fi
COMMENT
}
function create_rtos_full_img()
{
pack_info "running the function create_rtos_full_img for pure binary imagefile $1 $2"
set -e
#rtos use uboot-2018, so not use mbr, but gpt
gpt_file=sunxi_gpt_nor.fex
mbr_source_file=sunxi_mbr_nor.fex
#rtos logic start is 80K
LOGIC_START=48
if [ "x${PACK_SIG}" = "xsecure" ] ; then
boot0_file_name=toc0.fex
full_rtos_img_name=${PACK_PLATFORM}_${2}Mnor_s.fex
else
boot0_file_name=boot0_nor.fex
full_rtos_img_name=${PACK_PLATFORM}_${2}Mnor.fex
fi
set +e
echo ----------------mbr convert to gpt start---------------------
mbr_convert_to_gpt --source ${mbr_source_file} \
--out ${gpt_file} \
--input_logic_offset $((${LOGIC_START} * 1024 / 512 )) \
--input_flash_size ${2}
echo ----------------mbr convert to gpt end---------------------
set -e
cp ${gpt_file} sunxi_gpt.fex
cp ${boot0_file_name} boot0.fex
#cp ${boot0_file_name} boot0_sdcard.fex
#rtos have not uboot, rtos use gpt
merge_full_rtos_img --out ${full_rtos_img_name} \
--boot0 ${boot0_file_name} \
--mbr ${gpt_file} \
--logic_start ${LOGIC_START} \
--partition sys_partition_nor.bin \
--UDISK_partition_size ${1} \
--total_image_size ${2}
if [ $? -ne 0 ]; then
pack_error "merge_full_rtos_img failed"
exit 1
else
mv ${full_rtos_img_name} ../${full_rtos_img_name}
echo ----------rtos full image is at----------
echo -e '\033[0;31;1m'
echo ${PACK_TOPDIR}/out/${PACK_BOARD}/${full_rtos_img_name}
echo -e '\033[0m'
fi
set +e
}
function prepare_for_8Mnor()
{
pack_info "making data image for 8M nor"
make_data_image sys_partition_nor.fex ${LOGICAL_PARTS_KB_FOR_8M} LOGICAL_UDISK_PARTS_KB_REMAIN_FOR_8M
sed -i 's/\(imagename = .*\)_[^_]*nor/\1_8Mnor/g' image_nor.cfg
IMG_NAME=$(awk '{if($3~/^'${PACK_PLATFORM}'.*img$/)print$3}' image_nor.cfg)
current_rtos_full_img_size=8
}
function prepare_for_16Mnor()
{
pack_info "making data image for 16M nor"
make_data_image sys_partition_nor.fex ${LOGICAL_PARTS_KB_FOR_16M} LOGICAL_UDISK_PARTS_KB_REMAIN_FOR_16M
sed -i 's/\(imagename = .*\)_[^_]*nor/\1_16Mnor/g' image_nor.cfg
IMG_NAME=$(awk '{if($3~/^'${PACK_PLATFORM}'.*img$/)print$3}' image_nor.cfg)
echo $IMG_NAME
current_rtos_full_img_size=16
}
function prepare_for_64Mnor()
{
pack_info "making data image for 64M nor"
make_data_image sys_partition_nor.fex ${LOGICAL_PARTS_KB_FOR_64M} LOGICAL_UDISK_PARTS_KB_REMAIN_FOR_64M "cut_zero"
sed -i 's/\(imagename = .*\)_[^_]*nor/\1_64Mnor/g' image_nor.cfg
IMG_NAME=$(awk '{if($3~/^'${PACK_PLATFORM}'.*img$/)print$3}' image_nor.cfg)
current_rtos_full_img_size=64
}
function prepare_for_128Mnand()
{
pack_info "making data image for 128M nand"
make_data_image sys_partition_nand.fex ${LOGICAL_PARTS_KB_FOR_128Mnand} LOGICAL_UDISK_PARTS_KB_REMAIN_FOR_128Mnand "cut_zero"
sed -i 's/\(imagename = .*\)_[^_]*nand/\1_128Mnand/g' image_nand.cfg
IMG_NAME=$(awk '{if($3~/^'${PACK_PLATFORM}'.*img$/)print$3}' image_nand.cfg)
current_rtos_full_img_size=0 #not support now
}
[ -d "${PACK_TOPDIR}/out/${PACK_BOARD}/image" ] && rm -rf ${PACK_TOPDIR}/out/${PACK_BOARD}/image
mkdir -p ${PACK_TOPDIR}/out/${PACK_BOARD}/image; cd ${PACK_TOPDIR}/out/${PACK_BOARD}/image
pack_info "temporarily Enter pack directory: \"`pwd`\", will be back when terminated"
#read -p "====" -t 3
do_prepare
if [ "x${PACK_STORAGE_TYPE}" = "xnor" ] ; then
do_common "nor"
elif [ "x${PACK_STORAGE_TYPE}" = "xsdcard" ] ; then
do_common "card"
elif [ "x${PACK_STORAGE_TYPE}" = "xsdcard_product" ] ; then
do_common "card_product"
elif [ "x${PACK_STORAGE_TYPE}" = "xnand" ] ; then
do_common "nand"
fi
do_pack_${PACK_PLATFORM}
if [ "x${PACK_MODE}" = "xdump" ] ; then
do_finish
elif [ "x${PACK_STORAGE_TYPE}" = "xnor" ] ; then
[ "x${PACK_NORVOL}" = "x64" ] && {
prepare_for_64Mnor
do_finish "nor"
}
[ "x${PACK_NORVOL}" = "x16" ] && {
prepare_for_16Mnor
do_finish "nor"
}
[ "x${PACK_NORVOL}" = "x8" ] && {
prepare_for_8Mnor
do_finish "nor"
}
elif [ "x${PACK_STORAGE_TYPE}" = "xsdcard" ] ; then
prepare_for_8Mnor
sed -i 's/\(imagename = .*\)_[^_]*card/\1_8Mcard/g' image_card.cfg
IMG_NAME=$(awk '{if($3~/^'${PACK_PLATFORM}'.*img$/)print$3}' image_card.cfg)
do_finish "card"
elif [ "x${PACK_STORAGE_TYPE}" = "xsdcard_product" ] ; then
prepare_for_8Mnor
sed -i 's/\(imagename = .*\)_[^_]*card/\1_8Mcard/g' image_card_product.cfg
IMG_NAME=$(awk '{if($3~/^'${PACK_PLATFORM}'.*img$/)print$3}' image_card_product.cfg)
do_finish "card_product"
else
prepare_for_128Mnand
do_finish "nand"
fi
exit 0