WINCE6.0下的 IMX51 AC97驱动 简述
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驱动 简述的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android开发QQ登陆、分享、空间分
- 下一篇: ajax异步调用