luckfox-pico-sdk/tools/linux/Linux_Pack_Firmware/mk-update_pack.sh
2023-08-08 20:36:47 +08:00

233 lines
4.6 KiB
Bash
Executable File

#!/bin/bash
cmd=`realpath $0`
cwd=`dirname $cmd`
CMD_VERSION=1.0.1
C_BLACK="\e[30;1m"
C_RED="\e[31;1m"
C_GREEN="\e[32;1m"
C_YELLOW="\e[33;1m"
C_BLUE="\e[34;1m"
C_PURPLE="\e[35;1m"
C_CYAN="\e[36;1m"
C_WHITE="\e[37;1m"
C_NORMAL="\033[0m"
function msg_info()
{
echo -e "${C_GREEN}[$(basename $0):info] $1${C_NORMAL}"
}
function msg_warn()
{
echo -e "${C_YELLOW}[$(basename $0):warn] $1${C_NORMAL}"
}
function msg_error()
{
echo -e "${C_RED}[$(basename $0):error] $1${C_NORMAL}"
}
function pause()
{
msg_error "package update.img fail..."
msg_error "Press any key to quit:"
read -n1 -t10 -s key
exit -1
}
function msg_help()
{
echo "command format:"
echo " `basename $cmd` -v -h -i -id -p -t"
echo " -v|--version (Optional) view this version."
echo " -h|--help (Optional) view this help message."
echo " -id|--chip-id (Essential) input chip id."
echo " -i|--image (Essential) input firmware image path."
echo " -p|--parameter (Optional) the partition file path (Not added by default)."
}
function chk_param()
{
local cnt
cnt=0
while [ $# -ne 0 ]
do
case $1 in
-v|--version)
msg_info "V$CMD_VERSION"
exit 0
;;
-h|--help)
msg_help
exit 0
;;
-i|--image)
IMAGE_PATH=$2
cnt=$(( cnt + 1 ))
;;
-id|--chip-id)
CHIP_ID=$2
case $CHIP_ID in
rv1126|rv1109|RV1126|RV1109)
CHIP_ID=-RK1126
;;
rk3588|RK3588)
CHIP_ID=-RK3588
;;
rv1106|rv1103|RV1106|RV1103)
CHIP_ID=-RK1106
;;
*)
msg_error "Invalid paramter: -id $CHIP_ID"
exit -1
;;
esac
cnt=$(( cnt + 1 ))
;;
-p|--parameter)
partition_file=$2
;;
*)
;;
esac
shift
done
if [ $cnt -ne 2 -o -z "$IMAGE_PATH" -o -z "$CHIP_ID" ]; then
msg_error "Invalid parameter..."
msg_help
exit -1
fi
msg_info "image input dir: $IMAGE_PATH"
if [ -f "$partition_file" ]; then
PARTITION_FILE=`basename $partition_file`
return
fi
PARTITION_FILE=$partition_file
if [ -f "$IMAGE_PATH/$PARTITION_FILE" ]; then
return
fi
if [ -f "$IMAGE_PATH/env.img" ]; then
PARTITION_FILE=env.img
return
else
msg_error "Not found file named $PARTITION_FILE in the dir $IMAGE_PATH"
exit -1
fi
}
function get_partition_names()
{
local part_file part_lines boot_mediums
part_file=$IMAGE_PATH/$PARTITION_FILE
boot_mediums="blkdevparts=mmcblk1,mtdparts=sfc_nor,mtdparts=spi-nand0,mtdparts=rk-nand"
IFS=,
for medium in $boot_mediums;
do
part_lines=$(strings $part_file | grep -i $medium)
[ ! -z "$part_lines" ] && part_lines=${part_lines##*${medium}:} && break
done
IFS=
[ -z "$part_lines" ] && msg_error "Not found partition line in $part_file" && msg_help && exit -1
IFS=,
local part_name part_size
for part in $part_lines;
do
part_size=`echo $part | cut -d '@' -f1`
part_name=`echo $part | cut -d '(' -f2|cut -d ')' -f1`
[[ $part_size =~ "-" ]] && continue
PARTITIONS="$part_name,$PARTITIONS"
done
IFS=
if [ -z "$PARTITIONS" ];then
msg_error "Invalid partition..."
exit -1
fi
# msg_info "partitions:\n$PARTITIONS"
}
function __package_file()
{
if [ -f "$IMAGE_PATH/$1" ];then
PACKAGE_CFG="$part $1\n$PACKAGE_CFG"
elif [ -f "$IMAGE_PATH/${1}.img" ];then
PACKAGE_CFG="$part ${1}.img\n$PACKAGE_CFG"
elif [ -f "$IMAGE_PATH/${1%_[ab]}.img" ];then
PACKAGE_CFG="$part ${1%_[ab]}.img\n$PACKAGE_CFG"
else
msg_error "Not found image file: $IMAGE_PATH/$1"
[ "$2" = "Essential" ] && exit -1
return 1
fi
}
function create_package_file()
{
IFS=,
for part in $SPECIAL_PARTITIONS $PARTITIONS;
do
case $part in
package-file)
PACKAGE_CFG="$part package-file\n$PACKAGE_CFG"
;;
bootloader)
__package_file download.bin Essential
;;
parameter)
__package_file $PARTITION_FILE Essential
;;
rootfs)
__package_file $part
[ $? -eq 1 ] && __package_file rootfs_base.img
;;
*)
__package_file $part
;;
esac
done
IFS=
msg_info "partitions:\n$PACKAGE_CFG"
echo -e $PACKAGE_CFG > $IMAGE_PATH/package-file
}
CHIP_ID=""
IMAGE_PATH=""
PARTITION_FILE=""
SPECIAL_PARTITIONS="bootloader,package-file"
PARTITIONS=""
PACKAGE_CFG=""
chk_param $@
msg_info "partition file name: $PARTITION_FILE"
msg_info "start to package update.img..."
get_partition_names
create_package_file
echo "TOOL_PATH=$cwd"
$cwd/afptool -pack $IMAGE_PATH $IMAGE_PATH/update_tmp.img || pause
$cwd/rkImageMaker $CHIP_ID $IMAGE_PATH/download.bin $IMAGE_PATH/update_tmp.img $IMAGE_PATH/update.img -os_type:androidos || pause
msg_info "Making $CHIP_ID update.img OK."
# remove temporay image
rm -f $IMAGE_PATH/update_tmp.img
rm -f $IMAGE_PATH/package-file
exit $?