当前位置: 首页 > 工具软件 > ALSA driver > 使用案例 >

Writing an alsa driver译文-第一章 文件树架构

姜嘉荣
2023-12-01

最近在研究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”。

例1.1. ALSA文件树结构
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驱动压缩包中,这个路径是空的,当然了:)

 类似资料: