Linux ALSA声卡驱动之一:声卡的创建.doc
《Linux ALSA声卡驱动之一:声卡的创建.doc》由会员分享,可在线阅读,更多相关《Linux ALSA声卡驱动之一:声卡的创建.doc(12页珍藏版)》请在三一办公上搜索。
1、Linux ALSA声卡驱动之一:声卡的创建1. struct snd_card1.1. snd_card是什么snd_card可以说是整个ALSA音频驱动最顶层的一个结构,整个声卡的软件逻辑结构开始于该结构,几乎所有与声音相关的逻辑设备都是在snd_card的管理之下,声卡驱动的第一个动作通常就是创建一个snd_card结构体。正因为如此,本节中,我们也从 struct cnd_card开始吧。1.2. snd_card的定义snd_card的定义位于改头文件中:include/sound/core.hc-sharpview plaincopy/*mainstructureforsoundc
2、ard*/structsnd_cardintnumber;/*numberofsoundcard(indextosnd_cards)*/charid16;/*idstringofthiscard*/chardriver16;/*drivername*/charshortname32;/*shortnameofthissoundcard*/charlongname80;/*nameofthissoundcard*/charmixername80;/*mixername*/charcomponents128;/*cardcomponentsdelimitedwithspace*/structmod
3、ule*module;/*top-levelmodule*/void*private_data;/*privatedataforsoundcard*/void(*private_free)(structsnd_card*card);/*callbackforfreeingofprivatedata*/structlist_headdevices;/*devices*/unsignedintlast_numid;/*lastusednumericID*/structrw_semaphorecontrols_rwsem;/*controlslistlock*/rwlock_tctl_files_r
4、wlock;/*ctl_fileslistlock*/intcontrols_count;/*countofallcontrols*/intuser_ctl_count;/*countofallusercontrols*/structlist_headcontrols;/*allcontrolsforthiscard*/structlist_headctl_files;/*activecontrolfiles*/structsnd_info_entry*proc_root;/*rootforsoundcardspecificfiles*/structsnd_info_entry*proc_id
5、;/*thecardid*/structproc_dir_entry*proc_root_link;/*numberlinktorealid*/structlist_headfiles_list;/*allfilesassociatedtothiscard*/structsnd_shutdown_f_ops*s_f_ops;/*fileoperaTIonsintheshutdownstate*/spinlock_tfiles_lock;/*lockthefilesforthiscard*/intshutdown;/*thiscardisgoingdown*/intfree_on_last_cl
6、ose;/*freeincontextoffile_release*/wait_queue_head_tshutdown_sleep;structdevice*dev;/*deviceassignedtothiscard*/#ifndefCONFIG_SYSFS_DEPRECATEDstructdevice*card_dev;/*cardXobjectforsysfs*/#endif#ifdefCONFIG_PMunsignedintpower_state;/*powerstate*/structmutexpower_lock;/*powerlock*/wait_queue_head_tpow
7、er_sleep;#endif#ifdefined(CONFIG_SND_MIXER_OSS)|defined(CONFIG_SND_MIXER_OSS_MODULE)structsnd_mixer_oss*mixer_oss;intmixer_oss_change_count;#endif;struct list_head devices 记录该声卡下所有逻辑设备的链表struct list_head controls 记录该声卡下所有的控制单元的链表void *private_data 声卡的私有数据,可以在创建声卡时通过参数指定数据的大小2. 声卡的建立流程2.1.1. 第一步,创建sn
8、d_card的一个实例c-sharpview plaincopystructsnd_card*card;interr;.err=snd_card_create(index,id,THIS_MODULE,0,index 一个整数值,该声卡的编号id 字符串,声卡的标识符第四个参数 该参数决定在创建snd_card实例时,需要同时额外分配的私有数据的大小,该数据的指针最终会赋值给snd_card的private_data数据成员card 返回所创建的snd_card实例的指针2.1.2. 第二步,创建声卡的芯片专用数据声卡的专用数据主要用于存放该声卡的一些资源信息,例如中断资源、io资源、dma资
9、源等。可以有两种创建方法:通过上一步中snd_card_create()中的第四个参数,让snd_card_create自己创建c-sharpview plaincopy/structmychip用于保存专用数据err=snd_card_create(index,id,THIS_MODULE,sizeof(structmychip),/从private_data中取出structmychip*chip=card-private_data;自己创建:c-sharpview plaincopystructmychipstructsnd_card*card;.;structsnd_card*card
10、;structmychip*chip;chip=kzalloc(sizeof(*chip),GFP_KERNEL);.err=snd_card_create(indexdev,iddev,THIS_MODULE,0,/专用数据记录snd_card实例chip-card=card;.然后,把芯片的专有数据注册为声卡的一个低阶设备:c-sharpview plaincopystaTIcintsnd_mychip_dev_free(structsnd_device*device)returnsnd_mychip_free(device-device_data);staTIcstructsnd_dev
11、ice_opsops=.dev_free=snd_mychip_dev_free,;.snd_device_new(card,SNDRV_DEV_LOWLEVEL,chip,注册为低阶设备主要是为了当声卡被注销时,芯片专用数据所占用的内存可以被自动地释放。2.1.3. 第三步,设置Driver的ID和名字c-sharpview plaincopystrcpy(card-driver,MyChip);strcpy(card-shortname,MyOwnChip123);sprintf(card-longname,%sat0x%lxirq%i,card-shortname,chip-ioport
12、,chip-irq);snd_card的driver字段保存着芯片的ID字符串,user空间的alsa-lib会使用到该字符串,所以必须要保证该ID的唯一性。shortname字段更多地用于打印信息,longname字段则会出现在/proc/asound/cards中。2.1.4. 第四步,创建声卡的功能部件(逻辑设备),例如PCM,Mixer,MIDI等这时候可以创建声卡的各种功能部件了,还记得开头的snd_card结构体的devices字段吗?每一种部件的创建最终会调用snd_device_new()来生成一个snd_device实例,并把该实例链接到snd_card的devices链表中
13、。通常,alsa-driver的已经提供了一些常用的部件的创建函数,而不必直接调用snd_device_new(),比如:PCM - snd_pcm_new()RAWMIDI - snd_rawmidi_new()CONTROL - snd_ctl_create()TIMER - snd_timer_new()INFO - snd_card_proc_new()JACK - snd_jack_new()2.1.5. 第五步,注册声卡c-sharpview plaincopyerr=snd_card_register(card);if(errarm/pxa2xx-ac97.c的部分代码贴上来:c
14、ppview plaincopystaticint_devinitpxa2xx_ac97_probe(structplatform_device*dev)structsnd_card*card;structsnd_ac97_bus*ac97_bus;structsnd_ac97_templateac97_template;intret;pxa2xx_audio_ops_t*pdata=dev-dev.platform_data;if(dev-id=0)dev_err(ret=-ENXIO;gotoerr_dev;/(1)/ret=snd_card_create(SNDRV_DEFAULT_ID
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux ALSA声卡驱动之一:声卡的创建 ALSA 声卡 驱动 之一 创建
链接地址:https://www.31ppt.com/p-4842443.html