Jetson Orin Nano JetPack 5.1.1 (L4T 35.3.1) のカーネルビルド

# はじめに

Jetson Orin NanoでMIDIデバイスをサポートするため、JetPack5.1.1でカーネルビルドを行ってみました。

# 前提条件

SDカードは64GB以上を使用する必要があります。(32GBではカーネルビルド途中で容量が不足しました。)

# buildKernelAndModulesツール

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

- scripts/jetson_variables
- scripts/getKernelSources.sh

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

https://developer.nvidia.com/embedded/jetson-linux-r3531

![image_000.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/3b6d9196-da72-6150-2d37-e97698252cca.jpeg)

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

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

# 事前準備

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

```bash
scripts/extract-cert.c:21:10: fatal error: openssl/bio.h: No such file or directory
   21 | #include <openssl/bio.h>
      |          ^~~~~~~~~~~~~~~
compilation terminated.
  HOSTCC  scripts/genksyms/lex.lex.o
make[1]: *** [scripts/Makefile.host:95: scripts/extract-cert] Error 1
make[1]: *** Waiting for unfinished jobs....
scripts/sign-file.c:25:10: fatal error: openssl/opensslv.h: No such file or directory
   25 | #include <openssl/opensslv.h>
      |          ^~~~~~~~~~~~~~~~~~~~
compilation terminated.
make[1]: *** [scripts/Makefile.host:95: scripts/sign-file] Error 1
  HOSTLD  scripts/genksyms/genksyms
make: *** [Makefile:1231: scripts] Error 2
```

```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を選択します。

![image_001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/69d26668-c97d-36ea-47b8-97d3985fbaec.jpeg)

Sound card supportを選択します。

![image_002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/28318d52-37fd-20ab-6f41-f4dce5fa1186.jpeg)

Advanced Linux Sound Architectureを選択します。

![image_005.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/3c46d278-a4b8-f14d-6769-1d3a38266130.jpeg)

Enable OSS EmulationとSequencer supportにチェックを入れます。

![image_003.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/a65fc3cd-a91a-3073-c05a-bce456ed76b0.jpeg)

# カーネルビルド

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

掛かった時間

real	25m18.119s
user	89m49.725s
sys	11m20.079s

# モジュールのビルド

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

掛かった時間

real	41m19.982s
user	132m49.617s
sys	18m8.147s

# イメージのコピー

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

# 再起動

```bash
$ sudo reboot
```

# 動作確認1

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

```bash
sudo dmesg

[ 1309.416077] usb 1-2.1: new high-speed USB device number 11 using tegra-xusb
[ 1309.518167] usb 1-2.1: config 1 interface 1 altsetting 0 bulk endpoint 0x2 has invalid maxpacket 64
[ 1309.527554] usb 1-2.1: config 1 interface 1 altsetting 0 bulk endpoint 0x81 has invalid maxpacket 64
[ 1309.538907] usb 1-2.1: New USB device found, idVendor=1b3f, idProduct=8001, bcdDevice= 1.00
[ 1309.538913] usb 1-2.1: New USB device strings: Mfr=1, Product=1, SerialNumber=1
[ 1309.538918] usb 1-2.1: Product: NSX-39 
[ 1309.538923] usb 1-2.1: Manufacturer: NSX-39 
[ 1309.538927] usb 1-2.1: SerialNumber: NSX-39
```

aplaymidiコマンドでリストにデバイスが表示されることを確認します。

```bash
aplaymidi -l

 Port    Client name                      Port name
 14:0    Midi Through                     Midi Through Port-0
 16:0    NSX-39                           NSX-39 MIDI 1
```

サンプルのMIDIファイルを再生して、音が鳴ることを確認します。

```bash
aplaymidi -p 16:0 sample.mid
```

# 動作確認2

書籍「Jetson Nano 超入門」の Part 6-3 のサンプルスクリプトを実行するとエラーが出力されます。

```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
```

```bash
pygame 2.5.0 (SDL 2.28.0, Python 3.8.10)
Hello from the pygame community. https://www.pygame.org/contribute.html
ALSA lib conf.c:4555:(snd_config_update_r) Cannot access file /usr/local/share/alsa/alsa.conf
ALSA lib seq.c:935:(snd_seq_open_noupdate) Unknown SEQ default
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

pygame 2.5.0 (SDL 2.28.0, Python 3.8.10)
Hello from the pygame community. https://www.pygame.org/contribute.html
ALSA lib conf.c:4004:(snd_config_hooks_call) Cannot open shared library libasound_module_conf_pulse.so (/usr/local/lib/alsa-lib/libasound_module_conf_pulse.so: cannot open shared object file: No such file or directory)
ALSA lib seq.c:935:(snd_seq_open_noupdate) Unknown SEQ default
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
```

ファイルが見つからないため、エラーが出力されています。
シンボリックリンクを作成してエラーを解消します。

```bash
sudo ln -s /usr/share/alsa /usr/local/share/

sudo ln -s /usr/lib/aarch64-linux-gnu/alsa-lib /usr/local/lib/
```

MIDI が鳴ることを確認します。

```bash
python3 pocket_miku_test.py
```