blob: 5628924eabcd794a80ca125ca109f2b8464dd1ab [file] [log] [blame]
#!/bin/bash
#
# Copyright (c) 2021-2022 Amlogic, Inc. All rights reserved.
#
# SPDX-License-Identifier: MIT
#
#RTOS root directory
RTOS_BASE_DIR=$(realpath $(dirname $(readlink -f ${BASH_SOURCE[0]:-$0}))/..)
PARSED=$(getopt --options o:a:b:s:h --long address:,board:,bl22:,sensor:,out:,help --name "$0" -- "$@")
if [[ $? -ne 0 ]]; then
exit 1
fi
eval set -- "$PARSED"
while true; do
case "$1" in
-a | --address)
RTOS_TARGET_ADDRESS=$2
shift 2
;;
-b | --board)
BOARD_TYPE=$2
shift 2
;;
-s | --sensor)
if [[ "$2" =~ ^SENSOR=.* ]]; then
SENSOR_TYPE=${2#SENSOR=}
fi
shift 2
;;
--bl22)
BL22_DIR=$2
shift 2
;;
-o | --out)
INSTALL_DIR=$2
shift 2
;;
-h | --help)
echo -e "\033[41;33m gen_fastboot.sh help info \033[0m"
echo "Usage: fastboot [OPTIONS]"
echo
echo "Options:"
echo " -a/--address et address to load (e.g., -a 0x2200000)"
echo " -b/--board Set board type (e.g., -b aw402_c302x)"
echo " -s/--sensor Set ipc sensor type (e.g., -s IMX290)"
echo " --b22 PATH Set BL22 path"
echo " -h Display this help information"
echo
echo "For more details, refer to the fastboot documentation."
exit 1
shift
;;
--)
shift
break
;;
*)
echo "Invalid option: $1" >&2
exit 1
;;
esac
done
if [[ ! -d "$BL22_DIR" ]]; then
echo "The provided bl22 path is not a directory: $BL22_DIR"
exit 1
fi
#Retrieve the RTOS loading address; if none exists, set it to the default address.
if [ -z $RTOS_TARGET_ADDRESS ]; then
case $BOARD_TYPE in
'aw409_c302x')
RTOS_TARGET_ADDRESS=0x5400000
;;
'aw402_c302x')
RTOS_TARGET_ADDRESS=0x7600000
;;
'aw402s_c302x')
RTOS_TARGET_ADDRESS=0x7600000
;;
*)
RTOS_TARGET_ADDRESS=0x9000000
;;
esac
fi
#Calculate the RTOS2 loading address
let "RTOS2_TARGET_ADDRESS=$RTOS_TARGET_ADDRESS+0x100000"
RTOS2_TARGET_ADDRESS=$(printf '0x%x\n' $RTOS2_TARGET_ADDRESS)
#Clear cache files
[ -d $RTOS_BASE_DIR/output ] && rm -rf $RTOS_BASE_DIR/output
#Get the current project environment variables
source $RTOS_BASE_DIR/scripts/env.sh arm64 c3 $BOARD_TYPE fastboot
if [ "$?" -ne 0 ]; then
echo "Error: Incorrect board type selection!"
exit 1
fi
#IPC sensor model configuration.
if [ -z $SENSOR_TYPE ]; then
case $BOARD_TYPE in
'aw402_c302x')
SENSOR_TYPE=SC301IOT
;;
*)
SENSOR_TYPE=IMX290
;;
esac
fi
#RTOS object file path
RTOS_BUILD_DIR=$RTOS_BASE_DIR/output/$ARCH-$BOARD-$PRODUCT/freertos
RTOS_IMAGE_1=$RTOS_BUILD_DIR/rtos_1.bin
RTOS_IMAGE_2=$RTOS_BUILD_DIR/rtos_2.bin
BL22_IMAGE=$RTOS_BUILD_DIR/bl22.bin
function toolchain_prepare() {
echo "<============ TOOLCHAIN INFO RTOS ============>"
CROSSTOOL=$RTOS_BASE_DIR/arch/$ARCH/toolchain/$COMPILER*$TOOLCHAIN_KEYWORD
TOOLCHAIN_DIR=$RTOS_BASE_DIR/output/toolchains/$COMPILER-$TOOLCHAIN_KEYWORD
rm -rf $RTOS_BASE_DIR/output/toolchains
mkdir -p $TOOLCHAIN_DIR
tar -xf $CROSSTOOL.tar.xz -C $TOOLCHAIN_DIR --strip-components=1
ls -la $TOOLCHAIN_DIR/bin
$TOOLCHAIN_DIR/bin/aarch64-none-elf-gcc -v
echo "<============ TOOLCHAIN INFO RTOS ============>"
}
#Configure the compile-time address.
function rtos_config_prepare() {
CONFIG_FILE=$RTOS_BASE_DIR/boards/$ARCH/$BOARD/lscript.h
sed -i '/.*#define configTEXT_BASE*/c\#define configTEXT_BASE '${RTOS_TARGET_ADDRESS}'' $CONFIG_FILE
sed -i '/.*#define CONFIG_SCATTER_LOAD_ADDRESS*/c\#define CONFIG_SCATTER_LOAD_ADDRESS '${RTOS2_TARGET_ADDRESS}'' $CONFIG_FILE
}
function sensor_config_choose() {
sed -i '/CONFIG_SENSOR_SC401AI/d' $RTOS_BASE_DIR/boards/$ARCH/$BOARD/defconfig
if [ "${SENSOR_TYPE}" == "SC401AI" ]; then
sed -i '$ a CONFIG_SENSOR_SC401AI=y' $RTOS_BASE_DIR/boards/$ARCH/$BOARD/defconfig
fi
}
function lz4_rtos() {
pushd $RTOS_BASE_DIR/lib/utilities/lz4
cp $RTOS_IMAGE_1 .
#Get the rtos target address
./self_decompress_tool.sh -a ./self_decompress_head.bin -b ./rtos_1.bin -l 0x04c00000 -j $RTOS_TARGET_ADDRESS -d 0 -s $RTOS2_TARGET_ADDRESS
cp ./self_decompress_firmware.bin $RTOS_IMAGE_1
rm ./self_decompress_firmware.bin ./rtos_1.bin
popd
}
function bl22_compile() {
pushd $BL22_DIR
if [ -f ./mk ]; then
./mk c3 $BOARD_TYPE
if [ "$?" -ne 0 ]; then
echo "RTOS-SDK: BL22 compilation failed !!!"
exit 1
fi
fi
cp ./bl22.bin $RTOS_BUILD_DIR/bl22.bin
popd
}
function build_header() {
local bl2_2=$1
local rtos_1=$2
local rtos_2=$3
local size=0
# 4KB for header (reserve for sign)
local offset=4096
local rem=0
# build head for bl2-2.bin
size=$(stat -c %s ${bl2_2})
# insert uuid
echo -n -e "\x6b\xe6\x1e\x1f\xac\xc0\x45\x12\x97\x3b\x32\x5f\x2e\x17\xa7\x2d" >${RTOS_BUILD_DIR}/_tmp_hdr.bin
# insert size
printf "%02x%02x%02x%02x" $(((size) & 0xff)) $((((size) >> 8) & 0xff)) \
$((((size) >> 16) & 0xff)) $((((size) >> 24) & 0xff)) | xxd -r -ps >>${RTOS_BUILD_DIR}/_tmp_hdr.bin
# insert offset
printf "%02x%02x%02x%02x" $(((offset) & 0xff)) $((((offset) >> 8) & 0xff)) \
$((((offset) >> 16) & 0xff)) $((((offset) >> 24) & 0xff)) | xxd -r -ps >>${RTOS_BUILD_DIR}/_tmp_hdr.bin
# insert 8 bytes padding
printf "\0\0\0\0\0\0\0\0" >>${RTOS_BUILD_DIR}/_tmp_hdr.bin
# insert sha256
openssl dgst -sha256 -binary ${bl2_2} >>${RTOS_BUILD_DIR}/_tmp_hdr.bin
# build header for RTOS_1
offset=$(expr ${offset} + ${size} + 4095)
rem=$(expr ${offset} % 4096)
offset=$(expr ${offset} - ${rem})
size=$(stat -c %s ${rtos_1})
echo -n -e "\x31\x9f\xb3\x9e\x1f\x9f\x48\x98\x96\x38\xca\xfa\x7e\xa4\x2c\xe9" >>${RTOS_BUILD_DIR}/_tmp_hdr.bin
printf "%02x%02x%02x%02x" $(((size) & 0xff)) $((((size) >> 8) & 0xff)) \
$((((size) >> 16) & 0xff)) $((((size) >> 24) & 0xff)) | xxd -r -ps >>${RTOS_BUILD_DIR}/_tmp_hdr.bin
printf "%02x%02x%02x%02x" $(((offset) & 0xff)) $((((offset) >> 8) & 0xff)) \
$((((offset) >> 16) & 0xff)) $((((offset) >> 24) & 0xff)) | xxd -r -ps >>${RTOS_BUILD_DIR}/_tmp_hdr.bin
printf "\0\0\0\0\0\0\0\0" >>${RTOS_BUILD_DIR}/_tmp_hdr.bin
openssl dgst -sha256 -binary ${rtos_1} >>${RTOS_BUILD_DIR}/_tmp_hdr.bin
# build header for RTOS_2
offset=$(expr ${offset} + ${size} + 4095)
rem=$(expr ${offset} % 4096)
offset=$(expr ${offset} - ${rem})
size=$(stat -c %s ${rtos_2})
echo -n -e "\x33\x71\xb3\x2b\x17\xca\x43\xe2\xb4\xdb\x11\xe1\x3e\xc0\xa5\xf3" >>${RTOS_BUILD_DIR}/_tmp_hdr.bin
printf "%02x%02x%02x%02x" $(((size) & 0xff)) $((((size) >> 8) & 0xff)) \
$((((size) >> 16) & 0xff)) $((((size) >> 24) & 0xff)) | xxd -r -ps >>${RTOS_BUILD_DIR}/_tmp_hdr.bin
printf "%02x%02x%02x%02x" $(((offset) & 0xff)) $((((offset) >> 8) & 0xff)) \
$((((offset) >> 16) & 0xff)) $((((offset) >> 24) & 0xff)) | xxd -r -ps >>${RTOS_BUILD_DIR}/_tmp_hdr.bin
printf "\0\0\0\0\0\0\0\0" >>${RTOS_BUILD_DIR}/_tmp_hdr.bin
openssl dgst -sha256 -binary ${rtos_2} >>${RTOS_BUILD_DIR}/_tmp_hdr.bin
}
function package_binary() {
local fw_size=
local rem_val=
local bin1=$1
local bin2=$2
local out_bin=$3
# align bin1 size up to 4KB and padding bin2 at the end of bin1
fw_size=$(stat -c %s ${bin1})
fw_size=$(expr ${fw_size} + 4095)
rem_val=$(expr ${fw_size} % 4096)
fw_size=$(expr ${fw_size} - ${rem_val})
dd if=/dev/zero of=${RTOS_BUILD_DIR}/_tmp.bin bs=1 count=${fw_size} &>/dev/null
dd if=${bin1} of=${RTOS_BUILD_DIR}/_tmp.bin bs=1 count=${fw_size} conv=notrunc &>/dev/null
cat ${bin2} >>${RTOS_BUILD_DIR}/_tmp.bin
mv ${RTOS_BUILD_DIR}/_tmp.bin ${RTOS_BUILD_DIR}/${out_bin}
echo ==== package ${bin1} ${bin2} to ${out_bin} ====
}
function package_fastboot() {
build_header $BL22_IMAGE $RTOS_IMAGE_1 $RTOS_IMAGE_2
package_binary ${RTOS_BUILD_DIR}/_tmp_hdr.bin ${RTOS_BUILD_DIR}/bl22.bin bl22.bin
package_binary ${RTOS_BUILD_DIR}/bl22.bin ${RTOS_BUILD_DIR}/rtos_1.bin bl22.bin
package_binary ${RTOS_BUILD_DIR}/bl22.bin ${RTOS_BUILD_DIR}/rtos_2.bin rtos_fastboot.bin
if [[ -d "$INSTALL_DIR" ]]; then
cp ${RTOS_BUILD_DIR}/rtos_fastboot.bin ${INSTALL_DIR} -rf
fi
}
function debug_info() {
echo "<============ Kconfig RTOS ============>"
cat $RTOS_BASE_DIR/Kconfig
echo "<============ CMakeLists RTOS ============>"
cat $RTOS_BASE_DIR/CMakeLists.txt
echo "<============ XML RTOS ============>"
cat $RTOS_BUILD_DIR/rtos_sdk_manifest.xml
echo "<============ XML OLD RTOS ============>"
cat $RTOS_BUILD_DIR/rtos_sdk_manifest_old.xml
echo "<============ JENKINS FOR RTOS ============>"
}
#Configure the RTOS environment
rtos_config_prepare
#choose sensor
sensor_config_choose
#Compile toolchain preparation
toolchain_prepare
#compile the rtos image
cd $RTOS_BASE_DIR && make
if [ "$?" -ne 0 ]; then
echo "RTOS-SDK: RTOS compilation failed !!!"
exit 1
fi
#lz4 compression
lz4_rtos
#compile the bl22 image
bl22_compile
#Packaging RTOS binary files
package_fastboot
#debug
# debug_info