本文主要是介绍《Linux内核编程》第二章:ALSA驱动,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
本文基于mstar801平台Linux2.6.35.11内核。
一、ALSA驱动创建声卡过程
1.创建声卡
snd_card_create(Linux2.6.30及以后api),snd_card_new(Linux2.6.30以前api)。
说明:第一步要创建声卡
2.创建pcm设备,并加入声卡
int snd_pcm_new(struct snd_card *card,const char *id,int device,int playback_count,int capture_count,struct snd_pcm *rpcm );
说明:参数device表示目前创建的是该声卡下的第几个pcm,第一个pcm设备从0开始。
参数playback_count表示该pcm将会有几个playback substream。
参数capture_count表示该pcm将会有几个capture substream。
3.设置pcm设备的ops
void snd_pcm_set_ops(struct snd_pcm *pcm,int direction,struct snd_pcm_ops *ops);
说明:
4.注册声卡,创建设备节点
snd_card_register()
5.举例
module_init(_mdrv_alsa_init);
static int __init _mdrv_alsa_init(void){................................err = _mdrv_alsa_probe(device_id); ..............................
}
内核被加载时,_mdrv_alsa_probe(device_id)函数被调用;完成上述4个步骤。即snd_card_create;snd_pcm_new、snd_pcm_set_ops;snd_card_register。
====================================================================================================================================
二、基于USB的ALSA驱动
1.、USB声卡的发展
近年来产品层出不穷,USB类在USB开发者论坛的努力下、成为一种标准的规范;USB声卡也开始在市场上悄然出现。
因为USB声卡内置了DAC和有源功放,音频数据以数字方式进入USB声卡,完全杜绝了PC的内部干扰;所以,USB声卡有可能成为现有内置声卡的替代品。
本文介绍一种基于ARM处理器的USB声卡设计。
2、USB声卡原理
如上图:在主机端播放音乐时,应用软件或驱动程序把各类音频信号转换为统一的格式,如PCM等,通过主机的USB接口发送给USB声卡;声卡的USB接口接收到数据后,通过I2S接口把并行音频数据转为串行,再发送给音频编解码芯片进行D/A转换,即可在音频芯片连接的扬声器中发音。
3.编程
我们来看看USB音频设备驱动程序,下篇文章会讨论USB主机控制器驱动程序。
module_init(snd_usb_audio_init);
static int __init snd_usb_audio_init(void){if (nrpacks < 1 || nrpacks > MAX_PACKS) {printk(KERN_WARNING "invalid nrpacks value.\n");return -EINVAL;}return usb_register(&usb_audio_driver); //为了实现USB设备的即插即用,所有USB设备驱动都要在USBD中注册。当驱动程序调用int usb_register(struct usb_driver *new_driver)时,系统将这个新的驱动程序加入驱动链表(usb_driver_list)的尾部完成注册;同时、扫描总线上的所有设备,与驱动程序关联。
}
static struct usb_driver usb_audio_driver = {.name = "snd-usb-audio",.probe =usb_audio_probe,.disconnect = usb_audio_disconnect,.suspend = usb_audio_suspend,.resume = usb_audio_resume,.id_table = usb_audio_ids,//当USB设备挂载时,USB Host驱动会去匹配id_table、若与该id匹配、证明是Audio设备;usb_audio_probe将被触发。
};
USB音频设备挂载时,usb_audio_probe()函数被调用;完成上述4个步骤。即snd_card_create;snd_pcm_new、snd_pcm_set_ops;snd_card_register。
下一章将详细分析Linux USB驱动的组成:《Linux内核编程》第三章:USB类设备驱动
这篇关于《Linux内核编程》第二章:ALSA驱动的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!