ASoC 机器驱动

ASoC 机器(或板级)驱动程序是将所有组件驱动程序(例如编解码器、平台和 DAI)粘合在一起的代码。它还描述了每个组件之间的关系,包括音频路径、GPIO、中断、时钟、插孔和稳压器。

机器驱动程序可以包含编解码器和平台特定的代码。它将音频子系统注册到内核作为平台设备,并由以下结构表示:-

/* SoC machine */
struct snd_soc_card {
      char *name;

      ...

      int (*probe)(struct platform_device *pdev);
      int (*remove)(struct platform_device *pdev);

      /* the pre and post PM functions are used to do any PM work before and
       * after the codec and DAIs do any PM work. */
      int (*suspend_pre)(struct platform_device *pdev, pm_message_t state);
      int (*suspend_post)(struct platform_device *pdev, pm_message_t state);
      int (*resume_pre)(struct platform_device *pdev);
      int (*resume_post)(struct platform_device *pdev);

      ...

      /* CPU <--> Codec DAI links  */
      struct snd_soc_dai_link *dai_link;
      int num_links;

      ...
};

probe()/remove()

probe/remove 是可选的。在此处进行任何特定于机器的探测。

suspend()/resume()

机器驱动程序具有挂起和恢复的前后版本,以处理在编解码器、DAI 和 DMA 挂起和恢复之前或之后必须完成的任何机器音频任务。可选。

机器 DAI 配置

机器 DAI 配置将所有编解码器和 CPU DAI 连接在一起。它还可以用于设置 DAI 系统时钟,以及任何机器相关的 DAI 初始化,例如,机器音频映射可以连接到编解码器音频映射,未连接的编解码器引脚可以设置为这样。

struct snd_soc_dai_link 用于设置机器中的每个 DAI。例如:

/* corgi digital audio interface glue - connects codec <--> CPU */
static struct snd_soc_dai_link corgi_dai = {
      .name = "WM8731",
      .stream_name = "WM8731",
      .cpu_dai_name = "pxa-is2-dai",
      .codec_dai_name = "wm8731-hifi",
      .platform_name = "pxa-pcm-audio",
      .codec_name = "wm8713-codec.0-001a",
      .init = corgi_wm8731_init,
      .ops = &corgi_ops,
};

在上面的结构中,dai 是使用名称注册的,但您可以传递 dai 名称或设备树节点,但不能同时传递两者。此外,此处用于 cpu/codec/platform dai 的名称应该是全局唯一的。

此外,可以使用以下示例宏来注册 cpu、编解码器和平台 dai

SND_SOC_DAILINK_DEFS(wm2200_cpu_dsp,
      DAILINK_COMP_ARRAY(COMP_CPU("samsung-i2s.0")),
      DAILINK_COMP_ARRAY(COMP_CODEC("spi0.0", "wm0010-sdi1")),
      DAILINK_COMP_ARRAY(COMP_PLATFORM("samsung-i2s.0")));

struct snd_soc_card 然后使用其 DAI 设置机器。例如:

/* corgi audio machine driver */
static struct snd_soc_card snd_soc_corgi = {
      .name = "Corgi",
      .dai_link = &corgi_dai,
      .num_links = 1,
};

在此之后,可以使用 devm_snd_soc_register_card 注册声卡。在注册期间,会探测各个组件,例如编解码器、CPU 和平台。如果所有这些组件都成功探测到,则会注册声卡。

机器电源映射

机器驱动程序可以选择扩展编解码器电源映射,使其成为音频子系统的音频电源映射。这允许扬声器/HP 放大器等的自动上电/断电。编解码器引脚可以在机器初始化函数中连接到机器的插孔插座。

机器控制

可以在 DAI 初始化函数中添加特定于机器的音频混音器控制。

时钟控制

如前所述,时钟配置在机器驱动程序中处理。有关机器驱动程序可用于设置的时钟 API 的详细信息,请参阅音频时钟。但是,回调需要由 CPU/编解码器/平台驱动程序注册,以配置相应设备操作所需的时钟。