转载请标明来源:http://blog.csdn.net/l_d_d/article/details/8299049
现在来手写一下声卡驱动,对于每款声卡而言,都是又共性和差异性两部分组成:
在soc-core核心层会调用soc_codec_dev_wm9713.probe函数来初始化好声卡芯片。
struct snd_soc_codec_device soc_codec_dev_wm9713 = {
.probe = soc_probe,
.remove = soc_remove,
};
对于probe而言,共性部分+wm9714的硬件操作部分:
现在看看声卡共性的部分,用函数名sound_common表示:
该函数适合任何声卡驱动,包括wm9714和uda1341等:
static int sound_common( struct snd_soc_device *socdev,char *sound_name)
{
struct snd_soc_codec *codec;
/*分配设置socdev->card->codec结构体*/
if((socdev->card->codec= kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL))==NULL)
return -ENOMEM;
codec=socdev->card->codec;
mutex_init(&codec->mutex); //初始化codec的mutex_lock;
/*初始化链表*/
INIT_LIST_HEAD(&codec->dapm_widgets);
INIT_LIST_HEAD(&codec->dapm_paths);
/*初始化声卡寄存器值表*/
codec->reg_cache = kmemdup( sound_reg, sizeof( sound_reg), GFP_KERNEL);
if (codec->reg_cache == NULL) {
ret = -ENOMEM;
goto cache_err;
}
codec->reg_cache_size = sizeof(sound_reg);
codec->reg_cache_step = 2;
snd_soc_codec_set_drvdata(co