AK449Xの簡易外部クロック化について

 旭化成DAC AK449Xシリーズにて、複雑なクロック生成回路ではなく単純な発振器を用いて外部クロック化する手法の紹介。
 前回(BCLK/LRCLK出力しかないRaspberry Piで旭化成のDAC IC(AK449xシリーズ)を鳴らす実験 - _tkz_ memo])は外部回路追加無しでしたが今回はちょっとだけ外部回路を追加して、もっと高品質なクロックを供給できないかな?というお話です。

 NanoPi NEO2とRaspberry Pi Zeroで動作確認済み

 なお、データシート的にはダメとは書いてないように見えるが、イレギュラーなクロック入力になるので、動作保証はできません。

実現方法1 水晶発振器2個用意しOEピンで切り替え

  • MCLK=BCLKとし、BCLKをMCLK相当まで上げる
  • サンプリング周波数に合わせて22.5792MHz/24.576MHzのどちらかを切り替えMCLK=BCLKとする
    • 発振器のOEピンはGPIOで制御
  • LRCLKはSBC側I2SブロックでBCLK入力を基に生成する(CBM_CFS動作)
  • BCLK RATIO(BCLK/LRCLK比)は下記のような設定になる
    • 22.5792MHz/44.1kHz再生時 512fs
    • 22.5792MHz/88.2kHz再生時 256fs
    • 22.5792MHz/176.4kHz再生時 128fs
    • 24.576MHz/48kHz再生時 512fs
    • 24.576MHz/96kHz再生時 256fs
    • 24.576MHz/192kHz再生時 128fs
    • 24.576MHz/384kHz再生時 64fs

実装イメージ

  • 使用した水晶発振器はKyocera KC7050
  • GPIOでOEを制御
  • BCLKに22.5792MHz or 24.576MHzを入力 f:id:tkztkztkz:20190501202713j:plain

実現方法2 可変クロックジェネレータを制御

  • MCLK=BCLKとし、BCLKをMCLK相当まで上げる
  • 可変周波数出力のできるSi514を使用する
  • LRCLKはSBC側I2SブロックでBCLK入力を基に生成する(CBM_CFS動作)

実装イメージ

  • クロックジェネレータはSilicon Labs Si514
  • I2CでSi514を制御
  • BCLKには任意のクロックを入力可能だが、デフォルトでは22.5792MHz or 24.576MHzを入力
  • BCLK RATIO(BCLK/LRCLK比)は水晶発振器使用の場合と同じ f:id:tkztkztkz:20190501202746j:plain
  • 8pin DIPソケットは次回以降に説明する別のお話なので、今のところ無視してください。

メモと考察

  • IntPLLに比べると音質は向上
  • 比較的ハードウェア実装は簡単
  • ソフトウェアは結構面倒だが、DAI LINKドライバ化したので、OEピンはdevice-treeで指定できる

実験用のカーネルなど

  • ソースはgithubにコミット済み github.com
  • クロック制御の実体は下記ソース
sound/soc/codecs/i2s_mfdl.c
  • OE制御ピンの指定、Si514の指定は下記dtsを参照のこと
 arch/arm64/boot/dts/allwinner/sun50i-h5-nanopi-neo2-i2s_1clk.dts