手写声卡驱动

本文档详细介绍了如何手写WM9714声卡驱动,包括初始化声卡芯片、共性部分的实现、硬件操作、电源管理及卸载过程。通过示例代码展示了从注册声卡设备到设置寄存器值的过程。
摘要由CSDN通过智能技术生成

 

转载请标明来源: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值