IIS总线的嵌入式音频系统设计说明
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于IIS总线的嵌入式音频系统设计
嵌入式音频系统广泛应用于GPS自动导航、PDA、3G手机等嵌入式领域,但目前国在这方面的研究较少。
音频系统设计包括软件设计和硬件设计两方面,在硬件上使用了基于IIS总线的音频系统体系结构。
IIS(Inter-IC Sound bus)是菲利浦公司提出的串行数字音频总线协议。
目前很多音频芯片和MCU都提供了对IIS的支持。
在软件上,作为一个功能复杂的嵌入式系统,需要有嵌入式操作系统支撑。
Linux是一个源代码开放的类UNIX系统,由于其具有核可裁剪性,且提供对包括ARM、PPC在的多种嵌入式处理器的支持,所以广泛应用于嵌入式高端产品中。
虽然Linux提供了众多API来降低驱动程序制作的复杂度,但是由于音频应用对实时性有很高的要求,且需要处理的数据量较大,所以必须合理分配资源,使用适宜的算法。
本文针对三星公司的S3C44B0 ARM处理器构造了基于IIS的音频系统,并介绍了该音频系统基于Linux核的驱动程序构造技术。
1 硬件体系结构
IIS总线只处理声音数据。
其他信号(如控制信号)必须单独传输。
为了使芯片的引出管脚尽可能少,IIS只使用了三根串行总线。
这三根线分别是:提供分时复用功能的数据线、字段选择线(声道选择)、时钟信号线。
在三星公司的ARM芯片中,为了实现全双工模式,使用了两条串行数据线,分别作为输入和输出。
此外三星公司的IIS接口提供三种数据传输模式:
·正常传输模式。
此模式基于FIFO存放器。
该模式下CPU将通过轮询方式访问FIFO存放器,通过IISCON 存放器的第七位控制FIFO。
·DMA模式。
此模式是一种外部设备控制方式。
它使用窃取总线控制权的方法使外部设备与主存交换数据,从而提高系统的吞吐能力。
在三星公司的ARM芯片中有4个通道DMA控制器用于控制各种外部设备,其中IIS与其他串行外设共用两个桥联DMA(BDMA)类型的DMA通道。
通过设置CPU的IISFCON存放器可以使IIS接口工作在DMA模式下。
此模式下FIFO存放器组的控制权掌握在DMA控制器上。
当FIFO满时,由DMA控制器对FIFO中的数据进展处理。
DMA模式的选择由IISCON存放器的第四和第五位控制。
·传输/接收模式。
该模式下,IIS数据线将通过双通道DMA同时接收和发送音频数据。
本系统使用该数据传输模式。
图1是44B0X芯片与菲利浦公司的UDA1341TS音频芯片的连接示意图。
在这个体系结构中,为了实现全双工,数据传输使用两个BDMA通道。
数据传输(以回放为例)先由部总线送到存,然后传到BDMA控制器通道0,再通过IIS控制器写入IIS总线并传输给音频芯片。
通道1用来录音。
三星公司的BDMA控制器没有置的存储区域,在驱动程序中必须为音频设备分配DMA缓存区。
缓存区的地址在通道DMA控制器的地址存放器中设置。
UDA1341TS芯片除了提供IIS接口和麦克风扬声器接口,还提供L3接口控制音量等。
L3接口分别连到
S3C44B0的3个通用数据输出引脚上。
2 音频设备底层软件设计
嵌入式系统硬件设备种类繁多,且缺乏PC中标准的体系结构,所以必须为各种设备编写驱动程序。
驱动程序的主要任务是控制音频数据在硬件中流动,并为音频应用提供标准接口。
由于嵌入式系统资源有限,且处理器能力不强,所以在音频设备的驱动程序设计中,合理分配系统资源是难点。
需要注意的是,在三星公司的ARM芯片中,I/O设备的存放器作为存空间的一局部,可以使用普通的存访问语句读写I/O存放器,进而控制外部设备。
这是该嵌入式系统与传统的基于Intel处理器的PC最大的不同。
2.1 驱动程序功能
设备驱动程序中需要完成的任务包括:对设备以与对应资源初始化和释放;读取应用程序传送给设备文件的数据并回送应用程序请求的数据。
这需要在用户空间、核空间、总线与外设之间传输数据。
2.2 驱动程序构架
Linux驱动程序中将音频设备按功能分成不同类型,每种类型对应不同的驱动程序。
UDA1341TS音频芯片提供如下功能:
·数字化音频。
这个功能有时被称为DSP或Codec设备。
其功能是实现播放数字化声音文件或录制声音。
·混频器。
用来控制各种输入输出的音量大小,在本系统中对应L3接口。
在Linux设备驱动程序将设备看成文件,在驱动程序中将结构file_operations中的各个函数指针与驱动程序对应例程函数绑定,以实现虚拟文件系统VFS对逻辑文件的操作。
数字音频设备(audio)、混频器(mixer)对应的设备文件分别是/dev/dsp和/dev/mixer。
2.3 设备的初始化和卸载
/dev/dsp的驱动设计主要包含:设备的初始化和卸载、存与DMA缓存区的管理、设备无关操作(例程)的实现以与中断处理程序。
在设备初始化中对音频设备的相关存放器初始化,并在设备注册中使用了两个设备注册函数
register_sound_dsp() 和 regiter_sound_mixer()注册音频设备和混频器设备。
这两个函数在2.2以上版本的核drivers/sound/sound_core.c文件中实现。
其作用是注册设备,得到设备标识,并且实现设备无关操作的绑定。
在这些注册函数里使用的第一个参数都是struct file_operations类型的参数。
该参数定义了设备无关接口的操作[3]。
设备卸载时使用注销函数。
注销时用输入注册时得到的设备号即可。
在注销时还必须释放驱动程序使用的各种系统资源包括DMA、设备中断等。
2.4 DMA缓存区设计和存管理
在音频设备的驱动程序设计中,DMA缓存区设计和存管理局部最为复杂。
由于音频设备有很高的实时性要求,所以合理地使用存能加快对音频数据的处理,并减少时延。
三星公司的BDMA控制器没有置DMA存储区域,在驱动程序中必须为音频设备分配DMA缓存区。
这样就能通过DMA直接将需要回放或是录制的声音数据存放在核的DMA缓存区中。
为了方便各种物理设备使用DMA资源,在程序中使用strcut s3c44b_DMA数据结构管理系统各个DMA通道的资源,如图2。
每个DMA通道被多个外部设备共用,为各个外设分配的DMA缓存区的大小和数目可能不一致,所有分配的数据块使用DMA缓存数据块DMA_buf管理。
各个不同设备申请的数据缓存区形成一个单向链表,每个链表节点包含一个起点字段,存放实际DMA缓存起始位置的物理地址。
在设备第一次使用DMA 时,使用kmalloc函数为DMA_buf分配存,并且使用consistent_alloc函数为DMA分配实际的连续物理缓存区,然后将节点插入队列中。
从第二次开场通过缓存区的标示符对缓存区进展操作。
存管理中的重要问题是缓存区块设计。
常见的设计思路是使用一个缓存区,CPU先对缓存区处理,然后挂起,音频设备对缓存区操作,音频设备处理完后唤醒CPU,如此循环。
需要处理大量音频数据的音频设备驱动程序,可以使用双缓冲。
以录音为例,系统使用缓存2存放音频设备量化好的声音,CPU(应用程序)那么处理缓存1中的声音数据;当Codec设备填充完缓存2,它移向缓存1填充数据,而CPU转向处理缓存2里的数据;不断交替循环,如图3(a)、 (b)所示。
使用这种方法处理音频数据,能够提高系统的并行能力。
应用程序可以在音频工作的同时处理传输进来的音频数据。
由于实际系统被设计成支持全双工的音频系统,所以必须为输入和输出同时分配存,对应的数据结构设计如图4所示。
图4中音频设备缓存控制块管理音频设备的缓存区。
在控制块中输入/输出缓存指针分别指向输入和输出缓存结构audio_buf,输入输出控制块指针分别指向对应的DMA控制块。
因为输入输出使用了不同DMA通道,所以音频设备缓存控制块有两个DMA控制块控制指针。
在audio_buf中分别有两个DMA起点字段分别指向双缓存区的起始物理地址。
缓存区状态字段包含缓存区是否被映射、是否激活、是否暂停等信息。
应用程序处理缓存中数据的速度依赖于缓存的大小和数据传输速度。
例如使用“8kHz/8位/单工〞的采样方式录音,音频芯片产生64kbps的数据流量。
如果是两个4K字节的缓存,那么应用程序就只有0.5s处理缓存中的数据并把它存到Flash芯片中(或者传输到其它设备中)。
假设0.5s不能处理这些数据,缓存就会溢出。
假设采用高品质的采样,例如使用CD音质的采样,那么Codec产生数据的速度将达1376kbps,CPU 处理音频数据的时间就只有23ms。
在CPU负载较大的情况下,将可能出现数据丧失的问题。
为了解决音频应用I/O数据量大的问题,最简单易行的方法是使用比拟大的缓存区域。
但实际上大的缓存区需要更长的填充时间,在使用时会出现延时,并可能占用过多CPU资源。
为了解决延时的问题,使用多段缓存机制。
在这种机制下,将可用的缓存区分割成假设干个一样大小的块。
对较大的缓存区的操作转变成对较小的缓冲区块的操作,在不增加缓存区操作时间的情况下提供较大的缓存。
不同的音频应用,精度不一样,需要的缓存大小也不一样。
所以在应用程序层上,驱动程序还必须提供接口让应用程序改变块的大小和个数。
这个接口可以在ioctl中实现。
对缓存区块的大小控制通过对audio_buf中的对应字段设置实现。
使用存映射(mmap)技术是另一种提高系统性能的途径。
Linux系统的存空间分为核空间和用户空间,驱动程序工作在核空间,并负责在核空间和用户空间传输数据。
音频应用一般数据量比拟大,而且有较高的质量要求,在驱动程序中还可以使用存映射进一步提高CPU的利用率。
存映射通过remap_page_range将分配给DMA缓存区的核空间的存映射到用户空间,用户不需使用copy_to_user和copy_from_user将数据在核空间与用户空间中拷贝。
图4中缓存区状态和缓存区起点两个字段也用于存映射效劳。
在实现时由于DMA 的缓存结构复杂,需要将每个缓存块分别映射。
2.5 设备无关操作
设备无关操作对应于file_operations指向的各个例程,它让用户用访问文件的方式访问设备。
对设备的翻开和读写是启动程序为用户程序提供的最主要接口,分别对应于file_operations中的open、read和write例程。
在open例程中需要完成的任务主要是设备初始化,包括:
·通过设置IIS存放器控制音频设备的初始化,并且初始化设备的工作参数(包括速度、声道、采样宽度);
·为设备分配DMA通道;
·根据采样参数计算出缓存段的大小(程序也可以指定缓存段的大小);
当缓存区和DMA设置好后,读写操作主要对缓存操作,对设备的操作除了读写操作外,还有音频播放中的暂停和继续。
这两个操作在ioctl接口中实现,通过对相应的IIS总线控制器(IISCON存放器)操作实现。
此外,在对音频操作时还要注意:一次采样得到的数据必须一次处理,否那么不能正确播放数据。
*注:文章为网上收录供大家共同学习参考之用,并不代表本站意见。
如存在问题请马上通知我们,我们将马上删除。