您的位置:首页 > 其它

WinCE基于I2S总线的单体音频驱动开发(UDA1341)

2010-04-09 12:07 471 查看
本文转载自网络,但作者不详,如作者看到,请通知本人,本人会马上注明详细出处,谢谢。

1 音频驱动程序模型

本音频驱动采用Wavedev2模式来实现,这是单层的驱动模式,平台相关的都在hwctxt.h和hwctxt.cpp中,此外还加入了midi支持、software mixer支持、S/PDIF接口、gain class接口、forcespeaker接口,等等,因此,开发Smartphone或者PPC,这个模式较适合。





下载 (155.8 KB)

2009-10-25 16:58

2. 音频系统的硬件实现
本驱动采用的是基于IIS和音频编解码芯片UDA1341TS的音频系统的实现方式。
2.1 硬件电路连接图
S3C2440A的IIS控制器和音频编解码芯片UDA1341TS的IIS接口直接连接,L3接口的引脚L3MODE、L3DATA和L3CLOCK分别连接到S3C2440A的GPB2、GPB3和GPB4的数据输出引脚。

2.2 IIS控制器
2.2.1 IIS控制器

BRFC:总线接口、寄存器组和状态机,总线接口逻辑和FIFO访问由状态机控制。
IPSR:双分频器,通过IPSR_A分频用于IIS设备的主时钟发生器SCLKG,另一个通过IPSR_B分频得到的CDCLK用于外部编解码芯片。

SCLKG:主设备IISCLK产生器,在主模式下,串行位时钟SCLK是从这个主时钟SCLKG产生的。

64字节的FIFOs(TxFIFO和RxFIFO):在发送数据传输模式时,数据写入TxFIFO;在接收数据传输模式时,数据写入RxFIFO。

SFTR:16位的移位寄存器,在发送模式下将并行数据移位成串行数据输出;在接收模式下降串行数据输入移位成并行数据。

CHNC:通道发生器和状态机,IISCLK和IISLRCK是由这个通道状态机生成并控制。
IIS总线是一种面向多媒体的串行数字音频总线协议,专用于音频设备之间的数据传输,产生同步音频。IIS控制器可直接外接8/16位的立体声CODEC,IIS控制器的引脚如下:
SDI:音频数据输入端,录音时,引脚把量化的音频数据通过这个端口送入IIS控制器的接收FIFO中。

SDO:音频数据输出端,播放时,引脚把DMA控制器从DMA缓冲区中迁移的音频数据通过这个端口送入IIS控制器的发送FIFO中。

SCLK:串行位时钟,用于同步输入和输出的音频数据。
LRCK:左右通道选择端口,可以通过对模式控制器IISMOD的设置来选择当前正在发送的通道,比如在播放情况下,LRCK为低电平时,SDO当前输出的是左声道的音频数据,而LRCK为高电平时,SDO当前输出的是右声道的音频数据;当然也可以设置为LRCK为低电平时,SDO当前输出的是右声道的音频数据,而LRCK为高电平时,SDO当前输出的是左声道的音频数据,这个端口也就是音频数据采样端口。
CDCLK:CODEC系统时钟信号,用于给音频编解码芯片提供音频设备系统时钟,其值为256fs或384fs,其中fs为采样频率。

2.2.2 IIS控制器的总线格式时序图





下载 (474.38 KB)

2009-10-25 16:58

串行数据以2的补码发送,首先发送高位。高位首先发送是因为发送方和接收方可以有不同的字长度。发送方知道接收方能处理的位数是不必要的,同样,接收方也不需要知道发送方正发送多少位的数据。当系统字长度大于发送方的字长度时,字被切断来发送。如果接收方收到比它的字长度更多的位时,多的位被忽略;若接收方接收比它字长度少的位时,不足的位被内部设置为0。所以高位有固定的位置,而低位的位置依赖于字长度。发送器总是在iislrck变化的下一个时钟周期发送下一个字的高位。
发送器的串行数据发送可以在时钟信号的上升沿或下降沿被同步。可是串行数据必须在串行时钟信号的上升沿锁存进接收器,所以当发送数据用上升沿来同步时有一些限制。lr通道选择可以指示当前正发送的通道。iislrck既可以在串行时钟的上升沿变化,也可以在下降沿变化,但不需要同步。在从模式下,这个信号在串行时钟的上升沿锁存。iislrck信号秽‘变一个时钟周期之后,开始发送高位数据,这允许从发送方可以同步发送串行数据。更进一步,它允许接收方存储先前的字并准备接收下一个字。

为什么说LRCK就是采样频率端呢?首先我们知道采样频率的概念就是每秒钟采样了多少个样本值,而这个样本值由左右声道LRCK送入或送出,所以可以确定LRCK就是采样频率。根据上图所示,在低电平时,选择左声道的一个样本值(用16位来表示)在串行位时钟的同步下,通过SD输入或输出;在高电平时,在低电平时,选择右声道的一个样本值(用16位来表示)在串行位时钟的同步下,通过SD输入或输出。

加入我们选择每个声道的串行数据位为16位,则N=16,根据上时序图,我可以得到一个采样周期Tlrck=16×2(左右声道)×Tsclk(串行位时钟周期),从而可以推导出采样频率fs=(1/32)×fsclk(串行位时钟频率),进而可以得到fsclk=32fs,也即串行位时钟频率为采样频率的32倍。
2.3 音频编解码芯片UDA1341TS
UDA1341TS支持IIS总线数据格式,具有可编程增益放大器(PGA)和数字自动增益控制器(AGC),其提供IIS接口、麦克风和扬声器接口,还有L3接口等。其对外提供两组音频信号输入接口,每组包括左右2个声道,提供一组音频输出接口,用于连接扬声器。
2.3.1 IIS接口
BCK:位时钟输入引脚,由微处理器的IIS控制器的位时钟信号端口送入位时钟。
WS:字选择输入引脚,
DATAO:数据输出引脚,用于输出已被量化的音频数据。
DATA1:数据输入引脚,用于接收量化的音频数据。

2.3.2 L3接口
L3接口相当于混音器控制接口,可以控制输入/输出的音调(声音的高低)和音量(声音的大小)等。L3总线的时钟不是连续的时钟,它只在数据线上有数据时才发出8个周期时钟的时钟信号,其他情况下时钟始终保持高电平。

L3MODE:L3接口的模式输入端,用于选择高低音增强的声音处理滤波器的模式,有平音、最低音和最高音模式,可通过对寄存器DATA0的M1和M0编程来决定。
L3DATA:L3接口的数据端。
L3CLOCK:L3接口的时钟输入端,用于同步L3DATA端口送入的数据。

3. 音频系统的软件实现
音频设备驱动程序主要通过对硬件的控制实现音频数据流的传输,同时向上层提供标准的音频接口,其中的一个流接口函数WAV_IOControl()提供应用层控制音频设备的接口,通过输入和输出消息来实现对硬件的控制,主要包括连个函数HandleWaveMessage()和HandleMixerMessage (),其中HandleWaveMessage()负责音频数据的传输即播放数字化声音文件和录音操作等;而HandleMixerMessage ()负责对输出音频进行婚姻处理,如音量调节、高低音控制等。

在音频数据采样过程中,假如按音频采样频率为44.1KHz、16位每个声道、左右2个声道来计算,码流为1.411Mbps,通常在1~3Mbps,所以采用DMA控制器来传输十分必要,以下是整个音频系统软件的重要部分。
3.1初始化音频硬件

3.1.1 IIS控制器的设置

IIS控制寄存器IISCON
IISCON[0]:使能IIS接口,故为1。
IISCON[1]:使能IIS的分配器,故为1。
IISCON[2]:在空闲模式下IISLRCK是非激活状态(暂停Rx),因为我们还没开始接收,故为0。
IISCON[3]:在空闲模式下IISLRCK是非激活状态(暂停Tx),因为我们还没开始发送,故为0。
IISCON[4]:使能接收DMA服务请求,故为1。
IISCON[5]:使能发送DMA服务请求,故为1。
IISCON[6:7]:只读。

IIS模式寄存器IISMOD
IISMOD[0:1]:串行位时钟频率选择,在此选择32fs(=16*2*fs),根据IIS总线格式的时序图和下面相关位的设置来决定。
IISMOD[2]:主设备时钟频率选择,在此选择384fs,也即CODCK=384fs,此时钟给UDA1341TS提供系统时钟。
IISMOD[3]:每个声道的串行数据位选择,在此选择16位。
IISMOD[4]:串行接口数据传输格式,在此选择IIS总线格式,故为0。
IISMOD[5]:左右声道有效的电平,在此选择LRCK为低电平时,SCLK传输左声道的音频数据(16位);LRCK为高电平时,SCLK传输右声道的音频数据(16位)。
IISMOD[6:7]:发送或接收模式的选择,在此选择发送和接收模式。
IISMOD[8]:主/从设备模式选择,在此选择IIS控制器为主设备。
IISMOD[9]:主设备时钟选择,在此选择MPLLin。

IIS的FIFO接口寄存器IISFCON
IISFCON[5:11]:只读。
IISFCON[12]:禁用接收FIFO,等录音时才使能它。
IISFCON[13]:使能发送FIFO。
IISFCON[14]:接收FIFO访问模式选择,先选择为普通访问模式,等录音时才选择DMA访问模式。
IISFCON[15]:接收FIFO访问模式选择,选在DMA访问模式。
3.1.2 GPIO B端口的设置
因为我们采用GPB2~GPB3来控制UPD1341TS的L3接口。GPB2~GPB3作为输出端口
GPBCON控制寄存器
GPB2~GPB3作为输出端口,所以其对应的GPB[4:5],GPB[6:7]和GPB[8:9]均为01。

GPBDAT数据寄存器
因为GPB2连接L3MODE,GPB4连接L3CLOCK,而L3接口在L3DATA端没有进行数据传输时,要求L3MODE和L3CLOCK均为高电平,那必然GPB2和BPB4也为高电平。

GPBUP上拉寄存器
在此禁用GPB2~GPB3的上拉功能,故有GPB[2]、GPB[3]和GPB[4]位均为1。

g_pIOPregs->GPBDAT |= L3M|L3C; //start condition : L3M=H, L3C=H
g_pIOPregs->GPBUP |= 0x1c; //pull-up disable
g_pIOPregs->GPBCON = ((g_pIOPregs->GPBCON & 0x3ffc0f) | 0x000150);

3.1.3 GPIO E端口的设置

GPECON控制寄存器
因为采用GPE0~GPE4作为IIS接口,其对应的GPBBON控制寄存器
GPB2~GPB3作为输出端口,所以其对应的GPB[4:5],GPB[6:7]和GPB[8:9]均为01。

GPBUP上拉寄存器
在此禁用GPE0~GPE4的上拉功能,故有GPE0]、GPB[1]、GPB[2]、GPB[3]和GPB[4]位均为1。
g_pIOPregs->GPEUP |= 0x1f;
//PG[4:0]=I2SSDI:I2SSDO:CDCLK:I2SSCLK:I2SLRCK
g_pIOPregs->GPECON = ((g_pIOPregs->GPECON & 0xfffffc00) | 0x2aa);
3.1.4 DMA控制器的设置

DMA控制器通道1的设置
DMA控制器通道1用于录音时音频数据的传输,开始录音之前需要配置如下寄存器。
DMA1 初始源寄存器DIDSRC1
DIDSRC1[30:0]:用于传输的源数据基地址(开始地址),在此为IIS控制器的IISFIFO寄存器的地址。

DMA1初始源控制寄存器DISRRC1
DISRRC1[0]:用于选择地址增加,因为每次传输后,源地址还是IISFIFO寄存器的地址,所以地址不变,选择源地址固定的方式。
DISRRC1[1]:用于选择本地源,因为在录音时数据源是IIS总线上,所以本地源在外围总线(APB)上。

DMA1控制寄存器DCON1
DCON1[31]:用于选择请求或握手的模式,由于我们是采用IISDI的外部DMA请求源,故采用握手的请求模式进行DMA传输请求。
DCON1[30]:选择DREQ/DACK同步,因为UDA1341TS是连接在IIS总线(APB)上的设备,故选择DREQ和DACK与PCLK(APB)时钟同步。
DCON1[29]:对CURR_TC中断设置使能或无效,在此选择当所有的传输结束,中断请求产生(CURR_TC变为0)。
DCON1[28]:选择原子传输的传输大小,在此选择执行单元的传输方式,也即每次传输一个单元,单元的大小取决于DCON1[21:20]的设置。
DCON1[27]:在单服务模式和全服务模式中选择,在此选择单服务模式,在此模式下每个原子传输后DMA停止且等待其他的DMA请求。
DCON1[26:24]:选择各DMA通道的请求源,我们采用DMA1通道,且其请求源为I2SDDI。
DCON1[23]:在软件(软件请求模式)和硬件(硬件请求模式)间选择DMA请求源,在此选择硬件请求源的模式,由DCON1[26:24]的设置决定其硬件请求源。
DCON1[22]:设定重装载开关选项,在此选择当传输计数器的当前值CURR_TC为0,自动重载为执行的自动重载模式。
DCON1[21:20]:传输数据大小单位,也即一个传输单元的大小,在此选择半个字,也即2个字节。
DCON119:0]:初始化传输计数器,传输的实际字节数由以下公式计算:DSZ*TSZ*TC,其中DSZ表示数据大小DCON1[21:20],TSZ表示原子传输的传输大小DCON1[28],TC也即DCON119:0],仅当CURR_TC为0且DMA的DACK为1时,该值被重载入CURR_TC,在此为1×2×1024=2048字节。

DMA1屏蔽触发寄存器DMASKTRIG1
DMASKTRIG1[1]:DMA通道开关位,在开始录音时,此位设为1,用于开启DMA1通道,从而DMA请求被处理,也即DMA控制器从I2S控制器的接收FIFO中迁移音频数据到DMA输入缓冲区。

DMA控制器通道2的设置
DMA控制器通道2相关寄存器的设置参考DMA控制器通道1相关寄存器的设置。

3.1.5 UPD1341TS的初始化及控制
UPD1341TS的初始化主要是复位UPD1341TS、系统时钟设为384fs、DAC的输出增益、ADC的输入增益、禁用ADC和启动DAC、MIC放大器增益为+9dB、混音模式为数字混音模式、禁用AGC和设置第二个输入通道放大器的增益为14Db,这些同时通过对寄存器STATUS和DATA0的设置来完成的。

3.2 DMA缓冲区设计和实现
在音频设备驱动对设备实时性要求较高,为了提高系统的吞吐量,音频系统采用DMA控制器负责音频数据传输的机制,这种机制使得CPU从繁重的数据传输中解脱出来,可以执行其他计算,从而提高了系统运行速度。所以DMA缓冲区(此缓冲区是内存的一块区域)的设计以及合理利用缓冲区加快对音频数据的处理,减少延时变得十分重要。

S3C2440A的DMA控制器没有内置的DMA存储区域,所以驱动程序必须在内存内为音频设备分配DMA缓冲区。缓冲区设置是否合理非常关键,因为音频数据量通常较大,而缓冲区太小容易造成缓冲区溢出,所以要采用较大的缓冲区。而要填充大的缓冲区,CPU就要一次处理大量的数据,这样处理数据时间较长,容易造成延迟。所以在本驱动中采用双缓冲区来解决这个问题,也就是当CPU在处理某一个缓冲区音频数据的同时,DMA控制器可以完成另一个缓冲区音频数据的传输,如此交替下去,则可以提高系统的并行能力,提高音频处理的实时性。本驱动所采用的DMA1通道和DMA2通道分别设置两个缓冲区,每个缓冲区的大小为2048个字节。

在本驱动中,采用DMA控制器通道1控制录制的音频数据的传输,采用通道2控制播放的音频数据的传输。以播音为例,新的音频数据在CPU的控制下先写到DMA缓冲区A中,此时DMA控制器正在从DMA缓冲区B中迁移音频数据到IIS总线。当缓冲区B的数据全部传输完成之后,DMA控制器产生INT_DMA2中断,该中断通知CPU开始往缓冲区B中写新的音频数据,与此同时,DMA控制器从缓冲区B中迁移数据到IIS总线。这样交替循环,由于CPU和DMA控制器没有同时处理同一块缓冲区,就减少了资源访问的冲突,并且能够最大程度上保证音频数据不丢失,提高了音频处理的实时性,也提高了系统的并行能力。





下载 (508.2 KB)

2009-10-25 16:58

3.3 DMA控制器的数据传输和CPU对DMA中断的响应
3.3.1 播放时DMA控制器的音频数据传输
音频应用程序通过wave API manager调用WAV_IOControl()函数来开始播放,其播放过程主要涉及以下几方面:

DMA请求
开始播放音乐时,发送模式下的DMA请求时由 IIS控制器的IISCON寄存器的发送FIFO准备标志位自动执行的(此时发送FIFO为空,从而产生DMA发送请求。)。DMA控制器收到IIS的发送请求后,向CPU提出接管总线要求,以便进行下面的DMA数据传输。

DMA音频数据传输
DMA控制器得到总线的控制权后,通知IIS控制器DMA应答,这时开始进入DMA数据传输,DMA控制器从输出缓冲区A中取出CPU填充的音频数据到IIS控制器的发送FIFO,每次传输一个原子传输(半个字,也即2个字节),在每一次原子传输结束后CURR_TC值减一,并且DMA停止(还没有把总线控制权还给CPU)且等待其他的DMA请求,之后如果IIS控制器的发送FIFO为空就又发出DMA请求,开始下一个原子传输,如此进行下去,知道CURR_TC为0时,当前的DMA传输结束,也即2048个字节的音频数据已通过IIS总线发送到音频编解码器。

DMA中断
DMA传输结束后DMA控制器向CPU发出INT_DMA2中断,表示输出缓冲区A的数据已经被迁移到音频编解码器,这时CPU(这之前CPU往输出缓冲区B写入音频数据)转而向输出缓冲区A写入音频数据,而DMA控制器同时从输出缓冲区B中迁移数据到发送的FIFO。CPU和DMA控制器如此交替访问缓冲区,实现音频数据的快速传输。

3.3.2录音时DMA控制器的音频数据传输
录音时,DMA控制器和CPU的相互交换过程和播放时类似,可以参考3.3.1。

3.4 音频系统软件实现的流程图
3.4.1 DMA控制器中断服务线程的流程图





下载 (379.69 KB)

2009-10-25 17:19

3.4.2 开始播放时流程图





下载 (366.48 KB)

2009-10-25 17:19

3.4.3 开始录音时流程图



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: