当前位置: 首页 > news >正文

Orin NX开发板的烧录脚本注解

l4t_initrd_flash.sh烧录脚本注解

  • 介绍
  • 烧录命令说明
  • 准备工作
  • 脚本内容说明
    • l4t_initrd_flash.sh说明
    • l4t_create_images_for_kernel_flash.sh说明
    • flash.sh 脚本注解
    • 待续

介绍

l4t_initrd_flash.sh 是 NVIDIA Jetson 平台提供的一个烧录工具脚本,属于 L4T(Linux for Tegra) 工具链的一部分。这个脚本的主要作用是:

  • l4t_initrd_flash.sh 与传统的 flash.sh 不同,它使用 initrd(initial ramdisk)启动模式 来进行烧录。Jetson 设备通过 USB 被引导进入一个 RAM 中的 Linux 环境(initrd),然后使用该环境对 eMMC 或 NVMe 等存储器进行写入操作
  • 避免对目标设备 eMMC 的预置内容依赖(不依赖 U-Boot 等 bootloader)
  • 支持将 rootfs 安装到 NVMe、UFS、SSD 等多种存储介质上
  • 支持预装用户自定义的 system image,自定义烧录分区
  • 支持 OTA 升级(部分版本)所需的 layout 结构

烧录命令说明

本次说明的命令如下:

sudo ./tools/kernel_flash/l4t_initrd_flash.sh --external-device nvme0n1p1 -p "-c ./bootloader/t186ref/cfg/flash_t234_qspi.xml" -c ./tools/kernel_flash/flash_l4t_t234_nvme.xml --showlogs --network usb0 jetson-orin-nano-devkit nvme0n1p1

上述命令参考的链接

准备工作

将开发板进入Force Recovery Mode模式,然后通过type-c数据连接到ubuntu系统上,如下代表数据线连接正确:
USB显示

脚本内容说明

脚本的调用结构如下:

l4t_initrd_flash.sh -> 

l4t_initrd_flash.sh说明

下面按照程序顺序执行调用进行注解

#脚本开头常见的一种健壮性设置
set -eo pipefail #如果任何一个命令出错(返回非 0),整个脚本立即退出。
# 对于管道命令cmd1 | cmd2 | cmd3,默认情况只检查最后一个命令cmd3是否出错
trap cleanup EXIT #

上面的 trap cleanup EXIT含义:

  • trap 是 Bash 中的一个内建命令,用于在接收到指定信号时执行一个动作;
  • EXIT 是一个特殊信号,表示脚本退出(无论正常还是错误退出);
  • cleanup 是一个函数名(需要你在脚本其他地方定义它);
    继续执行下面的脚本,进行变量声明:
L4T_INITRD_FLASH_DIR="$(cd "$(dirname "${0}")" && pwd)" #获取脚本所在的绝对路径
L4T_TOOLS_DIR="${L4T_INITRD_FLASH_DIR%/*}"#获取上一个绝对路径
LINUX_BASE_DIR="${L4T_TOOLS_DIR%/*}"#获取上一个绝对路径
showlogs=0
flash_only="0"
initrd_only=""
reuse_package=""
external_only=""
no_flash="0"
target_partname=""
max_massflash=""
keep=""
network=""
direct=""
reuse=""
export initrd_flash_step=1
UDEV_L4T_DIR="${L4T_INITRD_FLASH_DIR}/host_udev"
flash_cmd="${L4T_INITRD_FLASH_DIR}/l4t_initrd_flash_internal.sh"
source "${L4T_INITRD_FLASH_DIR}"/l4t_initrd_flash.func #加载l4t_initrd_flash.func 的函数脚本文件
parse_param "$@" # $@代表执行脚本的传参,对传参进行解析

下面对函数parse_param注解

  • l4t_initrd_flash.func注解
    由于参数代码较多,针对使用到的代码进行注解
parse_param(){opstr+="u:p:v:c:-:S:k:i:"while getopts "${opstr}" OPTION; docase $OPTION inc) config_file=${OPTARG}; ;;#描述的是 NVMe 分区布局与烧录流程,用于设置 rootfs 等写入 NVMe 设备t) timeout=${OPTARG}; ;;k) target_partname=${OPTARG}; ;;S) external_size=${OPTARG}; ;;p) OPTIONS+=" ${OPTARG}"; ;;#传参描述的是 QSPI Flash 分区结构,用于板载 SPI 闪存u) KEY_FILE=${OPTARG}; ;;v) SBK_KEY=${OPTARG}; ;;i) ENC_RFS_KEY=${OPTARG}; ;;-) case ${OPTARG} inexternal-device)external_device="${!OPTIND}"; #获取传参external_device配置nvme0n1p1OPTIND=$((OPTIND + 1));;;network)network="${!OPTIND}"; #获取参数 usb0OPTIND=$((OPTIND + 1));;;showlogs)showlogs=1;;*) usage ;;esac;;*)usage;;esac;done
}

主脚本继续执行:

remove_udev_rules
install_udev_rules #用于识别 Jetson 设备(比如串口、USB 设备、mass storage)并设置合适的权限和处理行为
if [ "${flash_only}" = "0" ]; then# Generate flash images for both single flash and massflashecho "${flash_cmd} --no-flash $*"exit 0"${flash_cmd}" --no-flash "$@" #执行 Jetson 平台的 initrd-based 烧录流程echo "Finish generating flash package."
fi
  • 进入l4t_initrd_flash_internal.sh脚本
set -eo pipefail
L4T_INITRD_FLASH_DIR="$(cd "$(dirname "${0}")" && pwd)"
L4T_TOOLS_DIR="${L4T_INITRD_FLASH_DIR%/*}"
LINUX_BASE_DIR="${L4T_TOOLS_DIR%/*}"
BOOTLOADER_DIR="${LINUX_BASE_DIR}/bootloader"
ROOTFS_DIR="${LINUX_BASE_DIR}/rootfs"
# Change this if you want to use a different Rootfs for initrd nfs flash
NFS_ROOTFS_DIR="${ROOTFS_DIR}"
BOOT_CTRL_CONF="${ROOTFS_DIR}/etc/nv_boot_control.conf"
NFS_IMAGES_DIR="${L4T_INITRD_FLASH_DIR}/images"
INITRDDIR_L4T_DIR="${L4T_INITRD_FLASH_DIR}/initrd_flash"
KERNEL_FLASH_SCRIPT=""
FLASH_IMG_MAP="initrdflashimgmap.txt"
nargs=$#;
target_rootdev=${!nargs}; #解析传参 nvme0n1p1
nargs=$((nargs-1));
target_board=${!nargs};  #解析出传参 jetson-orin-nano-devkit
working_dir=$(mktemp -d)
TEMP_INITRD_FLASH_DIR=""
error_message=
CHIPID=$(LDK_DIR=${LINUX_BASE_DIR}; source "${LDK_DIR}/${target_board}.conf";echo "${CHIPID}")
with_systemimg=
CREATE_FLASH_SCRIPT="${L4T_INITRD_FLASH_DIR}/l4t_create_images_for_kernel_flash.sh"
export PATH="${L4T_INITRD_FLASH_DIR}/bin:${PATH}"
trap cleanup EXITexternal_device=""
append=""
should_exit=""
qspi=""
config_file=""
external_size=""
external_only=""
user_key=""
pv_crt=""
no_flash="0"
sparse_mode="0"
sshcon="$(mktemp)"
usb_instance=""
flash_only=0
OPTIONS=""
KEY_FILE=""
erase_all=""
device_instance="0"
target_partname=""
target_partfile=""
max_massflash=""
massflash_mode=""
SBK_KEY=""
keep=""
reuse=""
network=""
timeout=""
skipuid=""
initrd_only=""
reuse_package=""
direct=""
ENC_RFS_KEY=""
UEFI_KEYS_CONF=""
UEFI_ENC=""source "${L4T_INITRD_FLASH_DIR}"/l4t_kernel_flash_vars.func
source "${L4T_INITRD_FLASH_DIR}"/l4t_initrd_flash.func
source "${L4T_INITRD_FLASH_DIR}"/l4t_network_flash.funcparse_param "$@" #解析新增的脚本传参 --no-flash $*
check_prerequisite #检查网络配置
get_max_flash
  • 解析check_prerequisite函数如下:
get_max_flash()
{#LDK_DIR=${LINUX_BASE_DIR}:临时设置环境变量 LDK_DIR#source "${LDK_DIR}/${target_board}.conf":加载 jetson-orin-nano-devkit.conf 配置文件#echo "${MAX_MASSFLASH}":获取该配置文件中定义的 MAX_MASSFLASH 变量MAX_MASSFLASH=$(LDK_DIR=${LINUX_BASE_DIR}; source "${LDK_DIR}/${target_board}.conf";echo "${MAX_MASSFLASH}")if [ "${massflash_mode}" = "1" ]; thenmax_massflash=${max_massflash:-${MAX_MASSFLASH:-${DEFAULT_MAX_MASSFLASH}}}elsemax_massflash=1  #代表不需要批量并发,再普通烧录模式fi
}

继续l4t_initrd_flash_internal.sh脚本注解

if [ "${flash_only}" = "0" ]; then #判断是否只烧录if [ -z "${initrd_only}" ] && [ -z "${reuse_package}" ]; then #判断是否为空,然后准备initrd镜像,烧录包cat <<EOF
************************************
*                                  *
*  Step ${initrd_flash_step}: Generate flash packages *
*                                  *
************************************
EOFgenerate_flash_package #组合一个命令((initrd_flash_step+=1))fi
cat <<EOF
******************************************
*                                        *
*  Step ${initrd_flash_step}: Generate rcm boot commandline *
*                                        *
******************************************
EOFgenerate_rcm_bootcmdrm -f "${L4T_INITRD_FLASH_DIR}/${FLASH_IMG_MAP}"for i in $(seq 0 "$((max_massflash - 1))")dogenerate_flash_initrd "${i}"done((initrd_flash_step+=1))if [ "${massflash_mode}" = "1" ]; thenrm -rf "${LINUX_BASE_DIR}/mfi_${target_board}/"mkdir -p "${LINUX_BASE_DIR}/mfi_${target_board}/"package "${LINUX_BASE_DIR}/mfi_${target_board}/" "$(cat "${BOOTLOADER_DIR}/flashcmd.txt")" "${CHIPID}"tar -zcvf "${LINUX_BASE_DIR}/mfi_${target_board}.tar.gz" -C "${LINUX_BASE_DIR}" "./mfi_${target_board}"echo "Massflash package is generated at ${LINUX_BASE_DIR}/mfi_${target_board}.tar.gz"fi
fi
  • 函数generate_flash_package 注解
generate_flash_package()
{local cmdcmd=("${CREATE_FLASH_SCRIPT}")if [ -n "${external_device}" ]; thencmd+=("--external-device" \"${external_device}" "-c" "${config_file}")if [ -n "${external_size}" ]; thencmd+=("-S" "${external_size}")fifiif [ -n "${append}" ]; thencmd+=("--append")fiif [ -n "${external_only}" ]; thencmd+=("${external_only}")fiif [ -n "${OPTIONS}" ]; thencmd+=("-p" "${OPTIONS}")fiif [ -n "${KEY_FILE}" ] && [ -f "${KEY_FILE}" ]; thencmd+=("-u" "${KEY_FILE}")fiif [ -n "${SBK_KEY}" ] && [ -f "${SBK_KEY}" ]; thencmd+=("-v" "${SBK_KEY}")fiif [ -n "${user_key}" ] && [ -f "${user_key}" ]; thencmd+=("--user_key" "${user_key}")fiif [ -n "${pv_crt}" ] && [ -f "${pv_crt}" ]; thencmd+=("--pv-crt" "${pv_crt}")fiif [ -n "${target_partname}" ]; thencmd+=("-k" "${target_partname}")fiif [ -n "${target_partfile}" ]; thencmd+=("--image" "${target_partfile}")fiif [ -n "${with_systemimg}" ]; thencmd+=("--with-systemimg")fiif [ -n "${ENC_RFS_KEY}" ] && [ -f "${ENC_RFS_KEY}" ]; thencmd+=("-i" "${ENC_RFS_KEY}")fiif [ -n "${UEFI_KEYS_CONF}" ] && [ -f "${UEFI_KEYS_CONF}" ]; thencmd+=("--uefi-keys" "${UEFI_KEYS_CONF}")fiif [ -n "${UEFI_ENC}" ] && [ -f "${UEFI_ENC}" ]; thencmd+=("--uefi-enc" "${UEFI_ENC}")fi[ "${sparse_mode}" = "1" ] && cmd+=("--sparse")cmd+=("${target_board}" "${target_rootdev}")#执行命令:./Linux_for_Tegra/tools/kernel_flash/l4t_create_images_for_kernel_flash.sh #--external-device nvme0n1p1 -c ./tools/kernel_flash/flash_l4t_t234_nvme.xml #-p  -c ./bootloader/t186ref/cfg/flash_t234_qspi.xml jetson-orin-nano-devkit nvme0n1p1"${cmd[@]}"
}

l4t_create_images_for_kernel_flash.sh说明

L4T_NFSFLASH_DIR="$(cd "$(dirname "${0}")" && pwd)"
L4T_TOOLS_DIR="${L4T_NFSFLASH_DIR%/*}"
LINUX_BASE_DIR="${L4T_TOOLS_DIR%/*}"
BOOTLOADER_DIR="${LINUX_BASE_DIR}/bootloader"
NFS_IMAGES_DIR="${L4T_NFSFLASH_DIR}/images"
COMMON_TAR_OPTIONS=("--checkpoint=10000" "--warning=no-timestamp" \
"--numeric-owner")
KERNEL_FLASH_SCRIPT=l4t_flash_from_kernel.sh
OPTIONS=""
nargs=$#;
target_rootdev=${!nargs};
nargs=$((nargs-1));
target_board=${!nargs};
external_device=""
config_file=""
external_size=""
append=""
target_partname=""
tmp_log=$(mktemp)
external_only=0
EXTOPTIONS="${EXTOPTIONS}"
with_systemimg=
UEFI_KEYS_CONF=""
UEFI_ENC=""
source "${L4T_NFSFLASH_DIR}"/l4t_kernel_flash_vars.funcif [ "${USER}" != "root" ]; thenecho "${0} requires root privilege";exit 1;
fiif [ $# -lt 2 ]; thenusage;
fi;opstr+="k:u:p:v:c:-:S:i:"
while getopts "${opstr}" OPTION; docase $OPTION inc) config_file=${OPTARG}; ;;p) OPTIONS=${OPTARG}; ;;k) target_partname=${OPTARG}; ;;u) KEY_FILE=${OPTARG}; ;;v) SBK_KEY=${OPTARG}; ;;S) external_size=${OPTARG}; ;;i) ENC_RFS_KEY=${OPTARG}; ;;-) case ${OPTARG} inappend) append=1; ;;external-only) external_only=1; ;;external-device)external_device="${!OPTIND}";OPTIND=$((OPTIND + 1));;;sparse) sparse_mode=1; ;;usb-instance)usb_instance="${!OPTIND}";OPTIND=$((OPTIND + 1));;;user_key)user_key="${!OPTIND}";OPTIND=$((OPTIND + 1));;;pv-crt)pv_crt="${!OPTIND}";OPTIND=$((OPTIND + 1));;;image)target_partfile=${OPTARG};OPTIND=$((OPTIND + 1));;;with-systemimg)with_systemimg=1;;uefi-keys)UEFI_KEYS_CONF="${!OPTIND}";OPTIND=$((OPTIND + 1));;;uefi-enc)UEFI_ENC="${!OPTIND}";OPTIND=$((OPTIND + 1));;;*) usage ;;esac;;*)usage;;esac;
done
if [ "${external_only}" = "1" ]; thenEXTOPTIONS="${OPTIONS}"
fi
ENCRYPTED_SIGNED_DIR="${BOOTLOADER_DIR}/$(get_images_dir)"
FLASH_INDEX_FILE="${ENCRYPTED_SIGNED_DIR}/flash.idx"
INTERNAL="internal"
EXTERNAL="external"
FLASH_XML_FILE="${ENCRYPTED_SIGNED_DIR}/flash.xml.tmp"
CHIPID=$(LDK_DIR=${LINUX_BASE_DIR}; source "${LDK_DIR}/${target_board}.conf";echo "${CHIPID}")
check_prereq #检查是否安装了 libxml2-utils 组件
#下面进行参数的检查
if [ -n "${external_device}" ]; thenif [ -z "${config_file}" ]; thenusagefiif [[ ! "${external_device}" =~ ^nvme[0-9]+n[0-9]+(p[0-9]+)?$ \&& ! "${external_device}" =~ ^sd[a-z]+[0-9]*&& ! "${external_device}" =~ ^mmcblk[1-9][0-9]*(p[0-9]+)?$ ]]; thenecho "${external_device} is not a supported external storage device"exit 1fi
fi
#判断是否存在flash.sh脚本文件
if [ ! -f "${LINUX_BASE_DIR}/flash.sh" ]; thenecho "Error: ${LINUX_BASE_DIR}/flash.sh is not found"exit 1
fi
generate_flash_images #生成需要烧写的flash数据包
echo "Success"

下面开始对函数generate_flash_images以及里面的子函数进行注解

function generate_signed_images()
{local options="${1}"local external="${2}"local rootdev="${3}"local board_arg=local cmd_arg="--no-flash --sign "if [ "${external}" = "1" ]; thencmd_arg+="--external-device -c \"${config_file}\" "if [ -n "${external_size}" ]; thencmd_arg+="-S \"${external_size}\" "fiif [ "${rootdev}" != "eth0" ]; thenboard_arg="BOOTDEV=${rootdev} "fifiboard_arg+="ADDITIONAL_DTB_OVERLAY=\"${ADDITIONAL_DTB_OVERLAY_OPT}\" "if [ -n "${KEY_FILE}" ] && [ -f "${KEY_FILE}" ]; thencmd_arg+="-u \"${KEY_FILE}\" "fiif [ -n "${SBK_KEY}" ] && [ -f "${SBK_KEY}" ]; thencmd_arg+="-v \"${SBK_KEY}\" "fiif [ -n "${user_key}" ]; thencmd_arg+="--user_key \"${user_key}\" "fiif [ -n "${pv_crt}" ]; thencmd_arg+="--pv-crt \"${pv_crt}\" "fiif [ -n "${usb_instance}" ]; thencmd_arg+="--usb-instance \"${usb_instance}\" "fiif [ -n "${target_partname}" ]; thencmd_arg+="-k \"${target_partname}\" "fiif [ -n "${target_partfile}" ]; thencmd_arg+="--image \"${target_partfile}\" "fiif [ -n "${with_systemimg}" ]; thencmd_arg+="--with-systemimg "fiif [ -n "${ENC_RFS_KEY}" ] && [ -f "${ENC_RFS_KEY}" ]; thencmd_arg+="-i \"${ENC_RFS_KEY}\" "fiif [ -n "${UEFI_KEYS_CONF}" ] && [ -f "${UEFI_KEYS_CONF}" ]; thencmd_arg+="--uefi-keys \"${UEFI_KEYS_CONF}\" "fiif [ -n "${UEFI_ENC}" ] && [ -f "${UEFI_ENC}" ]; thencmd_arg+="--uefi-enc \"${UEFI_ENC}\" "ficmd_arg+="${options} ${target_board} ${rootdev}"cmd="${board_arg} ${LINUX_BASE_DIR}/flash.sh ${cmd_arg}"export BOARDIDexport FABexport BOARDSKUexport BOARDREVexport CHIP_SKUexport RAMCODE_IDexport RAMCODEecho "Generate images to be flashed"#输出命令:./Linux_for_Tegra/flash.sh --no-flash --sign  -c ./bootloader/t186ref/cfg/flash_t234_qspi.xml jetson-orin-nano-devkit nvme0n1p1echo -e "${cmd}\r\n"#进行执行命令并输出打印eval "${cmd}" | tee "${tmp_log}"return $?
}
function generate_flash_images()
{echo "Create folder to store images to flash"#新建文件夹:/Linux_for_Tegra/tools/kernel_flash/images/internal#新建/Linux_for_Tegra/tools/kernel_flash/images/externalif [[ -z "${append}" && -z "${target_partname}" ]]; thenrm -rf "${NFS_IMAGES_DIR}"mkdir -p "${NFS_IMAGES_DIR}/${INTERNAL}"mkdir -p "${NFS_IMAGES_DIR}/${EXTERNAL}"chmod 755 "${NFS_IMAGES_DIR}"chmod 755 "${NFS_IMAGES_DIR}/${INTERNAL}"chmod 755 "${NFS_IMAGES_DIR}/${EXTERNAL}"fi# generate all the images needed for flashingif [ "${external_only}" = "0" ]; thenecho "Generate image for internal storage devices"if ! generate_signed_images "${OPTIONS}" 0 "${target_rootdev}"; thenecho "Error: failed to generate images"exit 1fi# relocate the images we just create to the designated folderif ! package_images "0"; thenecho "Error: failed to relocate images to ${NFS_IMAGES_DIR}"exit 1fifi
}

flash.sh 脚本注解

if [ $# -lt 2 ]; thenusage allunknown 1;
fi;nargs=$#;
target_rootdev=${!nargs};
nargs=$(($nargs-1));
ext_target_board=${!nargs};# NV internal
_nvbrd_trk=0if [ ! -r ${ext_target_board}.conf ]; thenecho "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}");ext_target_board_canonical=$(readlink -e "${ext_target_board}".conf)
ext_target_board_canonical=$(basename "${ext_target_board_canonical}" .conf)
GENERIC="generic"
disk_enc_enable=0;
rootfs_ab=0;
source ${ext_target_board}.conf # jetson-orin-nano-devkit.conf
# Use the specified board family if it has.
if [ "${BOARD_FAMILY}" != "" ]; thentarget_board=${BOARD_FAMILY}
fi
# 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}:${BL_DIR}";		# preference on our DTC
DTB_DIR="${KERNEL_DIR}/dtb";
DTC="${KERNEL_DIR}/dtc";
L4T_CONF_DTBO="${BL_DIR}/L4TConfiguration.dtbo"
if [ "${BINSARGS}" = "" -a "${BINS}" != "" ]; then			#COMPATBINARGS="--bins \"";						#COMPAT
fi;									#COMPAT
if [ "${BINSARGS}" != "" ] && [ "${CHIPID}" != "0x23" ]; thenSKIPUID="--skipuid";
fi;
# Print BSP Info:
#
echo "${INFODIVIDER}";
echo "# L4T BSP Information:";
if [ -f "${LDK_DIR}/nv_tegra/bsp_version" ]; thensource "${LDK_DIR}/nv_tegra/bsp_version"echo "# R${BSP_BRANCH} , REVISION: ${BSP_MAJOR}.${BSP_MINOR}"
elif [ -f "${LDK_DIR}/rootfs/etc/nv_tegra_release" ]; thenhead -n1 "${LDK_DIR}/rootfs/etc/nv_tegra_release" | \sed -e s/DATE:/\\n\#\ DATE:/;
elseecho "# Unknown Release";
fi;
#将用户信息写入到rootfs里面
if [ -f "${LDK_DIR}/nv_tegra/user_version" ]; thensource "${LDK_DIR}/nv_tegra/user_version"echo "# User release: ${USER_VERSION}"# Store user release version into rootfs/etc/user_release_versionecho -n "# User release: ${USER_VERSION}" >"${LDK_DIR}/rootfs/etc/user_release_version"
fi
echo "${INFODIVIDER}";
# Determine rootdev_type
#判断rootdev_type 类型
rootdev_type="external";
if [[ "${target_rootdev}" == "internal" || "${target_rootdev}" == mmcblk0p* || \"${target_rootdev}" == ${BOOTDEV} ]]; thenrootdev_type="internal";INITRD="";if [ ${disk_enc_enable} -eq 1 ] && [ "${target_rootdev}" != "internal" ]; thenecho "Change device boot from ${target_rootdev} to internal"target_rootdev="internal";fi
elif [ "${target_rootdev}" = "eth0" -o "${target_rootdev}" = "eth1" ]; thenrootdev_type="network";disk_enc_enable=0;
elif [[ "${target_rootdev}" != "external" && "${target_rootdev}" != mmcblk1p* && \"${target_rootdev}" != sd* && "${target_rootdev}" != nvme* ]]; thenecho "Error: Invalid target rootdev($target_rootdev).";usage rootdevunknown 1;
fi;if [[ "${rootdev_type}" == "external" && "${disk_enc_enable}" -eq 1 ]]; thenecho "Error: When disk encryption is enabled, root device cannot be ${target_rootdev}"exit 1;
fi;
# Import disk encryption helper function
#
if [ ${disk_enc_enable} -eq 1 ]; thendisk_encryption_helper_dir="${LDK_DIR}/tools/disk_encryption";if [ ! -f "${disk_encryption_helper_dir}/disk_encryption_helper.func" ]; thenecho "Error: disk encryption is not supported."exit 1fisource "${disk_encryption_helper_dir}/disk_encryption_helper.func"
fi;rootfsuuid="";
rootfsuuid_enc="";
rootfsuuid_ext="";
rootfsuuid_ext_enc="";
rootfsuuid_b="";
rootfsuuid_b_enc="";
rootfsuuid_b_ext=""
rootfsuuid_b_ext_enc="";
cmdline_b="";rootfsuuidfile="${BL_DIR}/l4t-rootfs-uuid.txt"
read_part_name="";
rcm_boot=0;
no_root_check=0;
no_flash=0;
kdump_enable=0;
rapid_boot=0
external_device=0;
sparseupdate=0;
no_systemimg=0;
bup_blob=0;
single_bup_blob=0;
single_bup_name="";
bup_type="";
to_sign=0;
support_multi_spec=0;
clean_up=0;
_ODMDATA="";
with_systemimg=
OVERLAY_DTB_FILE="${OVERLAY_DTB_FILE},${ADDITIONAL_DTB_OVERLAY}"
boot_chain_flash="ALL";
boot_chain_select="A";
opstr+="c:d:f:h:i:k:m:n:o:rt:u:v:w:x:B:C:F:G:I:K:L:M:N:R:S:T:Z:-:";
while getopts "${opstr}" OPTION; docase $OPTION inc) CFGFILE=${OPTARG}; ;;d) DTBFILE=${OPTARG}; ;;f) FLASHAPP=${OPTARG}; ;;h) usage allunknown 0; ;;i) ENC_RFS_KEY=${OPTARG}; ;;k) target_partname=${OPTARG}; ;;	# cmdline onlym) MTSPREBOOT=${OPTARG}; ;;n) NFSARGS=${OPTARG}; ;;o) _ODMDATA=${OPTARG}; ;;r) reuse_systemimg="true"; ;;		# cmdline onlyt) TEGRABOOT=${OPTARG}; ;;u) dbmaster="${OPTARG}"; ;;v) SBKKEY=${OPTARG}; ;;w) WB0BOOT=${OPTARG}; ;;x) tegraid=${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}; ;;R) ROOTFS_DIR=${OPTARG}; ;;S) ROOTFSSIZE=${OPTARG}; ;;T) EXT_NUM_SECTORS=${OPTARG}; ;;Z) zflag="true"; ;;			# cmdline only-) case ${OPTARG} inno-root-check) no_root_check=1; ;;no-flash) no_flash=1; ;;kdump) kdump_enable=1; ;;no-systemimg) no_systemimg=1; ;;external-device) external_device=1; ;;sparseupdate) sparseupdate=1; ;;rcm-boot) rcm_boot=1; ;;# allow payload generation to happen without sudo optionbup) no_root_check=1;bup_blob=1; ;;single-image-bup)single_bup_blob=1;single_bup_name="${!OPTIND}";OPTIND=$(($OPTIND + 1));;;bup-type)bup_type="${!OPTIND}";OPTIND=$(($OPTIND + 1));;;sign) to_sign=1; ;;multi-spec) support_multi_spec=1; ;;clean-up) clean_up=1; ;;usb-instance)usb_instance="${!OPTIND}";OPTIND=$(($OPTIND + 1));;;image)write_image_name="${!OPTIND}";OPTIND=$(($OPTIND + 1));;;tosfile)TOSFILE="${!OPTIND}";OPTIND=$(($OPTIND + 1));;;pv-crt)PVCERT="${!OPTIND}";OPTIND=$(($OPTIND + 1));;;pv-enc)PVENC="${!OPTIND}";OPTIND=$(($OPTIND + 1));;;uda-dir)UDADIR="${!OPTIND}";OPTIND=$(($OPTIND + 1));;;uefi-keys)UEFI_KEYS_CONF="${!OPTIND}";OPTIND=$(($OPTIND + 1));;;uefi-enc)UEFI_ENC="${!OPTIND}";OPTIND=$(($OPTIND + 1));;;boot-chain-flash)boot_chain_flash="${!OPTIND}";# store user string in uppercaseboot_chain_flash="${boot_chain_flash^^}"OPTIND=$(($OPTIND + 1));;;boot-chain-select)boot_chain_select="${!OPTIND}";# store user string in uppercaseboot_chain_select="${boot_chain_select^^}"OPTIND=$(($OPTIND + 1));;;with-systemimg)with_systemimg=1;;*) usage allunknown 1; ;;esac;;*) usage allunknown 1; ;;esac;
done# if the user is not root, there is not point in going forward unless
# the user knows what he's doing.
if [ "${no_root_check}" != "1" ] && [ "${USER}" != "root" ]; thenecho "flash.sh requires root privilege";exit 1;
fi
#进行的参数检查
if [[ "${BUILD_SD_IMAGE}" == 1 && "${no_flash}" == 0 ]]; thenecho "*** The option BUILD_SD_IMAGE must work with --no-flash flag. ***"echo "Exiting now...";exit 1;
fi;if [ "${boot_chain_flash}" != "A" ] && [ "${boot_chain_flash}" != "B" ] && [ "${boot_chain_flash}" != "ALL" ]; thenecho "Boot chain ${boot_chain_flash} not recognized. Valid options are A/a, B/b or all.";exit 1;
fi;if [ "${CHIPID}" = "0x19" ] && [ "${boot_chain_flash}" = "B" ]; thenecho "Flashing only boot chain ${boot_chain_flash} not supported for this chip.";exit 1;
fi;# Validate the option "--boot-chain-select"
# Only 2 boot chains (A and B) are supported currently
if [ "${boot_chain_select}" != "A" ] && [ "${boot_chain_select}" != "B" ]; thenecho "Selected boot chain ${boot_chain_select} is invalid. Valid options are A/a or B/b.";exit 1;
fi;# If "--boot-chain-flash" is not set to "all", make sure that
# the selected boot chain is the same as the flashed chain.
if [ "${boot_chain_flash}" != "ALL" ] && [ "${boot_chain_flash}" != "${boot_chain_select}" ]; thenecho "Flashed chain (${boot_chain_flash}) is different from selected boot chain (${boot_chain_select}).";exit 1
fi;# get key file if -u option provided
keyfile=""; #判断是否使用密钥文件
if [ "${dbmaster}" != "" ]; thenif [[ ${dbmaster} =~ ^/ ]]; thenkeyfile="${dbmaster}";elsekeyfile=$(readlink -f "${dbmaster}");fi;if [ ! -f "${keyfile}" ]; thenecho "Error: keyfile ${keyfile} not found";exit 1;fi;
fi;
# get sbk key file if -v option provided
sbk_keyfile="";
echo "--------------SBKKEY--------------:${SBKKEY}"
if [ "${SBKKEY}" != "" ]; then# when sbk key is present, pkc key must be presentif [ "${keyfile}" = "" ]; thenecho "Error: missing PKC key; try -u";exit 1;fi;sbk_keyfile=$(readlink -f "${SBKKEY}");if [ ! -f "${sbk_keyfile}" ]; thenecho "Error: keyfile ${sbk_keyfile} not found";exit 1;fi;
fi;
pv_pub_key_hash=""
if [ "${PVCERT}" != "" ]; thenif [ "${keyfile}" = "" ] || [ ! -f "${keyfile}" ]; thenecho "Error: missing PKC key; try -u";exit 1;fi;pv_certfile=$(readlink -f "${PVCERT}");if [ ! -f "${pv_certfile}" ]; thenecho "Error: certificate file ${pv_certfile} not found";exit 1;fi;certpubkey=$(mktemp)certpkh=$(mktemp)pushd "$BL_DIR" > /dev/null 2>&1;openssl x509 -in "${pv_certfile}" -noout -modulus -out "${certpubkey}"./tegrasign_v3.py --pubkeyhash "${certpubkey}" "${certpkh}" "rsa" --sha sha512pv_pub_key_hash="$(xxd -p -e "${certpkh}" | cut -c 11-46 | tr -d ' ' | tr -d '\n' | sed 's/.\{8\}/0x& /g')"rm -rf "${certpubkey}" "${certpkh}"popd > /dev/null 2>&1;
fi;
pv_enc_key="";
pv_enc_content="0 0 0 0 0 0 0 0"
if [ "${PVENC}" != "" ]; thenif [ "${CHIPID}" != "0x23" ]; thenecho "Error: PV key encryption feature is not supported on this platform";exit 1;fi;pv_enc_key=$(readlink -f "${PVENC}");if [ ! -f "${pv_enc_key}" ]; thenecho "Error: keyfile ${pv_enc_key} not found";exit 1;fi;pv_enc_content=$(<"$pv_enc_key")
fi;uefi_secure_dtbo=""
# get uefi keys config file if --uefi-keys option is provided
if [ "${UEFI_KEYS_CONF}" != "" ]; thenuefi_keys_conf=$(readlink -f "${UEFI_KEYS_CONF}");if [ ! -f "${uefi_keys_conf}" ]; thenecho "Error: UEFI keys conf file ${uefi_keys_conf} not found";exit 1;fi;source "${uefi_keys_conf}"# cd to ${uefi_keys_conf}'s directoryuefi_keys_conf_dir=$(dirname "${uefi_keys_conf}")pushd "${uefi_keys_conf_dir}" > /dev/null 2>&1 || exit 1mkfilesoft uefi_db_key  "${UEFI_DB_1_KEY_FILE}" ""mkfilesoft uefi_db_cert  "${UEFI_DB_1_CERT_FILE}" ""# Copy the dtbo fileif [ ${bup_blob} -eq 1 ]; thenuefi_secure_dtbo="UefiUpdateSecurityKeys.dtbo"elseuefi_secure_dtbo="UefiDefaultSecurityKeys.dtbo"fiif [ ! -f "${uefi_secure_dtbo}" ]; thenecho "Error: ${uefi_secure_dtbo} not found"echo "Run 'gen_uefi_keys_dts.sh <keys_conf>' first"exit 1;ficp  "${uefi_secure_dtbo}" "${LDK_DIR}"/bootloader/"${uefi_secure_dtbo}"# Add the dtbo to OVERLAY_DTBOVERLAY_DTB_FILE="${OVERLAY_DTB_FILE}","${uefi_secure_dtbo}"popd  > /dev/null 2>&1 || exit 1
fi;uefi_enc_key="";
uefi_enc_content="0 0 0 0 0 0 0 0"
if [ "${UEFI_ENC}" != "" ]; thenif [ "${UEFI_KEYS_CONF}" == "" ]; thenecho "Error: '--uefi-enc' option needs '--uefi-keys' option specified to work "exit 1;fiuefi_enc_key=$(readlink -f "${UEFI_ENC}");if [ ! -f "${uefi_enc_key}" ]; thenecho "Error: keyfile ${uefi_enc_key} not found";exit 1;fi;uefi_enc_content=$(<"$uefi_enc_key")echo "uefi_enc_content= ${uefi_enc_content}"uefi_enc_hex=$(convert_key_to_hex "${uefi_enc_key}")key_len=${#uefi_enc_hex}if [ "${CHIPID}" = "0x23" ]; thenif [ "${key_len}" != 64 ]; thenecho "Error: key size has to be 64"exit 1;fielif [ "${CHIPID}" = "0x19" ]; thenif [ "${key_len}" != 32 ]; thenecho "Error: key size has to be 32"exit 1;fifi
fi;# get enc rfs key file if -i option provided
enc_rfs_keyfile="";
if [ "${ENC_RFS_KEY}" != "" ]; thenenc_rfs_keyfile=$(readlink -f "${ENC_RFS_KEY}");if [ ! -f "${enc_rfs_keyfile}" ]; thenecho "Error: keyfile ${enc_rfs_keyfile} not found";exit 1;fi;
fi;ECID="";
# get the fuse level and update the data accordingly
fuselevel="${FUSELEVEL}";
hwchipid="";
hwchiprev="${CHIPREV}";
if [ "${hwchiprev}" = "" ]; thenif [ "${CHIPID}" = "0x19" ]; thenhwchiprev="2";elsehwchiprev="0";fi
fi;
bootauth="";
if [ "${fuselevel}" = "" ]; thenget_fuse_level fuselevel hwchipid bootauth;# fuselevel_unknown or empty will be handled as fuselevel_productionif [ "${fuselevel}" = "fuselevel_unknown" ] || [ "${fuselevel}" = "" ]; thenfuselevel="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 ]; thenprocess_fuse_level "${fuselevel}"; #修改一些名字
fi;
#
# Handle -G option for reading partition image to file
#
if [ "${read_part_name}" != "" ]; then# Exit if no -k optionif [ "${target_partname}" = "" ]; thenecho "Error: missing -k option to specify partition name";exit 1;fi# Exit if --image option is provided for write partitionif [ "${write_image_name}" != "" ]; thenecho "Error: not support to write partition while reading partition";exit 1;fi# Exit if path is invalidget_full_path ${read_part_name} read_part_name;
fi;#
# Handle --image option for writing image to specified partition
#
if [ "${write_image_name}" != "" ]; then# Exit if no -k optionif [ "${target_partname}" = "" ]; thenecho "Error: missing -k option to specify partition name";exit 1;fi# Exit if file does not existif [ ! -f "${write_image_name}" ]; thenecho "Error: ${write_image_name} does not exist";exit 1;fi;# Exit if path is invalidget_full_path ${write_image_name} write_image_name;
fi;# SoC Sanity Check
if [ ${no_flash} -eq 0 ]; thenchk_soc_sanity; #通过usb检查soc系统的usb识别
fi;
###########################################################################
# System mandatory vars for dumping eeprom:
#初始化相关配置文件路径
mkfilesoft emc_fuse_dev_params     "${TARGET_DIR}/BCT/${EMC_FUSE_DEV_PARAMS}" ""; #内存控制器设置(EMC)
mkfilesoft emcfuse	"${EMCFUSE}"	"${BL_DIR}/${EMCFUSE}"; #Fuse(熔丝),一旦烧写就无法更改的永久性存储区域
mkfilesoft device_config  "${TARGET_DIR}/BCT/${DEVICE_CONFIG}" "";
mkfilesoft misc_config    "${TARGET_DIR}/BCT/${MISC_CONFIG}" ""; #其它杂项配置,如调试、GPIO、SPI 等初始化信息if [ "${CHIPID}" = "0x23" ]; then# READINFOFILE must be defined for 0x23 boards in order to dump its eeprom.mkfilepath readinfofile    "${READINFOFILE}" ""; #配置文件bootloader/readinfo_t234_min_prod.xml
fi
mkfilesoft mb2applet    "${APPLET}"	 ""; #配置文件bootloader/applet_t234.bin
# get the board version and update the data accordingly
if declare -F -f process_board_version > /dev/null 2>&1; thenboard_FAB="${FAB}";board_id="${BOARDID}";board_sku="${BOARDSKU}";board_revision="${BOARDREV}"if [ "${FORCE_ACCESS}" != "" ] || [ "${board_FAB}" == "" ]; thenif [ "${hwchipid}" != "" ]; thenget_board_version board_id board_FAB board_sku board_revision emcfuse_bin; _nvbrd_trk=1;BOARDID="${board_id}";BOARDSKU="${board_sku}";FAB="${board_FAB}";BOARDREV="${board_revision}";fi;fi;process_board_version "${board_id}" "${board_FAB}" "${board_sku}" "${board_revision}" "${hwchiprev}"; #获取板子的文件配置路径
fi;
if declare -F -f process_chip_sku_version > /dev/null 2>&1; thenchip_SKU="${CHIP_SKU}";chip_minor_revision_ID="${CHIP_MINOR}";bootrom_revision_ID="${BOOTROM_ID}";ramcode_ID="${RAMCODE_ID}";if [ "${FORCE_ACCESS}" != "" ] || [ "${chip_SKU}" == "" ]; thenif [ "${hwchipid}" != "" ]; thenget_chip_info_details chip_SKU chip_minor_revision_ID bootrom_revision_ID ramcode_ID;CHIP_SKU="${chip_SKU}";CHIP_MINOR="${chip_minor_revision_ID}";BOOTROM_ID="${bootrom_revision_ID}";RAMCODE_ID="${ramcode_ID}";fifi;process_chip_sku_version "${chip_SKU}" "${chip_minor_revision_ID}" "${bootrom_revision_ID}" "${ramcode_ID}" "${fuselevel}" "${board_FAB}"; #获取板子的sku(型号)配置信息
fi;
# This variable is defined in the board config file
emcfuse_value="${EMCFUSE_VALUE}"
if declare -F -f update_flash_args > /dev/null 2>&1; then# this variable is defined in get_board_version functionupdate_flash_args "${emcfuse_bin}" "${emcfuse_value}"
fiif declare -F -f update_emmc_cfg_for_bup > /dev/null 2>&1; thenupdate_emmc_cfg_for_bup "${bup_type}" #自动调整 eMMC 分区
fi# convert fuselevel to digit string 
#代表是否量产安全设备
if [ "${fuselevel}" == "fuselevel_nofuse" ]; thenfuselevel_s="0";
elsefuselevel_s="1";
fi;# Set board spec: BOARD_ID-FAB-BOARDSKU-BOARDREV-NV_PRODUCTION-CHIP_REV-BOARD_NAME-
spec="${BOARDID}-${FAB}-${BOARDSKU}-${BOARDREV}-${fuselevel_s}-${hwchiprev}-${ext_target_board}-";
# Make sure spec length is less than maximum supported by BUP (128)
MAX_SPEC_LEN=128if ((${#spec} > ${MAX_SPEC_LEN})); thenecho "Error: spec length exceeds ${MAX_SPEC_LEN}, ${spec}(len=${#spec})"exit 1
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
ACR_TYPE="${ACR_TYPE:-acr-debug}";		# default is acr-debug
fillpat="${FSFILLPATTERN:-0}";			# no cmdline: default=0
no_rootfs="${NO_ROOTFS:-0}" 			# default is 0
no_recovery_img="${NO_RECOVERY_IMG:-0}"
no_esp_img="${NO_ESP_IMG:-0}"
ext_num_sectors="${EXT_NUM_SECTORS:-122159104}"
boardid="${BOARDID}";
if [ "${tegraid}" = "" ]; thentegraid="${CHIPID}";
fi;if [ -z "${DFLT_KERNEL}" ]; thenDFLT_KERNEL=${KERNEL_DIR}/Image;
elsebasekernel=$(basename "${DFLT_KERNEL}");if [ "${DFLT_KERNEL}" = "${basekernel}" ]; thenDFLT_KERNEL="${KERNEL_DIR}/${DFLT_KERNEL}";fi;
fi;
if [ -z "${DFLT_KERNEL_FS}" ]; thenDFLT_KERNEL_FS=${DFLT_KERNEL};
fi;
if [ -z "${DFLT_KERNEL_IMAGE}" ]; thenDFLT_KERNEL_IMAGE=${DFLT_KERNEL};
fi;# as ODMDATA can be overwritten by process_board_version, overwrite with user specified option here.
if [ -n "${_ODMDATA}" ]; then# used by setval function belowODMDATA=${_ODMDATA};
fi
###########################################################################
# System mandatory vars:
#
setval     odmdata	ODMDATA;	# .conf mandatory
setval     rootfs_type	ROOTFS_TYPE;
setval     devsectsize	DEVSECTSIZE;
getsize    rootfssize	ROOTFSSIZE;	# .conf mandatory
getsize    recrootfssize RECROOTFSSIZE;
mkfilepath flashapp	"${FLASHAPP}"	"${BL_DIR}/tegraflash.py";
mkfilepath flasher	"${FLASHER}"	"";
mkfilepath bootloader	"${BOOTLOADER}"	"${BL_DIR}/cboot.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}";
if [ "${CHIPID}" = "0x19" ]; thenmkfilepath bctfile1	"${BCTFILE1}"	"${TARGET_DIR}/BCT/${EMMC_BCT1}";
fi;
mkfilepath cfgfile	"${CFGFILE}"	"${TARGET_DIR}/cfg/${EMMC_CFG}";
if [ "${NO_KERNEL_DTB}" = "1" ]; thenmkfilepath dtbfile	"${DTBFILE}"	"${BL_DIR}/${DTB_FILE}";
elsemkfilepath dtbfile      "${DTBFILE}"    "${DTB_DIR}/${DTB_FILE}";
fi;mkfilesoft kernelinitrd	"${INITRD}"	"${BL_DIR}/l4t_initrd.img";
mkfilesoft tegraboot	"${TEGRABOOT}"	"${TARGET_DIR}/nvtboot.bin";
mkfilesoft wb0boot	"${WB0BOOT}"	"${TARGET_DIR}/nvtbootwb0.bin";
mkfilesoft mb2_rf	"${MB2_RF}"	"";
mkfilesoft psc_rf	"${PSC_RF}"	"";
mkfilesoft cpu_bootloader	"${BOOTLOADER}"	"";
mkfilesoft mtspreboot	"${MTSPREBOOT}"	"${BL_DIR}/mts_preboot_si";
mkfilesoft ist_ucode	"${IST_UCODE}"	"";
mkfilesoft ist_bpmpfw	"${IST_BPMPFW}"	"";
mkfilesoft mcepreboot	"${MTS_MCE}"	"${BL_DIR}/${MTS_MCE}";
mkfilesoft mtsproper	"${MTSPROPER}"	"${BL_DIR}/${MTSPROPER}";
mkfilesoft mts		"${MTS}"	"${BL_DIR}/mts_si";
mkfilesoft mb1file	"${MB1FILE}"	"${BL_DIR}/mb1_prod.bin";
if [ "${BPFFILE}" != "" -a \"${BPFBASEFILE}" != "" -a "${BPFBASEDTBFILE}" != "" -a \-f "${BPFBASEFILE}" -a -f "${BPFBASEDTBFILE}" ]; thencat "${BPFBASEFILE}" "${BPFBASEDTBFILE}" > "${BPFFILE}";
fi;
mkfilesoft bpffile	"${BPFFILE}"	"${BL_DIR}/bpmp.bin";
mkfilesoft fsifwfile	"${FSIFWFILE}"	"";
mkfilesoft bpfdtbfile	"${BPFDTBFILE}" "${TARGET_DIR}/${BPFDTB_FILE}";
if [ "${bpfdtbfile}" = "" -a "${BPMPDTB_FILE}" != "" ]; then		#COMPATmkfilesoft bpfdtbfile	"${BL_DIR}/${BPMPDTB_FILE}"	"";	#COMPAT
fi;									#COMPAT
# Compress bpmp-fw-dtb for t19x devices if COMP_BPMP_FW_DTB is set to 1
if [ "${CHIPID}" = "0x19" ] && [ "${COMP_BPMP_FW_DTB}" = 1 ]; thenif [ "${TRIM_BPMP_DTB}" = "true" ]; thenecho "Error: Trim and compression cannot be used together.";exit 1;fi;compress_bpmp_fw_dtb "${bpfdtbfile}" "${bpfdtbfilename}"
fi
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}"	"${BL_DIR}/${FBFILE}";
mkfilesoft bcffile	"${BCFFILE}"	"";
mkfilesoft sosfile	"${SOSFILE}"	"";
mkfilesoft mb2blfile	"${MB2BLFILE}"	"";
mkfilesoft dcefile	"${DCE}"	"";
mkfilesoft xusbfile	"${XUSBFILE}"	"";
mkfilesoft nvdecfile	"${NVHOSTNVDEC}"	"";
mkfilesoft custinfofile	"${DFLT_CUSTOMER_INFO}"	"${BL_DIR}/${custinfofilename}";
mkfilesoft scefile	"${SCEFILE}"	"${BL_DIR}/camera-rtcpu-sce.img";
mkfilesoft camerafw	"${CAMERAFW}"	"";
mkfilesoft apefile	"${APEFILE}"	"${BL_DIR}/adsp-fw.bin";
mkfilesoft spefile	"${SPEFILE}"	"${BL_DIR}/spe.bin";
mkfilesoft drameccfile  "${DRAMECCFILE}" "";

待续


http://www.mrgr.cn/news/98800.html

相关文章:

  • C++11智能指针深度解析:在Visual Studio中高效管理内存
  • Linux网络编程实战:从字节序到UDP协议栈的深度解析与开发指南
  • 【ROS】DWA 规划器
  • Day2-UFS协议栈
  • 基础智能体的进展与挑战——从类脑智能到进化、协作和安全系统(译文)
  • 【c语言】深入理解指针2
  • 1.凸包、极点、极边基础概念
  • Linux 常用命令总结
  • 手动安装 VMware Tools 并设置虚拟机共享 Windows 文件夹
  • 老小区门禁安居宝AJB-FJ10FB数据传输格式
  • 【Docker】运行错误提示 unknown shorthand flag: ‘d‘ in -d ----详细解决方法
  • 协享云图分析--4图片模块
  • Linux系统编程学习 day4 进程
  • C++11:模板元编程(TMP)基础
  • 让SQL飞起来:搭建企业AI应用的SQL性能优化实战
  • USART讲解
  • OpenHarmony Camera开发指导(五):相机预览功能(ArkTS)
  • Ubuntu20.04配置cartographer记录
  • 【问题】一招解决vscode输出和终端不一致的困扰
  • 十二种存储器综合对比——《器件手册--存储器》