blob: 8f0bfa9725b0791881ccef9777f3a6f470ad60b1 [file] [log] [blame] [edit]
#! /bin/bash
#
# Copyright (c) 2021-2022 Amlogic, Inc. All rights reserved.
#
# SPDX-License-Identifier: MIT
#
MAIN_DIR=$(realpath $(dirname $(readlink -f ${BASH_SOURCE[0]:-$0}))/..)
#$1: bl2.bin
#$2: bl2_tmp.bin
#$3: bl2_fixed.bin
#$4: acs.bin
#$5: acs_fixed.bin
#$6: bl2_new.bin
#This function fix bl2.bin to bl2_fixed.bin, acs.bin to acs_fixed.bin,
#and then combine bl2_fixed.bin and acs_fixed.bin to bl2_new.bin
function fix_bl2() {
declare -i blx_bin_limit=57344
declare -i blx_acs_limit=4096
declare -i blx_size=0
declare -i remain_size=0
blx_size=$((`stat -c %s $1`))
if [ $blx_size -gt $blx_bin_limit ]; then
echo "Error: ($1) too big. $blx_size > $blx_bin_limit"
exit 1
fi
#fix bl2 to 56KB with zero
remain_size=$((blx_bin_limit - blx_size))
dd if=/dev/zero of=$2 bs=1 count=$remain_size
cat $1 $2 > $3 2> /dev/zero && rm $2
blx_size=$((`stat -c %s $4`))
if [ "$blx_size" -gt "$blx_acs_limit" ]; then
echo "Error: ($4) too big. $blx_size > $blx_acs_limit"
exit 1
fi
#fix acs to 4KB with zero
remain_size=$((blx_acs_limit - blx_size))
dd if=/dev/zero of=$2 bs=1 count=$remain_size
cat $4 $2 > $5 2> /dev/zero && rm $2
#combine bl2.bin and acs.bin to bl2_new.bin
cat $3 $5 > $6 2> /dev/zero && rm $3 $5
}
function encrypt() {
local ret=0
$ENCRYPT_TOOL $@
ret=$?
if [ 0 -ne "$ret" ]; then
echo "Encrypt error: $ret"
exit 1
fi
}
#$1 mcuboot output directory
function encrypt_bootloader() {
encrypt --bl3sig --input $BL31_IMG --output $BL31_IMG.enc --level v3 --type bl31
encrypt --bl3sig --input $BL33_BIN --output $BL33_BIN.enc --level v3 --type bl33
encrypt --bl2sig --input $BL2_NEW_BIN --output $BL2_ENCRYPT_BIN && rm $BL2_NEW_BIN
encrypt --bootmk --output $1/mcuboot.bin \
--bl2 $BL2_ENCRYPT_BIN \
--bl31 $BL31_IMG.enc \
--bl33 $BL33_BIN.enc --level v3 \
--ddrfw1 $DDRFW_1 \
--ddrfw2 $DDRFW_2 \
--ddrfw3 $DDRFW_3 \
--ddrfw4 $DDRFW_4 \
--ddrfw5 $DDRFW_5 \
&& rm $BL2_ENCRYPT_BIN $BL31_IMG.enc $BL33_BIN.enc
}
#$1 soc
#$2 product
#$3 input bl33.bin's and output mcuboot.bin's directory: output/arch-board-product/images/
function package_mcuboot() {
#define firmware parameters
FIRMWARE_DIR=$MAIN_DIR/products/$2/build/$1
ACS=$FIRMWARE_DIR/acs.bin
BL2_BIN=$FIRMWARE_DIR/bl2.bin
BL2_NEW_BIN=$FIRMWARE_DIR/bl2_new.bin
BL2_ENCRYPT_BIN=$FIRMWARE_DIR/bl2.n.bin.sig
BL31_BIN=$FIRMWARE_DIR/bl31.bin
BL31_IMG=$FIRMWARE_DIR/bl31.img
BL33_BIN=$3/bl33.bin
DDRFW_1=$FIRMWARE_DIR/ddr4_1d.fw
DDRFW_2=$FIRMWARE_DIR/ddr4_2d.fw
DDRFW_3=$FIRMWARE_DIR/ddr3_1d.fw
DDRFW_4=$FIRMWARE_DIR/piei.fw
DDRFW_5=$FIRMWARE_DIR/aml_ddr.fw
ENCRYPT_TOOL=$FIRMWARE_DIR/aml_encrypt_a1
fix_bl2 \
$BL2_BIN \
$FIRMWARE_DIR/bl2_tmp.bin \
$FIRMWARE_DIR/bl2_fixed.bin \
$ACS \
$FIRMWARE_DIR/acs_fix.bin \
$BL2_NEW_BIN
encrypt_bootloader $3
}
#$1 arch
#$2 soc
#$3 board
#$4 product
function compile_mcuboot() {
# target file path
export BUILD_MCUBOOT=1
MCUBOOT_ARCH=$1
MCUBOOT_SOC=$2
MCUBOOT_BOARD=$3
MCUBOOT_PRODUCT=$4
IMAGE_STORAGE_PATH=$5
MCUBOOT_OUTPUT_PATH=${MAIN_DIR}/output/$MCUBOOT_ARCH-$MCUBOOT_BOARD-$MCUBOOT_PRODUCT
MCUBOOT_IMAGE_PATH=${MCUBOOT_OUTPUT_PATH}/images
ORIGINAL_BINARY_FILE=${MCUBOOT_IMAGE_PATH}/bl33.bin
DEBUG_FILE_PREFIX=${MCUBOOT_OUTPUT_PATH}/${KERNEL}/${KERNEL}
# Clean up mcuboot compilation intermediate files
rm -rf $MCUBOOT_OUTPUT_PATH
# start compile flow
pushd $MAIN_DIR
source scripts/env.sh $MCUBOOT_ARCH $MCUBOOT_SOC $MCUBOOT_BOARD $MCUBOOT_PRODUCT
if [ "$BACKTRACE_ENABLE" = "1" ]; then
make backtrace
else
make
fi
if [ $? -ne 0 ]; then
echo "Compile MCUBoot failed:$?"
popd
exit 1
fi
if [ -f "$MCUBOOT_IMAGE_PATH/$KERNEL-signed.bin" ]; then
mv $MCUBOOT_IMAGE_PATH/$KERNEL-signed.bin $ORIGINAL_BINARY_FILE
else
echo "$MCUBOOT_OUTPUT_PATH/$KERNEL/$KERNEL.bin does not exist!"
popd
exit 1
fi
#package mcuboot
package_mcuboot $MCUBOOT_SOC $MCUBOOT_PRODUCT $MCUBOOT_IMAGE_PATH
test -f $MCUBOOT_IMAGE_PATH/mcuboot.bin && \
cp -av $MCUBOOT_IMAGE_PATH/mcuboot.* $IMAGE_STORAGE_PATH/
popd
}