Jetson JetPack4.4 DP のカーネルビルド

# はじめに
Jetson Xavier NX の発売と合わせて JetPack4.4 DP (Developer Preview) がリリースされたので、Nano と Xavier NX で Linux カーネルとモジュールをビルドしてみた。
通常のビルド手順と大きく変わりありませんが、今回は JetsonHacks の <a href="https://github.com/JetsonHacksNano/buildKernelAndModules">buildKernelAndModules</a> ツールを使ってみました。

## 注意点
Nano と Xavier NX とでソースコードのダウンロードリンクが異なるので注意が必要です。
<img width="75%" alt="source_1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/b9032cf2-1054-2548-c54d-f0c988303ff2.png">

### Xavier NX
https://developer.nvidia.com/embedded/L4T/r32_Release_v4.2/Sources/T186/public_sources.tbz2

### Nano
https://developer.nvidia.com/embedded/L4T/r32_Release_v4.2/Sources/T210/public_sources.tbz2


## ツールの変更点
まず、ツールをダウンロードします。

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

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

```sh:getKernelSources.sh
L4T_TARGET="32.3.1"
↓
L4T_TARGET="32.4.2"
```

Xavier NX の場合は上記に加えてモデル名を変更します。

```sh:getKernelSources.sh
JETSON_MODEL="NVIDIA Jetson Nano Developer Kit"
↓
JETSON_MODEL="NVIDIA Jetson Xavier NX Developer Kit"
```

カーネルソースコードのダウンロードリンクを変更します。Nano と Xavier NX とでリンク先が異なるので注意が必要です。

```sh:scripts/getKernelSources.sh
wget -N https://developer.nvidia.com/embedded/dlc/r32-3-1_Release_v1.0/Sources/T210/public_sources.tbz2
↓
# Xavier NX の場合
wget -N https://developer.nvidia.com/embedded/L4T/r32_Release_v4.2/Sources/T186/public_sources.tbz2
# Nano の場合
wget -N https://developer.nvidia.com/embedded/L4T/r32_Release_v4.2/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 関連のコンフィグを追加します。

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

```txt:.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
```

直接 .config ファイルを編集する他に editConfig.sh を実行して menuConfig 形式で修正することも可能です。

```bash
$ ./editConfig.sh
```

### 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
# Xavier NX
real    111m40.689s
user    44m39.048s
sys     3m40.908s
# Nano
real    31m41.584s
user    76m6.292s
sys     7m25.456s
```

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

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

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

```bash
# Xavier NX
real    207m34.403s
user    108m12.652s
sys     9m6.864s
# Nano
real    35m29.093s
user    87m13.700s
sys     9m5.276s
```

### 5. Image のバックアップを取得する (オプション: 必須ではありません)
現在の 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.140-tegra #1 SMP PREEMPT Sun May 31 13:27:02 JST 2020 aarch64 aarch64 aarch64 GNU/Linux
```

また、書籍「<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-3 に沿って MIDI が鳴れば正常です。

```bash
$ wget https://raw.githubusercontent.com/karaage0703/jetson-nano-tools/master/scripts/pocket_miku_test.py
$ python3 pocket_miku_test.py
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/a578bc5a-b8bf-bd42-da4b-ff81d57fab24.jpeg" width="75%">

(参考) MIDI が認識されていない場合に出力されるエラー

```bash
$ python3 pocket_miku_test.py 
pygame 1.9.6
Hello from the pygame community. https://www.pygame.org/contribute.html
ALSA lib seq_hw.c:466:(snd_seq_hw_open) open /dev/snd/seq failed: No such file or directory
Traceback (most recent call last):
  File "pocket_miku_test.py", line 49, in <module>
    main()
  File "pocket_miku_test.py", line 20, in main
    midiOutput.set_instrument(instrument)
UnboundLocalError: local variable 'midiOutput' referenced before assignment
```