2019年10月10日木曜日

【にわかAVマニアの難航】ラズパイ、AK4495をDSDで鳴らす難しさ(重箱の隅つつき)

旭化成のDAC AK4495基板を自作してPCM modeで動かして日常使いしている.
これとかがそれ.
【にわかAVマニアの僥倖】 板金工場でDAC BOXを私的生産
【にわかAVマニアの設計】AK4495 DAC私的設計資料(長文)

今度はAK4495をRapsberry piに接続しようと思って設計しているところである.
これとかがそれ.
【にわかAVマニアの計測】Arduino Nanoでオーディオサンプリング周波数を測定できるか?
OLED 0.91inch 128x32dot datasheetを読む読む (SSD1306)

ところで便利な事にAK4495はDSDでも使えるんで、ラズパイに繋ぐついでにDSDにも対応させちゃおうと思うわけだ.

だがしかし、ラズパイでDSDを再生するにはやたらと制約が多いぞ.わからないことも多い.

いろいろと調べてみて、ぼんやりと見えてきたことを書いてみる.推測を多く含むので間違いがあるかもしれない.内容が細かすぎるので誰得かもしれない.

なお、これを書いている時点で、OS等のversionはこうなっている.
% uname -a
Linux volumio 4.19.60-v7+ #1247 SMP Thu Jul 25 14:41:19 BST 2019 armv7l GNU/Linux

% mpd -V
Music Player Daemon 0.20.18 (128d910-dirty)

Volumio Audiophile Music Player for Raspberry Pi
VERSION: 2.632
RELEASE DATE: 03-10-2019


【やりたいこと】
システム面
・ラズパイの上に載せて使える子基板型のDAC
・DACはAK4495  (DAC基板がclock master)
・IFはI2S
・PCMだけでなくDSDも聞けるようにする
・OLEDにサンプリング周波数表示およびPCM/DSD表示をする
・ラズパイのソフトウエアはvolumio

性能面
・AK4495をモノラル使いする
・差動出力


【DSDの基礎】
サンプリング周波数によりいくつかの種類がある.
DSD64  :  サンプリング周波数= 2.8224MHz = 44.1kHz x 64
DSD128:  サンプリング周波数= 5.6448MHz = 44.1kHz x 128

もっと上のDSD256、DSD512もあるらしいが、ファイルサイズが巨大になるだろうなぁ.


【AK4495のDSD IFはどうなってるの?】
AK4495の音声信号IF pinはこの4つ
←AK4495

まずPCM modeについて説明する.

ラズパイとDACのIFでポピュラーなのはI2Sである.
ラズパイが出力するI2Sは3つの信号線である.
  BCK      サンプリング周波数の64倍とかいろいろ  (12pin)
  LRCK     サンプリング周波数そのもの      (35pin)
  DATA     LRchを1本線でシリアル伝送する     (40pin)
←ラズパイ

AK4495にはこの他にBCKの2~8倍ほどのMCLKを要するので、付加回路で作る必要がある.

つぎにDSD modeのAK4495について説明する.

DSDでは、物理的にはBCK/LRCK/DATA/MCLKのpinは同じだが、機能が化けるのである.
  BCK   → BCK      元のまま、5.6MHzとか2.8MHzとかそんなかんじ
  LRCK → DSDR    Rchの1bit streamに変わる
  DATA → DSDL    Lchの1bit streamに変わる
  MCLK → MCLK   元のまま、22MHzとか24MHzとかそんなかんじ

ゆえにだ、、、AK4495の都合から言えばラズパイに求めたいのはLRCKにDSD Rchが出てくるんだろうな? ということになる.

オシロで確認したり、ネットを徘徊してみたが、結論は「そんなモンは出てこない」であった.DSDでもLRCKはLRCKのままだ.したがってI2S接続でAK4495をDSD運用するのはひとまず不可能である.付加回路が必須である.

なお、DSDに対応しているES9038もAK4495と同様のIF仕様になっているようだ.


【ラズパイのDSDはどうしてBCLK/DSDL/DSDRを出力してくれないの?】
それにはまず、DoPというのを理解する必要がある.
DSD over PCMの略がDoPである.

DoPの意図するところは、I2Sは本来PCMを通すためのIFであるが、ここにDSDを乗せてしまおうという、I2Sの拡張規格である.
I2Sは上で説明したとおり、1本のdata信号線に時分割でLRchが乗るのが基本構成.
AK4495の求める仕様はLchとRchの2本線だが、それはI2Sの設計思想に反するのでそういう風にならなかったんじゃないかねぇ?

Linuxのデバドラを自作してI2SとDoPの制約から逃れるのがスカッと解決する美しいやり方だが、デバドラを自作する技術を持たないわたしには難易度が高いのでやめておく.


【DoPってどんな仕様なの?】
DoPの規格書はこれらしい
・data仕様は、8bitDSDマーカ+16bit音声データ、1本線でLch+Rchを伝送
・たぶんLRCKとBCKはPCMに順ずる仕様
・したがって見た目は24bitPCMデータと同じなので、DSDマーカを監視してDSDだぁと検知しないかぎりPCM DACからnoiseが出る羽目になる
・DSDマーカという冗長さゆえに、DSD64(2.8MHz)までしか伝送できないらしい.ただしDSD128まで行けるという説も在る

DSDマーカの仕様は、05とFAをサンプリング周期で交互に繰り返すらしい.
  T=i        DSDマーカLch=05h      DSDマーカRch=05h
  T=i+1    DSDマーカLch=FAh      DSDマーカRch=FAh

なにかと制約の多いDoPのせいで断念すべきこと、ならびに追加すべき回路がある.
・DSDマーカを監視するロジック回路が必要である
・DSD128以上を再生するためにはDoPでない他のIFを使う必要がある.候補はUSB,HDMI,SPDIFであろうが、この中で生き残るのはUSBだけだそうだ.HDMIは規格帯域がHiResを通せない、SPDIFはもとより伝送帯域不足.→こちら
・AK4495のDSDL/DSDRにフィットさせるため、及びマーカ監視のため、FPGAを付加する必要がある

ちなみに、Terraberry-DACという市販DSCボードがあり、DSD256に対応していると謳っているけれど、その実態はI2S伝送帯域はDSD64で、ボード上でDSD256に変換しているのだそうだ. →こちら


【たくさんあるラズパイDAC基板のデバドラはどうなってる?】
ここまでの考察で、
 ・volumioをソフト的にカスタマイズするのは避ける
 ・AK4495を接続するための諸問題回避は回路で行う
という方針を得た.

ところで、ラズパイ用DAC基板は多数販売されている.
これらの基板は各社が独自のデバドラをリリースし、ユーザーはvolumioにデバドラを組み込んで使っているのだろうか? だとしたらスゲーかったるい.
だがそれは違うのだ.
あまたあるラズパイDAC基板の多くは「ほにゃららのクローン基板」なのである.
たとえばラズパイDACで数が多いのはPCM5122を搭載した基板である.
PCM5122搭載DAC基板のご本家は「HiFiBerry DAC plus」である.
他メーカーのPCM5122基板は、HiFiBerryのデバドラを流用しているのだ.

Linuxに実装されたDevice tree overlayというデバドラ後付けの仕組みを利用している.
こちらのURLを見てもらうとそれがわかる.
「overlay:hifiberry-dac」という文字がたくさんあるでしょ.みんなで相乗り.


【こんなブロックを設計すりゃいいんじゃね?】
・ラズパイには「僕にはHiFiBerry DAC plusが繋がっているんだ」と誤解してもらう.
ちなみに、HiFiBerryのデバドラにはslave/masterの2種類がある.
  slave: HiFiBerry DAC
  master:HiFiBerry DAC plus

・ラズパイのI2Cの先にArduinoで作った「fake PCM5122」をつけておくことで、HiFiBerry DAC plusが繋がっていると誤解させる.

・ラズパイのI2Sからは、例の3本線のオーディオデータが出る.

・I2Sの先にはPLDを置く.機能は3つ.
 1) master clockの切り替え、LRCK/BCK生成   (volumioのFsとの連繋手法は不明)
 2) DSDマーカの監視、AK4495のPCM/DSD切り替え
 3) dataをDSDL/DSDRに振り分ける

追記:困ったよ.3番の機能には64bit分のFlip-Flopが最低でも必要だが、XC9572XLのような廉価なCPLDだとFFが72個しか載ってないわけで、容量不足でもうたいへん.目処が立たない.高価なデバイスを使う気はないし.

・ここまで読む根性のある人なら判ると思うが、24.576MHzは48kHz系源発振、22.579MHzは44.1kHz系源発振である.

・AK4495のレジスタ設定はArduinoで行う.またOLED制御もArduinoで行う.


【fake PCM5122をArduinoで作ってみた】
まずはI2Cアドレスを知る必要がある.再びこちらのURLを見てもらうと、4Dhだとわかる.
    {"id":"hifiberry-dacplus","name":"HiFiBerry DAC Plus","overlay":"hifiberry-dacplus","alsanum":"1","mixer":"Digital","modules":"","script":"","eeprom_name":"HiFiBerry DAC+","i2c_address":"4d","needsreboot":"no"},

I2Cアドレス4DをArduinoで監視したところ、起動時にラズパイがする操作は単純だ.resetと並行してprobingしているらしい.
ラズパイはPCM5122のpageレジスタを読む、非0ならPCM5122 probing断念
ラズパイはPCM5122をresetする
ラズパイはPCM5122のpageレジスタを読む、非0ならPCM5122 probing断念
ラズパイはPCM5122をpower down modeにする
ラズパイはPCM5122のpageレジスタを読む、非0ならPCM5122 probing断念

この操作をかいくぐればPCM5122 probingにひとまず成功したかもしれない.なぜなら、「Please connect HiFiBerry DAC Plus to the unit」という起動時メッセージが出なくなるからだ.
ただし、aplay -lではPlusと認識させるには至っていない.何かまだ地雷があるみたいだ.
card 1: sndrpihifiberry [snd_rpi_hifiberry_dac], device 0: HifiBerry DAC HiFi pcm5102a-hifi-0 []

恐らく地雷はclockではないかと思う.HiFiBerry DAC plusの場合はDACがmasterなので、clock供給無しの現状では不具合があるのだろう.(PCM5122と発振器を中華通販に発注したのでさらなる探求はまた後日)

こちらのサイトは大変有用で、回路図なども載っている.発振器の処理がわかる.

参考:起動時のI2Cの動き (bit7はinncrement modeの意味)
slave is written 1 bytes        80    readadrs
slave is requested to send data [80]    read命令  ゼロを返す
slave is written 2 bytes        80-0    reg0write
slave is written 2 bytes        81-11   reg1write
slave is written 1 bytes        80
slave is requested to send data [80]
slave is written 2 bytes        80-0
slave is written 2 bytes        81-0
slave is written 1 bytes        80
slave is requested to send data [80]
slave is written 2 bytes        80-0
slave is written 2 bytes        82-10
slave is written 1 bytes        80
slave is requested to send data [80]
slave is written 2 bytes        80-0
slave is written 2 bytes        82-11


【HiFiBerry DACデバドラでvolumioの動作状況は?】
fake PCM5122はこのくらいにしておく(発振器が無いのでこれ以上のことは出来ない).

volumioのDAC modelには「HiFiBerry DAC」を設定して各種音楽ファイルを再生してみる.I2Sに何が出てくるのだろうか?

まずPCMファイルをAuto Resamplingなしで再生してみる.
  44.1k16bit/88k24bit/176k24bit     →これらはそのままI2Sへ出てくる
  352k24bit       →これは192k24bitに落とされてI2Sへ出てくる
PCM5122やPCM5102は385kHzまで対応しているのでどうして192k落ちさせるのか不明である.

次にDSDファイルはどうか? DoPオンで再生してみる.
  DSD64(2.8MHz)     →I2SにDSDっぽい信号が出てくる.音出しは出来てないが
  DSD128(5.6MHz)    →192k24bitにPCM落ちしてI2Sへ出てくる

なお、DoPオフ(DSD direct)だと、DSD64も192k24bitにPCM落ちしてI2Sに出てくる.


今宵はここまでにしとうございます.さて、FPGAをやるか.

かしこ

0 件のコメント:

コメントを投稿