はじめに
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
カーネルソースのリンクはこちらです。
修正済のファイルをこちらに置きました。
事前準備
ビルドを開始すると、OpenSSLライブラリのヘッダーファイルが見つからないというエラーが出力されるため、OpenSSLライブラリをインストールします。
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
sudo apt install libssl-dev
buildKernelAndModulesツールのダウンロード
git clone https://github.com/kitazaki/buildKernelAndModules/
本家のGitレポジトリはこちら。(プルリクがマージされたら)
git clone https://github.com/JetsonHacksNano/buildKernelAndModules
カーネルソースのダウンロード
cd buildKernelAndModules/
./getKernelSources.sh
カーネルコンフィグの編集
editConfig.shコマンドを使用してCUIでカーネルコンフィグを編集します。
./editConfig.sh
編集する箇所はこちら。
Device Driversを選択します。
Sound card supportを選択します。
Advanced Linux Sound Architectureを選択します。
Enable OSS EmulationとSequencer supportにチェックを入れます。
カーネルビルド
$ ./makeKernel.sh
掛かった時間
real 25m18.119s
user 89m49.725s
sys 11m20.079s
モジュールのビルド
$ ./makeModules.sh
掛かった時間
real 41m19.982s
user 132m49.617s
sys 18m8.147s
イメージのコピー
$ ./copyImage.sh
再起動
$ sudo reboot
動作確認1
MIDIデバイス(NSX-39)をUSBに接続し、認識されることを確認します。
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コマンドでリストにデバイスが表示されることを確認します。
aplaymidi -l
Port Client name Port name
14:0 Midi Through Midi Through Port-0
16:0 NSX-39 NSX-39 MIDI 1
サンプルのMIDIファイルを再生して、音が鳴ることを確認します。
aplaymidi -p 16:0 sample.mid
動作確認2
書籍「Jetson Nano 超入門」の Part 6-3 のサンプルスクリプトを実行するとエラーが出力されます。
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
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
ファイルが見つからないため、エラーが出力されています。
シンボリックリンクを作成してエラーを解消します。
sudo ln -s /usr/share/alsa /usr/local/share/
sudo ln -s /usr/lib/aarch64-linux-gnu/alsa-lib /usr/local/lib/
MIDI が鳴ることを確認します。
python3 pocket_miku_test.py