分类: LINUX
2011-11-10 10:08:08
最近对ALSA架构进行了一点稍微深入的研究,记录如下。
我们的ALSA驱动程序,也就是中间内核层在2.6或以后的LINUX源码里面是有的,但我们还可以通过另外一个途径获得,就是所谓的alsa-driver。后者其实是为了保持与2.6或以后内核的兼容而不断更新的,当然其中包含了更多更细分的文件,以及在开发或尚在测试的附加功能,当这些功能完成且工作稳定时最终都会被移入到alsa内核树中。
下面我们来看一下内核中的源码树,我们开发的alsa驱动也是基于这个内核源码的,没有使用alsa-driver。
ALSA文件目录结构:
sound
/core
/oss
/seq
/oss
/instr
/ioctl132
/include
/drivers
/mpu401
/op13
/i2c
/13
/synth
/emux
/pci
/(cards)
/isa
/(cards)
/arm
/ppc
/sparc
/usb
/pcmcia/(cards)
/oss
下面我们来看一下具体的目录作用
core目录
这个目录包含了中间层,ALSA的核心驱动。
core/oss
关于PCM和mixer的OSS模拟的模块保存在这个目录里面。Raw midi OSS模拟也被包含在ALSA rawmidi代码中,因为它非常小。音序器代码被保存在core/seq/oss目录里面
core/ioctl32
这个目录包含32bit-ioctl到64bit架构(如x86-64,ppc64,sparc64)的转换。对于32bit和alpha的架构,他们是不被编译的。
core/seq
它和它的子目录主要是关于ALSA的音序器。它包含了音序器的core和一些主要的音序器模块如:snd-seq-midi,snd-seq-virmidi等等。它们仅仅在内核配置中当CONFIG_SND_SEQUENCER被设定的时候才会被编译。我们在使用的ALSA驱动中也没有使用。
core/seq/oss
包含了OSS音序器的模拟的代码。
core/seq/instr
包含了一些音序器工具层的一些模块。
include目录
这里面放的是ALSA驱动程序开放给用户空间,或者被其他不同目录引用的共同头文件。
Drivers目录
这个目录包含了不同架构的系统中的不同驱动共享的文件部分。它们是硬件无关的。在子目录里面,会放一些不同组件的代码,他们是根据不同的bus和cpu架构实现的。
i2c目录
这里面包含了ALSA的i2c组件。
虽然LINUX有i2c的标准协议层,ALSA还是拥有它关于一些card的专用i2c代码,因为一些声卡仅仅需要一些简单的操作,而标准的i2c的API函数对此显得太过复杂了。
i2c/l3
这是ARM L3 i2c驱动的子目录
synth目录
它包含了synth(合成器)的中间层模块
pci目录
它和它的一些子目录文件负责PCI声卡和一些PCI BUS的上层card模块。
isa目录
它和它的一些子目录文件是处理ISA声卡的上层card模块。
arm,ppc,和sparc目录
这里放置一些和芯片架构相关的一些上层的card模块。
usb目录
这里包含一些USB-AUDIO驱动。在最新版本里面,已经把USB MIDI 驱动也集成进USB-AUDIO驱动了。
pcmcia目录
PCMCIA卡,特别是PCCcard驱动会放到这里。CardBus驱动将会放到pci目录里面,因为API函数和标准PCI卡上统一的。
oss目录
和ALSA无关。
在了解了相关的目录结构后,我们就开始来分析一下ALSA驱动了,在ALSA驱动中,我们所要从始至终要记住的是,我们的应用程序是不能直接访问驱动的,必须通过中间的ALSA层,因此我么所写的驱动,所提供的接口也是针对中间层的。
下面的内容我们从两个方面来考虑ALSA驱动,一个是驱动在操作硬件的同时,如何为中间层提供接口的,另外一个是应用程序是如何调用ALSA库API来实现对驱动的连接从而操作硬件的。
这了解这两个方面之前我们先来看一下ALSA的系统组成,也就是我们所说的中间层由哪些方面组成:
n 驱动包alsa-driver:指内核驱动程序,包括硬件相关的代码和一些公共代码,非常庞大
n 开发包alsa-libs:指用户空间的函数库,提供给应用程序使用,应用程序应包括头文件asoundlib.h。并使用共享库libasound.so
n 设置管理工具包alsa-utils:包含一些基于ALSA的用于控制声卡的应用程序,如alsaconf(侦测系统中声卡并写一个适合的ALSA配置文件),aplay(基于命令行的声音文件播放),arecord(基于命令行的声音文件录制)等
n 还包括开发包插件alsa-libplugins,其他声音相关处理小程序包alsa-tools,特殊音频固件支持包alsa-firmware,OSS接口兼容模拟层工具alsa-oss共7个子项目,其中只有驱动包是必须的
其实对于驱动包,我们用的是内核自带的,所以我们也没有安装。这个我们在前面已经详细讲解过,不多说了。
转载:http://hi.baidu.com/xdyang1986/blog/item/68baf3c626eacad0d000603e.html