https://forums.developer.nvidia.com/t/assertion-issue-in-uefi-during-boot/315628/44
以下手順ではLinux_for_Tegraが/media/ubuntu/ssd0/BSP_ROOT_22.04-36.4.0にありますが任意の場所でも大丈夫なので適当に読み替えてください。
クロスコンパイルに必要なツールチェーンを準備する。
# 任意のディレクトリに専用フォルダを作成
mkdir ~/l4t-toolchain
cd ~/l4t-toolchain
# ダウンロードしたファイルを移動し、展開
# mv ~/Downloads/aarch64--glibc--stable-final.tar.gz .
tar -xvf aarch64--glibc--stable-final.tar.gz
ビルドスクリプトがツールやターゲットボードを認識できるように、ターミナルで環境変数を設定する。IDがどこから来るかは不明 AGX Orin Devkitならp3701-0000?
What is the difference between P3701-0000 and P3701-0004?
# 1. クロスコンパイラのパスを設定
export CROSS_COMPILE_AARCH64_PATH=~/l4t-toolchain
export PATH="${CROSS_COMPILE_AARCH64_PATH}/bin:${PATH}"
# 2. ターゲットボードのIDを設定
export NV_TARGET_BOARD=p3701-0000
UEFIのビルドに使用するDockerコマンドを簡略化するためのエイリアスを設定する。
export EDK2_DEV_IMAGE="ghcr.io/tianocore/containers/ubuntu-22-dev:latest"
export EDK2_USER_ARGS="-v \"${HOME}\":\"${HOME}\" -e EDK2_DOCKER_USER_HOME=\"${HOME}\""
# ビルド作業用のルートディレクトリを指定(AnvilのBSPがある場所などを指定)
export EDK2_BUILD_ROOT="/media/ubuntu/ssd0/BSP_ROOT_22.04-36.4.0/uefi_build_ws"
mkdir -p "${EDK2_BUILD_ROOT}"
export EDK2_BUILDROOT_ARGS="-v \"${EDK2_BUILD_ROOT}\":\"${EDK2_BUILD_ROOT}\""
alias edk2_docker="docker run -it --rm -w \"\$(pwd)\" ${EDK2_BUILDROOT_ARGS} ${EDK2_USER_ARGS} \"${EDK2_DEV_IMAGE}\""
edkrepoツールを使い、L4T r36.4.0に対応したソースコード一式を取得する。
edk2_docker init_edkrepo_conf
edk2_docker edkrepo manifest-repos add nvidia https://github.com/NVIDIA/edk2-edkrepo-manifest.git main nvidia
cd "${EDK2_BUILD_ROOT}"
edk2_docker edkrepo clone nvidia-uefi-r3640 NVIDIA-Platforms r36.4.0-updates
作成したワークスペース内のUEFIソースコードに、NVIDIA提供の修正パッチを適用する。
cd "${EDK2_BUILD_ROOT}/nvidia-uefi-r3640/edk2-nvidia"
wget https://github.com/NVIDIA/edk2-nvidia/pull/110.patch
git apply 110.patch
パッチを適用したソースから、目的のUEFIコンポーネントをビルドする。
cd "${EDK2_BUILD_ROOT}/nvidia-uefi-r3640"
edk2_docker edk2-nvidia/Platform/NVIDIA/StandaloneMmOptee/build.sh
最終的なTOSイメージの材料となるARM Trusted Firmwareをビルドする。
# L4Tのソースディレクトリに移動
cd /media/ubuntu/ssd0/BSP_ROOT_22.04-36.4.0/Linux_for_Tegra/source/
# 前提ビルドスクリプトを実行
./nv_public_src_build.sh
フェーズ2で作成したUEFIバイナリと、ステップ3.1で作成したATFを結合し、最終的なTOSイメージを生成する。
cd /media/ubuntu/ssd0/BSP_ROOT_22.04-36.4.0/Linux_for_Tegra/source/
./nv_public_src_build_tos.sh \
-p t234 \
-u /media/ubuntu/ssd0/BSP_ROOT_22.04-36.4.0/uefi_build_ws/nvidia-uefi-r3640/images/uefi_StandaloneMmOptee_RELEASE.bin \
-s /media/ubuntu/ssd0/BSP_ROOT_22.04-36.4.0/Linux_for_Tegra/nv_tegra/tos-scripts/gen_tos_part_img.py
完成したTOSイメージを、デバイスへのフラッシュに使用するディレクトリにコピーする。
L4T_DIR="/media/ubuntu/ssd0/BSP_ROOT_22.04-36.4.0/Linux_for_Tegra"
mv "${L4T_DIR}/bootloader/tos-optee_t234.img" "${L4T_DIR}/bootloader/tos-optee_t234.img.bak"
cp src_out/tos-t234.img "${L4T_DIR}/bootloader/tos-optee_t234.img"
修正済みのブートローダーをAnvil本体のQSPIメモリに書き込む。
cd /media/ubuntu/ssd0/BSP_ROOT_22.04-36.4.0/Linux_for_Tegra/
sudo ./flash.sh --qspi-only cti/orin-agx/forge/base mmcblk0p1
フラッシュ完了後、Anvilは再起動するので問題が完全に解決したか最終検証を行う。