[新唐音频] Linux环境NAU88C22如何使用PLL

[复制链接]
1374|0
 楼主| HFLD 发表于 2024-8-2 10:47 | 显示全部楼层 |阅读模式
当MCLK不是采样率的整数倍时,可能需要锁相环PLL来当系统时钟。
从寄存器来看,需要设定Reg0x06[8]=1 7214866ac45f76e152.png
但是在Linux中如何实现?
在驱动文件中,
.set_sysclk = nau8822_set_dai_sysclk, ( .set_sysclk 会被 machine 调用)
static int nau8822_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int freq, int dir)
{
struct snd_soc_component *component = dai->component;
struct nau8822 *nau8822 = snd_soc_component_get_drvdata(component);
nau8822->div_id = clk_id;
nau8822->sysclk = freq;
……
}
static int nau8822_config_clkdiv(struct snd_soc_dai *dai, int div, int rate)
{
struct snd_soc_component *component = dai->component;
struct nau8822 *nau8822 = snd_soc_component_get_drvdata(component);
switch (nau8822->div_id)
   {
      case NAU8822_CLK_MCLK:
          imclk = rate * 256;
          for (i = 1; i < ARRAY_SIZE(nau8822_mclk_scaler); i++)
            {
                 sclk = (nau8822->sysclk * 10) / nau8822_mclk_scaler;
                 if (sclk < imclk)break;div = i;
             }// 设置寄存器
     case NAU8822_CLK_PLL:
          // 设置寄存器
  }

在 machine 文件中 (./output/build/linux-custom/sound/soc/ma35d1/ma35d1-audio.c )
可以在hw_params中配置时钟,其他SOC也是类似。
static int ma35d1_audio_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params)
{
  …….
  ret = snd_soc_dai_set_sysclk(codec_dai, NAU8822_CLK_PLL, clk, SND_SOC_CLOCK_OUT);
  …….
}

如何验证:
在播放音乐时,去抓NAU88C22的寄存器,看看Reg0x06[8]是否置1.
cat /sys/kernel/debug/regmap/0-001a/registers
6294066ac45ce28edc.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

29

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部