3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Raspberry Pi, Jetson Nano向けオーディオ入出力ボードの作成(Jetson Nanoへの移植トラブル編)

Last updated at Posted at 2020-03-13

前回作成したコーデックボードをJetson Nanoへ接続して音出しをしていきたい。
##Jetson NanoでのI2Sデバイスの接続について

Jetson Nanoの40ピンコネクターはRaspberry pi互換となっている。

image.png

接続のイメージは下記の通りとなる。
image.png

Raspberry piの際に設定したように、BCKとLRCKをコーデックボードからもらう設定を行う。
Jetson Nanoの場合は下記のようにする。

$ amixer -c tegrasndt210ref cget name="I2S4 codec master mode"
numid=614,iface=MIXER,name='I2S4 codec master mode'
  ; type=ENUMERATED,access=rw------,values=1,items=5
  ; Item #0 'None'
  ; Item #1 'cbm-cfm'
  ; Item #2 'cbs-cfm'
  ; Item #3 'cbm-cfs'
  ; Item #4 'cbs-cfs'
  : values=4

$ amixer -c tegrasndt210ref cset name="I2S4 codec master mode" 1
numid=614,iface=MIXER,name='I2S4 codec master mode'
  ; type=ENUMERATED,access=rw------,values=1,items=5
  ; Item #0 'None'
  ; Item #1 'cbm-cfm'
  ; Item #2 'cbs-cfm'
  ; Item #3 'cbm-cfs'
  ; Item #4 'cbs-cfs'
  : values=1

もしくは、alsamixerで下記のように設定する
image.png

これでコーデックボードとJetson Nanoの通信方向の設定は終わり。

##I2Sを40pinヘッダーへアサインする設定(現在は簡略化)
Jetson NanoはALSAからはRT565xドライバーが認識され、その配下で自由に配線を変更できるTegra ASOC Driverというものにつながるらしい。
AMX、ADX、TDM等マルチチャンネルを扱うための設定も存在するようだ。

標準の状態では上記4つのpinはGPIOに割り当てられていて、I2Sをアサインするために、レジスタを変更する必要があるらしい。
https://devtalk.nvidia.com/default/topic/1049674/jetson-nano/audio-i2s-on-40-pin-connector/

標準では下記の表示のところ

$ sudo grep "Name:\|J:\|BB:" /sys/kernel/debug/tegra_gpio                                                                                                                                                                
Name:Bank:Port CNF OE OUT IN INT_STA INT_ENB INT_LVL
 J: 2:1 f0 00 00 00 00 00 000000
BB: 6:3 01 00 00 00 00 00 000000

↓

$ sudo grep "Name:\|J:\|BB:" /sys/kernel/debug/tegra_gpio                                                                                                                                                                
Name:Bank:Port CNF OE OUT IN INT_STA INT_ENB INT_LVL
 J: 2:1 00 00 00 00 00 00 000000
BB: 6:3 00 00 00 00 00 00 000000

上記に変更をしなくてはならない。
デバイスツリーの再構成が必要になるらしいが、当リンクを参考にUSBシリアルデバイスを接続して、u-bootの途中でレジスタを変更することで次回再起動まで有効にすることができる。

3秒間のブート待ちの間にエンターを押し、u-bootのプロンプトに入る。

Tegra210 (P3450-Porg) # mw 0x70003144 0x6044
Tegra210 (P3450-Porg) # mw 0x70003148 0x6044
Tegra210 (P3450-Porg) # mw 0x7000314c 0x6044
Tegra210 (P3450-Porg) # mw 0x70003150 0x6044

Tegra210 (P3450-Porg) # mw 0x6000d204 0
Tegra210 (P3450-Porg) # mw 0x6000d60c 0

Tegra210 (P3450-Porg) # boot

上記でOS起動後に下記設定を確認できる。

$ sudo grep "Name:\|J:\|BB:" /sys/kernel/debug/tegra_gpio                                                                                                                                                                
Name:Bank:Port CNF OE OUT IN INT_STA INT_ENB INT_LVL
 J: 2:1 00 00 00 00 00 00 000000
BB: 6:3 00 00 00 00 00 00 000000

これで40pinヘッダーへI2Sを接続設定が完了した

現在JetPack 4.3 (r32.3.1)には、Jetson-IO toolという上記および再起動後も設定が反映されるようにデバイスツリーの再構築を行ってくれるツールが存在するので楽になった。

##トラブル発生
何度か再起動をすると音が全くでなくなり、ぷつぷつという音だけがわずかに出る状態になってしまった。
このトラブルの調査はnVIDIA developer Forumに投稿し、RMAで一度Jetson Nanoを交換したが再発。一度起こるとコーデックボードを外しても発振したまま。
結局のところ、I2Sの4つのpinに入っている双方向レベルシフターTXB0108が発振していることが分かった。
それは容量負荷にデリケートなようで、プローブを当てたりして壊してしまったのかもしれない。
https://devtalk.nvidia.com/default/topic/1063127/jetson-nano/jetson-nano-i2s-strange-output-/post/5396024/#5396024

データシートから引用:
image.png
上記回路図からB側は発振していたが、1.8V側のA1,A2,A3pinなどを直接オシロで当たると、きちんとした波形が観測できた。

現在、nVIDIAからは以下のような注意喚起のドキュメントが出ている。

Jetson Nano Developer Kit 40-Pin Expansion Header GPIO Usage Considerations Applications Note 1.0
2020/02/18
This application note describes how to work with the signals on the 40-pin expansion header on the NVIDIA® Jetson Nano™ Developer Kit carrier board that pass through TI TXB0108RGYR level shifters.

今後気を付けるとして、I2Sが使えないJetson Nanoを救うためにJetson Nano上のTXB0108をヒートガンで外して、A-Bをワイヤーで直結させてみた。

そうすると、40pinには1.8VロジックレベルのI2S信号が来るわけだが、レベルシフターは依然として必要になる。双方向型は自動検知で信号の向きを決定しているようだが、調べているとトラブルが多いようだ。よって自動検知でなく手動で方向を設定できるチップを探していると見つかった。
http://www.tij.co.jp/product/jp/SN74AVC4T774
image.png

4本の信号線を設定で方向を決められるレベルシフターのようだ。ちょうどいい。

以下のような回路図を引いて、Jetson Nano とコーデックボードに割り込ませることにした。1.8Vはレギュレータを載せて3.3Vから生成させる形。

image.png
image.png
基盤を作成してみた。

これを割り込ませることでTXB0108を無効化したJetson Nanoで、オーディオコーデックが使えるようになった。
前回のRaspberry piで使用したAudacityでの設定例。
録音、再生ともにtegra-snd-t210ref-mobile-rt565x: -(hw:1,0)で認識できる。
image.png

3
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?