最近在研究ALSA,想深入了解一下整个系统的架构,碰巧在AlasProject上看到了这个文章,本着学习的态度,将它翻译并保存一下,在这个过程中加深一些理解,也为日后的学习提供一些参考。文章中有些英文词汇翻译成中文反而会降低对架构的理解,所以直接用原英文体现出来。
目录之类的就不写了
1. 前言
这篇文档描述了如何编写一个ALSA(高级linux音频架构)[http://www.alsa-project.org]驱动。文档中主要专注于PCI声卡。对于其他类型的设备,接口可能也会有所不同。无论如何,至少ALSA内核接口是一致的,因此这篇文章也会对编写相关代码有一些帮助。
这篇文章的阅读对象是拥有一定C语言基础并且有基本的linux内核编程知识的人。文章中不会对普通的linux内核编程问题进行解释,并且文章中不会包含低等级驱动的实现细节。它只会描述在ALSA平台上编写一个PCI声卡驱动的一些标准方法。
如果你已经对老的ALSA ver.0.5.x 的接口比较熟悉,你可以直接查看驱动程序,例如 sound/pci/es1938.c 或者 sound/pci/maestro3.c,这些驱动有着和 ALSA 0.5.x 树几乎相同的 code-base,所以你可以分辨其中的不同点。
这篇文章仍然是一个草稿。我们欢迎任何的指正或反馈,谢谢!!
第一章. 文件树结构
综合
ALSA的代码有两种获取方式。
一种是以压缩文件的树的形式,或通过ALSA的ftp网站的cvs(Concurrent Version System)提供下载。另一种是2.6(或更新)版本的Linux内核树。为了使两者同步,ALSA驱动树被分成了两个不同的文件树:alsa-kernel 和 alsa-driver。前者在linux2.6(或更新)直接包含源生代码。这个文件树被设计成只能在2.6或者之后的环境中编译。后者,alsa-driver,包含很多精妙的用于在linux内核环境外进行编译的文件,更老的2.2和2.4内核版本中用来适应最新内核API的包装函数和一些其他额外的驱动都在开发或测试中。开发测试完成后,alsa-driver树的驱动将会被移植到alsa-kernel(并且最终会到2.6内核树)中。
这个ALSA驱动的文件树结构描述如下所示。除了“core”目录,alsa-kernel和alsa-driver都有几乎相同的文件结构。“core”目录在alsa-driver中被命名为“acore”。
sound
/core
/oss
/seq
/oss
/instr
/ioctl32
/include
/drivers
/mpu401
/opl3
/i2c
/l3
/synth
/emux
/pci
/(cards)
/isa
/(cards)
/arm
/ppc
/sparc
/usb
/pcmcia(cards)
/oss
/core
这个路径中包含中间层,它是ALSA驱动的核心部分。在这个路径下,保存着本地ALSA模块。子目录包含不同的模块,并且它的子目录依赖于内核配置。
/core/oss
PCM的代码和混音器OSS模拟模块被保存在这个路径下。因为rawmidi (raw Musical Instrument Digital Interface) OSS模拟器代码非常小,所以它被包含在ALSA rawmidi代码中了。音序器(sequencer)代码被保存在 core/seq/oss 路径下(见下)。
/core/ioctl32
这个路径下包含64位架构的32位ioctl封装器,类似x86-64,ppc64和sparc64。对于32位和alpha架构来说,这些都不会被编译。
/core/seq
这个路径和它的子路径是为了ALSA的音序器(sequencer)服务的。这个路径包含音序器核心和一些主要的音序器模块,例如snd-seq-midi,snd-seq-virmidi等等。他们只有在内核配置了CONFIG_SND_SEQUENCER时才会被编译。
/core/seq/oss
这个路径包含OSS音序器的仿真代码。
/core/seq/instr
这个路径包含音序器模块的工具层。
/include
这是用来保存ALSA驱动公用头文件的地方,这些头文件会被暴露给user-space,或其他路径中的一些文件会使用他们。基本上,私有头文件不会放在这个路径下,但你仍然可以在这里找到他们,这就要归咎与历史遗留问题了:)
/drivers
这个目录包含不同架构中不同驱动所共享的代码。因此它们是不会有独特的架构特性的。例如,虚拟pcm驱动和串行MIDI驱动可以在这个路径找到。在它的子目录中,有相对于bus和cpu架构独立而来的组件代码。
/drivers/mpu401
MPU401和MPU401-UART模块被保存在这个路径下。
/drivers/opl3 和 opl4
OPL3和OPL4 FM-合成器的一些个东西在这个路径下。
/i2c
这个包含了ALSA i2c组件。
尽管在linux系统上有标准的i2c层,ALSA仍然有一些自己的i2c代码,因为有些声卡只需要一个简单的操作,标准i2c API 对于这个目的来说太复杂了。
/i2c/l3
这是一个ARM L3 i2c的子目录。
/synth
这里包含中间层模块的合成器。
到现在为止,synth/emux 子目录中只有Emu8000/Emu1Ok1 合成器驱动。
/pci
这个路径和它的子目录有着PCI声卡的top-level模块和针对于PCI BUS的代码。
/isa
这个路径和他的子路径中有ISA声卡的top-level模块。
/arm, /ppc,和/sparc
他们是用于在针对这些架构中的其中一个的top-level卡模块的。(不明觉厉-_-)
/usb
这个路径包含了usb-audio驱动。在最新版本中,usb midi驱动被加入进了usb-audio驱动中。
/pcmcia
PCMCIA,特别是PC声卡驱动将会保存在这里。卡总线驱动将会在/pci路径中,因为他们的API对于标准PCI卡来说是完全相同的。
/oss
在linux 2.6或更新的版本中,OSS/Lite的源文件存储在这里。在ALSA驱动压缩包中,这个路径是空的,当然了:)