| #!/bin/bash |
| exec_name=$0 |
| set -o errtrace |
| trap 'echo Fatal error: script ${exec_name} aborting at line $LINENO, command \"$BASH_COMMAND\" returned $?; exit 1' ERR |
| |
| NAND=${1:-toshiba} |
| [ "$FLASH_TYPE" = "" -o "$CUST_SELFKEY_IMAGE" = "" ] && { |
| source ../../berlin_config/config |
| if [ -z $CPUPLL ];then |
| CPUPLL=1000 |
| fi |
| if [ -z $MEMPLL ];then |
| MEMPLL=1600 |
| fi |
| if [ -z $SYSPLL ];then |
| SYSPLL=800 |
| fi |
| export PLATFORM |
| export CPUPLL |
| export PV_COMP |
| export NFCECCCLK |
| export LINUX_ON_CPU1 |
| export CPU_TYPE |
| export CPU_PLL |
| export MEMPLL |
| export SYSPLL |
| export SYSTEM_CONFIGURATION_PATH |
| export PLATFORM_INFO |
| export BUILD_GOOGLETV |
| export BOOT_TYPE |
| export RANDOMIZER |
| export CONFIG_NAND_READ_RETRY |
| export CONFIG_ENHANCED_SLC |
| export CONFIG_SLC |
| export SM_IMAGE_ACTIVE |
| export SM_IMAGE_PATH |
| export SM_IMAGE_FORMAT |
| export CPU0_START_ADDR |
| export CONFIG_GPT |
| export DISABLE_CRASH_COUNTER |
| export BERLIN_CHIP |
| top_data_dir=../../berlin_config/ |
| export top_data_dir |
| } |
| pagesize=`echo $FLASH_TYPE | cut -d _ -f1` |
| page_per_block=`echo $FLASH_TYPE | cut -d _ -f3` |
| block_size=`expr $pagesize \* $page_per_block` |
| block_size_kB=`expr $block_size / 1024` |
| echo "pagesize=$pagesize , page_per_block=$page_per_block" |
| echo "block_size_kB=$block_size_kB" |
| WORKING_DIR=`pwd` |
| ADDHEADER_TOOL="../Scripts/addheader.sh" |
| LOCAL_CUST_SELFKEY_PATH=$WORKING_DIR/../../berlin_config/${CUST_SELFKEY_IMAGE} |
| SYSTEM_INIT_FILE_LOCAL=SI_part1.bin |
| SI_CUST_FIGO_IMAGE_LOCAL=SI_cust_figo.bin |
| SM_PATH=$WORKING_DIR/../../berlin_config/$SM_IMAGE_PATH |
| if [ $BOOT_TYPE = "NAND_BOOT" ]; then |
| BOOT_DEV=nand |
| else |
| BOOT_DEV=emmc |
| fi |
| |
| # copy the linux parameters (bootargs) |
| if [ ! -f ../.temp/linux_param.h ]; then |
| echo run \"make linux_param\" under MV88DE3100_Tools/ first |
| exit 1 |
| fi |
| cp -f ../.temp/linux_param.h . |
| |
| # check platform info |
| if [ \( ! -f $top_data_dir/$PLATFORM_INFO \) -a \( ! -L $top_data_dir/$PLATFORM_INFO \) ]; then |
| echo "Error: Pin setting file $top_data_dir/$PLATFORM_INFO does not exist." |
| exit 1 |
| fi |
| cp -f $top_data_dir/$PLATFORM_INFO pin_settings.h ||exit 1 |
| |
| # copy SM |
| if [ "$SM_IMAGE_FORMAT" = "binary" ]; then |
| echo "SM image is a binary file" |
| else |
| echo "SM image is a $SM_IMAGE_FORMAT file" do not support now |
| exit 1 |
| fi |
| cp -f $SM_PATH sm.bin |
| |
| if [ $CPU_TYPE = "Z1" -o $CPU_TYPE = "Z2" ];then |
| SYS_INIT_DIR=../sys_init_bg2cdp |
| else |
| SYS_INIT_DIR=../sys_init_bg2cdp_a0 |
| fi |
| |
| SYS_INIT_BIN_FILE=sys_init_${BOOT_DEV}_secure_CPU"$CPUPLL"_MEM"$MEMPLL"_SYS"$SYSPLL"_$CPU_TYPE.bin |
| |
| [ $# = 1 ] && VT_PATH=$1 || VT_PATH=../.temp/version_table |
| |
| if [ "$PRODUCTION_CHIP" = "0" ]; then |
| echo "Generating bootloader for engineer chip" |
| if [ ! -f ../DRM_Image/customer_keystore_figo.bin_ROM_Key ]; then |
| echo "../DRM_Image/customer_keystore_figo.bin_ROM_Key not found" |
| exit 1 |
| fi |
| DRM_IMAGE_FILE=../DRM_Image/customer_keystore_figo.bin_ROM_Key |
| else |
| echo "Generating bootloader for production chip" |
| if [ ! -f ../DRM_Image/customer_keystore_figo.bin_Dist_Key ]; then |
| echo "../DRM_Image/customer_keystore_figo.bin_Dist_Key not found" |
| exit 1 |
| fi |
| DRM_IMAGE_FILE=../DRM_Image/customer_keystore_figo.bin_Dist_Key |
| fi |
| |
| # Copy system init part1 image and cust figo image to local |
| cp $DRM_IMAGE_FILE $SI_CUST_FIGO_IMAGE_LOCAL |
| |
| SYS_INIT_BIN_DIR=$SYS_INIT_DIR/$PLATFORM |
| SYS_INIT_BIN_FILE=${NAND}_sysinit.bin |
| echo "sys_init binary file: $SYS_INIT_BIN_DIR/$SYS_INIT_BIN_FILE" |
| cp $SYS_INIT_BIN_DIR/image1/release/bcm_erom.bin init_erom.bin || exit 1 |
| cp $SYS_INIT_BIN_DIR/image1/release/bcm_erom.info init_erom.info || exit 1 |
| cp $SYS_INIT_BIN_DIR/image1/release/drm_erom.bin drm_erom.bin || exit 1 |
| cp $SYS_INIT_BIN_DIR/image1/release/drm_erom.info drm_erom.info|| exit 1 |
| cp $SYS_INIT_BIN_DIR/image2/release/${NAND}_sysinit.bin init_boot.bin || exit 1 |
| cp $SYS_INIT_BIN_DIR/image2/release/${NAND}_sysinit.info init_boot.info || exit 1 |
| cp $SYS_INIT_BIN_DIR/image2/release/tz_loader_en.bin tz_loader_en.bin || exit 1 |
| # Preserve TZ (MPR enabled) version of TZ loader |
| cp $SYS_INIT_BIN_DIR/image2/release/tz_loader_en_tz.bin tz_loader_en_tz.bin || exit 1 |
| |
| cat init_erom.bin init_boot.bin >$SYSTEM_INIT_FILE_LOCAL |
| |
| if [ ! -f $VT_PATH ];then |
| echo "please generate $VT_PATH first." |
| exit 1 |
| fi |
| |
| make clean &&\ |
| make configure ASIC=$BERLIN_CHIP CPU_TYPE=$CPU_TYPE CPUPLL=$CPUPLL BOX_PRODUCT_RELEASE=$BOX_PRODUCT_RELEASE BOOT_TYPE=$BOOT_TYPE RANDOMIZER=$RANDOMIZER &&\ |
| make && \ |
| rm -f pin_settings.h || exit 1 |
| |
| TOOL_DIR=$WORKING_DIR/.. |
| |
| SIGN_TOOL=$TOOL_DIR/sign_image |
| SIGN_TOOL_CMD=$TOOL_DIR/sign_image_cmd.sh |
| |
| readelf -h bootloader_en.elf | grep "Entry point" >bootloader_en.info |
| #echo " Entry point address: 0x680000" >bootloader.info |
| cp -f $SIGN_TOOL $SIGN_TOOL_CMD ../gen_layout.sh ../set_layout.sh . && \ |
| $SIGN_TOOL_CMD $TOOL_DIR -d 0x4 -i bootloader.bin -o bootloader_en.bin -v -g > bootloader.log || { |
| echo fail to generate bootloader_en.img |
| exit 1 |
| } |
| |
| if [ "$ROM_KEY_DISABLE" = "" ];then |
| echo "ROM_KEY_DISABLE is not set in config file, please update your config file" |
| exit 1 |
| fi |
| |
| if [ "$ROM_KEY_DISABLE" = "1" ]; then |
| echo " ****************** ROM key has been disabled ************" |
| |
| if [ "$OTP_RSA_KEY_FILE_NAME" = "" ]; then |
| echo "ROM KEY has been disabled, but OTP_RSA_KEY_FILE_NAME is not defined" |
| exit 1 |
| fi |
| |
| if [ ! -f ../../berlin_config/${OTP_RSA_KEY_FILE_NAME} ];then |
| echo " Can not find User RSA key file: ../../berlin_config/${OTP_RSA_KEY_FILE_NAME} " |
| exit 1 |
| fi |
| cp ../../berlin_config/${OTP_RSA_KEY_FILE_NAME} ./ |
| cp ../kms_release_bg2_32/seclab/bin/ChangeSign ./ |
| if [ ! -f ./ChangeSign ];then |
| echo "ChangeSign doesn't exist" |
| exit 1 |
| fi |
| |
| echo " resign system init..." |
| ./ChangeSign $SYSTEM_INIT_FILE_LOCAL 0 |
| echo " resign cust figo image..." |
| ./ChangeSign $SI_CUST_FIGO_IMAGE_LOCAL 0 |
| fi |
| |
| echo -------------------- |
| echo Generate pre bootloader image |
| echo -------------------- |
| |
| target=init_loader.img |
| LAST4K=`expr $block_size - 4096` |
| |
| #layout: erom, im2, tzl, tsm, version, lastk |
| |
| #make version 1KiB |
| dd if=$VT_PATH of=version.bin conv=notrunc && \ |
| SIZE=`stat -c %s version.bin` && \ |
| dd if=random.bin of=version.bin bs=1 seek=$SIZE count=`expr 1024 - $SIZE` conv=notrunc || exit 1 |
| echo " Entry point address: 0x600000" >version.info |
| |
| #generate filler2 |
| dd if=random.bin of=filler2.bin bs=1024 count=2 || exit 1 |
| |
| #eval tsm filler size |
| cat init_erom.bin init_boot.bin tz_loader_en.bin > $target || exit 1 |
| s=`stat -c %s $target` |
| mask=$(( pagesize - 1 )) |
| d=$((( (s + mask) & ~mask ) - s)) |
| if [ $d -gt 0 ]; then |
| s=`stat -c %s tz_loader_en.bin` |
| s_mpr=`stat -c %s tz_loader_en_tz.bin` |
| if (( $s_mpr != $s )) |
| then |
| echo "!!!ERROR: MPR TZ loader size does not match TZ loader" |
| ls -al tz_loader_en.bin tz_loader_en_tz.bin |
| exit 1 |
| fi |
| dd if=random.bin of=tz_loader_en.bin bs=1 seek=$s count=$d conv=notrunc || exit 1 |
| # Pad tz_loader_en_tz with same size padding as TZ loader |
| dd if=random.bin of=tz_loader_en_tz.bin bs=1 seek=$s count=$d conv=notrunc || exit 1 |
| echo "expand tz_loader_en.bin and tz_loader_en_tz.bin from $s with $d" |
| fi |
| |
| #eval filler size |
| cat init_erom.bin init_boot.bin tz_loader_en.bin drm_erom.bin > $target || exit 1 |
| INIT_LOADER_FINAL_SIZE=`stat -c %s $target` |
| if [ $INIT_LOADER_FINAL_SIZE -gt $LAST4K ]; then |
| echo "Error: size of preloader images image size is too big." |
| exit 1; |
| fi |
| head -c `expr $LAST4K - $INIT_LOADER_FINAL_SIZE` random.bin >filler.bin |
| echo " Entry point address: 0x000000" >filler.info |
| |
| if [ ! -f tz_loader.elf ]; then |
| # use last 16M for tz_loader |
| MEM_SIZE_NUM=${MEMORY_SIZE:0:${#MEMORY_SIZE}-1} |
| echo " Entry point address: $(printf "0x%08X" $((MEM_SIZE_NUM*1024*1024-0x01000000)))" >tz_loader_en.info |
| else |
| readelf -h tz_loader.elf | grep "Entry point" >tz_loader_en.info |
| fi |
| |
| readelf -h bootloader.elf | grep "Entry point" >bootloader_en.info |
| #echo " Entry point address: 0x680000" >bootloader.info |
| |
| #generate custk store |
| CUSTK_SDK_STORE=$TOOL_DIR/store/custk_sdk.store |
| [ -e $CUSTK_SDK_STORE ] || exit 1 |
| ## generate lastk from custk_sdk |
| SIZE=$(stat -c %s $CUSTK_SDK_STORE) |
| head -c `expr 64 - $SIZE` random.bin > var1 |
| head -c 64 random.bin > var2 |
| cat $CUSTK_SDK_STORE var1 var2 > lastk.bin |
| SIZE=$(stat -c %s lastk.bin) |
| dd if=/dev/zero of=lastk.bin bs=1 seek=$SIZE count=`expr 1024 - $SIZE` conv=notrunc |
| echo " Entry point address: 0x000000" > lastk.info |
| |
| GEN_LAYOUT=./gen_layout.sh # tool to generate block1 layout data |
| SET_LAYOUT=./set_layout.sh # tool to inject block1 layout |
| echo "$WORKING_DIR/init_erom 0x10001" >layout.seq |
| echo "$WORKING_DIR/init_boot 2" >>layout.seq |
| echo "$WORKING_DIR/tz_loader_en 3" >>layout.seq |
| echo "$WORKING_DIR/drm_erom 0x10002" >>layout.seq |
| echo "$WORKING_DIR/filler 0x100200ff" >>layout.seq |
| echo "$WORKING_DIR/version 0x10020008" >>layout.seq |
| echo "$WORKING_DIR/filler2 0x100200ff" >>layout.seq |
| echo "$WORKING_DIR/lastk 0x10020009" >>layout.seq |
| $GEN_LAYOUT layout.seq layout.bin |
| $SET_LAYOUT layout.bin init_erom.bin init_layout.bin |
| |
| cat init_layout.bin init_boot.bin tz_loader_en.bin drm_erom.bin filler.bin version.bin filler2.bin lastk.bin > init_loader.img || exit 1 |
| # |
| # Pre bootloader image generation complete |
| # |
| |
| # |
| # Generate post bootloader image for BG2CDP. |
| # |
| cat bootloader_en.bin > post-init_loader.img || exit 1 |
| |
| # Save a copy of the post-bootloader prior to padding |
| cp post-init_loader.img post-bootloader_nopadding.img |
| cp init_loader.img bootloader_nopadding.img |
| |
| # Sanity check size of init_loader.img |
| INIT_LOADER_FINAL_SIZE=`stat -c %s init_loader.img` |
| if [ $INIT_LOADER_FINAL_SIZE -gt $block_size ]; then |
| echo "Error: bootloader partition image size is greater than block size." |
| exit 1; |
| fi |
| |
| # expand post-init_loader to align to block_size |
| target2=post-init_loader.img |
| cat bootloader_en.bin > $target2 || exit 1 |
| s=`stat -c %s $target2` && \ |
| mask=$(( block_size - 1 )) |
| d=$((( (s + mask) & ~mask ) - s)) |
| if [ $d -gt 0 ]; then |
| dd if=random.bin of=$target2 bs=1 seek=$s count=$d conv=notrunc || exit 1 |
| echo "expand $target2 from $s with $d" |
| fi |