Linux_ALSA声卡驱动开发实践

上传人:小** 文档编号:44103126 上传时间:2021-12-05 格式:DOC 页数:34 大小:883.50KB
返回 下载 相关 举报
Linux_ALSA声卡驱动开发实践_第1页
第1页 / 共34页
Linux_ALSA声卡驱动开发实践_第2页
第2页 / 共34页
Linux_ALSA声卡驱动开发实践_第3页
第3页 / 共34页
点击查看更多>>
资源描述
Linux ALSA声卡驱动开发最佳实践木实践是在Linux基础培训-驱动开发最佳实践基础上进行的一、ALSA架构简介二、最佳实践的目标、目的、方法三、具体步骤四、总结一、ALSA架构简介二、最佳实践的目标、目的、方法三、具体步骤四、总结2020/6/32020/6/31.ALSA架构特点支持多种声卡设备模块化的内核驱动程序支持SMP和多线程提供应用程序开发库兼容OSS应用程序开发必架枸简介AL5A AppALSA lib11111ALSAApp-API11111111Piugin(conveB8BJ1100:;10AO1A0 100O10RIMas七ur PCMIMMIfiOA MicIMMIBOBUidroIMMIMic BoosIMMIrf 0O00ALineCD(2) # Ispci |grep13/r ENS1371声卡会显示类似如下字样#02:02.0 Multimedia audio controller: Ensoniq ES1371 AudioPCI-97 (rev 02) 如果不是ENS1371,下文可作为参考根据口己的实际情况进行。:i會00 Phone1 准备匸作。(2)新建匸作目录如alsa-ensl371-dev-driver,在匸作目录中新建文件ensl371-playback.Co(3)制作makefile。新建文件Makefile。参照Linux基础培训驱动开发最佳实艇:l.pptx第5页编写Makefile。 Makefile内容如下:ifneq ($(KERNELRELEASE)Jobj-m := ensl371 -playback.。elseKBUILD := /lib/modules/uname -r/buildmodules:make -C $(KBUILD) M=$(shell pwd) modulesclean:rm f *.ocore depend *.cmd *.ko *.mod.c *.order *.symversrm -rf .tmp_versionsendif2.查看内核linux-source-2.6.26/sound/pci/ensl371.c的代码,内容如下:/define CHIP1371 /include ,ensl370.c/3.抽取ensl370.c (位 J* linux-source-2.6.26/sound/pci)中Linux通用驱动程序核心,添加到ensl371-playback.c中并make, 测试。可以先添加框架,再向框架中逐步添加函数。可以打印适当的log信息,不会影响ensl371的流程。Linux通用驱动 程序代码如下:#define CHIP1371#in elude static int _init alsa_card_e nsl37x_init(void) _ _ static void _exit alsa_card_ensl37x_exit(void) _ _ modulej nit(alsa_card_en sl37xjnit)module_exit(alsa_card_e nsl37x_exit)4根据ensl370.c的代码,向init和exit中添加实现函数。根据调用关系实现一个被调用函数的最小化定义(如下页图中的 snd_audiopci_probe(snd_audiopci_remove(),以填充调用函数,并将无关部分注释掉,减轻代码量。注意注释无关 部呑时需耍压意,有些不能确定有独有用,可以先留着,另外,除了函数外,其他部分的最好用注释,不耍直接删除, 以便在后面检查是否删除了有用的部分。定义最小化的函数后,代码是可以编译,并可以加载到内核的,再逐步添写被调用函数,以此类推,直到所有的调 用关系全部被添加进代码。如向init和exit中添加实现函数:define CHIP1371秤 in elude 徉 in elude 衬define ENS1371_DEBUGffifdef ENS1371_DEBUGdefine FUNC_LOG() printk(KERN_ERR ”FUNC_LOG: (%d:(%s()nz _LINE_, _FUNCTION_) Wencfifdene DRIVERNAME ENS137r=/ ES1370 / ES1371 / ES1373 CT588O / Ectiva EV1938 4/fflfdef CHIP1370 0X1274, 0X5000, PCI.ANYJD, PCI.ANYJD, 0r 0, 0 J/ffendrf#ifdef CHIP1371 0X1274, 0X1371, PCI_ANYD, PCI_ANYJDr 0r 0z 0, r 0X1274, 0X5880, PCI.ANYJD, PCI.ANYJD, 0, 0, 0, , 0X1102, 0X8938, PCI-ANYD, PCLANYJD, 0r 0, 0,r ffendif0J;(struct pcidev *pciz const struct pci_deyiced *pcijd)FUNC_LOG(hreturn 0;(struct pcidev 4 pci) FUNC_LOG();.name = DRIVER_NAME,.datable = snd_audiopcids,.probe = snd_audiopci_prober.remove = _devexitptsndaudiopciremove), #ifdef CONFIG_PM/.suspend = snd ensoniqsuspend,/.resume = sndensoniqresume,#endif;FUNC_LOG();static int _init alsa_card_ensl37xjnitvod)static void _exrt alsa card ensl37x exitvoid FUNC.LOGO; po_unregster_dnver &d”vetj;r modulQ_init(aka_cad_Gns237)c_init)modulQ_exit(a1sa-Card-Qns237X-Gxit)5.make、insmod、rmmod 驱动模块示例:lb55:/mnt/share/alsa-ensl3?l-dev-dr iuertt makenake: Warn ing: File Makef ile has modif ication time 1,3e+04 s in th巳 future nake -C /Iib/modules/ uname -r/buiId M=/mnt/share/alsa-ensl371-dev-driuer modu1 ms naked: Ent ering d irectory /usr/src/1 inux-source-2 6 26J nakeLZJ: Warning: File /mnt/share/alsa-ensl371-dev-dr iuer/Hakef ile* has modific it ion time 1.3e+W4 s in the futureCC MJ /mnt/share/alsa-ensl371-dev-driver/ens1371-playback o nakeLZJ: warning: Clock skew detected Your build may be incompleteBuilding modules, stage Z nakeLZ: Warning: File /mnt/share/alsa-ensl371-dev-dr iuer/Makef i1巳has modific it ion time 1.3e+84 s in the futureMODFOST 1 roudulesCC/nnitz/shcuD/dlsd-DiisJL3?:l-dDV-dFiuDr/tni$1.371.-pldubcii:k mud . uLD MJ zmnt/sharc/a lsa-ensl371-dev-di%i verzcnsl371-p layback kunakc Z :warn ing: Cluckdetected. Yuux- build mayEcinuump 1 u t u nakc Lil: Leaving directory 1 Zusr/src/ 1 inux-suurcc-Z Ci 26J nakc: warn ing: lb55:/mntzsharczaIsalb55:/mntzsharczaIsa lb55:/mntzsharczaIsaC lock skew detcctcd ?our build may be incomplete dev dr iverttdev-dr iver#cnsl3?lensl371dev ivertt lsmod ! grep cnsl371u192360snd_ensl371snd_ensl371/snd_seq_mid isnd_ensl371snd_ensl371 ,snd_ac97_codec snd_ens?l371i snd_ac97_codec ,snd_pcm, s grep21440nsl371._plaijbackb55:/mnt/share/alsa-ensl3?l-dev-driuer# rmmod ensl371-playback 3848.189611 FUNC.LOG : 59 : alsa_card 药 sl37xxit () 3848.189839 FUNCLOG: 36:Jsnd.audiopci.remoue()b55:/mnt/share/alsa-ensl37L-deu-dr iver#注意insmod ensl371-playback.ko前,耍先卸载系统中原有的ensl371模块snd_ensl371o否则,在定义了DRIVER_NAME后,insmod时就会出错。2020/OT中,五色是shell中输入的命令,黄色是系统打印的信息,而绿色是我们的模块打印的log。 5 另外,驱动模块的单步调试川以参照紅kn祕蜡讪2)驱动开发最佳实践lpptx。6.仿照snd_audiopci_probe()和 snd_audiopci_remove()的填充与alsa_card_ensl37xjnit()和alsa_card_ensl37x_exit()类似, 如此一级乜的填竟下去,直至模玫可以播政出声音。对TsnddiocLprobe(j这样比较套杂石函数,窶一行一行的 添加,边添加边调试。如遇到变量等应该在前面函数中赋值而还後有实现了勺部分,可以先用if宏等方法暂时注释掉,如 下页代码中的红色部分。添加的代码如下:define CHIP1371 include include 禅define ENS1371.DEBUG#ifdef ENS1371_DEBUGffdefme FUNC_LOG() printkjKERNERR ”FUNC_LOodev0Hif | (err = sndensoniqUTlmixerlensoniq snd_card_free(card) return err;return err;/ if (err = sndensomqpcmatensonlq, X, NULL) 0) sndcardfreelcard);return err;if |(err = 5nd.en$omq_midl(en$oniq, 0. NULL) 0)( snd_card_free(card); return err;ffifdef ENS1371_RESERVEDffendif static void _devexit snd_audiopci_remove(struct pci_dev *pci) FUNC_LOG();static struct pa_driver driver = .name = DRIVER-NAM ,id_table = snd_audiopci_idsz .probe = snd_audiopci _prober .remove = _devexitptsndaudiopcLremove), ffifdef CONFIG.PM/.suspend = snd _ensoniq_suspe nd,/.resume = snd_ensoniq_resumez ffendif static mt _init alsa card_ensl37x init(void) FUNC_LOG();retu m pci_register_driver(&d rive r); static void _exit alsacard ensl37x exit(void) FUNC.LOG0; pci_unregister_driver( ftdriver);modulejnit(alsa_cardMensl37x_init) module_exit(alsa_card-ensl37x_exjt)7.如此类推再实现snd_ensoniq_create(). snd_ensoniq_pcm(). snd_ensoniq_1371_mixer()函数,再此不再详述。 出声音,并且能够正漏停止,加抓 卸我模兔 即最小化的驱动程序能够正常工作,也就完成了我们的目标。2020/6/3一、ALSA架构简介二、最佳实践的目标、目的、方法三、具体步骤四、总结ensl371的声卡核心驱动可以分为三个主要部分:(1) 模块insmod时初始化和rmmod时退出部分:初始化: alsa_card_ensl37xjnit() sn d_audiopci_probe() snd_ensoniq_create() sn d_e nsoniq _chipnit() sn d_e nsoniq_1371_mixer() snd_ensoniq _pcm() 退出:一 _ alsa_card_e nsl37x_exit() snd_audiopci_remove() snd_ enson iq_free() sn d_ens oniq_ mixer_free_ac97()(2) 播放以及蔣止部分:一一 一播放:sn d_ens oniq _playbackl_ope n()sn d_e nsoniq _hw_params()sn d_ens oniq _playbackl_prepare()sn d_ens oniq _trigger()虞止:一sn d_ensoniq_trigger()sn d_ens oniq _hw_free()sn d_ensoniq_playbackl_close()(3) 中断触发部分:sn d_audiopcijnterrupt()sn d_ens oniq _playbackl_poi nter()其中有的部分乂包含若干子部分。硬件无关部分会使用alsa-driver中的函数。2020/6/3
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!