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、驱动实现中数据流
- WINCE6.0下的 IMX51 AC97驱动 简述
- iMX51 一步一个脚印 --iMX51 WINCE6.0 GPIO设置
- WINCE6.0+S3C6410下的DM9000A驱动
- s3c2450下AC97驱动研究
- s3c2450下AC97驱动研究
- linux下ac97声卡的alsa驱动方法
- 图解WinCE6.0下的内核驱动和用户驱动
- 图解WinCE6.0下的内核驱动和用户驱动
- 图解WinCE6.0下的内核驱动和用户驱动
- 图解WinCE6.0下的内核驱动和用户驱动
- 图解WinCE6.0下的内核驱动和用户驱动
- 图解WinCE6.0下的内核驱动和用户驱动
- 图解WinCE6.0下的内核驱动和用户驱动
- AC97声卡的驱动安装
- wince6.0 下的流驱动开发范例
- wince6.0 下的流驱动开发范例(转摘)
- wince6.0 下的流驱动开发范例
- WINCE6.0+S3C2443下的usb function(功能)驱动
- C#使用异步客户端套接字
- 关于javac编译时出现“非法字符:\65279”的解决方法
- Java文件操作
- 犯错了!!
- Log4j配置
- WINCE6.0下的 IMX51 AC97驱动 简述
- 证人的记忆
- 约瑟夫环问题的优化
- MindManager 把你的思绪记下来
- ff4.0中无法用window.open打开网页
- ffmpeg音视频分离命令
- SQL STUFF函数 拼接字符串
- DropDownList下拉框绑定树行结构
- Oracle 10g内存结构