Jetson Nano JetPack 4.6.4 (L4T 32.7.4) のカーネルビルド

# はじめに

Jetson Nanoの最終プロダクトリリースJetPack 4.6.4 (L4T 32.7.4)でMIDIデバイスをサポートするため、カーネルビルドを行ってみました。

# 前提条件

SDカードは32GB以上を使用する必要があります。

JetPack 4.6.4はSDカードイメージファイルが配布されていないため、SDK Managerを使用してJetson Nanoへ書き込む必要があります。

## Virtualbox + Ubuntu 18.04 LTSでSDK Managerを使用する

USBの設定を変更します。

- USB 3.0 (xHCI) コントローラーを選択する
  - デフォルトのUSB 2.0 (OHCI+EHCI) コントローラーだと、途中で書き込みが止まってしまいます
- USBデバイスフィルターにNVIDIA Corp. APX [0102]を追加する
  - 書き込み途中でデバイスがデタッチされて書き込みが失敗するため、自動でアタッチされるようにします

![jp_image_010.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/64144690-4b2b-ce6e-b482-14798cf59e5c.jpeg)

# buildKernelAndModulesツール

JetsonHacksのbuildKernelAndModulesツールはJetPack4.6.3 (L4T 32.7.3)までしか対応していないため、ファイルを修正する必要があります。

- scripts/jetson_variables
- scripts/getKernelSources.sh

カーネルソースのリンクはこちらです。

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

![image_001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/1b5667b2-24f3-4323-47bd-f1d43de0d437.jpeg)

修正済のファイルをこちらに置きました。

https://github.com/kitazaki/buildKernelAndModules/

# 事前準備

ビルドを開始すると、OpenSSLライブラリのヘッダーファイルが見つからないというエラーが出力されるため、OpenSSLライブラリをインストールします。

```bash
sudo apt install libssl-dev
```

# buildKernelAndModulesツールのダウンロード

```bash
git clone https://github.com/kitazaki/buildKernelAndModules/
```

本家のGitレポジトリはこちら。(プルリクがマージされたら)

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

# カーネルソースのダウンロード

```bash
cd buildKernelAndModules/
./getKernelSources.sh
```

# カーネルコンフィグの編集

editConfig.shコマンドを使用してCUIでカーネルコンフィグを編集します。

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

編集する箇所はこちら。

Device Driversを選択します。

![jp_image_002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/62202e52-f0d6-063f-cea2-8e34e1e683eb.jpeg)

Sound card supportを選択します。

![jp_image_003.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/5734a33e-9e0d-c83e-3a43-2576f195500c.jpeg)

Open Sound System (DEPRECATED)にチェックを入れます。
Advanced Linux Sound Architectureを選択します。

![jp_image_020.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/90f2be1d-a6ec-3e32-c0fb-38d212400f88.jpeg)

Sequencer support、OSS Mixer API、OSS PCM API、PCM timer interface、OSS Sequencer APIにチェックを入れます。
Generic sound devicesを選択します。

![jp_image_021.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/7c468643-ae5d-3f13-3408-dfa6992253e2.jpeg)

![jp_image_022.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/d2654c1b-25d7-f939-7298-b20324264e99.jpeg)

# カーネルビルド

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

掛かった時間

real	30m21.065s
user	76m10.324s
sys	7m44.704s

# モジュールのビルド

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

ビルド中に以下のエラーが表示されました。

```bash
  CC [M]  sound/core/seq/seq_ports.o
sound/core/seq/seq_ports.c:572:13: error: redefinition of ‘delete_and_unsubscribe_port’
 static void delete_and_unsubscribe_port(struct snd_seq_client *client,
```

seq_ports.cファイルの中で、delete_and_unsubscribe_port関数が複数回宣言されているというエラーです。
以下のファイルを編集して、1つのdelete_and_unsubscribe_port関数を削除します。

/usr/src/kernel/kernel-4.9/sound/core/seq/seq_ports.c

![jp_image_011.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/50bd06a1-055b-1560-c490-e1379a4ad1bc.jpeg)

掛かった時間

(エラー修正前)
real	38m57.338s
user	95m10.828s
sys	10m31.592s

(エラー修正後)
real	9m56.872s
user	17m46.132s
sys	3m10.724s

# イメージのコピー
 
```bash
$ ./copyImage.sh
```

# 再起動

```bash
$ sudo reboot
```

# 動作確認

MIDIデバイス(NSX-39)をUSBに接続し、認識されることを確認します。

```bash
sudo dmesg

[   68.028970] usb 1-2.1: USB disconnect, device number 3
[   71.835810] usb 1-2.1: new high-speed USB device number 7 using tegra-xusb
[   71.856903] usb 1-2.1: config 1 interface 1 altsetting 0 bulk endpoint 0x2 has invalid maxpacket 64
[   71.866243] usb 1-2.1: config 1 interface 1 altsetting 0 bulk endpoint 0x81 has invalid maxpacket 64
[   71.876477] usb 1-2.1: New USB device found, idVendor=1b3f, idProduct=8001
[   71.876487] usb 1-2.1: New USB device strings: Mfr=1, Product=1, SerialNumber=1
[   71.876494] usb 1-2.1: Product: NSX-39 
[   71.876501] usb 1-2.1: Manufacturer: NSX-39 
[   71.876507] usb 1-2.1: SerialNumber: NSX-39 
```

```bash
$ amidi -l
Dir Device    Name
IO  hw:2,0    Virtual Raw MIDI (16 subdevices)
IO  hw:2,1    Virtual Raw MIDI (16 subdevices)
IO  hw:2,2    Virtual Raw MIDI (16 subdevices)
IO  hw:2,3    Virtual Raw MIDI (16 subdevices)
IO  hw:5,0,0  NSX-39 MIDI 1
```

書籍「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 libsdl2-ttf-dev libsdl2-image-dev libsdl2-mixer-dev libfreetype6-dev libjpeg-dev libportmidi-dev python3-pip

sudo -H pip3 install pygame

python3 pocket_miku_test.py
```