linux声卡驱动详介

参考jive_wm8750声卡
static struct snd_soc_dai_link jive_dai = {
.name = “wm8750”,
.stream_name = “WM8750”,
.cpu_dai_name = “s3c2412-i2s”, //cpu端i2s驱动一般
.codec_dai_name = “wm8750-hifi”, //一个codec里边会包含几个dai,这个是指定codec里边dail名字
.platform_name = “s3c2412-i2s”, //cpu端对i2s dma的驱动
.codec_name = “wm8750.0-001a”, //codec的名字 i2c注册使用的名字
.init = jive_wm8750_init,
.ops = &jive_ops,
};
static const struct snd_soc_dapm_widget wm8750_dapm_widgets[] = {
SND_SOC_DAPM_HP(“Headphone Jack”, NULL),
SND_SOC_DAPM_SPK(“Internal Speaker”, NULL),
SND_SOC_DAPM_LINE(“Line In”, NULL),
};

/* jive audio machine driver */
static struct snd_soc_card snd_soc_machine_jive = {
.name = “Jive”,
.owner = THIS_MODULE,
.dai_link = &jive_dai,
.num_links = 1,

.dapm_widgets = wm8750_dapm_widgets,
.num_dapm_widgets = ARRAY_SIZE(wm8750_dapm_widgets),
.dapm_routes = audio_map,
.num_dapm_routes = ARRAY_SIZE(audio_map),
};

/*
这个就是我们cpu dai驱动,就是i2s驱动对应我们声卡 cpu_dai_name
snd_soc_component_driver在注册s3c2412_i2s_dai时使用其中的名字
*/
static const struct snd_soc_component_driver s3c2412_i2s_component = {
.name = “s3c2412-i2s”,
};
static struct snd_soc_dai_driver s3c2412_i2s_dai = {
.probe = s3c2412_i2s_probe,
.remove = s3c2412_i2s_remove,
.playback = {
.channels_min = 2,
.channels_max = 2,
.rates = S3C2412_I2S_RATES,
.formats = SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE,
},
.capture = {
.channels_min = 2,
.channels_max = 2,
.rates = S3C2412_I2S_RATES,
.formats = SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE,
},
.ops = &s3c2412_i2s_dai_ops,
};

/*
这个是我们在i2c驱动注册codec驱动时注册的codec dail
使用snd_soc_register_codec(&i2c->dev,&soc_codec_dev_wm8750, &wm8750_dai, 1);注册

*/
static struct snd_soc_dai_driver wm8750_dai = {
.name = “wm8750-hifi”,
.playback = {
.stream_name = “Playback”,
.channels_min = 1,
.channels_max = 2,
.rates = WM8750_RATES,
.formats = WM8750_FORMATS,},
.capture = {
.stream_name = “Capture”,
.channels_min = 1,
.channels_max = 2,
.rates = WM8750_RATES,
.formats = WM8750_FORMATS,},
.ops = &wm8750_dai_ops,
};

所以我们声卡对应三大部分组成
1,cpu_dail //i2s驱动 snd_soc_register_dais
2,code_dail //我们声卡i2c设备的驱动 snd_soc_register_codec(dev(dev就是我们具体的codec芯片),dail(codec芯片里边的解码器))
3,platform //我们平台针对i2s的dma驱动 snd_soc_add_platform

声卡在注册的过程中会在在我们的/dev/snd目录下生成control pcmc pcmp等设备节点 c就是capture p就是play(soc_new_pcm —- snd_pcm_new 创建pcm节点)
snd_soc_register_platform

 

 

/dev/snd/pcmC0D0c  /dev/snd/pcmC0D0p /dev/snd/controlC0

C0: 0:第几个声卡

D0:0 就是代表我们jive_dai 即声卡snd_soc_card 中 dail_ink索引 我们一个声卡可能会有很多个dail_ink

MIXER: 作用是 对多输入 进行选择 ,或者 混合多输入为一个输出。

MUX: 作用是 是对多输入 进行选择, 输出只有一个。

PGA: 单输入 单输出,同时带有 一个gain 控制音量。

 

 

 

对于mixer control的命名规则是:
对于mux controls命名规则是:

版权声明:本文为vkang原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/vkang/articles/12220670.html