GMSLカメラ取り込み時の不具合対応の際、カーネルビルドが必要になったので手順を記載します。

動作環境

  • Jetson
    • AGX Orin Developer Kit(32GB)
    • Jetpack 5.1.1 L4T 35.3.1
  • HostPC
    • Ubuntu 20.04.1 LTS

参考

作業手順(HostPC)

ビルド環境構築

$ sudo apt update
$ sudo apt install -y git build-essential bc

作業ディレクトリ作成

以下ディレクトリにソース、生成物を配置

$ mkdir -p ~/work/{downloads,source,tool,output}
$ cd ~/work/downloads/

Jetson Linux, toolchainのダウンロード

L4T 35.3.1を想定
downloadsディレクトリに各ファイルを保存

  • Driver Package (BSP)
  • Driver Package (BSP) Sources
  • Sample Root Filesystem
  • Bootlin Toolchain gcc 9.3

ディレクトリ構成一覧確認

$ tree
.
├── downloads
│ ├── aarch64–glibc–stable-final.tar.gz
│ ├── jetson_linux_r35.3.1_aarch64.tbz2
│ ├── public_sources.tbz2
│ └── tegra_linux_sample-root-filesystem_r35.3.1_aarch64.tbz2
├── output
├── source
└── tool

Jetson Linux, toolchainを展開

$ cd ~/work/tool/
$ tar xf ../downloads/aarch64--glibc--stable-final.tar.gz
$ cd ../output/
$ tar xf ../downloads/jetson_linux_r35.3.1_aarch64.tbz2
$ cd ./Linux_for_Tegra/rootfs/
$ sudo tar xpf ../../../downloads/tegra_linux_sample-root-filesystem_r35.3.1_aarch64.tbz2
$ cd ../source/
$ tar xf ../downloads/public_sources.tbz2
$ cd ./Linux_for_Tegra/source/public/
$ tar xf kernel_src.tbz2
$ mkdir ./kernel_out/

ディレクトリ構成一覧確認

$ tree -L 2
.
├── downloads
│ ├── aarch64–glibc–stable-final.tar.gz
│ ├── jetson_linux_r35.3.1_aarch64.tbz2
│ ├── public_sources.tbz2
│ └── tegra_linux_sample-root-filesystem_r35.3.1_aarch64.tbz2
├── output
│ └── Linux_for_Tegra
├── source
│ └── Linux_for_Tegra
└── tool
├── aarch64-buildroot-linux-gnu
├── bin
├── etc
├── include
├── lib
├── lib64 -> lib
├── libexec
├── relocate-sdk.sh
├── share
└── usr -> .

カーネルソースコードを編集

$ cd ~/work/source/Linux_for_Tegra/source/public/kernel/

修正対象のソースを編集
直接ファイルを編集、もしくはフォーラムで添付されているpatchファイルを当てる等の対応を行う

環境変数設定

コンパイルパス、カーネルビルドの対象ディレクトリを設定

$ export CROSS_COMPILE_AARCH64_PATH=~/work/tool
$ export CROSS_COMPILE_AARCH64=~/work/tool/bin/aarch64-buildroot-linux-gnu-
$ export CROSS_COMPILE=~/work/tool/bin/aarch64-buildroot-linux-gnu-
$ export TEGRA_KERNEL_OUT=~/work/source/Linux_for_Tegra/source/public/kernel_out
$ export INSTALL_PATH=~/work/output/Linux_for_Tegra/rootfs

ビルド

nvbuild.shを実行し、カーネルビルドを実行
HostPCのスペックにより多少時間がかかる

$ cd ~/work/source/Linux_for_Tegra/source/public/
$ mkdir kernel_out
$ ./nvbuild.sh -o $PWD/kernel_out
$ cp -i ./kernel_out/arch/arm64/boot/Image ~/work/output/Linux_for_Tegra/kernel/
$ cd ./kernel/kernel-5.10/
$ sudo make ARCH=arm64 O=$TEGRA_KERNEL_OUT modules_install INSTALL_MOD_PATH=$INSTALL_PATH

インストール

Jetsonをリカバリーモードで起動、HostPCでJetsonを認識していることを確認
$ lsusb | grep NVIDIA
Bus 003 Device 007: ID 0955:7023 NVIDIA Corp. APX
インストール事前処理
$ sudo ./apply_binaries.sh
Jetsonデフォルトユーザの作成
$ cd ./tools/
$ sudo ./l4t_create_default_user.sh -u $user -p $password
コマンド実行後、以下のような表示が出力されるので「Accept」を押下

接続先JetsonのeMMCへ書き込み
$ cd ../
$ sudo ./flash.sh jetson-agx-orin-devkit mmcblk0p1

書き込み完了後、Jetsonが起動したら作業完了

まとめ

以上でJetsonの環境構築手順が完了となります。
今後もエッジPCに関連する内容、クラウド・映像・AIの実装を中心に投稿していきますのでよろしくお願いします。