ASoC Machine 驱动¶
ASoC machine (或板) 驱动程序是将所有组件驱动程序(例如,编解码器、平台和 DAI)粘合在一起的代码。 它还描述了每个组件之间的关系,包括音频路径、GPIO、中断、时钟、插孔和稳压器。
machine 驱动程序可以包含编解码器和平台特定的代码。 它将音频子系统注册到内核,作为一个平台设备,并由以下结构表示:-
/* 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 是可选的。 在这里进行任何 machine 相关的探测。
suspend()/resume()¶
machine 驱动程序具有 suspend 和 resume 的 pre 和 post 版本,以处理在编解码器、DAI 和 DMA 挂起和恢复之前或之后必须完成的任何 machine 音频任务。 可选。
Machine DAI 配置¶
machine DAI 配置将所有编解码器和 CPU DAI 粘合在一起。 它也可以用于设置 DAI 系统时钟以及任何 machine 相关的 DAI 初始化,例如,machine 音频映射可以连接到编解码器音频映射,未连接的编解码器引脚可以设置为这样。
struct snd_soc_dai_link 用于设置你的 machine 中的每个 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 dais 的名称应该是全局唯一的。
此外,可以使用以下示例宏来注册 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 设置 machine。 例如:
/* 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 和平台。 如果所有这些组件都成功探测,则声卡将被注册。
Machine 电源映射¶
machine 驱动程序可以选择扩展编解码器电源映射,并成为音频子系统的音频电源映射。 这允许自动打开/关闭扬声器/HP 放大器等。 编解码器引脚可以在 machine 初始化函数中连接到 machine 的插孔插座。
Machine 控制¶
可以在 DAI 初始化函数中添加 machine 特定的音频混音器控制。
时钟控制¶
如前所述,时钟配置在 machine 驱动程序中处理。 有关 machine 驱动程序可以用于设置的时钟 API 的详细信息,请参阅 音频时钟。 但是,回调需要由 CPU/编解码器/平台驱动程序注册,以配置相应设备操作所需的时钟。