Skip to content

Instantly share code, notes, and snippets.

@Davidnet
Created October 26, 2018 03:24
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Davidnet/013ceb704ebdc7ebd728e059f90fca80 to your computer and use it in GitHub Desktop.
Save Davidnet/013ceb704ebdc7ebd728e059f90fca80 to your computer and use it in GitHub Desktop.
#!/bin/bash
# Copyright (c) 2011-2018, NVIDIA CORPORATION. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of NVIDIA CORPORATION nor the names of its
# contributors may be used to endorse or promote products derived
# from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# flash.sh: Flash the target board.
# flash.sh performs the best in LDK release environment.
#
# Usage: Place the board in recovery mode and run:
#
# flash.sh [options] <target_board> <root_device>
#
# for more detail enter 'flash.sh -h'
#
# Examples:
# ./flash.sh <target_board> mmcblk0p1 - boot <target_board> from eMMC
# ./flash.sh <target_board> mmcblk1p1 - boot <target_board> from SDCARD
# ./flash.sh <target_board> sda1 - boot <target_board> from USB device
# ./flash.sh -N <IPaddr>:/nfsroot <target_board> eth0 - boot <target_board> from NFS
# ./flash.sh -k LNX <target_board> mmcblk1p1 - update <target_board> kernel
# ./flash.sh -k EBT <target_board> mmcblk1p1 - update <target_board> bootloader
#
# Optional Environment Variables:
# BCTFILE ---------------- Boot control table configuration file to be used.
# BOARDID ---------------- Pass boardid to override EEPROM value
# BOOTLOADER ------------- Bootloader binary to be flashed
# BOOTPARTLIMIT ---------- GPT data limit. (== Max BCT size + PPT size)
# BOOTPARTSIZE ----------- Total eMMC HW boot partition size.
# CFGFILE ---------------- Partition table configuration file to be used.
# CMDLINE ---------------- Target cmdline. See help for more information.
# DEVSECTSIZE ------------ Device Sector size. (default = 512Byte).
# DTBFILE ---------------- Device Tree file to be used.
# EMMCSIZE --------------- Size of target device eMMC (boot0+boot1+user).
# FLASHAPP --------------- Flash application running in host machine.
# FLASHER ---------------- Flash server running in target machine.
# IGNOREFASTBOOTCMDLINE -- Block fastboot from filling unspecified kernel
# cmdline parameters with its defaults.
# INITRD ----------------- Initrd image file to be flashed.
# KERNEL_IMAGE ----------- Linux kernel zImage file to be flashed.
# MTS -------------------- MTS file name such as mts_si.
# MTSPREBOOT ------------- MTS preboot file name such as mts_preboot_si.
# NFSARGS ---------------- Static Network assignments.
# <C-ipa>:<S-ipa>:<G-ipa>:<netmask>
# NFSROOT ---------------- NFSROOT i.e. <my IP addr>:/exported/rootfs_dir.
# ODMDATA ---------------- Odmdata to be used.
# ROOTFSSIZE ------------- Linux RootFS size (internal emmc/nand only).
# ROOTFS_DIR ------------- Linux RootFS directory name.
# SCEFILE ---------------- SCE firmware file such as camera-rtcpu-sce.bin.
# SPEFILE ---------------- SPE firmware file path such as bootloader/spe.bin.
# FAB -------------------- Target board's FAB ID.
# TEGRABOOT -------------- lowerlayer bootloader such as nvtboot.bin.
# WB0BOOT ---------------- Warmboot code such as nvtbootwb0.bin
#
INFODIVIDER="\
###############################################################################\
";
chkerr ()
{
if [ $? -ne 0 ]; then
if [ "$1" != "" ]; then
echo "$1";
else
echo "failed.";
fi;
exit 1;
fi;
if [ "$1" = "" ]; then
echo "done.";
fi;
}
pr_conf()
{
if [ "${zflag}" != "true" ]; then
return 0;
fi;
echo "target_board=${target_board}";
echo "target_rootdev=${target_rootdev}";
echo "rootdev_type=${rootdev_type}";
echo "rootfssize=${rootfssize}";
echo "odmdata=${odmdata}";
echo "flashapp=${flashapp}";
echo "flasher=${flasher}";
echo "bootloader=${bootloader}";
echo "tegraboot=${tegraboot}";
echo "wb0boot=${wb0boot}";
echo "mtspreboot=${mtspreboot}";
echo "mts=${mts}";
echo "bctfile=${bctfile}";
echo "cfgfile=${cfgfile}";
echo "kernel_fs=${kernel_fs}";
echo "kernel_image=${kernel_image}";
echo "rootfs_dir=${rootfs_dir}";
echo "nfsroot=${nfsroot}";
echo "nfsargs=${nfsargs}";
echo "kernelinitrd=${kernelinitrd}";
echo "cmdline=${cmdline}";
echo "boardid=${boardid}";
exit 0;
}
validateIP ()
{
local ip=$1;
local ret=1;
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
OIFS=${IFS};
IFS='.';
ip=($ip);
IFS=${OIFS};
[[ ${ip[0]} -le 255 && ${ip[1]} -le 255 && \
${ip[2]} -le 255 && ${ip[3]} -le 255 ]];
ret=$?;
fi;
if [ ${ret} -ne 0 ]; then
echo "Invalid IP address: $1";
exit 1;
fi;
}
netmasktbl=(\
"255.255.255.252" \
"255.255.255.248" \
"255.255.255.240" \
"255.255.255.224" \
"255.255.255.192" \
"255.255.255.128" \
"255.255.255.0" \
"255.255.254.0" \
"255.255.252.0" \
"255.255.248.0" \
"255.255.240.0" \
"255.255.224.0" \
"255.255.192.0" \
"255.255.128.0" \
"255.255.0.0" \
"255.254.0.0" \
"255.252.0.0" \
"255.248.0.0" \
"255.240.0.0" \
"255.224.0.0" \
"255.192.0.0" \
"255.128.0.0" \
"255.0.0.0" \
);
validateNETMASK ()
{
local i;
local nm=$1;
for (( i=0; i<${#netmasktbl[@]}; i++ )); do
if [ "${nm}" = ${netmasktbl[$i]} ]; then
return 0;
fi;
done;
echo "Error: Invalid netmask($1)";
exit 1;
}
validateNFSargs ()
{
local a=$2;
OIFS=${IFS};
IFS=':';
a=($a);
IFS=${OIFS};
if [ ${#a[@]} -ne 4 ]; then
echo "Error: Invalid nfsargs($2)";
exit 1;
fi;
validateIP ${a[0]};
if [ "${serverip}" = "" ]; then
validateIP ${a[1]};
fi;
validateIP ${a[2]};
validateNETMASK ${a[3]};
if [ "$1" != "" ]; then
eval "$1=$2";
fi;
return 0;
}
validateNFSroot ()
{
if [ "$2" = "" ]; then
return 1;
fi;
OIFS=${IFS};
IFS=':';
local var=$1;
local a=($2);
IFS=${OIFS};
if [ ${#a[@]} -ne 2 ]; then
echo "Error: Invalid nfsroot($2)";
exit 1;
fi;
validateIP ${a[0]};
if [[ "${a[1]}" != /* ]]; then
echo "Error: Invalid nfsroot($2)";
exit 1;
fi;
eval "${var}=$2";
return 0;
}
usage ()
{
state=$1;
retval=$2;
if [[ $state == allunknown ]]; then
echo -e "
Usage: sudo ./flash.sh [options] <target_board> <rootdev>
Where,
target board: Valid target board name.
rootdev: Proper root device.";
elif [[ $state == rootdevunknown ]]; then
echo -e "
Usage: sudo ./flash.sh [options] ${target_board} <rootdev>
Where,
rootdev for ${target_board}:
${ROOT_DEV}";
else
echo "
Usage: sudo ./flash.sh [options] ${target_board} ${target_rootdev}";
fi;
cat << EOF
options:
-b <bctfile> --------- nvflash boot control table config file.
-c <cfgfile> --------- nvflash partition table config file.
-d <dtbfile> --------- device tree file.
-e <emmc size> ------- Target device's eMMC size.
-f <flashapp> -------- Path to flash application: nvflash or tegra-rcm.
-h ------------------- print this message.
-i ------------------- pass user kernel commandline as-is to kernel.
-k <partition id> ---- partition name or number specified in flash.cfg.
-m <mts preboot> ----- MTS preboot such as mts_preboot_si.
-n <nfs args> -------- Static nfs network assignments
<Client IP>:<Server IP>:<Gateway IP>:<Netmask>
-o <odmdata> --------- ODM data.
-p <bp size> --------- Total eMMC HW boot partition size.
-r ------------------- skip building and reuse existing system.img.
-s <PKC key file>----- PKC key used for signing and building bl_update_payload.
-t <tegraboot> ------- tegraboot binary such as nvtboot.bin
-u <dbmaster> -------- PKC server in <user>@<IP address> format.
-w <wb0boot> --------- warm boot binary such as nvtbootwb0.bin
-x <tegraid> --------- Tegra CHIPID. default = 0x18(jetson-tx2)
0x21(jetson-tx1), 0x40(jetson-tk1).
-y <fusetype> -------- PKC for secureboot, NS for non-secureboot.
-z <sn> -------------- Serial Number of target board.
-B <boardid> --------- BoardId.
-C <cmdline> --------- Kernel commandline arguments.
WARNING:
Each option in this kernel commandline gets
higher preference over the same option from
fastboot. In case of NFS booting, this script
adds NFS booting related arguments, if -i option
is omitted.
-F <flasher> --------- Flash server such as fastboot.bin.
-G <file name> ------- Read partition and save image to file.
-I <initrd> ---------- initrd file. Null initrd is default.
-K <kernel> ---------- Kernel image file such as zImage or Image.
-L <bootloader> ------ Bootloader such as cboot.bin or u-boot-dtb.bin.
-M <mts boot> -------- MTS boot file such as mts_si.
-N <nfsroot> --------- i.e. <my IP addr>:/my/exported/nfs/rootfs.
-P <end of PPT + 1> -- Primary GPT start address + size of PPT + 1.
-R <rootfs dir> ------ Sample rootfs directory.
-S <size> ------------ Rootfs size in bytes. Valid only for internal
rootdev. KiB, MiB, GiB short hands are allowed,
for example, 1GiB means 1024 * 1024 * 1024 bytes.
-T <its file> -------- ITS file name. Valid only for u-boot.
--no-flash ----------- perform all steps except physically flashing the board.
This will create a system.img.
--bup ---------------- Generate bootloader update payload(BUP).
--multi-spec---------- Enable support for building multi-spec BUP.
--clean-up------------ Clean up BUP buffer when multi-spec is enabled.
--usb-instance <id> -- Specify the USB instance to connect to; integer
ID (e.g. 0, 1), bus/dev (e.g. 003/091), or USB
port path (e.g. 3-14). The latter is best.
EOF
exit $retval;
}
setdflt ()
{
local var="$1";
if [ "${!var}" = "" ]; then
eval "${var}=$2";
fi;
}
setval ()
{
local var="$1";
local val="$2";
if [ "${!val}" = "" ]; then
echo "Error: missing $val not defined.";
exit 1;
fi;
eval "${var}=${!val}";
}
mkfilesoft ()
{
local var="$1";
local varname="$1name";
eval "${var}=$2";
if [ "${!var}" = "" -o ! -f "${!var}" ]; then
if [ "$3" != "" -a -f "$3" ]; then
eval "${var}=$3";
fi;
fi;
if [ "${!var}" != "" ]; then
if [ ! -f ${!var} ]; then
eval "${var}=\"\"";
eval "${varname}=\"\"";
return 1;
fi;
eval "${var}=`readlink -f ${!var}`";
eval "${varname}=`basename ${!var}`";
fi;
return 0;
}
mkfilepath ()
{
local var="$1";
local varname="$1name";
eval "${var}=$2";
setdflt "${var}" "$3";
if [ "${!var}" != "" ]; then
eval "${var}=`readlink -f ${!var}`";
if [ ! -f "${!var}" ]; then
echo "Error: missing $var (${!var}).";
usage allknown 1;
fi;
eval "${varname}=`basename ${!var}`";
fi;
}
mkdirpath ()
{
local var="$1";
eval "${var}=$2";
setdflt "$1" "$3";
if [ "${!var}" != "" ]; then
eval "${var}=`readlink -f ${!var}`";
if [ ! -d "${!var}" ]; then
echo "Error: missing $var (${!var}).";
usage allknown 1;
fi;
fi;
}
getsize ()
{
local var="$1";
local val="$2";
if [[ ${!val} != *[!0-9]* ]]; then
eval "${var}=${!val}";
elif [[ (${!val} == *KiB) && (${!val} != *[!0-9]*KiB) ]]; then
eval "${var}=$(( ${!val%KiB} * 1024 ))";
elif [[ (${!val} == *MiB) && (${!val} != *[!0-9]*MiB) ]]; then
eval "${var}=$(( ${!val%MiB} * 1024 * 1024 ))";
elif [[ (${!val} == *GiB) && (${!val} != *[!0-9]*GiB) ]]; then
eval "${var}=$(( ${!val%GiB} * 1024 * 1024 * 1024))";
else
echo "Error: Invalid $1: ${!val}";
exit 1;
fi;
}
validatePartID ()
{
local idx=0;
declare -A cf;
while read aline; do
if [ "$aline" != "" ]; then
arr=( $(echo $aline | tr '=' ' ') );
if [ "${arr[1]}" == "name" ]; then
if [ "${arr[3]}" == "id" ]; then
cf[$idx,1]="${arr[2]}";
cf[$idx,0]="${arr[4]}";
else
cf[$idx,0]="${arr[2]}";
fi
idx=$((idx+1));
fi
fi;
done < $4;
if [ "${arr[3]}" == "id" ]; then
for ((i = 0; i < idx; i++)) do
if [ "\"$3\"" = "${cf[$i,0]}" -o \
"\"$3\"" = "${cf[$i,1]}" ]; then
eval "$1=${cf[$i,0]}";
eval "$2=${cf[$i,1]}";
return 0;
fi;
done;
echo "Error: invalid partition id ($3)";
exit 1;
else
return 0;
fi;
}
cp2local ()
{
local src=$1;
if [ "${!src}" = "" ]; then return 1; fi;
if [ ! -f "${!src}" ]; then return 1; fi;
if [ "$2" = "" ]; then return 1; fi;
if [ -f $2 -a ${!src} = $2 ]; then
local sum1=`sum ${!src}`;
local sum2=`sum $2`;
if [ "$sum1" = "$sum2" ]; then
echo "Existing ${src}($2) reused.";
return 0;
fi;
fi;
echo -n "copying ${src}(${!src})... ";
cp -f ${!src} $2;
chkerr;
return 0;
}
chsuffix ()
{
local var="$1";
local fname=`basename "$2"`;
local OIFS=${IFS};
IFS='.';
na=($fname);
IFS=${OIFS};
eval "${var}=${na[0]}.${3}";
}
build_fsimg ()
{
echo "Making $1... ";
local loop_dev=`losetup --find`;
if [ $? -ne 0 ]; then
echo "Cannot find loop device. Terminating..";
exit 1;
fi;
umount "${loop_dev}" > /dev/null 2>&1;
losetup -d "${loop_dev}" > /dev/null 2>&1;
rm -f $1; chkerr "clearing $1 failed.";
rm -rf mnt; chkerr "clearing $4 mount point failed.";
local bcnt=$(( $3 / 512 ));
local bcntdiv=$(( $3 % 512 ));
if [ $bcnt -eq 0 -o $bcntdiv -ne 0 ]; then
echo "Error: $4 file system size has to be 512 bytes allign.";
exit 1;
fi
if [ "$2" != "" -a "$2" != "0" ]; then
local fc=`printf '%d' $2`;
local fillc=`printf \\\\$(printf '%02o' $fc)`;
< /dev/zero head -c $3 | tr '\000' ${fillc} > $1;
chkerr "making $1 with fillpattern($fillc}) failed.";
else
truncate --size $3 $1;
chkerr "making $1 with zero fillpattern failed.";
fi;
losetup "${loop_dev}" $1 > /dev/null 2>&1;
chkerr "mapping $1 to loop device failed.";
if [ "$4" = "FAT32" ]; then
mkfs.msdos -I -F 32 "${loop_dev}" > /dev/null 2>&1;
else
mkfs -t $4 "${loop_dev}" > /dev/null 2>&1;
fi;
chkerr "formating $4 filesystem on $1 failed.";
mkdir -p mnt; chkerr "make $4 mount point failed.";
mount "${loop_dev}" mnt; chkerr "mount $1 failed.";
mkdir -p mnt/boot/dtb; chkerr "make $1/boot/dtb failed.";
cp -f "${kernel_fs}" mnt/boot;
chkerr "Copying ${kernel_fs} failed.";
if [ -f "${dtbfilename}" ]; then
cp -f "${dtbfilename}" "mnt/boot/dtb/${dtbfilename}";
chkerr "populating ${dtbfilename} to $1/boot/dtb failed.";
fi;
if [ "$4" = "FAT32" ]; then
touch -f mnt/boot/cmdline.txt > /dev/null 2&>1;
chkerr "Creating cmdline.txt failed.";
fi;
if [ "$5" != "" ]; then
# inject board spec info into nv_boot_control.conf
if [ -e "${5}/etc/nv_boot_control.conf" ]; then
sed -i '/TNSPEC/d' "${5}/etc/nv_boot_control.conf";
sed -i "$ a TNSPEC ${spec}" "${5}/etc/nv_boot_control.conf";
fi
pushd mnt > /dev/null 2>&1;
echo -n -e "\tpopulating rootfs from $5 ... ";
(cd $5; tar cf - *) | tar xf - ; chkerr;
popd > /dev/null 2>&1;
fi;
echo -e -n "\tSync'ing $1 ... ";
sync; sync; sleep 5; # Give FileBrowser time to terminate gracefully.
echo "done.";
umount "${loop_dev}" > /dev/null 2>&1;
losetup -d "${loop_dev}" > /dev/null 2>&1;
rmdir mnt > /dev/null 2>&1;
if [ "$2" != "" -a -x mksparse ]; then
echo -e "\tConverting RAW image to Sparse image... ";
mv -f $1 $1.raw;
if [ "${BLBlockSize}" != "" ]; then
blblksizeoption="-b $BLBlockSize";
fi;
./mksparse ${blblksizeoption} -v --fillpattern=$2 $1.raw $1; chkerr;
fi;
echo "$1 built successfully. ";
}
append_bootargs_to_dtb ()
{
local trgdtbfilename="${1}";
if [ "${flashappname}" != "tegraflash.py" ]; then
return 1;
fi;
dtc -I dtb -O dts "${trgdtbfilename}" -o temp.dts;
sed -i '/bootargs/d' temp.dts;
sed -i "/chosen {/ a \\\t\\tbootargs=\"${cmdline} \";" temp.dts;
dtc -I dts -O dtb temp.dts -o "${trgdtbfilename}";
rm temp.dts;
}
get_fuse_level ()
{
local ECID;
local rcmcmd;
local inst_args="";
local idval="";
local flval="";
local baval="None";
local flvar="$1";
local hivar="$2";
local bavar="$3";
if [ -f "${BL_DIR}/tegrarcm_v2" ]; then
rcmcmd="tegrarcm_v2";
elif [ -f "${BL_DIR}/tegrarcm" ]; then
rcmcmd="tegrarcm";
else
echo "Error: tegrarcm is missing.";
exit 1;
fi;
if [ -n "${usb_instance}" ]; then
inst_args="--instance ${usb_instance}";
fi;
pushd "${BL_DIR}" > /dev/null 2>&1;
ECID=$(./${rcmcmd} ${inst_args} --uid | grep BR_CID | cut -d' ' -f2);
popd > /dev/null 2>&1;
if [ "${ECID}" != "" ]; then
idval="0x${ECID:3:2}";
eval "${hivar}=\"${idval}\"";
flval="${ECID:2:1}";
baval="";
if [ "${idval}" = "0x21" -o "${idval}" = "0x12" ]; then
case ${flval} in
0|1|2) flval="fuselevel_nofuse"; ;;
3) flval="fuselevel_production"; ;;
4) flval="fuselevel_production"; baval="NS"; ;;
5) flval="fuselevel_production"; baval="SBK"; ;;
6) flval="fuselevel_production"; baval="PKC"; ;;
*) flval="fuselevel_unknown"; ;;
esac;
SKIPUID="--skipuid";
else
case ${flval} in
0|1|2) flval="fuselevel_nofuse"; ;;
8) flval="fuselevel_production"; ;;
9|d) flval="fuselevel_production"; baval="SBK"; ;;
a|e) flval="fuselevel_production"; baval="PKC"; ;;
b|f) flval="fuselevel_production"; baval="SBKPKC"; ;;
c) flval="fuselevel_production"; baval="NS"; ;;
*) flval="fuselevel_unknown"; ;;
esac;
fi;
eval "${flvar}=\"${flval}\"";
eval "${bavar}=\"${baval}\"";
fi;
}
function get_full_path ()
{
local val="$1";
local result="$2";
local fullpath;
fullpath=$(readlink -f ${val}); # null if path is invalid
if [ "${fullpath}" == "" ]; then
echo "Invalid path/filename ${val}";
exit 1;
fi;
eval "${result}=${fullpath}";
}
#
# XXX: This EEPROM read shall be replaced with new FAB agnostic function.
#
get_board_version ()
{
local args="";
local __board_id=$1;
local __board_version=$2;
local boardid;
local boardversion;
if [ -n "${usb_instance}" ]; then
args+="--instance ${usb_instance} ";
fi;
args+="--chip ${CHIPID} ";
args+="--applet \"${LDK_DIR}/${SOSFILE}\" ";
args+="--cmd \"dump eeprom boardinfo cvm.bin\" ";
args+="${SKIPUID} ";
SKIPUID="";
local cmd="./tegraflash.py ${args}";
pushd "${BL_DIR}" > /dev/null 2>&1;
if [ "${keyfile}" != "" ]; then
cmd+="--key \"${keyfile}\" ";
fi;
echo "${cmd}";
eval "${cmd}";
chkerr "Reading board information failed.";
boardid=`./chkbdinfo -i cvm.bin`;
boardversion=`./chkbdinfo -f cvm.bin`;
chkerr "Parsing board information failed.";
popd > /dev/null 2>&1;
eval ${__board_id}="${boardid}";
eval ${__board_version}="${boardversion}";
}
#
# EEPROM get board S/N .
#
boardinfo_trk ()
{
local boardinforom;
local boardpartnu;
if [ "${target_board}" == "t186ref" ]; then
if [[ -e "${LDK_DIR}/nv_internal_trk.sh" && -e "${BL_DIR}/chkbdinfo" ]]; then
pushd "${BL_DIR}" > /dev/null 2>&1;
boardinforom=`./chkbdinfo -a cvm.bin`;
boardpartnu=`./chkbdinfo -p cvm.bin`;
if [[ "${boardinforom}" != ""] && ["${boardpartnu}" != "" ]]; then
eval PRODUCT_OUT="${LDK_DIR}" "${LDK_DIR}/nv_internal_trk.sh" "${boardinforom}" "${boardpartnu}";
fi
popd > /dev/null 2>&1;
fi
fi
}
#
# SoC Sanity Check:
#
chk_soc_sanity ()
{
local mach_dir="";
local socname="Unknown";
local opmode="Unknown";
if [ "${hwchipid}" = "" ]; then
# Nothing to check against. Just let it go.
echo "Error: probing the target board failed.";
echo " Make sure the target board is connected through ";
echo " micro-B USB port and is in recovery mode.";
exit 1;
fi;
#
# Print Target Board Information:
# NOTE: The list of board listed here may or may not be
# supported by the version of BSP(Board Support Package)
# that provides this copy of the script. This lists all
# of the publicly available Jetson developer platforms.
#
case ${hwchipid} in
0x12) socname="Tegra 124"; mach_dir="ardbeg"; ;;
0x21) socname="Tegra 210"; mach_dir="t210ref"; ;;
0x18) socname="Tegra 186"; mach_dir="t186ref"; ;;
esac;
case ${fuselevel} in
fuselevel_nofuse) opmode="pre-production"; ;;
fuselevel_production) opmode="production"; ;;
esac;
echo "# Target Board Information:";
echo -n "# Name: ${ext_target_board}, Board Family: ${target_board}, ";
echo "SoC: ${socname}, ";
echo "# OpMode: ${opmode}, Boot Authentication: ${bootauth}, ";
echo "${INFODIVIDER}";
if [ "${CHIPID}" != "" -a "${CHIPID}" != "${hwchipid}" ]; then
echo -n "Error: The Actual SoC ID(${hwchipid}) ";
echo -n "mismatches intended ${ext_target_board} ";
echo "SoC ID(${CHIPID}).";
exit 1;
fi;
if [ "${target_board}" != "${mach_dir}" ]; then
echo -n "Error: The Actual board family (${mach_dir}) ";
echo -n "mismatches intended ${ext_target_board} ";
echo "board family(${target_board}).";
exit 1;
fi;
case ${bootauth} in
PKC|SBKPKC)
if [ "${dbmaster}" = "" ]; then
echo -n "Error: The RSA key file is not proviced for ";
echo "for PKC protected target board.";
exit 1;
fi;
;;
SBK)
echo "Error: L4T does not support SBK protected target board.";
exit 1;
;;
*)
if [ "${dbmaster}" != "" ]; then
echo -n "Error: The RSA key file is provided for ";
echo "non-PKC protected target board.";
exit 1;
fi;
;;
esac;
}
if [ $# -lt 2 ]; then
usage allunknown 1;
fi;
# if the user is not root, there is not point in going forward
if [ "${USER}" != "root" ]; then
echo "flash.sh requires root privilege";
exit 1;
fi
nargs=$#;
target_rootdev=${!nargs};
nargs=$(($nargs-1));
ext_target_board=${!nargs};
# NV internal
_nvbrd_trk=0
if [ ! -r ${ext_target_board}.conf ]; then
echo "Error: Invalid target board - ${ext_target_board}.";
usage allunknown 1;
fi
# set up LDK_DIR path
LDK_DIR=$(cd `dirname $0` && pwd);
LDK_DIR=`readlink -f "${LDK_DIR}"`;
source ${ext_target_board}.conf
# set up path variables
BL_DIR="${LDK_DIR}/bootloader";
TARGET_DIR="${BL_DIR}/${target_board}";
KERNEL_DIR="${LDK_DIR}/kernel";
export PATH="${KERNEL_DIR}:${PATH}"; # preference on our DTC
DTB_DIR="${KERNEL_DIR}/dtb";
if [ "${BINSARGS}" = "" -a "${BINS}" != "" ]; then #COMPAT
BINARGS="--bins \""; #COMPAT
fi; #COMPAT
if [ "${BINSARGS}" != "" ]; then
SKIPUID="--skipuid";
fi;
# Print BSP Info:
#
echo "${INFODIVIDER}";
echo "# L4T BSP Information:";
if [ -f "${LDK_DIR}/rootfs/etc/nv_tegra_release" ]; then
head -n1 "${LDK_DIR}/rootfs/etc/nv_tegra_release" | \
sed -e s/DATE:/\\n\#\ DATE:/;
else
echo "# Unknown Release";
fi;
echo "${INFODIVIDER}";
# Determine rootdev_type
#
rootdev_type="external";
if [[ "${target_rootdev}" == mmcblk0p* || "${target_rootdev}" == ${BOOTDEV} ]]; then
rootdev_type="internal";
INITRD="";
elif [ "${target_rootdev}" = "eth0" -o "${target_rootdev}" = "eth1" ]; then
rootdev_type="network";
elif [[ "${target_rootdev}" != mmcblk1p* && \
"${target_rootdev}" != sd* ]]; then
echo "Error: Invalid target rootdev($target_rootdev).";
usage rootdevunknown 1;
fi;
read_part_name="";
rcm_boot=0;
no_flash=0;
bup_blob=0;
support_multi_spec=0;
clean_up=0;
opstr+="b:c:d:e:f:hik:m:n:o:p:rs:t:u:w:x:y:z:B:C:F:G:I:K:L:M:N:P:R:S:T:Z:-:";
while getopts "${opstr}" OPTION
do
case $OPTION in
b) BCTFILE=${OPTARG}; ;;
c) CFGFILE=${OPTARG}; ;;
d) DTBFILE=${OPTARG}; ;;
e) EMMCSIZE=${OPTARG}; ;;
f) FLASHAPP=${OPTARG}; ;;
h) usage allunknown 0; ;;
i) IGNOREFASTBOOTCMDLINE="ignorefastboot"; ;;
k) target_partname=${OPTARG}; ;; # cmdline only
m) MTSPREBOOT=${OPTARG}; ;;
n) NFSARGS=${OPTARG}; ;;
o) ODMDATA=${OPTARG}; ;;
p) BOOTPARTSIZE=${OPTARG}; ;;
r) reuse_systemimg="true"; ;; # cmdline only
s) PKCKEY=${OPTARG}; ;;
t) TEGRABOOT=${OPTARG}; ;;
u) dbmaster="${OPTARG}"; ;;
w) WB0BOOT=${OPTARG}; ;;
x) tegraid=${OPTARG}; ;;
y) fusetype=${OPTARG}; ;;
z) sn=${OPTARG}; ;;
B) BOARDID=${OPTARG}; ;;
C) CMDLINE="${OPTARG}"; ;;
F) FLASHER=${OPTARG}; ;;
G) read_part_name=${OPTARG}; ;;
I) INITRD=${OPTARG}; ;;
K) KERNEL_IMAGE=${OPTARG}; ;;
L) BOOTLOADER=${OPTARG}; ;;
M) MTS=${OPTARG}; ;;
N) NFSROOT=${OPTARG}; ;;
P) BOOTPARTLIMIT=${OPTARG}; ;;
R) ROOTFS_DIR=${OPTARG}; ;;
S) ROOTFSSIZE=${OPTARG}; ;;
Z) zflag="true"; ;; # cmdline only
-) case ${OPTARG} in
no-flash) no_flash=1; ;;
rcm-boot) rcm_boot=1; ;;
bup) bup_blob=1; ;;
multi-spec) support_multi_spec=1; ;;
clean-up) clean_up=1; ;;
usb-instance)
usb_instance="${!OPTIND}";
OPTIND=$(($OPTIND + 1));
;;
esac;;
*) usage allunknown 1; ;;
esac;
done
# get key file if -u option provided
keyfile="";
if [ "${dbmaster}" != "" ]; then
if [[ ${dbmaster} =~ ^/ ]]; then
keyfile="${dbmaster}";
else
keyfile=`readlink -f "${dbmaster}"`;
fi;
fi;
# get the fuse level and update the data accordingly
fuselevel="${FUSELEVEL}";
hwchipid="";
bootauth="";
if [ "${fuselevel}" = "" ]; then
get_fuse_level fuselevel hwchipid bootauth;
# fuselevel_unknown will be handled as fuselevel_production
if [ "${fuselevel}" = "fuselevel_unknown" ]; then
fuselevel="fuselevel_production";
fi;
else
# can not "--skipuid" when function get_fuse_level is skipped.
SKIPUID="";
fi;
declare -F -f process_fuse_level > /dev/null 2>&1;
if [ $? -eq 0 ]; then
process_fuse_level "${fuselevel}";
fi;
#
# Handle -G option for reading partition image to file
#
if [ "${read_part_name}" != "" ]; then
# Exit if path is invalid
get_full_path ${read_part_name} read_part_name;
fi;
# SoC Sanity Check
if [ ${no_flash} -eq 0 ]; then
chk_soc_sanity;
fi;
# get the board version and update the data accordingly
declare -F -f process_board_version > /dev/null 2>&1;
if [ $? -eq 0 ]; then
board_version="${FAB}";
board_id="${BOARDID}";
if [ "${board_version}" == "" ]; then
if [ "${hwchipid}" != "" ]; then
get_board_version board_id board_version;
_nvbrd_trk=1;
BOARDID="${board_id}";
FAB="${board_version}";
fi;
fi;
process_board_version "${board_id}" "${board_version}";
fi;
spec="${BOARDID}-${FAB}-${fuselevel}";
# get board SN and Part
if [ ${_nvbrd_trk} -ne 0 ]; then
boardinfo_trk;
fi;
###########################################################################
# System default values: should be defined AFTER target_board value.
#
ROOTFS_TYPE="${ROOTFS_TYPE:-ext4}";
DEVSECTSIZE="${DEVSECTSIZE:-512}"; # default sector size = 512
BOOTPARTLIMIT="${BOOTPARTLIMIT:-10485760}"; # 1MiB limit
fillpat="${FSFILLPATTERN:-0}"; # no cmdline: default=0
boardid="${BOARDID}";
if [ "${tegraid}" = "" ]; then
tegraid="${CHIPID}";
fi;
if [ -z "${DFLT_KERNEL}" ]; then
if [[ "${target_board}" == ardbeg* ]]; then
DFLT_KERNEL=${KERNEL_DIR}/zImage;
else
DFLT_KERNEL=${KERNEL_DIR}/Image;
fi;
else
basekernel=`basename "${DFLT_KERNEL}"`;
if [ "${DFLT_KERNEL}" = "${basekernel}" ]; then
DFLT_KERNEL="${KERNEL_DIR}/${DFLT_KERNEL}";
fi;
fi;
if [ -z "${DFLT_KERNEL_FS}" ]; then
DFLT_KERNEL_FS=${DFLT_KERNEL};
fi;
if [ -z "${DFLT_KERNEL_IMAGE}" ]; then
DFLT_KERNEL_IMAGE=${DFLT_KERNEL};
fi;
###########################################################################
# System mandatory vars:
#
setval odmdata ODMDATA; # .conf mandatory
setval rootfs_type ROOTFS_TYPE;
setval devsectsize DEVSECTSIZE;
getsize rootfssize ROOTFSSIZE; # .conf mandatory
getsize emmcsize EMMCSIZE; # .conf mandatory
getsize bootpartsize BOOTPARTSIZE; # .conf mandatory
getsize bootpartlim BOOTPARTLIMIT;
mkfilepath flashapp "${FLASHAPP}" "${BL_DIR}/nvflash";
mkfilepath flasher "${FLASHER}" "${TARGET_DIR}/fastboot.bin";
mkfilepath bootloader "${BOOTLOADER}" "${TARGET_DIR}/fastboot.bin";
mkdirpath rootfs_dir "${ROOTFS_DIR}" "${LDK_DIR}/rootfs";
mkfilepath kernel_image "$KERNEL_IMAGE" "${DFLT_KERNEL_IMAGE}";
mkfilepath kernel_fs "$KERNEL_IMAGE" "${DFLT_KERNEL_FS}";
mkfilepath bctfile "${BCTFILE}" "${TARGET_DIR}/BCT/${EMMC_BCT}";
mkfilepath cfgfile "${CFGFILE}" "${TARGET_DIR}/cfg/${EMMC_CFG}";
mkfilepath dtbfile "${DTBFILE}" "${DTB_DIR}/${DTB_FILE}";
if [[ "${bootloadername}" == u-boot* ]]; then
bootloader_is_uboot=1;
else
bootloader_is_uboot=0;
fi;
if [[ "${kernel_imagename}" == u-boot* ]]; then
kernel_image_is_uboot=1;
else
kernel_image_is_uboot=0;
fi;
if [ ${bootloader_is_uboot} -eq 1 -o ${kernel_image_is_uboot} -eq 1 ]; then
using_uboot=1;
else
using_uboot=0;
fi;
case "${target_board}" in
t210ref)
uboot_replaces_tboot=0;
if [[ "${kernel_image_is_uboot}" == "1" ]]; then
uboot_in_tboot_img=0;
else
uboot_in_tboot_img=1;
fi;
if [ "${tegraid}" = "" ]; then
tegraid="0x21";
fi;
;;
t186ref)
uboot_replaces_tboot=0;
uboot_in_tboot_img=0;
if [ "${tegraid}" = "" ]; then
tegraid="0x18";
fi;
;;
*)
uboot_replaces_tboot=1;
uboot_in_tboot_img=0;
;;
esac;
mkfilesoft kernelinitrd "${INITRD}" "";
if [ ${using_uboot} -eq 0 -o ${uboot_replaces_tboot} -eq 0 ]; then
mkfilesoft tegraboot "${TEGRABOOT}" "${TARGET_DIR}/nvtboot.bin";
mkfilesoft wb0boot "${WB0BOOT}" "${TARGET_DIR}/nvtbootwb0.bin";
fi
mkfilesoft mtspreboot "${MTSPREBOOT}" "${BL_DIR}/mts_preboot_si";
mkfilesoft mts "${MTS}" "${BL_DIR}/mts_si";
mkfilesoft mb1file "${MB1FILE}" "${BL_DIR}/mb1_prod.bin";
mkfilesoft bpffile "${BPFFILE}" "${BL_DIR}/bpmp.bin";
mkfilesoft bpfdtbfile "${BPFDTBFILE}" "${TARGET_DIR}/${BPFDTB_FILE}";
if [ "${bpfdtbfile}" = "" -a "${BPMPDTB_FILE}" != "" ]; then #COMPAT
mkfilesoft bpfdtbfile "${BL_DIR}/${BPMPDTB_FILE}" ""; #COMPAT
fi; #COMPAT
mkfilesoft nctfile "${NCTFILE}" "${TARGET_DIR}/cfg/${NCT_FILE}";
mkfilesoft tosfile "${TOSFILE}" "${TARGET_DIR}/tos.img";
mkfilesoft eksfile "${EKSFILE}" "${TARGET_DIR}/eks.img";
mkfilesoft fbfile "${FBFILE}" "";
mkfilesoft bcffile "${BCFFILE}" "";
mkfilesoft sosfile "${SOSFILE}" "";
mkfilesoft mb2blfile "${MB2BLFILE}" "";
mkfilesoft scefile "${SCEFILE}" "${BL_DIR}/camera-rtcpu-sce.bin";
mkfilesoft spefile "${SPEFILE}" "${BL_DIR}/spe.bin";
mkfilesoft misc_config "${TARGET_DIR}/BCT/${MISC_CONFIG}" "";
mkfilesoft pinmux_config "${TARGET_DIR}/BCT/${PINMUX_CONFIG}" "";
mkfilesoft pmic_config "${TARGET_DIR}/BCT/${PMIC_CONFIG}" "";
mkfilesoft pmc_config "${TARGET_DIR}/BCT/${PMC_CONFIG}" "";
mkfilesoft prod_config "${TARGET_DIR}/BCT/${PROD_CONFIG}" "";
mkfilesoft scr_config "${TARGET_DIR}/BCT/${SCR_CONFIG}" "";
mkfilesoft scr_cold_boot_config "${TARGET_DIR}/BCT/${SCR_COLD_BOOT_CONFIG}" "";
mkfilesoft dev_params "${TARGET_DIR}/BCT/${DEV_PARAMS}" "";
mkfilesoft bootrom_config "${TARGET_DIR}/BCT/${BOOTROM_CONFIG}" "";
if [ ${using_uboot} -eq 0 -o ${uboot_replaces_tboot} -eq 0 ]; then
mkfilesoft tbcfile "${TBCFILE}" "";
mkfilesoft tbcdtbfile "${TBCDTB_FILE}" "${DTB_DIR}/${DTB_FILE}";
fi
if [ "${rootdev_type}" = "network" ]; then
if [ "${NFSROOT}" = "" -a "${NFSARGS}" = "" ]; then
echo "Error: network argument(s) missing.";
usage allknown 1;
fi;
if [ "${NFSROOT}" != "" ]; then
validateNFSroot nfsroot "${NFSROOT}";
fi;
if [ "${NFSARGS}" != "" ]; then
validateNFSargs nfsargs "${NFSARGS}";
fi;
if [ "${nfsroot}" != "" ]; then
nfsdargs="root=/dev/nfs rw netdevwait";
cmdline+="${nfsdargs} ";
if [ "${nfsargs}" != "" ]; then
nfsiargs="ip=${nfsargs}";
nfsiargs+="::${target_rootdev}:off";
else
nfsiargs="ip=:::::${target_rootdev}:on";
fi;
cmdline+="${nfsiargs} ";
cmdline+="nfsroot=${nfsroot} ";
fi;
elif [ "${flashappname}" = "tegraflash.py" ]; then
cmdline+="root=/dev/${target_rootdev} rw rootwait ";
fi;
if [ "${CMDLINE_ADD}" != "" ]; then
cmdline+="${CMDLINE_ADD} ";
fi;
if [ "${CMDLINE}" != "" ]; then
for string in ${CMDLINE}; do
lcl_str=`echo $string | sed "s|\(.*\)=.*|\1|"`
if [[ "${cmdline}" =~ $lcl_str ]]
then
cmdline=`echo "$cmdline" | sed "s|$lcl_str=[0-9a-zA-Z:/]*|$string|"`
else
cmdline+="${string} ";
fi
done
fi;
if [ "${IGNOREFASTBOOTCMDLINE}" != "" ]; then
cmdline+="${IGNOREFASTBOOTCMDLINE} ";
fi;
if [ ${using_uboot} -eq 1 ]; then
if [ "${rootdev_type}" = "network" ]; then
SYSBOOTFILE="${TARGET_DIR}/${SYSBOOTFILE}.nfs";
elif [[ "${target_rootdev}" == mmcblk1p* ]]; then
SYSBOOTFILE="${TARGET_DIR}/${SYSBOOTFILE}.sdcard";
elif [[ "${target_rootdev}" == sd* ]]; then
if [ "${rootdev_type}" == "internal" ]; then
SYSBOOTFILE="${TARGET_DIR}/${SYSBOOTFILE}.sata";
else
SYSBOOTFILE="${TARGET_DIR}/${SYSBOOTFILE}.usb";
fi;
else
SYSBOOTFILE="${TARGET_DIR}/${SYSBOOTFILE}.emmc";
fi;
mkfilesoft sysbootfile "${SYSBOOTFILE}";
fi;
##########################################################################
pr_conf; # print config and terminate if requested.
##########################################################################
pushd $BL_DIR > /dev/null 2>&1;
### Localize files and build TAGS ########################################
# BCT_TAG:::
#
cp2local bctfile "${BL_DIR}/${bctfilename}";
if [ "${BINSARGS}" != "" ]; then
# Build up BCT parameters:
if [ "${misc_config}" != "" ]; then
cp2local misc_config "${BL_DIR}/${misc_configname}";
BCTARGS+="--misc_config ${misc_configname} ";
fi;
if [ "${pinmux_config}" != "" ]; then
cp2local pinmux_config "${BL_DIR}/${pinmux_configname}";
BCTARGS+="--pinmux_config ${pinmux_configname} ";
fi;
if [ "${pmic_config}" != "" ]; then
cp2local pmic_config "${BL_DIR}/${pmic_configname}";
BCTARGS+="--pmic_config ${pmic_configname} ";
fi;
if [ "${pmc_config}" != "" ]; then
cp2local pmc_config "${BL_DIR}/${pmc_configname}";
BCTARGS+="--pmc_config ${pmc_configname} ";
fi;
if [ "${prod_config}" != "" ]; then
cp2local prod_config "${BL_DIR}/${prod_configname}";
BCTARGS+="--prod_config ${prod_configname} ";
fi;
if [ "${scr_config}" != "" ]; then
cp2local scr_config "${BL_DIR}/${scr_configname}";
BCTARGS+="--scr_config ${scr_configname} ";
fi;
if [ "${scr_cold_boot_config}" != "" ]; then
cp2local scr_cold_boot_config "${BL_DIR}/${scr_cold_boot_configname}";
BCTARGS+="--scr_cold_boot_config ${scr_cold_boot_configname} ";
fi;
if [ "${bootrom_config}" != "" ]; then
cp2local bootrom_config "${BL_DIR}/${bootrom_configname}";
BCTARGS+="--br_cmd_config ${bootrom_configname} ";
fi;
if [ "${dev_params}" != "" ]; then
cp2local dev_params "${BL_DIR}/${dev_paramsname}";
BCTARGS+="--dev_params ${dev_paramsname} ";
fi;
if [ "${BCT}" = "" ]; then
BCT="--sdram_config";
fi;
elif [ "${BCT}" = "" ]; then
BCT="--bct";
fi;
# EBT_TAG:
#
if [ ${using_uboot} -eq 1 -a ${uboot_in_tboot_img} -eq 1 ]; then
bootloaderdir=`dirname "${bootloader}"`;
uboot_elf="${bootloaderdir}/u-boot";
uboot_entry=`"${LDK_DIR}/elf-get-entry.py" "${uboot_elf}"`;
chkerr "Could not determine entry point of bootloader binary";
"${BL_DIR}/gen-tboot-img.py" "${bootloader}" ${uboot_entry} "${BL_DIR}/${bootloadername}";
chkerr "Failed to add TBOOT header to bootloader";
else
cp2local bootloader "${BL_DIR}/${bootloadername}";
fi;
EBT_TAG+="-e s/fastboot.bin/${bootloadername}/ ";
EBT_TAG+="-e s/EBTFILE/${bootloadername}/ ";
# LNX_TAG:
#
localbootfile=boot.img;
rm -f initrd; touch initrd;
if [ ${rcm_boot} -eq 1 ]; then
if [ "${kernelinitrd}" = "" ]; then
kernelinitrd=l4t_initrd.img
fi;
fi;
if [ "$kernelinitrd" != "" -a -f "$kernelinitrd" ]; then
echo -n "copying initrd(${kernelinitrd})... ";
cp -f "${kernelinitrd}" initrd;
chkerr;
fi;
if [ ${using_uboot} -eq 1 ]; then
mkdir -p "${rootfs_dir}/boot" > /dev/null 2>&1;
echo -e -n "\tpopulating kernel to rootfs... ";
cp -f "${kernel_fs}" "${rootfs_dir}/boot"; chkerr;
echo -e -n "\tpopulating initrd to rootfs... ";
cp -f initrd "${rootfs_dir}/boot"; chkerr;
echo -e -n "\tpopulating ${sysbootfilename} to rootfs... ";
cp -f "${dtbfile}" "${rootfs_dir}/boot"; chkerr;
echo -e -n "\tpopulating ${dtbfile} to rootfs... ";
mkdir -p "${rootfs_dir}/boot/extlinux"; chkerr;
cp -f "${sysbootfile}" "${rootfs_dir}/boot/extlinux/extlinux.conf";
sed -i "s|fbcon=map:.|${CMDLINE_ADD}|" "${rootfs_dir}/boot/extlinux/extlinux.conf";
chkerr;
fi
LNX_TAG+="-e s/LNXNAME/kernel/ ";
LNX_TAG+="-e s/LNXSIZE/67108864/ ";
if [ ${using_uboot} -eq 1 -a ${kernel_image_is_uboot} -eq 0 ]; then
LNX_TAG+="-e /filename=${localbootfile}/d ";
LNX_TAG+="-e /LNXFILE/d ";
else
echo -n "Making Boot image... ";
MKBOOTARG+="--kernel ${kernel_image} ";
MKBOOTARG+="--ramdisk initrd ";
MKBOOTARG+="--board ${target_rootdev} ";
MKBOOTARG+="--output ${localbootfile} ";
./mkbootimg ${MKBOOTARG} --cmdline "${cmdline}" > /dev/null 2>&1;
chkerr;
LNX_TAG+="-e s/LNXFILE/${localbootfile}/ ";
fi;
# NCT_TAG:
#
if [ "${bcffile}" != "" ]; then
cp2local bcffile "${BL_DIR}/${bcffilename}";
NCTARGS+="--boardconfig ${bcffilename} ";
NCT_TAG+="-e /NCTFILE/d ";
NCT_TAG+="-e s/NCTTYPE/data/ ";
elif [ "${boardid}" != "" ]; then
if [ "${flashappname}" != "tegraflash.py" ]; then
# --boardid is an invalid option for tegraflash.py
NCTARGS+="--boardid $boardid ";
NCT_TAG+="-e /NCTFILE/d ";
NCT_TAG+="-e s/NCTTYPE/data/ ";
fi;
elif [ "${nctfile}" != "" ]; then
cp2local nctfile "${BL_DIR}/${nctfilename}";
NCT_TAG+="-e s/name=NXT/name=NCT/ ";
NCT_TAG+="-e s/NCTFILE/${nctfilename}/ ";
NCT_TAG+="-e s/NCTTYPE/config_table/ ";
NCTARGS+="--nct ${nctfilename}";
else
NCT_TAG+="-e /NCTFILE/d ";
NCT_TAG+="-e s/NCTTYPE/data/ ";
fi;
# SOS_TAG: XXX: recovery is yet to be implemented.
#
SOS_TAG+="-e /SOSFILE/d ";
if [ "${sosfile}" != "" ]; then
cp2local sosfile "${BL_DIR}/${sosfilename}";
SOSARGS+="--applet ${sosfilename} ";
else
SOS_TAG+="-e /filename=recovery.img/d ";
fi;
# NVC_TAG:== MB2
#
if [ "${tegraboot}" != "" ]; then
cp2local tegraboot "${BL_DIR}/${tegrabootname}";
NVC_TAG+="-e s/NXC/NVC/ ";
NVC_TAG+="-e s/MB2NAME/mb2/ ";
NVC_TAG+="-e s/type=data\s\+#TEGRABOOT/type=bootloader/ ";
NVC_TAG+="-e s/NVCTYPE/bootloader/ ";
NVC_TAG+="-e s/MB2TYPE/mb2_bootloader/ ";
NVC_TAG+="-e s/#filename=nvtboot.bin/filename=${tegrabootname}/ ";
NVC_TAG+="-e s/NVCFILE/${tegrabootname}/ ";
NVC_TAG+="-e s/MB2FILE/${tegrabootname}/ ";
else
NVC_TAG+="-e s/NVCTYPE/data/ ";
NVC_TAG+="-e s/MB2TYPE/data/ ";
NVC_TAG+="-e /NVCFILE/d ";
NVC_TAG+="-e /MB2FILE/d ";
NVC_TAG+="-e /filename=nvtboot.bin/d ";
fi;
# MB2BL_TAG:== tboot_recovery
#
if [ "${mb2blfile}" != "" ]; then
cp2local mb2blfile "${BL_DIR}/${mb2blfilename}";
if [ "${BINSARGS}" != "" ]; then
BINSARGS+="mb2_bootloader ${mb2blfilename}; ";
fi;
fi;
# MPB_TAG:
#
if [ "${mtspreboot}" != "" ]; then
cp2local mtspreboot "${BL_DIR}/${mtsprebootname}";
MPB_TAG+="-e s/MXB/MPB/ ";
MPB_TAG+="-e s/MPBNAME/mts-preboot/ ";
MPB_TAG+="-e s/type=data\s\+#MTSPREBOOT/type=mts_preboot/ ";
MPB_TAG+="-e s/MPBTYPE/mts_preboot/ ";
MPB_TAG+="-e s/#filename=mts_preboot_si/filename=${mtsprebootname}/ ";
MPB_TAG+="-e s/MPBFILE/${mtsprebootname}/ ";
if [ "${BINSARGS}" != "" ]; then
BINSARGS+="mts_preboot ${mtsprebootname}; ";
else
MTSARGS+="--preboot ${mtsprebootname} ";
fi;
else
MPB_TAG+="-e s/MPBTYPE/data/ ";
MPB_TAG+="-e /#filename=mts_preboot_si/d ";
MPB_TAG+="-e /MPBFILE/d ";
fi;
# MBP_TAG:
#
if [ "${mts}" != "" ]; then
cp2local mts "${BL_DIR}/${mtsname}";
MBP_TAG+="-e s/MXP/MBP/ ";
MBP_TAG+="-e s/MBPNAME/mts-bootpack/ ";
MBP_TAG+="-e s/type=data\s\+#MTSBOOTPACK/type=mts_bootpack/ ";
MBP_TAG+="-e s/MBPTYPE/mts_bootpack/ ";
MBP_TAG+="-e s/#filename=mts_si/filename=${mtsname}/ ";
MBP_TAG+="-e s/MBPFILE/${mtsname}/ ";
if [ "${BINSARGS}" != "" ]; then
BINSARGS+="mts_bootpack ${mtsname}; ";
else
MTSARGS+="--bootpack ${mtsname} ";
fi;
else
MBP_TAG+="-e s/MBPTYPE/data/ ";
MBP_TAG+="-e /#filename=mts_si/d ";
MBP_TAG+="-e /MBPFILE/d ";
fi;
# MB1_TAG:
#
if [ "${mb1file}" != "" ]; then
cp2local mb1file "${BL_DIR}/${mb1filename}";
MB1_TAG+="-e s/MB1NAME/mb1/ ";
MB1_TAG+="-e s/MB1TYPE/mb1_bootloader/ ";
MB1_TAG+="-e s/MB1FILE/${mb1filename}/ ";
else
MB1_TAG+="-e s/MB1TYPE/data/ ";
MB1_TAG+="-e /MB1FILE/d ";
fi;
# BPF_TAG:
#
if [ "${bpffile}" != "" ]; then
cp2local bpffile "${BL_DIR}/${bpffilename}";
BPF_TAG+="-e s/BXF/BPF/ ";
BPF_TAG+="-e s/BPFNAME/bpmp-fw/ ";
BPF_TAG+="-e s/BPFFILE/${bpffilename}/ ";
BPF_TAG+="-e s/BPFSIGN/true/ ";
if [ "${BINSARGS}" != "" ]; then
BINSARGS+="bpmp_fw ${bpffilename}; ";
fi;
else
BPF_TAG+="-e /BPFFILE/d ";
BPF_TAG+="-e s/BPFSIGN/false/ ";
fi;
# BPFDTB_TAG:
if [ "${bpfdtbfile}" != "" ]; then
cp2local bpfdtbfile "${BL_DIR}/${bpfdtbfilename}";
BPFDTB_TAG+="-e s/BPFDTB-NAME/bpmp-fw-dtb/ ";
BPFDTB_TAG+="-e s/BPFDTB-FILE/${bpfdtbfilename}/ ";
BPFDTB_TAG+="-e s/BPMPDTB-SIGN/true/ ";
BPFDTB_TAG+="-e s/BPMPDTB/${bpfdtbfilename}/ "; #COMPAT
if [ "${BINSARGS}" != "" ]; then
BINSARGS+="bpmp_fw_dtb ${bpfdtbfilename}; ";
fi;
else
BPFDTB_TAG+="-e /BPFDTB-FILE/d ";
BPFDTB_TAG+="-e s/BPMPDTB-SIGN/false/ ";
fi;
# SCE_TAG:
if [ "${scefile}" != "" ]; then
cp2local scefile "${BL_DIR}/${scefilename}";
SCE_TAG+="-e s/SCENAME/sce-fw/ ";
SCE_TAG+="-e s/SCESIGN/true/ ";
SCE_TAG+="-e s/SCEFILE/${scefilename}/ ";
SCE_TAG+="-e s/SCEFIRMWARE/${scefilename}/ "; #COMPAT
else
SCE_TAG+="-e s/SCESIGN/flase/ ";
SCE_TAG+="-e /SCEFILE/d ";
fi;
# SPE_TAG:
if [ "${spefile}" != "" ]; then
cp2local spefile "${BL_DIR}/${spefilename}";
SPE_TAG+="-e s/SPENAME/spe-fw/ ";
SPE_TAG+="-e s/SPETYPE/spe_fw/ ";
SPE_TAG+="-e s/SPEFILE/${spefilename}/ ";
SPE_TAG+="-e s/spe.bin/${spefilename}/ ";
else
SPE_TAG+="-e s/SPETYPE/data/ ";
SPE_TAG+="-e /SPEFILE/d ";
fi;
# WB0_TAG:
#
if [ "${wb0boot}" != "" ]; then
cp2local wb0boot "${BL_DIR}/${wb0bootname}";
WB0_TAG+="-e s/WX0/WB0/ ";
WB0_TAG+="-e s/SC7NAME/sc7/ ";
WB0_TAG+="-e s/WB0SIZE/20480/ ";
WB0_TAG+="-e s/type=data\s\+#WB0BOOT/type=WB0/ ";
WB0_TAG+="-e s/WB0TYPE/WB0/ ";
WB0_TAG+="-e s/#filename=warmboot.bin/filename=${wb0bootname}/ ";
WB0_TAG+="-e s/WB0FILE/${wb0bootname}/ ";
else
WB0_TAG+="-e s/WB0TYPE/data/ ";
WB0_TAG+="-e s/WB0SIZE/20480/ ";
WB0_TAG+="-e /WB0FILE/d ";
WB0_TAG+="-e /filename=warmboot.bin/d ";
fi;
# TOS_TAG:
#
if [ "${tosfile}" != "" ]; then
cp2local tosfile "${BL_DIR}/${tosfilename}";
TOS_TAG+="-e s/TXS/TOS/ ";
TOS_TAG+="-e s/TOSNAME/secure-os/ ";
TOS_TAG+="-e s/TOSFILE/${tosfilename}/ ";
if [ "${BINSARGS}" != "" ]; then
BINSARGS+="tlk ${tosfilename}; ";
fi;
else
TOS_TAG+="-e /TOSFILE/d ";
fi;
# EKS_TAG:
#
EKS_TAG+="-e s/EXS/EKS/ ";
if [ "${eksfile}" != "" ]; then
cp2local eksfile "${BL_DIR}/${eksfilename}";
EKS_TAG+="-e s/EKSFILE/${eksfilename}/ ";
if [ "${BINSARGS}" != "" ]; then
BINSARGS+="eks ${eksfilename}; ";
fi;
else
EKS_TAG+="-e /EKSFILE/d ";
fi;
# FB_TAG:
#
if [ "${fbfile}" != "" ]; then
chsuffix fbfilebin ${fbfilename} "bin";
fbfilexml="reserved_fb.xml";
cp2local fbfile "${BL_DIR}/${fbfilename}";
FB_TAG+="-e s/FBFILE/${fbfilebin}/ ";
FB_TAG+="-e s/FX/FB/ ";
FB_TAG+="-e s/FBNAME/fusebypass/ ";
FB_TAG+="-e s/FBTYPE/fuse_bypass/ ";
FB_TAG+="-e s/FBSIGN/true/ ";
if [ "${flashappname}" = "tegraflash.py" ]; then
FBARGS+="--fb ${fbfilebin} "
FBARGS+="--cmd \"parse fusebypass ${fbfilename} ";
FBARGS+="non-secure;flash;reboot\" ";
fi;
else
FB_TAG+="-e s/FBTYPE/data/ ";
FB_TAG+="-e s/FBSIGN/false/ ";
FB_TAG+="-e /FBFILE/d ";
if [ "${flashappname}" = "tegraflash.py" ]; then
if [ ${rcm_boot} -ne 0 ]; then
BINSARGS+="kernel boot.img; "
BINSARGS+="kernel_dtb ${DTB_FILE}; "
BINSARGS+="sce_fw ${scefilename}; "
FBARGS+="--cmd \"rcmboot\" ";
elif [ ${bup_blob} -ne 0 ]; then
FBARGS+="--cmd \"sign\" ";
else
FBARGS+="--cmd \"flash; reboot\" ";
fi
fi;
fi;
# DTB_TAG: Kernel DTB
#
if [ "${dtbfile}" != "" ]; then
cp2local dtbfile "${BL_DIR}/${dtbfilename}";
append_bootargs_to_dtb "${dtbfilename}";
DTB_TAG+="-e s/DXB/DTB/ ";
DTB_TAG+="-e s/KERNELDTB-NAME/kernel-dtb/ ";
DTB_TAG+="-e s/#filename=tegra.dtb/filename=${dtbfilename}/ ";
DTB_TAG+="-e s/DTBFILE/${dtbfilename}/ ";
DTB_TAG+="-e s/KERNELDTB-FILE/${dtbfilename}/ ";
DTB_TAG+="-e s/KERNEL-DTB/${dtbfilename}/ "; #COMPAT
if [ "${flashappname}" = "tegraflash.py" ]; then
if [ "${tegraid}" != "0x18" ]; then
DTBARGS+="--bldtb ${dtbfilename} ";
fi
else
DTBARGS+="--dtbfile ${dtbfilename} ";
fi;
else
DTB_TAG+="-e /tegra.dtb/d ";
DTB_TAG+="-e /DTBFILE/d ";
DTB_TAG+="-e /KERNELDTB-FILE/d ";
fi;
# APP_TAG: RootFS
#
# check cases where system.img is not needed
if [ ${bup_blob} -eq 1 ] || [ ${rcm_boot} -eq 1 ] \
|| [ "${read_part_name}" != "" ]; then
skip_systemimg="true";
fi;
localsysfile=system.img;
APP_TAG+="-e s/size=1073741824/size=${rootfssize}/ ";
APP_TAG+="-e s/APPSIZE/${rootfssize}/ ";
APP_TAG+="-e /recovery.img/d ";
if [ "${reuse_systemimg}" = "true" ] || [ "${skip_systemimg}" = "true" ]; then
APP_TAG+="-e s/filename=system.img/filename=${localsysfile}/ ";
APP_TAG+="-e s/APPFILE/${localsysfile}/ ";
if [ "${skip_systemimg}" != "true" ]; then
echo "Reusing existing ${localsysfile}... ";
if [ ! -e "${localsysfile}" ]; then
echo "file does not exist.";
exit 1;
fi;
echo "done.";
else
echo "Skip generating ${localsysfile}";
fi;
elif [ "${rootdev_type}" = "internal" ]; then
APP_TAG+="-e s/filename=system.img/filename=${localsysfile}/ ";
APP_TAG+="-e s/APPFILE/${localsysfile}/ ";
if [ "${target_partname}" = "" -o "${target_partname}" = "APP" ]; then
build_fsimg "$localsysfile" "$fillpat" \
"$rootfssize" "$rootfs_type" "$rootfs_dir";
fi;
elif [ "${rootdev_type}" = "network" -o "${rootdev_type}" = "external" -a \
${using_uboot} -eq 1 ]; then
echo -n "generating /boot/extlinux/extlinux.conf files... ";
APP_TAG+="-e s/filename=system.img/filename=${localsysfile}/ ";
APP_TAG+="-e s/APPFILE/${localsysfile}/ ";
NFSCONV="-e s/NFSARGS/${nfsiargs}/ ";
NFSCONV+="-e s%NFSROOT%${nfsroot}% ";
sed ${NFSCONV} < "${rootfs_dir}/boot/extlinux/extlinux.conf" > ./extlinux.conf;
mv ./extlinux.conf "${rootfs_dir}/boot/extlinux/extlinux.conf";
echo "done.";
echo "generating system.img for booting... ";
tmpdir=`mktemp -d`;
mkdir -p "${tmpdir}/boot/extlinux" > /dev/null 2>&1;
cp -f "${rootfs_dir}/boot/extlinux/extlinux.conf" "${tmpdir}/boot/extlinux" > /dev/null 2>&1;
cp -f "${kernel_fs}" "${tmpdir}/boot" > /dev/null 2>&1;
cp -f "${dtbfile}" "${tmpdir}/boot" > /dev/null 2>&1;
cp -f initrd "${tmpdir}/boot" > /dev/null 2>&1;
build_fsimg "$localsysfile" "$fillpat" \
"$rootfssize" "$rootfs_type" "$tmpdir";
else
APP_TAG+="-e /filename=system.img/d ";
APP_TAG+="-e /system.img/d ";
APP_TAG+="-e /APPFILE/d ";
fi;
# TBC_TAG:== EBT
#
if [ "${tbcfile}" != "" ]; then
cp2local tbcfile "${BL_DIR}/${tbcfilename}";
TBC_TAG+="-e s/TXC/TBC/ ";
TBC_TAG+="-e s/TBCNAME/cpu-bootloader/ ";
TBC_TAG+="-e s/TBCTYPE/bootloader/ ";
TBC_TAG+="-e s/TBCFILE/${tbcfilename}/ ";
else
TBC_TAG+="-e s/TBCTYPE/data/ ";
TBC_TAG+="-e /TBCFILE/d ";
fi;
# TBCDTB_TAG:== Bootloader DTB
#
if [ "${tbcdtbfile}" != "" ]; then
cp2local tbcdtbfile "${BL_DIR}/${tbcdtbfilename}";
append_bootargs_to_dtb "${tbcdtbfilename}";
TBCDTB_TAG+="-e s/TBCDTB-NAME/bootloader-dtb/ ";
TBCDTB_TAG+="-e s/TBCDTB-FILE/${tbcdtbfilename}/ ";
if [ "${BINSARGS}" != "" ]; then
BINSARGS+="bootloader_dtb ${tbcdtbfilename}; ";
fi;
else
TBCDTB_TAG+="-e s/TBCTYPE/data/ ";
TBCDTB_TAG+="-e /TBCDTB-FILE/d ";
fi;
# EFI_TAG: Minimum FAT32 partition size is 64MiB (== 1 FAT cluster)
#
localefifile=efi.img;
efifs_size=$(( 64 * 1024 * 1024 ));
EFI_TAG+="-e s/size=67108864\s\+#EFISIZE/size=${efifs_size}/ ";
EFI_TAG+="-e s/EFISIZE/${efifs_size}/ ";
if [ "${bootloadername}" = "uefi.bin" ]; then
build_fsimg $localefifile "" $efifs_size "FAT32" "";
EFI_TAG+="-e s/EXI/EFI/ ";
EFI_TAG+="-e s/#filename=efi.img/filename=${localefifile}/ ";
EFI_TAG+="-e s/EFIFILE/${localefifile}/ ";
else
EFI_TAG+="-e /EFIFILE/d ";
fi;
# GPT_TAG: tag should created before cfg and actual img should be
# created after cfg.
#
localpptfile=ppt.img;
localsptfile=gpt.img;
if [ ! -z "${bootpartsize}" -a ! -z "${emmcsize}" ]; then
bplmod=$(( ${bootpartlim} % ${devsectsize} ));
if [ ${bplmod} -ne 0 ]; then
echo "Error: Boot partition limit is not modulo ${devsectsize}";
exit 1;
fi;
bpsmod=$(( ${bootpartsize} % ${devsectsize} ));
if [ ${bpsmod} -ne 0 ]; then
echo "Error: Boot partition size is not modulo ${devsectsize}";
exit 1;
fi;
gptsize=$(( ${bootpartlim} - ${bootpartsize} ));
if [ ${gptsize} -lt ${devsectsize} ]; then
echo "Error: No space for primary GPT.";
exit 1;
fi;
GPT_TAG+="-e s/size=2097152\s\+#BCTSIZE/size=${bootpartsize}/ ";
GPT_TAG+="-e s/size=8388608\s\+#PPTSIZE/size=${gptsize}/ ";
GPT_TAG+="-e s/PPTSIZE/${gptsize}/ ";
GPT_TAG+="-e s/#filename=ppt.img/filename=${localpptfile}/ ";
GPT_TAG+="-e s/#filename=spt.img/filename=${localsptfile}/ ";
else
GPT_TAG+="-e s/PPTSIZE/16896/ ";
fi;
# CFG:
#
if [[ ${cfgfile} =~ \.xml$ ]]; then
localcfgfile=flash.xml;
else
localcfgfile=flash.cfg;
fi;
echo -n "copying cfgfile(${cfgfile}) to ${localcfgfile}... ";
if [ "${BINSARGS}" != "" ]; then
# Close BINSARGS before get used for the first time.
BINSARGS+="\"";
BINSCONV+="-e s/\"[[:space:]]*/\"/ ";
BINSCONV+="-e s/\;[[:space:]]*\"/\"/ ";
BINSARGS=`echo "${BINSARGS}" | sed ${BINSCONV}`;
fi;
CFGCONV+="${EBT_TAG} ";
CFGCONV+="${LNX_TAG} ";
CFGCONV+="${SOS_TAG} ";
CFGCONV+="${NCT_TAG} ";
CFGCONV+="${NVC_TAG} ";
CFGCONV+="${MB2BL_TAG} ";
CFGCONV+="${MPB_TAG} ";
CFGCONV+="${MBP_TAG} ";
CFGCONV+="${MB1_TAG} ";
CFGCONV+="${BPF_TAG} ";
CFGCONV+="${BPFDTB_TAG} ";
CFGCONV+="${SCE_TAG} ";
CFGCONV+="${SPE_TAG} ";
CFGCONV+="${TOS_TAG} ";
CFGCONV+="${EKS_TAG} ";
CFGCONV+="${FB_TAG} ";
CFGCONV+="${WB0_TAG} ";
CFGCONV+="${APP_TAG} ";
CFGCONV+="${EFI_TAG} ";
CFGCONV+="${DTB_TAG} ";
CFGCONV+="${TBC_TAG} ";
CFGCONV+="${TBCDTB_TAG} ";
CFGCONV+="${GPT_TAG} ";
cat ${cfgfile} | sed ${CFGCONV} > ${localcfgfile}; chkerr;
# GPT:
# mkgpt need to update as per new flash_t186_l4t.xml,
# currently skipping mkgpt as gpt partition is taken care by tegraflash.
if [ ! -z "${bootpartsize}" -a ! -z "${emmcsize}" -a \
"${tegraid}" != "0x18" ]; then
echo "creating gpt(${localpptfile})... ";
MKGPTOPTS="-c ${localcfgfile} -P ${localpptfile} ";
MKGPTOPTS+="-t ${emmcsize} -b ${bootpartsize} -s 4KiB ";
MKGPTOPTS+="-a GPT -v GP1 ";
MKGPTOPTS+="-V ${MKGPTCMD} ";
./mkgpt ${MKGPTOPTS};
chkerr "creating gpt(${localpptfile}) failed.";
fi;
# FLASH:
#
cp2local flasher "${BL_DIR}/${flashername}";
cp2local flashapp "${BL_DIR}/${flashappname}";
if [ "${target_partname}" != "" ]; then
validatePartID target_partid target_partname $target_partname $localcfgfile;
tmp_updateid="[${target_partname}]";
need_sign=0;
sigheader=0;
sigext=bin;
case ${target_partname} in
BCT) target_partfile="${bctfilename}";
FLASHARGS="${BCT} ${target_partfile} --updatebct SDRAM ";
;;
mb2) target_partfile="nvtboot.bin";
need_sign=1;
sigheader=1;
;;
bpmp-fw)
target_partfile="${bpffile}";
need_sign=1;
sigheader=1;
;;
bpmp-fw-dtb)
target_partfile="${bpfdtbfile}";
need_sign=1;
sigheader=1;
sigext=dtb;
;;
PPT) target_partfile="${localpptfile}"; ;;
EBT) target_partfile="${bootloadername}"; need_sign=1; ;;
cpu-bootloader)
target_partfile="${tbcfilename}";
need_sign=1;
sigheader=1;
;;
secure-os)
target_partfile="${tosfilename}";
need_sign=1;
sigheader=1;
sigext=img;
;;
eks) target_partfile="${eksfilename}";
need_sign=1;
sigheader=1;
sigext=img;
;;
LNX) target_partfile="${localbootfile}";
if [ "${tegraid}" = "0x21" ]; then
if [ "${read_part_name}" = "" ]; then
need_sign=1;
fi;
else
pre_cmds="write DTB ${dtbfilename}; ";
fi;
;;
kernel)
target_partfile="${localbootfile}";
need_sign=1;
sigheader=1;
sigext=img;
;;
kernel-dtb) target_partfile="${dtbfilename}";
need_sign=1;
sigheader=1;
sigext=dtb;
;;
NCT) target_partfile="${nctfilename}"; ;;
SOS) target_partfile="${sosfilename}"; ;;
NVC) target_partfile="${tegrabootname}"; need_sign=1; ;;
MPB) target_partfile="${mtsprebootname}"; ;;
MBP) target_partfile="${mtsname}"; ;;
BPF) target_partfile="${bpffilename}"; ;;
APP) target_partfile="${localsysfile}"; ;;
DTB|RP1) target_partfile="${dtbfilename}";
need_sign=1;
sigext=dtb;
if [ "${tegraid}" = "0x21" ]; then
sigheader=1;
fi;
;;
EFI) target_partfile="${localefifile}"; ;;
TOS) target_partfile="${tosfilename}"; ;;
EKS) target_partfile="${eksfilename}"; ;;
FB) target_partfile="${fbfilename}"; ;;
WB0) target_partfile="${wb0bootname}"; ;;
GPT) target_partfile="${localsptfile}"; ;;
spe-fw)
target_partfile="${spefilename}";
need_sign=1;
sigheader=1;
;;
*) echo "*** Update ${tmp_updateid} is not supported. ***";
exit 1; ;;
esac;
if [ "${read_part_name}" != "" ]; then
target_partfile="${read_part_name}";
echo "*** Reading ${tmp_updateid} and storing to ${target_partfile} ***";
else
echo "*** Updating ${tmp_updateid} with ${target_partfile} ***";
fi;
if [ "${FLASHARGS}" = "" ]; then
FLASHARGS="--bl ${flashername} ${DTBARGS} ";
if [ "${keyfile}" != "" -a "${tegraid}" = "0x21" ]; then
FLASHARGS="--bl ${flashername}.signed ";
DTBARGS+="--bldtb ${dtbfilename}.signed ";
fi;
FLASHARGS+="--chip ${tegraid} --applet ${sosfilename} ";
fi;
if [ ${need_sign} -eq 1 ]; then
pf_dir="$(dirname "${target_partfile}")";
pf_fn="$(basename "${target_partfile}")";
if [ "${read_part_name}" != "" ]; then
mkdir -p "${pf_dir}/signed" > /dev/null 2>&1;
fi;
signtype="encrypt";
if [ "${bootauth}" = "PKC" -o "${bootauth}" = "SBKPKC" ]; then
signtype="signed";
fi;
if [ ${sigheader} -eq 1 ]; then
sighdr="_sigheader.${sigext}.${signtype}";
target_partfile=`echo "${pf_fn}" | awk -F '.' '{print $1}'`;
target_partfile="${pf_dir}/signed/${target_partfile}${sighdr}";
else
target_partfile="${pf_dir}/signed/${pf_fn}.${signtype}";
fi;
FLASHARGS+=" --cfg ${localcfgfile} ";
FLASHARGS+=" ${BCT} ${bctfilename} ";
pre_cmds+="sign; ";
fi
FLASHARGS+="$BCT ${bctfilename} ";
FLASHARGS+="${BCTARGS} ";
FLASHARGS+="--cfg ${localcfgfile} ${BINSARGS} ";
FLASHARGS+=" --cmd \"";
FLASHARGS+="${pre_cmds}";
if [ "${read_part_name}" != "" ]; then
FLASHARGS+="read ${target_partname} ${target_partfile}\" ";
else
FLASHARGS+="write ${target_partname} ${target_partfile}; ";
FLASHARGS+="reboot\" ";
fi
FLASHARGS+="${SKIPUID} ";
if [ -n "${usb_instance}" ]; then
FLASHARGS+="--instance ${usb_instance} ";
fi;
# Add keyfile if provided
if [ "${keyfile}" != "" ]; then
FLASHARGS+="--key \"${keyfile}\" ";
fi;
echo "./${flashappname} ${FLASHARGS}";
cmd="./${flashappname} ${FLASHARGS}";
eval ${cmd};
chkerr "Failed to flash/read ${target_board}.";
if [ "${read_part_name}" != "" ]; then
if [ ${need_sign} -eq 1 ]; then
# remove sign header and place to user specified location and name
header_sz=400 # 0x190 bytes
dd if="${target_partfile}" of="${read_part_name}" bs=${header_sz} \
skip=1
fi;
echo "*** The ${tmp_updateid} has been read successfully. ***";
if [ "${target_partname}" = "APP" -a -x mksparse ]; then
echo -e "\tConverting RAW image to Sparse image... ";
mv -f ${target_partfile} ${target_partfile}.raw;
./mksparse -v --fillpattern=0 ${target_partfile}.raw ${target_partfile};
fi;
else
echo "*** The ${tmp_updateid} has been updated successfully. ***";
fi;
exit 0;
fi;
if [ ${bup_blob} -eq 0 ] && [ -f odmsign.func ]; then
# --bup option is not supported by odmsign functions
source odmsign.func;
odmsign;
if [ $? -ne 0 ]; then
exit 1;
fi;
fi;
if [ -n "${usb_instance}" ]; then
FLASHARGS+="--instance ${usb_instance} ";
fi;
FLASHARGS+="--bl ${flashername} ${BCT} ${bctfilename} ";
FLASHARGS+="--odmdata ${odmdata} ";
FLASHARGS+="${DTBARGS}${MTSARGS}${SOSARGS}${NCTARGS}${FBARGS} ";
if [ "${flashappname}" = "tegraflash.py" ]; then
FLASHARGS+="--cfg ${localcfgfile} ";
FLASHARGS+="--chip ${tegraid} ";
FLASHARGS+="${BCTARGS} ";
FLASHARGS+="${BINSARGS} ";
FLASHARGS+="${SKIPUID} ";
else
FLASHARGS+="--configfile ${localcfgfile} ";
FLASHARGS+="--setbct --create --wait -s 0 --go ";
fi;
flashcmd="./${flashappname} ${FLASHARGS}";
echo "${flashcmd}";
flashcmdfile="${BL_DIR}/flashcmd.txt";
echo "saving flash command in ${flashcmdfile}";
echo "${flashcmd}" | tee "${flashcmdfile}";
# Remove --skipuid flag for running flash command tegraflash.py directly
sed -i 's/--skipuid//g' "${flashcmdfile}"
# For Windows flashing or rcmboot
sata_boot_ext="sb"
rcm_boot_ext="rb"
kernel_dtb_file="kernel_dtb_filename.txt"
if [ ${rcm_boot} -eq 0 ]; then
flashargfile="${BL_DIR}/flash_parameters.txt";
echo -n "copying boot image (${localbootfile}.${sata_boot_ext})... ";
cp -f ${localbootfile} ${localbootfile}.${sata_boot_ext};
chkerr;
echo -n "copying partition layout (${localcfgfile}.${sata_boot_ext})... ";
cp -f ${localcfgfile} ${localcfgfile}.${sata_boot_ext};
chkerr;
echo -n "copying kernel dtb (${dtbfilename}.${sata_boot_ext})... ";
cp -f ${dtbfilename} ${dtbfilename}.${sata_boot_ext};
chkerr;
echo "${dtbfilename}.${sata_boot_ext}" | tee ${kernel_dtb_file} >>/dev/null;
else
flashargfile="${BL_DIR}/rcmboot_parameters.txt";
echo -n "copying boot image (${localbootfile}.${rcm_boot_ext})... ";
cp -f ${localbootfile} ${localbootfile}.${rcm_boot_ext};
chkerr;
echo -n "copying initrd (initrd.${rcm_boot_ext})... ";
cp -f initrd initrd.${rcm_boot_ext};
chkerr;
fi;
echo "saving flash parameters in ${flashargfile}";
echo "${FLASHARGS}" | tee "${flashargfile}";
# Remove --skipuid flag for running flash command tegraflash.py directly
sed -i 's/--skipuid//g' "${flashargfile}"
# generate bootloader update payload (BUP)
if [ ${bup_blob} -ne 0 ]; then
bup_gen="${BL_DIR}/l4t_bup_gen.func"
if [ -f "${bup_gen}" ]; then
source "${bup_gen}"
echo "*** Sign and generate BUP... *** ";
if [ "${BOARDID}" = "" ]; then
echo "Error: BOARDID is missing. BOARDID can be either set by "\
"environment variable BOARDID or by reading from on-board "\
"EEPROM."
exit 1
fi
if [ "${fuselevel}" = "" ]; then
echo "Error: fuselevel is missing."
exit 1
fi;
if [ "${FAB}" = "" ]; then
echo "Error: FAB # is missing."
exit 1
fi;
l4t_bup_gen "${flashcmd}" "${spec}" "${fuselevel}" "${target_board}" "${PKCKEY}"
else
echo ""
echo "Error: Missing ${bup_gen}"
echo ""
exit 1
fi;
exit 0;
fi;
if [ ${no_flash} -ne 0 ]; then
echo "*** no-flash flag enabled. Exiting now... *** ";
exit 0;
fi;
echo "*** Flashing target device started. ***"
eval "${flashcmd}";
chkerr "Failed flashing ${target_board}.";
echo "*** The target ${target_board} has been flashed successfully. ***"
if [ "${rootdev_type}" = "internal" ]; then
echo "Reset the board to boot from internal eMMC.";
elif [ "${rootdev_type}" = "network" ]; then
if [ "${nfsroot}" != "" ]; then
echo -n "Make target nfsroot(${nfsroot}) exported ";
echo "on the network and reset the board to boot";
else
echo -n "Make the target nfsroot exported on the ";
echo -n "network, configure your own DHCP server ";
echo -n "with \"option-root=<nfsroot export path>;\" ";
echo "properly and reset the board to boot";
fi;
else
echo -n "Make the target filesystem available to the device ";
echo -n "and reset the board to boot from external ";
echo "${target_rootdev}.";
fi;
echo;
exit 0;
# vi: ts=8 sw=8 noexpandtab
@OUTHIM
Copy link

OUTHIM commented Jul 12, 2021

Am i able to flash from a SSD card which i have set the system to boot rootfs on? I have tried to set the root device name to be my ssd ID but it still flashed from the internal emmc which is confusing.

@Davidnet
Copy link
Author

This is a very old nvidia script you should be able to take a look at more modern version which are packed in the L4T recent releases.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment