Published using Google Docs
L4T R36.4.0 patch方法
Updated automatically every 5 minutes

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にありますが任意の場所でも大丈夫なので適当に読み替えてください。

フェーズ1:クロスコンパイラとビルドツールの準備

ステップ1.1:クロスコンパイラのダウンロードと展開

クロスコンパイルに必要なツールチェーンを準備する。

  1. NVIDIA公式ページからツールチェーンをダウンロードする。https://developer.nvidia.com/embedded/jetson-linux/bootlin-toolchain-gcc-93
  2. ホームディレクトリにツールチェーンを展開する。

# 任意のディレクトリに専用フォルダを作成

mkdir ~/l4t-toolchain

cd ~/l4t-toolchain

# ダウンロードしたファイルを移動し、展開

# mv ~/Downloads/aarch64--glibc--stable-final.tar.gz .

tar -xvf aarch64--glibc--stable-final.tar.gz

ステップ1.2:環境変数の設定

ビルドスクリプトがツールやターゲットボードを認識できるように、ターミナルで環境変数を設定する。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

フェーズ2:パッチ適用済みUEFIバイナリのビルド

ステップ2.1:edk2_docker エイリアスの設定

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}\""

ステップ2.2:edkrepoによるワークスペースの作成

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

ステップ2.3:修正パッチの適用

作成したワークスペース内の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

ステップ2.4:UEFIコンポーネントのビルド

パッチを適用したソースから、目的のUEFIコンポーネントをビルドする。

cd "${EDK2_BUILD_ROOT}/nvidia-uefi-r3640"

edk2_docker edk2-nvidia/Platform/NVIDIA/StandaloneMmOptee/build.sh

フェーズ3:修正済みTOSイメージのビルド

ステップ3.1:前提コンポーネントのビルド

最終的な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

ステップ3.2:最終TOSイメージのビルド

フェーズ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

ステップ3.3:完成イメージの配置

完成した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"

フェーズ4:デバイスへのフラッシュと最終検証

ステップ4.1:Anvilのリカバリーモード起動

  1. Anvilの電源を完全にオフにする。
  2. ホストPCとAnvilをUSB-Cケーブルで接続する。
  3. Anvilをリカバリーモードで起動する。裏面のFとRのボタンを順に押す。

ステップ4.2:QSPIフラッシュの実行

修正済みのブートローダーを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

ステップ4.3:動作確認

フラッシュ完了後、Anvilは再起動するので問題が完全に解決したか最終検証を行う。

  1. Anvilの起動画面で ESC キーなどを連打し、UEFIメニューに入る。
  2. メニューから Device Manager → NVIDIA Configuration → Reset Setting を選択し、設定をリセットする。
  3. トップメニューに戻り Reset を選択して再起動する。
  4. OSが正常に起動することを確認します。この再起動操作を5回ほど繰り返し、一度も ASSERT エラーが発生しなければ成功。