打印
[新唐音频]

Linux环境NAU88C22如何使用PLL

[复制链接]
874|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
HFLD|  楼主 | 2024-8-2 10:47 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
当MCLK不是采样率的整数倍时,可能需要锁相环PLL来当系统时钟。
从寄存器来看,需要设定Reg0x06[8]=1
但是在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 (21.23 KB )

6294066ac45ce28edc.png

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

24

帖子

0

粉丝