Jetson JetPack4.5 のカーネルビルド

# はじめに

2021年1月21日にJetPack4.5がリリースされましたので、Jetson Nano (4GB)でLinux カーネルとモジュールをビルドしてみました。
JetsonHacks の <a href="https://github.com/JetsonHacksNano/buildKernelAndModules">buildKernelAndModules</a> ツールを使ってビルドを行います。

# ソースコードのダウンロードリンク

以前はJetson Download Centerから直接ダウンロードできましたが、L4Tのページからダウンロードするように変更されています。

https://developer.nvidia.com/embedded/linux-tegra

![スクリーンショット 2021-02-02 9.35.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/71df4fc9-4c76-45a5-6dce-23a31453483f.png)

### Nano
https://developer.nvidia.com/embedded/L4T/r32_Release_v5.0/sources/T210/public_sources.tbz2

# ビルドツールの変更点

まず、ツールをダウンロードします。

```bash
$ git clone https://github.com/JetsonHacksNano/buildKernelAndModules
$ cd buildKernelAndModules
```

ツールは JetPack 4.3 (r32.3.1) 用に作成されているので、ターゲットバージョンを JetPack 4.5 (r32.5.0) に変更します。

```bash
L4T_TARGET="32.3.1"
↓
L4T_TARGET="32.5.0"
```

カーネルソースコードのダウンロードリンクを変更します。

```bash
wget -N https://developer.nvidia.com/embedded/dlc/r32-3-1_Release_v1.0/Sources/T210/public_sources.tbz2
↓
wget -N https://developer.nvidia.com/embedded/L4T/r32_Release_v5.0/sources/T210/public_sources.tbz2
```

# ビルド手順

### 1.カーネルソースをダウンロードするスクリプトを実行する

```bash
$ ./getKernelSources.sh
```

### 2. コンフィグを修正する

例として、書籍「<a href="https://www.amazon.co.jp/Jetson-Nano%E8%B6%85%E5%85%A5%E9%96%80-Japan-User-Group/dp/4800712513">Jetson Nano 超入門</a>」の Part 6-2 に沿って MIDI 関連のコンフィグを追加します。

```bash
$ sudo vi /usr/src/kernel/kernel-4.9/.config
```

```text:.config
CONFIG_SOUND_OSS_CORE=y
CONFIG_SOUND_OSS_CORE_PRECLAIM=y
CONFIG_SND_SEQUENCER=y
CONFIG_SND_SEQ_DUMMY=y
CONFIG_SND_OSSEMUL=y
CONFIG_SND_MIXER_OSS=y
CONFIG_SND_PCM_OSS=y
CONFIG_SND_PCM_OSS_PLUGINS=y
CONFIG_SND_RAWMIDI_SEQ=y
```

### 3. カーネルをビルドする

```bash
$ ./makeKernel.sh
```

途中で質問された場合は y で答えます。

```bash
OSS Sequencer API (SND_SEQUENCER_OSS) [N/y/?] (NEW) y
Virtual MIDI soundcard (SND_VIRMIDI) [N/m/y/?] (NEW) y
```

Image makeにかかった時間は以下のとおりでした。

```bash
real	29m40.845s
user	75m54.888s
sys	7m11.592s
```

### 4. モジュールをビルドする

```bash
$ ./makeModules.sh
```

Modules make にかかった時間は以下のとおりでした。

```bash
real	41m50.216s
user	109m18.468s
sys	11m3.240s
```

### 5. Image のバックアップを取得する (オプション: 必須ではありません)

```bash
$ sudo cp /boot/Image /boot/Image.backup
```

### 6. Image をコピーする

ビルドした新しい Image を現在の Image にコピーします。

```bash
$ ./copyImage.sh
```

### 7. /boot/extlinux/extlinux.conf を修正 (オプション: 必須ではありません)

起動時の backup kernel として /boot/Image.backup を指定することが可能です。

```bash
$ sudo vi /boot/extlinux/extlinux.conf
```

```text:/boot/extlinux/extlinux.conf
# LABEL backup
#    MENU LABEL backup kernel
#    LINUX /boot/Image.backup
#    INITRD /boot/initrd
#    APPEND ${cbootargs}
↓
LABEL backup
   MENU LABEL backup kernel
   LINUX /boot/Image.backup
   INITRD /boot/initrd
   APPEND ${cbootargs}
```

### 8. 再起動

```bash
$ sudo reboot
```

# 動作確認

カーネルのビルドされた時刻を確認することができます。

```bash
$ uname -a
Linux jetson-desktop 4.9.2014.9.201-tegra #1 SMP PREEMPT Tue Feb 2 11:18:50 JST 2021 aarch64 aarch64 aarch64 GNU/Linux
```

書籍「Jetson Nano 超入門」の Part 6-3 のサンプルスクリプトを実行して MIDI が鳴れば正常です。

```bash
$ wget https://raw.githubusercontent.com/karaage0703/jetson-nano-tools/master/scripts/pocket_miku_test.py
$ sudo apt install libsdl2-dev
$ sudo apt install libsdl2-ttf-dev
$ sudo apt install libsdl2-image-dev
$ sudo apt install libsdl2-mixer-dev
$ sudo apt install libfreetype6-dev
$ sudo apt install libjpeg-dev
$ sudo apt install libportmidi-dev
$ sudo -H pip3 install pygame
$ python3 pocket_miku_test.py
```

(参考)
https://qiita.com/kitazaki/items/5fc6b2e8df2bfe03e9b5