簡易外部クロック化について 補足

必要なスペック

DAI(I2Sコントローラ)側

  • 高いBCLK入力に対応可能であること
    • NEO2(H5)では98.304MHzでも動いてた。ただし、12.288MHzより高い周波数はスペック範囲外となる。
    • RPi Zero(BCM2835)では24.576MHzまで確認。それ以上は未確認。
  • CBM_CFS動作が可能であること
    • Codec Bitclk Master/Codec FrameSync Slaveを意味するALSA用語
    • SBCのI2Sコントローラが、入力したBCLKからLRCLKを生成・出力できること
    • NEO2(H5)/RPi Zero(BCM2835)ともに可能
  • 高いBCLK RATIO(BCLK/LRCLK比)を設定可能であること
    • 22.5792MHz/44.1kHz再生時には512fs必要
    • 45.1584MHz/44.1kHz再生時には1024fs必要
    • NEO2(H5)では2048fsまで指定可
    • RPi Zero(BCM2835)では1024fsまで指定可

DAC

  • 高いBCLK RATIO(BCLK/LRCLK比)を入力可能であること
    • 近代的なTDM SLOT対応DACだと結構大丈夫そう
    • 古いものや廉価なI2S DACはダメなことが多い。左詰(LJ+1シフト)になるからBCLKカウンタが必要なため?
    • 古くてもRJ入力だとOKなことがある。RJだからシリパラは垂れ流しで、LRCLKでラッチすれば良いから?
  • 高い再生周波数を再生できること
    • 384kHz/32bit再生可能だと大丈夫そう
    • これは44.1kHz再生時でも352.8kHz相当のデータ転送スピードとなるため
  • BCLK/MCLK比、LRCLK/BCLK比に制約が無いこと
    • AK4495のデータシートを読むと、MCLK/LRCLKについては位相の制約などがあるが、BCLKについての制約は書かれていない
    • BCLKをDAC内デジタル信号処理のクロックに使っているとダメな可能性が高い

ソフトウェア

  • CPU DAI(I2Sドライバ) (改造)

    • CBM_CFS動作が可能であること
      • NEO2(H5)は機能追加が必要
      • RPi Zero(BCM2835)は対応済み
    • set_bclk_ratioに対応していること
      • NEO2(H5)は機能追加が必要
      • RPi Zero(BCM2835)は対応済み
    • ハイレートなfslenの計算ができること
      • NEO2(H5)は機能追加が必要
      • RPi Zero(BCM2835)は対応済み
  • DAI LINKドライバ (新規作成)

    • 外部クロックの制御(OE制御やSi514などの可変クロック制御)ができること
    • BCLK RATIO(fs)を算出の上CPU DAI(I2Sドライバ)に設定すること

その他のDACでの動作

  • ES9023(SabreberryDAC ZERO)では512fsで音が出ることを確認
  • PCM5102Aでは64fs(384kHz)のみ音が出た。
    • 残念ながら512fs動作はできず。
    • 128fsから上は無音となる。
  • TDA1543/TDA1387T(I2S)では動作せず。TDA1545A(RJ)では512fs動作した。
    • 前者はI2Sのため、BCLKのカウンタが溢れたのではないかと推察
    • I2SはLRCLKのエッジから1clkディレイして取り込み開始とか、左詰なので量子化bit数分取り込んだらシリパラ止めるかデータラッチしておく必要があるなど制御が複雑
    • 後者はRJのためカウンタは不要で、シリパラにジャブジャブデータを突っ込んで、LRCLKのエッジでデータラッチすれば良いからだと推察

実装周りのメモ

  • NEO2(H5)とRPi Zero(BCM2835)でFrameLengthの指定方法が違う
    • NEO2(H5)では片chのFrameLengthをPeriodとして指定するだけでOK
      • I2S(1bit shift)やRJのデータ出力開始位置は自動算出してくれる
      • 指定可能なのは8/12/16/20/24/28/32bit
      • 言い換えるとデータ出力開始位置を柔軟に指定できない
      • 古いDAC ICの18bitなどには対応できない(裏技で対応することはできそう?という情報有り。未確認)
    • RPi Zero(BCM2835)では、Lch/Rchのデータ開始位置をbit単位で指定する必要がある
      • 例 I2S 64fs の場合 Lch tx_ch1_pos = 1, Rch tx_ch2_pos = 33
      • 例 LJ24 64fsの場合 Lch tx_ch1_pos = 0, Rch tx_ch2_pos = 32
      • 例 RJ24 64fsの場合 Lch tx_ch1_pos = 8, Rch tx_ch2_pos = 40
      • I2S/LJ/RJでそれぞれ計算が必要で面倒だが、データ出力開始位置を柔軟に指定できる
      • RJで15bit出力するなど特殊なslotwidthを実現可能。古いマルチビットDAC ICを使用するときにはとても良さそう。