ALSA ASoC 简单声卡驱动程序中的 DAPM 路由是啥意思?

Posted

技术标签:

【中文标题】ALSA ASoC 简单声卡驱动程序中的 DAPM 路由是啥意思?【英文标题】:What does DAPM routing in ALSA ASoC simple-audio-card driver mean?ALSA ASoC 简单声卡驱动程序中的 DAPM 路由是什么意思? 【发布时间】:2020-05-21 20:39:02 【问题描述】:

内核文档doc/Documentation/devicetree/bindings/sound/simple-card.txt 给出了如何在设备树中使用它的示例:

sound 
    compatible = "simple-audio-card";
    ...
    simple-audio-card,widgets =
        "Microphone", "Microphone Jack",
        "Headphone", "Headphone Jack",
        "Speaker", "External Speaker";
    simple-audio-card,routing =
        "MIC_IN", "Microphone Jack",
        "Headphone Jack", "HP_OUT",
        "External Speaker", "LINE_OUT";
    ...

“麦克风”、“耳机”和“扬声器”只是标识符(允许的只有“麦克风”、“耳机”、“扬声器”、“线路”)。名称“MIC_IN”、“HP_OUT”和“LINE_OUT”是其驱动程序报告的硬件编解码器的真实内容。

“麦克风插孔”、“耳机插孔”和“外接扬声器”等别名是什么?它们出现在哪里以及它们有多重要(它们不会将 1 对 1 映射到用户空间 ALSA 设备,这些名称从未出现在用户空间中)?它们如何影响硬件编解码器?

【问题讨论】:

【参考方案1】:

简而言之,“simple-audio-card,routing”中使用的名称实际上就是您在“simple-audio-card,widgets”中定义并重命名的名称。

另一个重要说明是“简单的声卡,小部件”可能定义例如两个扬声器小部件:

"Speaker", "External Speaker";
"Speaker", "Internal Speaker";

第一个“Speaker”是模板名称,第二个是实例名称。

TL;DR:

我最近也遇到了这个问题。读了一些代码后,我的理解如下:

按照 DTS 定义做两件事:

simple-audio-card,widgets =
        "Microphone", "Microphone Jack",
        "Headphone", "Headphone Jack",
        "Speaker", "External Speaker";
    它定义/创建机器级别(声卡级别)小部件,例如“扬声器”、“麦克风”、“耳机”。 DTS 还允许将其重命名为自定义名称。所以“麦克风”被重命名为“麦克风插孔”等等。

这可以从如下所示的代码中读取。所以从“simple-audio-card,routing”引用的未来widget名称应该是重命名后的。

在文件 kernel/sound/soc/soc-core.c:

static const struct snd_soc_dapm_widget simple_widgets[] = 
    SND_SOC_DAPM_MIC("Microphone", NULL),
    SND_SOC_DAPM_LINE("Line", NULL),
    SND_SOC_DAPM_HP("Headphone", NULL),
    SND_SOC_DAPM_SPK("Speaker", NULL),
;

上面定义了一个小部件模板。

int snd_soc_of_parse_audio_simple_widgets(struct snd_soc_card *card,
                    const char *propname)

在上面的函数中,它会尝试通过名称将DT中显示的名称与模板匹配,然后将名称更改为第二列中的名称(在DTS中)

文档widget.txt其实也是重复的:

kernel/Documentation/devicetree/bindings/sound/widgets.txt

小部件:

这主要指定音频off-codec DAPM小部件。

每个条目是DT中的一对字符串:

"template-wname", "user-supplied-wname"

“template-wname”是模板小部件名称,当前 包括:“麦克风”、“线路”、“耳机”和“扬声器”。

“user-supplied-wname”是用户指定的小部件名称。

例如: 简单的音频小部件 = “麦克风”、“麦克风插孔”、 “线”,“杰克线”, “线路”,“线路输出插孔”, “耳机”、“耳机插孔”、 “扬声器”、“外部扬声器”;

我不是 ALSA 专家,很遗憾,我在阅读代码之前无法理解该文档。

【讨论】:

以上是关于ALSA ASoC 简单声卡驱动程序中的 DAPM 路由是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

ALSA声卡驱动的DAPM-建立过程

Linux ALSA声卡驱动之五:移动设备中的ALSA(ASoC)

ALSA声卡驱动的DAPM-基于高通平台

Linux audio驱动模型

ALSA driver---DAPM 2

Linux音频驱动学习之:ASOC分析