Jetson NanoのI2S音声:Raspiaudio Audio+を設定する方法

Jetson NanoでRaspiaudio Audio+を使うには、jetson-ioでI2S4のピンを有効にし、起動のたびにピンを音声モードへ強制設定して、I2S4を音声ドライバーにつなぎます。Jetson Nanoの開発キットはAIやロボティクス向けですが、アナログ音声出力はありません。Raspiaudio Audio+ボードはRaspberry Pi用のサウンドカードで、Nanoの40ピンヘッダーにも接続できます。

このガイドはJetson Nano B02(2019)の全手順を説明します。完了すると、Audio+のヘッドホン端子から音が出ます。

数秒で曲をマスタリング
**自動で-14 LUFSに合わせ、曲の個性を保ちます。**音楽の持ち味を残した、配信に使える音声に仕上げます。ブラウザからそのまま。

始める前に:Jetson NanoのモデルとAudio+の互換性

まずJetson Nanoをセットアップしてください。まだの場合は、NVIDIAのJetson Nanoセットアップガイドに従います。モニターとキーボードを使い、Nanoをデスクトップまで起動できる状態にしてください。

必要なもの: Jetson Nano B02とRaspiaudio Audio+ボードです。Audio+の40ピンコネクターは、Nanoのヘッダーに直接はまります。すべてのピンが接触するよう、しっかり押し込んでください。

このガイドは、P3450とも呼ばれるJetson Nano B02開発キット(2019)で確認しました。P3449のキャリアボード上にP3448モジュールが載っています。Jetson Nanoは受動冷却のヒートシンクで見分けられます。より新しいJetsonモデルはファンを使います。B02には、小さな「張り出し」のように突き出たピンの列があり、古いA01モデルにはありません。

古いA01や、より新しいJetsonを使っている場合、手順はそのまま適用できないので参考用にしてください。Raspiaudioのコミュニティーで、工夫した点を共有できます。

**他のI2S DACボード:**Audio+や同様のRaspberry Pi用DACには制御インターフェースがなく、I2Sインターフェースだけがあります。Jetson Nano用のRaspberry Pi I2SサウンドカードについてのNVIDIAフォーラムの投稿では、ピンを設定すれば、こうしたボードは動作するはずだと説明されています。そのため、以下の手順はNano B02で同種のI2S DACを使う際にも出発点になります。

このガイドのきっかけとなった、40ピンコネクターのI2S音声出力を有効にするNVIDIAフォーラムの投稿を書いたjas-mxに感謝します。

手順1:jetson-ioでI2S4の音声ピンを有効にする

標準状態では、Jetson Nanoはこれらのヘッダーピンを音声に使いません。モニターとキーボードをつなぎ、Nanoを起動してターミナルを開き、実行します。

sudo /opt/nvidia/jetson-io/jetson-io.py

メニュー式のツールが開きます。

  1. 方向キー(上/下)で**「Configure Jetson 40pin Header」**を選択状態にし、Enterを押します
  2. **「Configure header pins manually」**を選び、Enterを押します
  3. チェックボックスの一覧で**「i2s4」(ピン12、35、38、40)と「audio_mclk」(ピン7)を探します。それぞれでSpace**を押し、アスタリスク [*] を付けます。
  4. **「Back」**を選びます
  5. **「Save pin changes」**を選びます
  6. **「Save and reboot to reconfigure pins」**を選びます

Jetson Nanoが再起動します。ツールは、これらのピンを音声に割り当てる独自のデバイスツリー(DTB)を作り、/boot/kernel_tegra210-p3448-0000-p3449-0000-b00-user-custom.dtbに保存します。

手順2:ピンがI2Sモードか確認する

再起動後、ピンのモードを確認します。

sudo cat /sys/kernel/debug/tegra_gpio | grep "J:"

次の表示になるはずです。J: 2:1 00 00 00 00 00 00 000000
どこかに「f0」がある場合(「f0 00 00」など)は、以下の修正が必要です。
「00」は、ピンがI2S音声用の特殊機能(SFIO)モードであることを示します。「f0」は、GPIOモードのままであることを示します。

手順3:必要ならsystemdサービスでピンを修正する

多くのB02ボードでは、ピンが音声モードへ切り替わりません。次のコマンドで修正できます。

sudo busybox devmem 0x6000d204 32 0

ピンを正しいモードに強制設定しますが、再起動するとGPIOモードに戻ります。起動のたびに修正するため、systemdサービスを作ります。

sudo tee /etc/systemd/system/fix-i2s4-pins.service <<EOF
[Unit]
Description=Fix I2S4 Pinmux for Jetson Nano
After=local-fs.target

[Service]
Type=oneshot
ExecStart=/bin/busybox devmem 0x6000d204 32 0
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
EOF

この起動時のサービスはGPIO設定レジスター0x6000d204に書き込み、Port JのピンをI2S4用のSFIOモードへ強制設定します。

サービスを有効にし、開始します。

sudo systemctl enable fix-i2s4-pins
sudo systemctl start fix-i2s4-pins

どちらのコマンドも、エラーなしで終了するはずです。「Failed to start fix-i2s4-pins.service: Unit not found」と表示される場合、サービスファイルが正しく作られていません。ログを確認します。

sudo journalctl -u fix-i2s4-pins

手順4:I2S4を音声ドライバーにつなぐ

I2S4インターフェースを音声システムへ接続します。

amixer -c tegrasndt210ref cset name='I2S4 Mux' ADMAIF1

出力はvalues=1で終わるはずです。「Invalid card」エラーなら、音声ドライバーがまだ読み込まれていません。再起動して、もう一度試してください。

これは、音声ドライバーが音声を送るADMAIF1インターフェースをI2S4へルーティングし、ドライバーをハードウェアのピンに接続します。

手順5:テスト音を再生する

このコマンドは、I2S4インターフェースへ48 kHz、16ビット、ステレオの正弦波を送ります。

speaker-test -D hw:tegrasndt210ref,0 -r 48000 -c 2 -F S16_LE -t sine

ヘッドホンやスピーカーから連続した音が聴こえるはずです。Ctrl+Cで止めます。

Audio+ボードの動作を確認する方法

音が聴こえたら、Raspiaudio Audio+はJetson Nano B02で動作しています。手順3のサービスにより、再起動後もピンの修正が適用されます。

補足:独自のDTBでJetson Nanoに書き込む方法

上の方法は1台のデバイス向けです。量産のために複数のJetson Nanoボードへ書き込む場合、それぞれでjetson-ioのメニューを操作するのは手間です。代わりに、手順1で作ったDTB(Device Tree Blob、デバイスツリーのバイナリーファイル)を各ボードに書き込めば、ピン設定を先に適用できます。

/boot/kernel_tegra210-p3448-0000-p3449-0000-b00-user-custom.dtb

このファイルをコンピューターへコピーします。再書き込み時には、最初の起動前に/boot/フォルダーへ戻してください。

重要:どのJetson Nanoを使っていますか?

このDTBファイルは、作成したキャリアボードのリビジョンにだけ対応します。リビジョンはファイル名の末尾にあり、ここではb00です。異なるリビジョンのDTBを書き込むと、起動パーティションが壊れ、ホストコンピューターから全体を書き直す必要が生じることがあります。

Jetson Nanoに書き込む最も簡単な方法は、LinuxのホストコンピューターでNVIDIA SDK ManagerかNVIDIA Jetson Linux Driver Package(L4T)を使うことです。対応するLinuxディストリビューションが多いので、私はL4Tを勧めます。全手順は、L4Tを手動で取得して書き込むNVIDIAフォーラムの投稿にあります。以下は簡潔な手順です。

NVIDIA Jetson LinuxのアーカイブからL4Tをダウンロードします。Jetson Nanoでは、新しいJetPackのブランチではなく、Jetson Linux 32.7.x系列を使ってください。リリースページでDriver Package (BSP)とSample Root Filesystemを取得します。ドライバーパッケージはsudoなしで展開し、サンプルのルートファイルシステムはsudoを使ってLinux_for_Tegra/rootfs/へ展開します。

次にLinux_for_TegraフォルダーからNVIDIAのバイナリーを適用します。

sudo ./apply_binaries.sh

その後、micro USBでJetson Nanoをホストコンピューターに接続します。Nanoには独立した5V電源が必要です。

以下は、独自のDTBファイルでJetson Nanoに書き込むコマンドの例です。Nanoの独自DTBをホストにコピーしてから、ホストコンピューターで実行します。パスは自分のものに置き換えてください。

sudo ./flash.sh -k DTB
-d /path/to/your/file/kernel_tegra210-p3448-0000-p3449-0000-b00-user-custom.dtb
jetson-nano-devkit mmcblk1p1

書き込みのため、Jetson Nanoをリカバリーモードにする必要があるかもしれません。

  1. micro USBではなく、5V電源でJetson Nanoに給電します。
  2. ジャンパーワイヤー、クリップ、小さなドライバーで、「FC RCV」(強制リカバリー)ピンを「GND」ピンへ接続します。
  3. 「SYS_RST」(システムリセット)ピンを「GND」ピンへ接続し、Jetson Nanoを再起動します。
  4. micro USBでNanoをホストコンピューターに接続します。

ホストコンピューターで接続を確認します。

lsusb | grep -i nvidia

書き込み後も、起動のたびにピンを正しく設定するため、手順3のsystemdサービスを追加する必要があります。

関連ガイド

ボードから音が出たら、次のガイドで小型のシングルボードコンピューター向けニューラル音声プロジェクトを確認できます。

数秒で曲をマスタリング
**自動で-14 LUFSに合わせ、曲の個性を保ちます。**音楽の持ち味を残した、配信に使える音声に仕上げます。ブラウザからそのまま。