面向Wi-Fi音频应用的嵌入式Linux音频驱动设计

2016-11-21 09:47梁作坤
电子设计工程 2016年21期
关键词:音频系统实时性缓冲区

陈 熹,程 鹏,梁作坤,吴 斌

(1.中国科学院微电子研究所 北京 100029;2.锐凌微南京电子科技有限公司 江苏 南京 210042)

面向Wi-Fi音频应用的嵌入式Linux音频驱动设计

陈 熹1,程 鹏1,梁作坤2,吴 斌1

(1.中国科学院微电子研究所 北京 100029;2.锐凌微南京电子科技有限公司 江苏 南京 210042)

搭载Wi-Fi的音频设备是物联网和智能家庭应用中的一大热点,音频驱动则是该系统的一个设计难点。本文针对Wi-Fi片上系统(SoC)AR9331和音频芯片WM8904组成的硬件平台,设计了基于ALSA架构的嵌入式Linux音频驱动程序,采用模块化的程序架构提高了驱动的可移植性,通过适配PCM接口减少了驱动代码量,设计环形DMA缓冲区提高了系统的实时性能。实际应用表明,该音频系统性能稳定,最高支持"96 kHz/24-bit/双声道"音频播放,具有良好的实时性。

嵌入式Linux;音频驱动;ALSA;DMA

随着电子技术和通信技术的发展,无线设备正在融入人们的生活,智能手机、平板电脑、车载导航、智能家居等产品大大改变了人们的生活方式[1],而Wi-Fi以其带宽大、距离远、成本低等特点成为了智能设备的标配[2]。音频系统丰富了人们与智能设备的交互,还能提供娱乐功能,搭载Wi-Fi的音频设备抛弃了数据线,具有很大的应用前景。音频系统的一大特征是实时性,而影响实时性的技术难点是音频驱动[3],因此设计良好的音频驱动具有重大意义。

国内对嵌入式系统的音频驱动已有部分研究,文献[4-7]研究了Linux系统下基于IIS控制器的音频驱动,但缺乏良好的可移植性,文献[8-10]研究了ARM平台下基于高级Linux声音架构(Advanced Linux Sound Architecture,ALSA)的音频驱动设计,然而目前针对内置Wi-Fi片上系统 (System on a Chip,SoC)的音频驱动研究还很少。

文中面向Wi-Fi音频应用,选用Qualcomm公司的无线SoC AR9331和Cirrus Logic公司的音频芯片WM8904组成硬件平台,设计并实现了基于ALSA架构的嵌入式Linux音频驱动程序,实验证明,该方案具有很大的应用价值。

1 系统硬件架构

AR9331通过IIS总线与WM8904进行音频数据交互,IIS有3个主要信号[5]:

1)位时钟(BCLK)。对应数字音频信号每一位数据的时钟,频率=声道数×采样频率×位宽。

2)声道选择时钟(LRCLK)。用于切换左右声道的时钟,其频率等于音频采样率。

3)串行数据(SD)。用二进制补码表示的音频数据,提供分时复用功能。本文用于IIS数据输出。

此外,还使用了用于时钟同步的主时钟(MCLK),以及用于IIS数据输入的串行输入(SDI)。IIS总线只能处理音频数据,因此还需要IIC总线传输控制信号[6],配置WM8904的寄存器,实现音量调节、音频格式设置等功能。WM8904提供标准的两线控制接口,AR9331则使用GPIO模拟IIC总线。图1是AR9331与WM8904的引脚具体连接方式,除了IIS和IIC总线的连接,WM8904还外接麦克风插孔、耳机插孔和音箱插孔,用于音频的输入和输出。

图1 引脚连接框图

2 Linux音频驱动架构

Linux 2.6内核开始,ALSA成为了默认的音频驱动架构,针对原有的开放声音系统(Open Sound System,OSS)架构[7]做出不少改进,图2是ALSA音频系统的架构[9],分为两层:用户空间中的应用软件以及内核空间中的驱动软件。ALSA最大的优势是提供了硬件无关的程序库,应用软件直接调用程序库API,无需像OSS应用那样访问硬件相关的接口[5],因此具有良好的可移植性。内核空间又包含ALSA内核API与ALSA内核驱动,内核API负责连接应用库与内核驱动,包含PCM以及控制设备等重要接口,内核驱动则负责与硬件设备进行交互,并实现最大程度的硬件功能抽象。ALSA对OSS应用提供了内核态模拟和用户态模拟两种方式,具备良好的兼容性。

图2 ALSA音频系统架构

ALSA驱动的主要功能是在CPU和音频芯片之间传输PCM音频数据。为了缩短驱动开发周期,ALSA内核API抽象出了功能强大的PCM中间层[9],驱动只需完成与DMA传输相关的底层接口函数,即可实现PCM层对硬件的访问。在进行音频播放和录制的过程中,驱动会开辟一个或多个PCM音频流,音频数据就通过PCM流进行传输。

3 基于AR9331及WM8904的ALSA音频驱动设计

3.1ALSA驱动模块probe()基本流程

文中将ALSA驱动整体上导出为一个内核驱动模块ar9331_wm8904_alsa.ko,装载该模块时,系统会自动进入探针函数probe(),执行ALSA驱动的初始化[11]。图3给是probe()函数的基本流程,最关键的步骤是创建和注册声卡对象,作为整个音频系统资源的封装。

图3 probe()函数基本流程

3.2PCM接口设计

PCM中间层是ALSA内核API中的一个模块,用于完成音频数据流的传输,使用PCM接口可以有效减少驱动代码量。驱动通过创建PCM设备实现与内核API的交互,用户进程请求对PCM设备文件进行操作时,ALSA系统开辟PCM数据流,随后调用驱动注册的PCM操作函数完成相关操作[8]。

3.2.1PCM操作函数

PCM接口中最重要的结构是PCM操作函数集snd_pcm _ops,其包含了AR9331的IIS接口设置、AR9331的DMA内存配置和WM8904的IIS接口设置等操作。为了提高驱动的可移植性,文中采用了模块化设计,图4是PCM接口设计的示意图,抽象出了与AR9331、WM8904相关的3个模块,移植驱动时只需更新相应模块中的函数,提高了驱动的可移植性。

图4 PCM接口模块化设计

PCM操作函数集是通过snd_pcm_set_ops()与PCM流进行绑定的,表1是函数集中各函数的功能[10]。

3.2.2PCM运行状态

图5给出了PCM流运行时,发生状态转移过程中各函数的调用关系。一个典型的PCM状态转移流程描述如下:从CLOSED状态开始,首先调用open()打开PCM流,进入OPEN状态;然后通过hw_params()设置IIS及DMA参数,进入SETUP状态;接着调用prepare()重置 IIS和DMA,进入PREPARED状态;随后接收到应用程序的start指令,进入RUNNING状态,执行PCM数据的传输;传输完毕后,收到stop指令返回SETUP状态;最后调用hw_free()和close()完成资源释放,重回CLOSED状态。

表1 PCM操作函数功能

图5 PCM状态转移图

在RUNNING状态下有可能因为CPU负载过大等原因进入XRUN状态。例如使用“48 kHz/16-bit/双声道”的采样方式录音,音频芯片产生1 536 kbps的数据流,如果使用16 kB的缓冲区,那么应用程序有0.01 s处理缓冲区中的数据,如果不能及时处理完,缓冲区就会溢出而进入OVERRUN状态;播放时,也可能因为应用程序不能及时写入数据,导致缓冲区空了而进入UNDERRUN状态。减少进入XRUN状态的方法就是有效的利用内存,设计合理的DMA缓冲区,从而提高系统实时性[6]。

3.3环形DMA缓冲区

音频系统对实时性要求较高,在DMA传输模式下,CPU可以在DMA控制器占据总线使用权时执行其他任务,因而能有效提高系统的工作效率[4]。对于单缓冲区,数据读完后,需要写入新的数据,而在写缓冲区时,必须停止播放或录制(否则产生同时读写的错误),因此单缓冲区不能满足实时性[3]。为此,文中使用了一种环形DMA缓冲区的内存管理策略[12],将一段连续的DMA内存划分为若干个等长buffer,每个buffer通过描述符进行访问,描述符包含buffer物理地址、大小、控制位以及下一个描述符的指针等信息,通过将描述符连接成环形链表实现了环形DMA缓冲区。图6是播放音频时DMA内存的读写过程,白色buffer表示可写,灰色buffer表示可读,当对buffer 2进行播放时,CPU往buffer 1中填写数据,当buffer 2播放完毕之后,DMA控制器产生一个传输完中断,将buffer 2置为可写,CPU随后就会往buffer 2中填写数据,系统则继续对buffer 3进行播放,遇到缓冲区末尾则返回buffer 0,依次类推,直到所有音频播放完毕。

图6 播放时DMA内存读写过程

4 应用测试

针对图1中的硬件平台,本文搭建了图7所示的应用系统,核心板型号为TinyPlay1100,为了减少面积底板只使用线路输出外接音箱,平台搭载 OpenWrt系统[13],采用 Linux 3.10.49内核,并移植了ALSA音频驱动。经过测试,系统最高支持“96 kHz/24-bit/双声道”高保真音频的播放,驱动运行稳定,音质良好,达到了实时性要求。

图7 实际应用系统

文中还在此系统上开发了支持DLNA[14]以及AirPlay[15]协议的无线音频推送服务端程序,Android和iOS设备可以在同一局域网内通过Wi-Fi向该系统推送音乐进行播放,图8是使用手机推送歌曲的效果图,方框标识了服务端设备名称。该系统具有良好的兼容性和可靠性,已在国产某Wi-Fi智能音箱解决方案中得到应用。

图8 iOS(左)及Android(右)音乐推送

5 结 论

搭载Wi-Fi的音频设备是物联网和智能化时代的应用热点,高集成度的Wi-Fi SoC将得到广泛使用,作为该系统的一个关键技术点,音频驱动需要良好的设计。文中针对Wi-Fi SoC AR9331和低功耗音频芯片WM8904组成的硬件系统,设计并实现了基于ALSA架构的嵌入式Linux音频驱动,与文献[8-10]中基于ARM平台的系统相比,具有高集成度、低成本、低功耗的优势。测试证明,该驱动具有良好的实时性和稳定性,对于其他Wi-Fi SoC平台也具有较好的可移植性和参考价值,可以应用于Wi-Fi高保真音箱、智能家居等领域。

[1]严萍,张兴敢,柏业超,等.基于物联网技术的智能家居系统[J].南京大学学报:自然科学版,2012,48(1):26-32.

[2]盛仲飙.WIFI无线网络技术及安全性研究[J].电子设计工程,2012,20(16):1-3.

[3]孟祥岳,孔令通,张文明,等.嵌入式Linux系统下音频驱动程序的设计[J].电视技术,2013,37(S2):480-481.

[4]徐睿,李斐,王申康.基于IIS总线的嵌入式音频系统设计[J].电子技术应用,2004,30(4):7-9.

[5]霍燃,高丽萍,陈庆奎.嵌入式Linux系统下基于UDA1341芯片的音频驱动程序设计[J].计算机应用与软件,2012,29(4):16-19.

[6]秦贵和,徐云鹏,洪宇,等.基于ARMLinux的嵌入式音频系统设计[J].计算机工程与设计,2007,28(11):2611-2613.

[7]程杰,凌明.基于SEP4020的嵌入式Linux音频驱动程序设计[J].微型机与应用,2009,28(20):5-8.

[8]周鹏,王承,汤银焕,等.基于ALSA的WM8976音频驱动的设计[J].武汉理工大学学报:信息与管理工程版,2011,33(4):517-520.

[9]刘哲峰.嵌入式Linux音频设备的驱动设计与研究[D].太原:太原理工大学,2010.

[10]孟浩,孟利民.基于ARM9和WM8731的音频编解码系统的设计与实现[C].第二届亚太地区信息论学术会议论文集. 2011.

[11][美]科波特(Corbet,J.).Linux设备驱动程序[M].北京:中国电力出版社,2012.

[12]陈学松.深入Linux设备驱动程序内核机制[M].北京:电子工业出版社,2012.

[13]许倩.基于OpenWrt系统路由器的功能模块的开发[D].北京:中国石油大学(华东),2013.

[14]李欣,李轶婷.基于DLNA数字媒体适配器的设计[J].电子设计工程,2012,20(20):179-181.

[15]邱晨.基于Android的Airplay Server端应用设计与实现[D].厦门:厦门大学,2014.

Design of embedded Linux audio driver aimed at Wi-Fi audio application

CHEN Xi1,CHENG Peng1,LIANG Zuo-kun2,WU Bin1
(1.Institute of Microelectronics of Chinese Academy of Science,Beijing 100029,China;2.Ralinwi Nanjing Electronic Technology Co.Ltd,Nanjing 210042,China)

Audio devices integrated with Wi-Fi module is a hot spot in the field of Internet of Things and smart home,while audio driver is a difficulty.This hardware system is composed of Wi-Fi System on Chip(SoC)AR9331 and audio chip WM8904.An embedded Linux audio driver based on Advanced Linux Sound Architecture(ALSA)was designed.A modular programming architecture was adopted to enhance the portability of the driver.The amount of code was reduced via accessing Pulse-code modulation(PCM)interface.A DMA ring buffer technology was designed to improve the real time processing of this system.Practical application showed that the audio driver ran stably on the platform and supported up to"96KHz/24-bit/ Stereo"audio playback with good performance of real time.

embedded linux;audio driver;ALSA;DMA

TN875

A

1674-6236(2016)21-0095-03

2016-03-17稿件编号:201603219

国家发改委2013年移动互联网及第四代移动通信(TD-LTE)产业化专项

陈 熹(1990—),男,江苏南通人,硕士研究生。研究方向:嵌入式系统设计、Linux驱动开发。

猜你喜欢
音频系统实时性缓冲区
浅谈号角与带式扬声器 在家用或专业音频系统中的应用
打造最具性价比的7.4.1沉浸式音频系统 昆明艺术家园
Elektrobit提供的EB GUIDE工具链加速Pioneer最新显示音频系统的开发
从房间与音频系统再谈定制安装的核心要素 畅谈家庭影院系统中的隐藏设计
航空电子AFDX与AVB传输实时性抗干扰对比
计算机控制系统实时性的提高策略
一类装配支线缓冲区配置的两阶段求解方法研究
关键链技术缓冲区的确定方法研究
初涉缓冲区
一种车载Profibus总线系统的实时性分析