WINCE6.0下的 IMX51 AC97驱动 简述

来源:互联网 发布:unity3d 打包ios 详细 编辑:程序博客网 时间:2024/06/01 09:32
 

AC97驱动接说明

本驱动使用IMX51的 SSI接口支持的AC97接口,对外接支持AC97 2.0协议的UCB1400芯片。

本驱动能够实现全双工的PCM码率的播放、录制,同时支持多种采样率的PCM数据,包括44.1 --8Khz。此外,对于单、双声道也同时给予支持。

 

   1、WINCE6.0的声音驱动模型

 

 

图1:WINDOWS CE驱动模型

WINCE提供了WAVEAPI给用户使用,包括:WaveOutOpen,WaveOutMessage、WaveInOpen、AddinBuffer等。

WINCE提供了一个丰富的中间层,来帮助应用和驱动之间的衔接,其中包括AudioCompression(语音编码变换)、Software Mixer(提供不同码率数据的自由转换)。

对于驱动层,WINCE目前提供三种AUDIO模型,分层的AUDIO MDD-PDD模型、Unified Audio Model和 WaveDev2 Audio Model。

我们目前使用WaveDev2 Audio Model来完成声音的驱动,该模型提供了一个结构清晰的类体系完成对设备的抽象和操作,包括:DEVICE、STREAM等。

 

2、AC97接口原理

AC972.1的标准基本帧结构如下图2。

 

AC97接口一般采用12.288MHZ的外部时钟,每256个CLK产生一个SYNC时钟信号,即12.288MHZ/256 = 48KHZ。数据在每个CLK的上升沿进行数据传输。

AC97的帧结构,由13个Slot组成,包括 1个16bit Slot,12个20bit Slot:

    编号    代称          数据宽度      说明

Slot 0   TAG            16bits         本帧的数据组织定义

Slot 1   cmdAddr        20bits         命令地址

Slot 2   cmdData        20bits         命令数据

Slot 3   Pcm Left        20bits         PCM左声道数据

Slot 4   Pcm Right       20bits         PCM右声道数据

(其他SLOT见相关协议)

AC97采用双向数据通道,SDATA_OUT代表Playback方向,SDATA_IN代表Record数据。实际使用中,各个时隙都是要全部传送的,即使没有数据。如果要控制AC97设备,就直接通过Slot1-slot2进行命令发送,与此同时还可以痛过Slot3-slot4进行声音回放。对于RECORD则是在SLOT3-SLOT4进行数据接收。

 

对于TAG的定义如下:

// MSB FIRST

 BIT16:帧有效标志1代表整个后面的帧有效

 BIT15-BIT3:SLOT1 - SLOT12 时隙是否有效(代表有效)

 BIT2-BIT0 : 表示Codec选择,Primary Codec时钟使用 00代表

 

 

3、硬件采样和软件采样

       硬件采样频率由硬件特性决定,比如:48KHZ,16BIT,双声道等。这一旦设定后基本就不做调整。

       软件采样频率主要由应用决定,比如:44.1KHZ,8BIT,单声道等。

       所有,这样就存在一些差异.WAVEDEV2的驱动模型完全支持应用采样需求和硬件标准之间进行码率匹配、声道匹配等。

       软件匹配的例子如下图:

       (将硬件的44.1KHZ,16BIT采样变换成软件要求的22KHZ,16BIT  采样)

 

 

4、IMX51平台声音接口实现模型

IMX51的声音接口硬件配置较复杂,需要经过:

IOMUX接口进行 GPIO配置

AUDMUX接口

SSI接口

DMA数据搬运

等几个标准环节,只有各个环节都配置正确,系统才能正常运转。

 

        4.1 IMX51的 AUDMUX接口

IMX51的AUDMUX支持将内部的SSI接口和外部的AC97接口连接起来。AUDMUX的定义包括:

 

 

实际应用中要注意选择好对应关系。

AUDMUX的模式设置:

NORMAL MODE  --点对点模式

                  MODE0 = 0 

RXDSEL[2:0](配置要点)

                                       

配置AUDMUX寄存器的时候要根据IMX51rm.pdf PAGE 502页进行。

 

 

4.2 IMX51的 SSI接口

IMX51    的SSI 可以配置为AC97模式。

当SSI接口被配置为AC97模式的时候,内部会自动配置一些寄存器(这些寄存器无需也不可能再更改),用户只需要关心如下寄存器即可:

1)STCCR[WL]

2)STCCR[DC]

在AC97模式下,主要对:

SACNT、SACADD、SACDAT、SATAG进行操控。

详细情况请仔细阅读IMX51手册。

 

4.3 IMX51的 DMA接口

DMA接口使用原理主要如下图。在AUDIO驱动中一般使用双BUFFER接口进行轮替操作。以便让声音听起来不卡。

在回放的时候DMA就是从BUFFER1中向SSI FIFO中发送数据,SSI FIFO在设定的中断WATERMARK(中断触发阈值)达到后就会自动向DMA进行请求。当BUFFER1数据发送完毕后,CPU会得到DMA的中断请求,CPU检查后命令DMA切换到BUFFER2进行自动数据发送,同时CPU完成BUFFER1数据重填充的工作。

 

 

 

当然,值得注意的事情是一般CPU的DMA通道有很多,但只有1个DMA中断,不同的设备使用DMA 通道的话,就需要做一个基础设施,我们称作 Dma Engine,大家都向他申请DMA资源,并挂入自己的处理事件。

 

 

5、驱动实现中数据流

 

 

 

 

原创粉丝点击