《Linux内核编程》第二章:ALSA驱动
来源:互联网 发布:linux起进程命令 编辑:程序博客网 时间:2024/05/21 14:46
本文基于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驱动
- Linux 2.6 内核安装ALSA驱动
- 《Linux4.0设备驱动开发详解》笔记--第二章:Linux内核及内核编程
- linux驱动学习第二天(linux内核及其编程1)
- linux驱动学习第二天(linux内核及其编程2)
- Linux ALSA声卡驱动
- Linux ALSA声卡驱动
- linux内核外驱动编程
- Linux内核驱动模块编程
- 《Linux内核编程》第十四章:Linux驱动基础
- Linux ALSA声卡驱动:ALSA架构简介
- Linux ALSA声卡驱动:ALSA架构简介
- LINUX下ALSA编程
- LINUX下ALSA编程
- Linux Alsa音频编程
- 《Linux内核编程》第三章:USB类设备驱动
- linux学习笔记-读《Linux设备驱动开发详解》~第三章 Linux内核及内核编程
- linux ALSA音频驱动框架
- Linux学习笔记(二)
- POJ 1417 True Liars(并查集+DP)
- python学习之路-继承
- Linux学习笔记(三)
- Linux学习笔记(四)
- 《Linux内核编程》第二章:ALSA驱动
- windows和android一个都不能少
- 你在我左胸腔第四根肋骨往里一寸的位置里
- Eclipse快捷键大全
- 话说..这不过是个标题。。出错了!您访问的页面不存在..
- SQL Server 索引基础知识(2)
- Oracle行列转换
- 页面缓存, jsp 缓存, html 缓存, ajax缓存,解决方法
- DBUtil(传统模式)