ALSA SoCドライバメモ No.004 外部クロック関連

外部クロックを使う場合

  • 外部クロックを使うときのクロック制御はDAI LINKに組み込むか、CODECに組み込むか。どちらでも良さそう。
  • PCM5122のGPIOとDividerを利用しているHiFiBerry DAC+PROではdai link (sound/soc/bcm/hifiberry-dacpro.c)でやっている
    • PCM5122内蔵GPIOの制御はdai linkから子のcodecハンドラを辿ってi2cハンドラを取得し、i2c writeするという離れ業をやっている。あまり真似したくない方法。
  • クロックの向きの話
    • CBS_CFS
      Codec_BCLK_Slave /Codec_FrameCLK_Slave
      クロック全部をCPU DAI(I2S)側が用意する。デフォルト。
    • CBM_CFM
      Codec_BCLK_Master/Codec_FrameCLK_Master
      クロック全部をCODEC側が用意する
    • CBM_CFS
      Codec_BCLK_Master/Codec_FrameCLK_Slave
      BCLKをCODEC側が用意し、LRCKはCPU DAI(I2S)が生成する
  • CBM_CFM/CBM_CFS時のfs指定
    • DAI LINK or CODEC to CPU DAI
      • snd_soc_dai_set_tdm_slotかsnd_soc_dai_set_bclk_ratio経由で外部から指定できる。
  • Dai link/codecからCPU DAIに設定可能なCallbackはこの辺。実装はされていないものもある。
    • うまく使えば、dai linkからMCLKを指定して、内蔵PLLに設定させるとかもできそう
        int (*set_sysclk)(struct snd_soc_dai *dai,
                int clk_id, unsigned int freq, int dir);
        int (*set_pll)(struct snd_soc_dai *dai, int pll_id, int source,
                unsigned int freq_in, unsigned int freq_out);
        int (*set_clkdiv)(struct snd_soc_dai *dai, int div_id, int div);
        int (*set_bclk_ratio)(struct snd_soc_dai *dai, unsigned int ratio);