外部クロックを使う場合
- 外部クロックを使うときのクロック制御は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);