はじめに
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]を追加する
- 書き込み途中でデバイスがデタッチされて書き込みが失敗するため、自動でアタッチされるようにします
buildKernelAndModulesツール
JetsonHacksのbuildKernelAndModulesツールはJetPack4.6.3 (L4T 32.7.3)までしか対応していないため、ファイルを修正する必要があります。
- scripts/jetson_variables
- scripts/getKernelSources.sh
カーネルソースのリンクはこちらです。
修正済のファイルをこちらに置きました。
事前準備
ビルドを開始すると、OpenSSLライブラリのヘッダーファイルが見つからないというエラーが出力されるため、OpenSSLライブラリをインストールします。
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を選択します。
Open Sound System (DEPRECATED)にチェックを入れます。
Advanced Linux Sound Architectureを選択します。
Sequencer support、OSS Mixer API、OSS PCM API、PCM timer interface、OSS Sequencer APIにチェックを入れます。
Generic sound devicesを選択します。
カーネルビルド
$ ./makeKernel.sh
掛かった時間
real 30m21.065s
user 76m10.324s
sys 7m44.704s
モジュールのビルド
$ ./makeModules.sh
ビルド中に以下のエラーが表示されました。
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
掛かった時間
(エラー修正前)
real 38m57.338s
user 95m10.828s
sys 10m31.592s
(エラー修正後)
real 9m56.872s
user 17m46.132s
sys 3m10.724s
イメージのコピー
$ ./copyImage.sh
再起動
$ sudo reboot
動作確認
MIDIデバイス(NSX-39)をUSBに接続し、認識されることを確認します。
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
$ 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 が鳴れば正常です。
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