オジロワシ(根室市風蓮湖)


Date/Time: 2018:02:24 09:12:22
Camera: PENTAX
Model: PENTAX K-5 II s
Exporsure Time: 1/800
FNumber: 0.0
Aperture Value:
Focal Length: 500.0

Close

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” という行を追加しておく.



root@bbgb7:/boot# pwd
/boot
root@bbgb7:/boot# cat uEnv.txt
#Docs: http://elinux.org/Beagleboard:U-boot_partitioning_layout_2.0

uname_r=4.8.13-botic7-rc3
dtb=am335x-boneblack-botic.dtb

cmdline=quiet init=/lib/systemd/systemd 

##Example
#cape_disable=capemgr.disable_partno=
#cape_enable=capemgr.enable_partno=

##enable BBB: eMMC Flasher:
##make sure, these tools are installed: dosfstools rsync
#cmdline=init=/opt/scripts/tools/eMMC/init-eMMC-flasher-v3.sh

uuid=3d866599-f9ad-474c-b44a-1f8da524951a
root@bbgb7:/boot# ls -la
total 40036
drwxr-xr-x  4 root root    4096 Dec 31 23:20 .
drwxr-xr-x 24 root root    4096 Dec 25 15:28 ..
-rw-r--r--  1 root root     480 Feb 22  2015 SOC.sh
-rw-r--r--  1 root root 2725558 Feb 19  2015 System.map-3.18.7-botic4
-rw-r--r--  1 root root 2477338 May 17  2016 System.map-4.5.0-botic7-rc1
-rw-r--r--  1 root root 2563919 Dec  2 08:52 System.map-4.8.11-botic7-rc2
-rw-r--r--  1 root root 2587221 Dec 10 09:37 System.map-4.8.13-botic7-rc3
-rw-r--r--  1 root root  121127 Feb 19  2015 config-3.18.7-botic4
-rw-r--r--  1 root root  123020 May 17  2016 config-4.5.0-botic7-rc1
-rw-r--r--  1 root root  126523 Dec  2 08:52 config-4.8.11-botic7-rc2
-rw-r--r--  1 root root  126307 Dec 10 09:37 config-4.8.13-botic7-rc3
drwxr-xr-x  6 root root    4096 Dec 31 23:20 dtbs
-rw-r--r--  1 root root 2829850 Feb 22  2015 initrd.img-3.18.7-botic4
-rw-r--r--  1 root root 2768412 Nov 23 15:12 initrd.img-4.5.0-botic7-rc1
-rw-r--r--  1 root root 2830506 Dec 25 15:28 initrd.img-4.8.11-botic7-rc2
-rw-r--r--  1 root root 2645199 Dec 31 23:20 initrd.img-4.8.13-botic7-rc3
-rw-r--r--  1 root root     444 Dec 31 23:20 uEnv.txt
drwxr-xr-x  2 root root    4096 Feb 16  2015 uboot
-rwxr-xr-x  1 root root 5805792 Feb 19  2015 vmlinuz-3.18.7-botic4
-rwxr-xr-x  1 root root 5437112 May 17  2016 vmlinuz-4.5.0-botic7-rc1
-rwxr-xr-x  1 root root 3655304 Dec  2 08:52 vmlinuz-4.8.11-botic7-rc2
-rwxr-xr-x  1 root root 4122480 Dec 10 09:37 vmlinuz-4.8.13-botic7-rc3
root@bbgb7:/boot# less uEnv.txt
root@bbgb7:/boot# 


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


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



 ・方法1:Micro SD カードの第1パーティション(FAT16形式でパーティションが作成されているので、
        WindowsやMac,Linuxなど手元のPC上で編集可能)上の ”uboot/uEnv.txt” ファイルを編集する.
   ・方法2: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”


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


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




    +1 ... I2S mode
    +2 ... Right Justified mode (LSB) -- BUG: does not work in botic4; fixed in botic5
    +3 ... Left Justified mode (MSB)
    +4 ... L data MSB after FRM LRC
    +5 ... L data MSB during FRM LRC

    +0 ... NB_NF: normal BCLK & LRCK
    +512 ... NB_IF: normal BCLK, inverted LRCK
    +768 ... IB_NF: inverted BCLK, normal LRCK
    +1024 ... IB_IF: inverted BCLK & LRCK

    +4096 ... CBM_CFM: DAC is BCLK & LRCK master
    +8192 ... CBS_CFM: DAC is BCLK slave, LRCK master
    +12288 ... CBM_CFS: DAC is BCLK master, LRCK slave
    +16384 ... CBS_CFS: DAC is BCLK & LRCK slave

Default value: I2S + NB_NF + CBS_CFS

Change via file is active on the next playback start.


デフォルトでは 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”


この設定をカーネル起動時に行う場合は “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” 信号がサポートされた事が記されていた.



 
--------
Mute pin
--------

Notice: This parameter is available in botic7

Emulation of mute pin on some of 1-4 data pins:
   - kernel option snd_soc_davinci_mcasp.mute_pin
   - file /sys/module/snd_soc_davinci_mcasp/parameters/mute_pin
     which can be updated while system is running, but change
     will be applied on the next start of playback

Supported values for mute_pin:
  -1 ... mute pin functionality is disabled
or these additive numbers:
 + 1 ... signal mute on pin 0
 + 2 ... signal mute on pin 1
 + 4 ... signal mute on pin 2
 + 8 ... signal mute on pin 3
 + 16777216 ... invert the mute signal

For example (stereo playback of I2S/DSD on TPA Hermes-BBB):
 $ echo 12 > /sys/module/snd_soc_davinci_mcasp/parameters/mute_pin
 $ echo MD-- > /sys/module/snd_soc_botic/parameters/serconfig
Two pins are needed, because Hermes-BBB switches pins 2 and 3 when I2S/DSD mode
is switched. After playback start/stop there should appear a mute pin on D5
output pin of Cronus.
 

上記の説明にあるように、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 でのミュート制御については今後試してみる予定なので、そのうち紹介しようと思う.