y2blog » BeagleBone + Botic で簡単DSD Native 再生(その3)

12

10

2016

BeagleBone + Botic で簡単DSD Native 再生(その3)

Boticの環境設定


Botic V7(最新版は 2016/12/10時点で rc3)へのアップデートが済んだところで、Botic固有の環境設定について説明しておく.詳しい設定の仕方は”http://bbb.ieero.com” に記載されているので、ここではその内容を要約しておくことにする.


【Boticドライバモジュール組み込み設定の確認】


Botic 7にアップデートすると、Boticドライバモジュールの組み込み指定が外れてしまう?ようなので念のため “/boot/uEnv.txt” ファイルの中身を確認して、Boticドライバモジュールに関する記述が無ければ、下記のように “dtb=am335x-boneblack-botic.dtb” という行を追加しておく.




【カーネルオプションの変更】


BoticはLinux起動時にカーネルオプションとしてBoticに関する各種パラメータを設定することができる.設定方法は “uEnv.txt” というカーネル設定ファイル中にBoticのパラメータ項目をテキスト形式で記入する.この “uEnv.txt” ファイルを編集するには、次の2つの方法のどちらか一方で行えば良い.


 ・ Micro SD カードの第1パーティション(FAT16形式でパーティションが作成されているので、
    WindowsやMac,Linuxなど手元のPC上で編集可能)上の ”uboot/uEnv.txt” ファイルを編集する
 
   ・ Botic 起動後にLinux上で、”/boot/uboot/uEnv.txt” を編集する


上記のどちらでも構わないが、Micro SD カードの第1パーティションが Linux上で /boot にマウントされているだけなので、”uEnv.txt” の実体は同じ物だ.


Clocks configuration : クロック設定

snd_soc_botic.ext_masterclkパラメータとして以下の何れかを指定する.

  0 … no external clocks, just onboard for 48k freq
  1 … external clock for 44k1 + onboard for 48k
  2 … external clock for 48k only
  3 … external clocks for 44k1 and 48k (default)
  +4 … invert polarity of clock selection switch GPIO0_15
  9 … external clock for 44k1 only

  0 ⇒ 外部クロックを使用せずに、内部生成される 48kHz系のクロック信号のみで
     全ての音源を再生する
  1 ⇒ 44.1kHz系の音源のみ外部クロックを使用し、48kHz系の音源は内部生成される
    クロック信号で再生する
  2 ⇒ 48kHz系の外部クロック信号のみで全ての音源を再生する

  3 ⇒ 44.1kHz系の音源用の外部クロックと、48kHz系の音源用の外部クロック信号をそれぞれ用いる
    (デフォルト)
  +4 ⇒ クロック系列切り替え信号(GPIO0_15)の極性を反転させる
    48kHz系列 ⇒ GPIO0_15 = “1” / 44.1kHz系列 ⇒ GPIO0_15 = “0” [ 通常時 ]
    48kHz系列 ⇒ GPIO0_15 = “0” / 44.1kHz系列 ⇒ GPIO0_15 = “1” [ 反転時 ]
  9 ⇒ 44.1kHz系の外部クロック信号のみで全ての音源を再生する

  ※ 組み込み系のシステムに慣れていない人にとっては、”+4″ の意味が判り難いかもしれない.
   これは、クロック系列切り替え信号を反転させたい場合には、元々の値(0/1/2/9)に +4 した
   値を指定するという意味で、デフォルトの “3” の場合は “3+4” つまり “7” を指定すれば良い.


DSD format switch : DSD 切り替えスイッチ設定

snd_soc_botic.dsd_format_switchパラメータとして以下の何れかを指定する.

  0 … DSD switch is disabled
  1 … DSD switch is enabled (default)
  +2 … invert polarity of format selection switch GPIO0_14


  0 ⇒ DSD 切り替えスイッチ(GPIO0_14)による DSD 切り替え信号を使用しない
  1 ⇒ DSD 切り替えスイッチを使用する(デフォルト)
  +2 ⇒ DSD 切り替えスイッチの極性を反転する
     DSD ⇒ GPIO0_14 = “1” / PCM ⇒ GPIO0_14 = “0” [ 通常時 ]
     DSD ⇒ GPIO0_14 = “0” / PCM ⇒ GPIO0_14 = “1” [ 反転時 ]

Channels configuration : チャネル設定

soc_botic.serconfigパラメータにチャネルとオーディオシリアル信号形式の設定を行う.


この設定をカーネル起動時に行う場合は “uEnv.txt” ファイルで指定するが、起動後に “/sys/module/snd_soc_botic/parameters/serconfig” を書き換えることでも一次的な変更が可能


この設定がBotic設定で一番重要な部分なのだが、少し判り難いので前置きをしておく.


BeagleBone Black/Green で用いられている TI AM3358 SoC チップには汎用オーディオ・シリアルポート信号(McASP : Multi-channel Audio Serial Port)を出力(入力)する機能が備わっており、そのシリアルポートを拡張端子 P9 を通して外部と接続することが可能になっている.


McASPでは同時に4チャネルのオーディオ・シリアルポート信号(mcasp0_axr0 – mcasp0_axr3)の入出力を実行することができ、1チャネルのオーディオ・シリアルポート信号として、

  ・ PCM(I2S) 信号 (STEREO)
  ・ DSD信号 (MONO)
  ・ SPDIF信号 (STEREO)

を扱うことができる.soc_botic.serconfigパラメータに対して4チャネルの信号の割り当て方を指定する必要がある.各チャネル毎に次の何れかを割り当てる.


  M … I2S/DSD mode
  I … I2S only mode
  D … DSD only mode
  S … SPDIF only mode (exclusive, cannot be combined with I2S/DSD)
      – Notice: does not work in botic5
  R … record mode (I2S only)
  - … disabled serializer

  M ⇒ PCM(I2S)とDSDの両信号に対応可能なチャネルとして割り当てる
  I ⇒ PCM(I2S) 信号専用としてチャネルを割り当てる
  D ⇒ DSD信号専用としてチャネルを割り当てる
  S ⇒ SPDIF信号専用としてチャネルを割り当てる(PCM/DSD信号とは排他的)
  R ⇒ PCM(I2S)信号の入力用
  - ⇒ このチャネルを割り当てない(使用しない)


代表的なsoc_botic.serconfigパラメータの設定例を幾つか挙げておくと、

  soc_botic.serconfig=I— <== mcasp0_axr0 ポートだけにI2S信号を設定

  soc_botic.serconfig=DD– <== mcasp0_axr0 ポートを DSD(#1)、mcasp0_axr1 ポートを DSD(#2)

  soc_botic.serconfig=MM– <== mcasp0_axr0 ポートを PCM(#1)/DSD(#1)、
                    mcasp0_axr1 ポートを PCM(#2)/DSD(#2)
  ※ PCM1792、 ES9018系、AK49xx 系などの PCM/DSD信号入力ポートを兼用している場合は、
   この設定を用いて、DSD 切り替えスイッチの信号によってマルチプレクサICなどを用いてDAC入力
   ポートへのアサインを変更する

TI(BB) DSD1792 のような PCM, DSD それぞれに入力ポートを持つようなDACでは、

  soc_botic.serconfig=IDD-

のような指定も便利だろう.


デフォルトでは “soc_botic.serconfig=MMMM” に設定されているので、自分のDAC設定に合わせてこのパラメータの設定を変更しておくことを推奨する.


DAI format : PCM信号のフォーマット設定

snd_soc_botic.dai_formatパラメータにPCMオーディオシリアル信号のフォーマット設定を行う.


この設定をカーネル起動時に行う場合は “uEnv.txt” ファイルで指定するが、起動後に “/sys/module/snd_soc_botic/parameters/dai_format” を書き換えることでも一次的な変更が可能


PCM信号として一般的なI2Sフォーマットを利用するのであれば、デフォルトのままで構わないだろう.使用するDACによっては、このパラメータの値を調整する必要があるかもしれない.



デフォルトでは I2S + NB_NF + CBS_CFS なので、”snd_soc_botic.dai_format=16385″ に設定されている.



External masterclock frequencies : 外部マスタークロック信号の周波数設定

snd_soc_botic.clk_44k1 & snd_soc_botic.clk_48kパラメータに外部マスタークロック信号の周波数設定を行う.


この設定をカーネル起動時に行う場合は “uEnv.txt” ファイルで指定するが、起動後に “/sys/module/snd_soc_botic/parameters/clk_44k1”, “/sys/module/snd_soc_botic/parameters/clk_48k”, を書き換えることでも一次的な変更が可能


外部マスタークロックの周波数として、44.1kHz系列の音源の場合は、
  snd_soc_botic.clk_44k1= 22579200 [22.5792MHz ]
同様に、48kHz系列の音源の場合には、
  snd_soc_botic.clk_48k= 24576000 [24.5760MHz ]
がデフォルト値として設定されている.もし、この倍のマスタークロック 45.1584KHz/19.1520MHz を用いる場合は、この設定を変更しておかないと、倍速モード(ピッチ、再生速度とも2倍)で再生されてしまうので、注意が必要だ.(これはこれで笑えるけど...^_^!)


Force BCLK/LRCLK ratio : BCK/LRCKの比率設定

snd_soc_botic.blr_ratioパラメータにBCK/LRCKの比率を設定する.


この設定をカーネル起動時に行う場合は “uEnv.txt” ファイルで指定するが、起動後に “/sys/module/snd_soc_botic/parameters/blr_ratio”を書き換えることでも一次的な変更が可能


この値は、I2S信号での 1 LRCK 周期に含まれる BCK信号の周期となる.デフォルト値は 64 となっており、ちょっと高級系(PCM179x系、ES90xx系、AK449x系)なDACチップは 64 がデフォルトなので、この値のままで大丈夫だが、廉価系(PCM5102など)のDACの場合は、32まで下げておいた方が良いかもしれない.


Raspberry Pi用として出まわっているI2S対応DACは、デフォルトが大抵 32 なので、上手くI2S再生できない場合はこの数値の設定を変更してみると良いだろう.


BoticでのBBB/BBGの拡張端子P9 のピン設定


I2S/DSD信号や、マスタークロック(入力)、クロック系列信号、DSD切り替え信号などは、次の様なピンの割り当てとなっている.



  P9_25 – A14/0 – mcasp0_ahclkx (oscillator) – GPIO3_21 
  P9_31 – A13/0 – mcaps0_aclkx (bit clock) – SPI1_SCLK 
  P9_29 – B13/0 – mcasp0_fsx (lr clock) – SPI1_D0 
  P9_30 – D12/0 – mcasp0_axr0 (data0) – SPI1_D1 
  P9_41 – D13/0 – mcasp0_axr1 (data1) – GPIO3_20 shared pin with D14 
  P9_?? – ?12/2 – mcasp0_axr2 (data2) – configurable, see bellow 
  P9_27 – C13/2 – mcasp0_axr3 (data3) – GPIO3_19 
  P9_24 – D15/7 – uart1_txd (external masterclock switch) – GPIO0_15 
  P9_26 – D16/7 – uart1_rxd (I2S/DSD format switch)- GPIO0_14 
  P9_14 – U14/7 – gpmc_a2 (cape power switch) – EHRPWM1A 

  Default mode (kernel param snd_soc_botic.pinconfig=default or not set)
  P9_42 – B12/2 – mcasp0_axr2 (data2) – GPIO3_18

  Compat mode (kernel param snd_soc_botic.pinconfig=compat)
  P9_28 – C12/2 – mcasp0_axr2 (data2) – SPI1_CS0 shared with HDMI audio output

  GND is available on any of these pins P9_{01,02,43,44,45,46}.

Raspberry PiでのI2S接続とはかなり様子が異なるので、各ピンの用途を簡単に説明しておく.


 ・P9_14 (pin #14): Cape(ケープ)のパワー状態
    ⇒ このピンが “0” ⇒ “1” に遷移すると、Capeが使用可能な状態となる

    ※BBB/BBGでは このピンが “0” の時に P8/P9 端子に外部から信号が加えられると、BBB/BBG本体が
    損傷(壊れてしまう)可能性が高いので、必ずこの信号ピンが “1” になっている状態で Capeを稼働
    させること!!!


  【実際に、このピンがまだ “0” の状態の時に、P9_26 (pin #26)に +3.3V を掛けてしまったら
    BBBがお亡くなりになりました(南無阿弥陀仏)<(_ _)> 】


 ・P9_24 (pin #24): 外部マスタークロック信号切り替えSW
    “0”/”1″ ⇒ 44.1kHz系列/48.0kHz系列


 ・P9_25 (pin #25): 外部マスタークロック入力
            ※必ず P9_14 (pin #14)⇒ “1” となってからこの端子にクロック信号を入力すること


 ・P9_26 (pin #26): DSD 切り替えSW [ “0”/”1″ ⇒ PCM/DSD ]



【追記:Botic 7 の “Mute” 信号 】


Botic のホームページが改訂され、Botic 7 で “Mute” 信号がサポートされた事が記されていた.



上記の説明にあるように、0〜3のシリアルポート(data0 〜data3)出力信号の何れかに”Mute” 信号を割り当てることができるようだ.”Mute”信号の割り当て方法は他のパラメータ設定と同じで、

  snd_soc_davinci_mcasp.mute_pin=8
  soc_botic.serconfig=MD–

のようにカーネルオプションで指定するか、Botic起動後に “/sys/module/snd_soc_davinci_mcasp/parameters/mute_pin” ファイルを更新すれば良い.上記の例では+8指定なので、mcasp0_axr3(data3) [ P9-Pin#27 ] が “Mute” 信号ピンとなる.


出力される”Mute”信号が、Hi-activeなのか Low-activeなのかハッキリしないが、反転することもできるようなので、実際の出力信号を見て使用するDAC側に合わせれば良いだろう.Roonであればアプリケーション側で完璧にミューティング制御が行われるようなので、DSD/PCM切り替え時や曲間でのノイズは皆無だが、MPDでは盛大なノイズが発生する場合が多いので、ハードウェア側で何らかのミュート制御が行えるようになると非常に助かる.Botic 7 でのミュート制御については今後試してみる予定なので、そのうち紹介しようと思う.


Local Search

Calendar

May 2017
S M T W T F S
« Apr    
 123456
78910111213
14151617181920
21222324252627
28293031  
  • Blogroll