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