版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 目錄</b></p><p><b> 摘要1</b></p><p><b> 第一章 緒論2</b></p><p> 1.1課題研究的背景2</p><p> 第二章 系統(tǒng)設(shè)計(jì)2</p><p> 2
2、.1 嵌入式系統(tǒng)3</p><p> 2.2 嵌入式系統(tǒng)的組成3</p><p> 2.3 嵌入式系統(tǒng)的開發(fā)流程4</p><p> 2.4 操作系統(tǒng)的選擇5</p><p> 第三章 硬件架構(gòu)5</p><p> 3.1 S3C2440處理器簡介5</p><p> 3
3、.2 電源接口6</p><p> 3.3 IIS音頻數(shù)據(jù)接口7</p><p> 3.4 AC97接口8</p><p> 第四章 AC97音頻驅(qū)動(dòng)及實(shí)現(xiàn)10</p><p> 4.1 設(shè)備的初始化11</p><p> 4.2 Mixer 驅(qū)動(dòng)11</p><p>
4、4.3 Dsp 驅(qū)動(dòng)11</p><p><b> 第五章 總結(jié)12</b></p><p><b> 參考文獻(xiàn)13</b></p><p> 附錄1 mixer.c14</p><p> 附錄2 dsp.c17</p><p> 基于S3C2440的AC
5、97音頻設(shè)備電路及驅(qū)動(dòng)程序設(shè)計(jì)</p><p><b> 摘要</b></p><p> 嵌入式操作系統(tǒng)ARM-Linux的應(yīng)用已經(jīng)越來越廣泛,但是Linux系統(tǒng)本身并沒有對種類繁多的硬件設(shè)備都提供現(xiàn)成的驅(qū)動(dòng)程序, 特別是由于工程應(yīng)用中的靈活性就需開發(fā)一套適合于自己產(chǎn)品的設(shè)備驅(qū)動(dòng), 這使得嵌入式Linux設(shè)備驅(qū)動(dòng)程序的開發(fā)在整個(gè)嵌入式系統(tǒng)開發(fā)周期中占據(jù)很大的比例。
6、本文針對三星的S3C2440嵌入式ARM微處理器, 介紹了在Linux操作系統(tǒng)下, 對S3C2440微處理器內(nèi)部AC97音頻設(shè)備電路及驅(qū)動(dòng)程序設(shè)計(jì),通過編寫編寫AC97音頻驅(qū)動(dòng)程序, 總結(jié)出一種在嵌入式Linux操作系統(tǒng)下快速方便的開發(fā)驅(qū)動(dòng)程序的方法。</p><p> 關(guān)鍵詞:嵌入式系統(tǒng); Linux系統(tǒng);設(shè)備驅(qū)動(dòng);AC97音頻</p><p><b> 第一章 緒論<
7、;/b></p><p> 近年來隨著微處理器技術(shù)、DSP 技術(shù)、多媒體編解碼技術(shù)以及嵌入式技術(shù)的發(fā)展,多媒體娛樂終端已經(jīng)成為消費(fèi)性電子(Consumer Electronic,CE)產(chǎn)品的熱點(diǎn)。視頻和音頻都是多媒體娛樂的重要組成部分,尤其是數(shù)字音頻信號(hào)。在“十一五”規(guī)劃建議中,數(shù)字化音頻信息產(chǎn)業(yè)群被列為重點(diǎn)培育對象。</p><p> 1.1 課題研究的背景</p>
8、<p> 嵌入式設(shè)備在生活中隨處可見,如手機(jī)、MP3 播放器、家用電器、手持通信設(shè)備、信息終端、儀器儀表、汽車、航天航空、軍事裝備、制造工業(yè)、過程控制、電子表等,它以其獨(dú)有的嵌入、專用特點(diǎn),備受系統(tǒng)開發(fā)者的青睞。嵌入式系統(tǒng)的軟件、硬件都是可裁剪的,特別適用于對功能、可靠性、成本、體積、功耗有嚴(yán)格要求的場合。開源操作系統(tǒng)Linux 具有豐富的開發(fā)工具,大量文檔和廣泛的技術(shù)支持;支持主流的硬件設(shè)備和最新的硬件技術(shù),全球的Li
9、nux 愛好者編寫了大量的驅(qū)動(dòng)程序,使得Linux非常容易移植;龐大的體系給學(xué)習(xí)內(nèi)核帶來了很大困擾,通用的Linux 不具備硬實(shí)時(shí)性。多媒體已經(jīng)進(jìn)入到人民生活的方方面面,視頻與音頻設(shè)備迅速發(fā)展,決定了編寫相應(yīng)的Linux 驅(qū)動(dòng)代碼的必要性??v觀聲卡的發(fā)展歷史,我們不難發(fā)現(xiàn),主線一直是隨著聲道技術(shù)以及采樣規(guī)格的發(fā)展而發(fā)展。UDA1341TS 編解碼芯片屬于16 位/44.1 kHz 聲卡芯片之一,因其簡單實(shí)用,價(jià)格便宜,又可以滿足嵌入式系
10、統(tǒng)對聲音的一般處理要求而廣泛使用,所以為其編寫驅(qū)動(dòng)程序是很有必要的。Linux 內(nèi)核主要支持OSS 和ALSA 兩種聲卡驅(qū)動(dòng)框架,相比于OSS,A</p><p><b> 第二章 系統(tǒng)設(shè)計(jì)</b></p><p> 嵌入式系統(tǒng)具有廣闊的應(yīng)用前景,可以用于不同的領(lǐng)域,而開源的Linux 操作系統(tǒng)在嵌入式領(lǐng)域快速發(fā)展,兩者結(jié)合的研究是一個(gè)很好的課題,具有重要的社會(huì)和
11、商業(yè)價(jià)值。</p><p><b> 2.1 嵌入式系統(tǒng)</b></p><p> 嵌入式系統(tǒng)在廣義上說就是計(jì)算機(jī)系統(tǒng),它包括除了以通用為目的計(jì)算機(jī)之外的所有計(jì)算機(jī)。從便攜式音樂播放器到航天飛機(jī)的實(shí)時(shí)控制子系統(tǒng)都能見到嵌入式系統(tǒng)的應(yīng)用。與通用計(jì)算機(jī)系統(tǒng)可以滿足多種任務(wù)不同,嵌入式系統(tǒng)只能完成某些特定目的的任務(wù)。但有些也有實(shí)時(shí)性能的制約因素必須得到滿足的原因,如安全
12、性和可用性。除此之外其他功能可能要求較低或沒有要求,使系統(tǒng)的硬件得以簡化,以降低成本。對于大批量生產(chǎn)的系統(tǒng)來說,降低成本通常是設(shè)計(jì)的首要考慮。嵌入式系統(tǒng)通常需要簡化去除不需要的功能以降低成本,設(shè)計(jì)師通常選擇剛剛滿足所需功能的硬件使目標(biāo)最小化低成本的實(shí)現(xiàn)。</p><p> 嵌入式系統(tǒng)的定義:嵌入式系統(tǒng)是指以應(yīng)用為中心,以計(jì)算機(jī)技術(shù)為基礎(chǔ),軟件硬件可剪裁,適應(yīng)應(yīng)用系統(tǒng)對功能、可靠性、成本、體積、功耗嚴(yán)格要求的專用
13、計(jì)算機(jī)系統(tǒng)。它主要由嵌入式微處理器、外圍硬件設(shè)備、嵌入式操作系統(tǒng)以及用戶應(yīng)用軟件等部分組成。它具有“嵌入性”、“專用性”與“計(jì)算機(jī)系統(tǒng)”的三個(gè)基本要素。</p><p> 2.2 嵌入式系統(tǒng)的組成</p><p> 一個(gè)典型的嵌入式系統(tǒng)應(yīng)由硬件平臺(tái)、班級(jí)支持包(BSP: Board Support Package)、操作系統(tǒng)、應(yīng)用程序四部分組成。</p><p>
14、; 硬件平臺(tái)主要就是嵌入式處理器及其控制所需要的相關(guān)外設(shè)。目前,32 位處理器是嵌入式處理器的主流,主頻通常在40MHz 以上;也有超過500MHz 甚至更高的高端處理器。多處理器組成的平臺(tái)、多核處理器平臺(tái)也出現(xiàn)在嵌入式領(lǐng)域。不過。現(xiàn)在大量使用的仍是32 位單處理組成的平臺(tái)。一個(gè)典型平臺(tái)的基本組成如圖2-1 所示:</p><p> 圖2-1 嵌入式平臺(tái)的架構(gòu)</p><p> 2.
15、3 嵌入式系統(tǒng)的開發(fā)流程</p><p> 設(shè)計(jì)一個(gè)嵌入式專用系統(tǒng)的開發(fā)過程:首先是需求分析,了解用戶需要解決哪些問題;選擇處理器和相應(yīng)的硬件,原則上采用比較低的成本和簡單的外設(shè)解決問題;而后是硬件的設(shè)計(jì)(包括原理圖和PCB)調(diào)試,檢查硬件是否工作正常;接著調(diào)試軟件,有處理器的初始化、中斷、外設(shè)等需要編程序?qū)崿F(xiàn)的;最后就是測試,測試整個(gè)系統(tǒng)的功能是否正常,若正常則發(fā)布產(chǎn)品。如果有了嵌入式系統(tǒng)(即:基本的處理器和
16、核心電路是固定的,操作系統(tǒng)已經(jīng)移植好了),做產(chǎn)品時(shí),所需要做的工作就是看看是否需要添加外設(shè),爾后編寫所添加外設(shè)的驅(qū)動(dòng)程序,進(jìn)而編寫應(yīng)用程序。這樣避免重復(fù)勞動(dòng),縮短開發(fā)周期。目前大多數(shù)小公司就采用的是這種方案。其流程如圖2-2 所示:</p><p> 圖2-2 在嵌入式平臺(tái)的開發(fā)流程</p><p> 2.4 操作系統(tǒng)的選擇</p><p> 選擇合適的操作系
17、統(tǒng),對于嵌入式系統(tǒng)開發(fā)十分關(guān)鍵。合適的操作系統(tǒng)至少應(yīng)該具有兩大功能:多任務(wù)管理;文件和設(shè)備的管理。此外,還得考慮以下5 個(gè)方面:</p><p> 1. 系統(tǒng)的實(shí)時(shí)性問題。</p><p> 2. 是否容易移植。</p><p> 3. 系統(tǒng)驅(qū)動(dòng)程序是否好完善。</p><p> 4. 用程序是否容易開發(fā)和調(diào)試。</p>
18、<p> 5. 交叉編譯工具鏈?zhǔn)欠裢晟啤?lt;/p><p> 考慮以上因素,符合要求的有:Linux、WinCE、VxWorks、eCos、uC/OS-II 等,但Linux 源碼開放,軟件和驅(qū)動(dòng)程序支持十分豐富,驅(qū)動(dòng)協(xié)議棧完善,應(yīng)用廣泛,所以論文中采用了Linux 為操作系統(tǒng)。</p><p><b> 第三章 硬件架構(gòu)</b></p>
19、<p> 3.1 S3C2440處理器簡介</p><p> S3C2440處理器由核心板和底板兩大部分組成,外圍擴(kuò)展資源豐富,支持IIS 總線,AC97 聲卡接口。三星公司的16/32 位RISC 微處理器S3C2440A,它采用了ARM920t 的內(nèi)核,0.13um 的CMOS 標(biāo)準(zhǔn)宏單元和存儲(chǔ)器單元,新的總線架構(gòu)Advanced Microcontroller Bus Architectur
20、e (AMBA),具有獨(dú)立的16KB 指令I(lǐng)Cache 和16KB 數(shù)據(jù)DCache。同時(shí),使用了5 級(jí)流水線技術(shù),最大工作頻率可到400MHz;采用哈佛體系機(jī)構(gòu),取指和讀指可以同時(shí)進(jìn)行;引入了高速緩存(Cache)和寫緩存(Write Buffer),解決了存儲(chǔ)器訪問速度的瓶頸;支持MMU(Memory Manage Units,內(nèi)存管理單元),使用虛擬文件系統(tǒng),通過內(nèi)存保護(hù),一個(gè)進(jìn)程的失敗并不會(huì)影響其他進(jìn)程的運(yùn)行,從而增強(qiáng)了系統(tǒng)的穩(wěn)
21、定性。論文中用到的片上功能有:</p><p> 1. 60 個(gè)中斷源(1個(gè)看門狗定時(shí)器,5個(gè)定時(shí)器,9個(gè)UARTs,24個(gè)外部中斷,4 個(gè)DMA,2個(gè)RTC,2個(gè)ADC,1個(gè)IIC,2個(gè)SPI,1個(gè)SDI,2個(gè)USB,1個(gè)LCD和1個(gè)電池故障,1 個(gè)NAND和2個(gè)Camera), 1個(gè)AC97音頻</p><p> 2. 電平/邊沿觸發(fā)模式的外部中斷源</p><
22、p> 3. 可編程的邊沿/電平觸發(fā)極性</p><p> 4. 支持為緊急中斷請求提供快速中斷服務(wù)</p><p> 5. 24個(gè)外部中斷端口</p><p> 6. 130個(gè)多功能輸入/輸出端口</p><p> 7. 4-通道的DMA 控制器;</p><p> 8. 支持存儲(chǔ)器到存儲(chǔ)器,IO 到
23、存儲(chǔ)器,存儲(chǔ)器到IO 和IO 到IO 的傳輸s</p><p> 9. 采用觸發(fā)傳輸模式來加快傳輸速率</p><p> 10. 8 通道多路復(fù)用ADC</p><p> 11. 最大500KSPS/10 位精度</p><p> 12. 通道多主IIC 總線</p><p> 13. 可進(jìn)行串行,8 位,雙
24、向數(shù)據(jù)傳輸,標(biāo)準(zhǔn)模式下數(shù)據(jù)傳輸速度可達(dá)100kbit/s,快速模式下可達(dá)到400kbit/s.</p><p> 14. 1 通道音頻IIS 總線接口,可基于DMA 方式工作</p><p> 15. 串行,每通道8/16 位數(shù)據(jù)傳輸</p><p> 16. 發(fā)送和接收具備128 字節(jié)(64 字節(jié)加64 字節(jié))FIFO</p><p>
25、; 17. 支持IIS 格式和MSB-justified 數(shù)據(jù)格式</p><p> 18. 支援16 位采樣</p><p> 19. ch 立體聲PCM 輸入/ 1-ch 立體聲PCM 輸出1-ch MIC 輸入</p><p><b> 3.2 電源接口</b></p><p> TQ2440開發(fā)板上的電
26、壓設(shè)計(jì)采用5V 輸入實(shí)驗(yàn)板,板上帶電源開關(guān)和指示燈,經(jīng)可帶載1.5A 的低壓差線性穩(wěn)壓源AS1117AR-3.3 IC 芯片穩(wěn)壓,提供給實(shí)驗(yàn)板所需要的3.3V 電源如圖3-1 所示。</p><p> 圖3-1 3.3V電源電路</p><p> 注意:輸入電壓不要大于7V ,標(biāo)配的電源適配器是5V 供電。在不清楚適配器輸出電壓時(shí),請向適配器的供應(yīng)商確認(rèn)輸出電壓或自行用電壓表測試輸出電
27、壓;以防止因?yàn)檩斎腚妷哼^高而導(dǎo)致開發(fā)板出現(xiàn)損壞的情況。</p><p> 3.3 IIS音頻數(shù)據(jù)接口</p><p> TQ2440提供的音頻接口完全按照標(biāo)準(zhǔn)接口提供,綠色為音頻輸出接口,紅色為音頻輸入接口。底板與UDA1341TS 的接口電路如圖3-2 所示。</p><p> 圖3-2 TQ2440音頻接口電路原理圖</p><p>
28、; IIS即音頻數(shù)據(jù)接口,它是Philips 和Sony 等公司共同推出的接口標(biāo)準(zhǔn)。本系統(tǒng)把接口與UDA1341TS (Philips 公司的)音頻數(shù)字信號(hào)編譯碼相連接,得到</p><p> SPEADER 音頻輸出通道和MICROPHONE 音頻輸入通道。UDA1341TS 可把數(shù)字信號(hào)</p><p> 轉(zhuǎn)換為模擬信號(hào),同樣也能把立體聲模擬信號(hào)轉(zhuǎn)化為數(shù)字信號(hào),并可用AGC (自
29、動(dòng)增益控制)、PGA (可編程增益控制)對模擬信號(hào)進(jìn)行處理。對于數(shù)字信號(hào),該芯片提供DSP (數(shù)字音頻處理)功能。對于UDA1341TS 的L3 總線,它是該芯片工作于微</p><p> 控制器輸入模式時(shí)使用的,它包括L3DATA 、L3MODE 和L3CLOCK 三根接線,它們分別表示微處理器的接口數(shù)據(jù)線、接口模式線和接口時(shí)鐘線(連接GPB2、GPB3、GPB4 引腳)。通過這個(gè)接口,微處理器能夠?qū)DA1
30、341TS 中的數(shù)字音頻處理參數(shù)和</p><p> 系統(tǒng)控制參數(shù)進(jìn)行配置。</p><p> 3.4 AC97接口</p><p> AC97 是音頻編解碼器(Audio Codec)‘97(1997 年)的縮寫,此標(biāo)準(zhǔn)最早是Inter公司于1996 年發(fā)布的應(yīng)用于PC 機(jī)的“軟”聲卡標(biāo)準(zhǔn)。將聲卡中成本最高的數(shù)字信號(hào)處理(DSP)去掉了,通過特別編寫的驅(qū)動(dòng)程
31、序由CPU(Central Processing Unit, 中央處理器)負(fù)責(zé)這部分的信號(hào)處理工作,降低了聲卡的成本。隨著處理器速度的提升,聲音處理對CPU 的占用越來越不足道。它提供了一套廉價(jià)的音頻標(biāo)準(zhǔn)解決方案。不同于PCM 和IIS,AC97 不只是一種數(shù)據(jù)格式,還具有控制功能。采用了AC-Link 與外部的編解碼器連接,AC-Link 接口包括:位時(shí)鐘(BITCLK)、同步信號(hào)校正和從編碼到處理器和從處理器中解碼(SDATDIN
32、和SDATAOUT)的數(shù)據(jù)隊(duì)列。AC97 以數(shù)據(jù)幀SYNC脈沖開始,包含了12 個(gè)20 位的時(shí)間段及16 位的“tag”段。共計(jì)256 個(gè)數(shù)據(jù)序列。把幀分成時(shí)間段,使得傳輸控制信號(hào)與音頻數(shù)據(jù)僅通過4 線到達(dá)9 個(gè)音頻通道或轉(zhuǎn)換成其他數(shù)據(jù)流成為可能。AC97 一般采用TQFP48 封裝,減少了整體管腳數(shù)。事實(shí)上,AC97 是比IIS </p><p> 圖3-3 AC79音頻設(shè)備連接圖</p>&l
33、t;p> AC97 的通信方式也是同步串行接口,有5 根信號(hào)線:</p><p> 1. SYNC——同步信號(hào)。</p><p> 2. BIT_CLK——位時(shí)鐘信號(hào),由AC97 編解碼芯片產(chǎn)生。</p><p> 3. SDATA_OUT——串行數(shù)據(jù)輸出信號(hào)。</p><p> 4. SDATA_IN——串行數(shù)據(jù)輸入信號(hào)。&
34、lt;/p><p> 5. nRESER——AC97 編解碼器復(fù)位信號(hào),低電平有效。</p><p> 與IIS 總線不同的是,AC97 編解碼器有自己的振蕩器,可通過晶體產(chǎn)生時(shí)鐘。一般而言,AC97 編解碼芯片的時(shí)鐘是固定的24.576MHz。經(jīng)過分頻后,輸出28.288MHz的位時(shí)鐘信號(hào),所以AC97 編解碼芯片的時(shí)鐘,所以AC97 音頻的采樣不會(huì)因?yàn)橄到y(tǒng)的時(shí)鐘不準(zhǔn)確而產(chǎn)生失真,比被動(dòng)
35、編解碼模式工作的IIS 總線效果提高很多。AC97 是一種分時(shí)復(fù)用的串行同步總線,在總線上定義了13 個(gè)(編號(hào)是0~12)時(shí)間片。如圖3-4所示。</p><p> 圖3-4 AC97的十三個(gè)時(shí)間片</p><p> 與IIS 相比,AC97 的定義要復(fù)雜的很多。包括6 個(gè)音頻輸出通道(可用于5.1 的立體聲通道),“軟”調(diào)制解調(diào)器通信、控制通道,以及用于讀/寫AC97 編解碼器寄存
36、器的數(shù)據(jù)通道。編號(hào)1~12 的每個(gè)時(shí)間片數(shù)據(jù)(整個(gè)數(shù)據(jù)幀)的有效性,都可通過時(shí)間片0中的對應(yīng)位控制,這種控制方法使得每個(gè)通道的數(shù)據(jù)相對獨(dú)立,不會(huì)因?yàn)橐粋€(gè)通道的數(shù)據(jù)的更新對其它通道產(chǎn)生影響。AC97 數(shù)據(jù)幀的時(shí)序圖如圖3-5所示,數(shù)據(jù)在每一個(gè)位時(shí)鐘(BIT_CLK)的下降沿被送出,時(shí)間片0 中占有了16 個(gè)時(shí)鐘周期,其中,最高1 位決定整個(gè)AC97 數(shù)據(jù)幀是否有效,接著12 位決定了后面對應(yīng)的時(shí)間片(1~12)是否有效。其余的時(shí)間片1~1
37、2各占20 個(gè)時(shí)鐘周期。整個(gè)AC97 數(shù)據(jù)幀占用了256 個(gè)位時(shí)鐘周期(BIT_CLK)的時(shí)間。而位時(shí)鐘的頻率固定在12.288 MHz,所以一個(gè)AC97 數(shù)據(jù)幀的頻率剛好是48 kHz。</p><p> 圖3-5 AC97數(shù)據(jù)幀的時(shí)序</p><p> S3C2440A 的AC97 控制器單元支持AC97 的2.0 版本特點(diǎn)。AC97 控制器使用一個(gè)音頻控制器連接(AC-link)
38、來和AC97 編解碼器通訊。控制器發(fā)送立體聲PCM 數(shù)據(jù)給編解碼器。編解碼器中的外部數(shù)模轉(zhuǎn)換器轉(zhuǎn)換音頻采樣到模擬音頻波形??刂破饕矎木幗獯a器接收立體聲PCM 數(shù)據(jù)說單聲道的MIC 數(shù)據(jù),然后將數(shù)據(jù)存儲(chǔ)在內(nèi)存中。S3C2440A 的AC97主要特點(diǎn):</p><p> 1. 對于立體聲PCM 輸入,立體聲PCM 輸出和單聲道MIC 輸入都有獨(dú)立的通道。</p><p> 2. 基于DMA
39、 操作和基于中斷的操作</p><p> 3. 所有通道都僅支持16 位采樣</p><p> 4. 不同采樣率的AC97 編解碼器接口(48KHz 及以下)</p><p> 5. 16 位,每個(gè)通道16 個(gè)入口FIFO</p><p> 6. 僅支持主編解碼器</p><p> 第四章 AC97音頻驅(qū)動(dòng)及
40、實(shí)現(xiàn)</p><p> 設(shè)備驅(qū)動(dòng)程序中需要完成的任務(wù)包括對設(shè)備以及對應(yīng)資源初始化和卸載控制音頻數(shù)據(jù)在硬件中流動(dòng)并為音頻應(yīng)用提供標(biāo)準(zhǔn)接口。讀取應(yīng)用程序傳送給設(shè)備文件的數(shù)據(jù)并回送應(yīng)用程序請求的數(shù)據(jù)。這需要在用戶空間、內(nèi)核空間、總線及外設(shè)之間傳輸數(shù)據(jù)。</p><p> 嵌入式L inux 把硬件設(shè)備都看成是文件, 通過打開、讀取或?qū)懭雽?yīng)的設(shè)備文件實(shí)現(xiàn)對硬件設(shè)備的讀寫操作, 另外還提供io
41、ctl 接口給上層用戶來設(shè)置設(shè)備參數(shù)。本驅(qū)動(dòng)程序主要是通過對硬件的控制實(shí)現(xiàn)音頻流的傳輸, 同時(shí)向上層提供了標(biāo)準(zhǔn)的音頻接口。本音頻系統(tǒng)驅(qū)動(dòng)提供了兩個(gè)標(biāo)準(zhǔn)接口:</p><p> ?、贁?shù)字音頻處理, 即Dsp , 負(fù)責(zé)音頻數(shù)據(jù)的傳輸即播放或錄音等操作。</p><p> ?、诨祛l器, 即Mixer, 負(fù)責(zé)對輸出音頻進(jìn)行混音處理。如音量調(diào)節(jié), 高低音控制等。</p><p&g
42、t; 這兩部分分別對應(yīng)設(shè)備文件ö devö dsp 和ödevö m ixer。</p><p> 4.1 設(shè)備的初始化</p><p> 設(shè)備的初始化主要就是U CB 1400 Codec 的初始化和音頻設(shè)備的注冊, 步驟如下:</p><p> ?、俪跏蓟疨XA 255 的GP IO 口為A C2link 功能口;&
43、lt;/p><p> ?、诔跏蓟疉 CUN IT 的GCR 寄存器, 并重啟U CB 1400;</p><p> ?、圩x取U CB 1400 的ID 號(hào), 并初始化Codec中的各個(gè)混音控制寄存器;</p><p> ?、芨鶕?jù)我們系統(tǒng)的需求調(diào)整Codec 混音的各項(xiàng)參數(shù);</p><p> ?、菹騆 inux 系統(tǒng)注冊dsp 設(shè)備和m ixer
44、 設(shè)備。</p><p> 這樣U CB 1400 Codec 基本上就處于可用狀態(tài)了。</p><p> 4.2 Mixer 驅(qū)動(dòng)</p><p> Mixer 驅(qū)動(dòng)只是控制混音效果, 并不執(zhí)行讀寫操作, 所以Mixer的文件操作結(jié)構(gòu)只實(shí)現(xiàn)了一個(gè)ioctl調(diào)用, 提供給上層設(shè)置Codec的混音效果。驅(qū)動(dòng)中主要實(shí)現(xiàn)了一個(gè)結(jié)構(gòu)struct ac97_codec
45、pxa_ac97_codec。該結(jié)構(gòu)描述了Codec的基本信息, 主要是實(shí)現(xiàn)了Codec 寄存器的讀寫函數(shù)和混音的控制函數(shù)。Mixer 文件操作結(jié)構(gòu)中的ioctl就是調(diào)用pxa_ac97_codec中的混音控制函數(shù)來實(shí)現(xiàn)的。</p><p> 4.3 Dsp 驅(qū)動(dòng)</p><p> Dsp 驅(qū)動(dòng)實(shí)現(xiàn)了音頻數(shù)據(jù)的傳輸, 即播放和錄音的數(shù)據(jù)傳輸。同時(shí)還提供ioctl 對U CB 1400C
46、odec 中DA C 和ADC 采樣率進(jìn)行控制。采樣率的控制主要就是對照U CB 1400 手冊讀寫U CB 1400 Code 中的采樣率控制寄存器。所以驅(qū)動(dòng)的主要部分是音頻數(shù)據(jù)傳輸?shù)目刂啤?lt;/p><p> 驅(qū)動(dòng)中通過一個(gè)結(jié)構(gòu)static audio_state_tac97_ audio_state 來描述整個(gè)音頻系統(tǒng)的狀態(tài), 其中最主要的就是兩個(gè)數(shù)據(jù)流結(jié)構(gòu)ac97_audio_in 和ac97_audio
47、_out。這兩個(gè)結(jié)構(gòu)分別描述輸入音頻流和輸出音頻流的信息。</p><p> 通過對ac97_audio_in 和ac97_audio_out 的操作, 分別實(shí)現(xiàn)了音頻的輸入和輸出, 即音頻的播放和錄音, 本驅(qū)動(dòng)的主要內(nèi)容就是數(shù)據(jù)流結(jié)構(gòu)的設(shè)計(jì)和實(shí)現(xiàn)。</p><p> 該結(jié)構(gòu)應(yīng)該包含音頻緩沖區(qū)的信息、DM A的相關(guān)信息和所用到的信號(hào)量。還有就是F_IFO的入口寄存器的地址。其中在傳輸時(shí)
48、緩沖區(qū)的設(shè)計(jì)是音頻傳輸?shù)闹攸c(diǎn)。以Write 函數(shù)為例, 因?yàn)橐纛l數(shù)據(jù)量通常較大, 緩存太小容易造成緩存溢出, 所以要采用較大的緩沖區(qū)。而要填充大的緩沖區(qū), CPU 就要一次處理大量的數(shù)據(jù), 這樣處理數(shù)據(jù)時(shí)間較長, 容易造成延遲。在這種情況下, 我們采用多個(gè)緩存的機(jī)制, 將緩沖區(qū)分為多個(gè)數(shù)據(jù)段。數(shù)據(jù)段的個(gè)數(shù)和大小分別在數(shù)據(jù)流結(jié)構(gòu)中指定。這樣把大的數(shù)據(jù)段分為幾個(gè)小段處理, 每處理一小段數(shù)據(jù)就可以通過DM A 發(fā)送出去。Read 函數(shù)也是如此
49、,DMA 每發(fā)來一小段數(shù)據(jù)就可以處理了, 而不用等到大緩沖區(qū)都填滿才處理數(shù)據(jù)。這里還提供了ioctl 接口給上層調(diào)用, 這樣上層還可以根據(jù)音頻數(shù)據(jù)的精度, 即數(shù)據(jù)流量, 來調(diào)整緩沖區(qū)數(shù)據(jù)段的大小和個(gè)數(shù), 來取得最好的傳輸效果。</p><p><b> 第五章 總結(jié)</b></p><p> 本文采用TQ2440 為硬件開發(fā)平臺(tái),S3C2440 為微處理器,UDA
50、1341TS 為音頻編解碼器,使用了Linux 操作系統(tǒng),介紹了在嵌入式系統(tǒng)中構(gòu)架基于AC97標(biāo)準(zhǔn)的音頻系統(tǒng), 實(shí)現(xiàn)音頻的播放和錄音采集。首先講述了嵌入式系統(tǒng)選擇和設(shè)計(jì)過程, 然后介紹了硬件架構(gòu)及幾個(gè)重要接口,同時(shí)還介紹了AC97的音頻驅(qū)動(dòng)程序和整個(gè)驅(qū)動(dòng)過程。</p><p> 我在學(xué)習(xí)嵌入式系統(tǒng)初期,起步很是困難,代碼間的相互關(guān)系錯(cuò)綜復(fù)雜,整個(gè)系統(tǒng)開發(fā)過程也十分困難,一時(shí)之間抓不到主線。幸好,在Windows
51、 平臺(tái)下,使用Source Insight查看代碼,很快理清思路,為嵌入式的學(xué)習(xí)帶來很大便利。在Linux 驅(qū)動(dòng)開發(fā)過程中,我也曾經(jīng)因?yàn)榫帉懙尿?qū)動(dòng)代碼不成功而失望過,痛苦過;然而,當(dāng)一切問題都解決后,那種喜悅與成就感是無法用語言形容的。真可謂是:其中的酸甜苦辣,只有經(jīng)歷過的人,才能真正體會(huì)。相信在可預(yù)見的未來,linux的使用者會(huì)越來越多。我很榮幸的成為其中的一員,自己需要不斷努力進(jìn)取,才能更好的使用Linux,為它的應(yīng)用與推廣貢獻(xiàn)一份
52、力量。</p><p><b> 參考文獻(xiàn)</b></p><p> [1] 肖文鵬,Linux 音頻編程指南,[S]2004, http:∥www 2900. ibm. com ö.</p><p> [2] 杜春雷ARM 體系結(jié)構(gòu)與編程[M]. 北京:清華大學(xué)出版社,2003.</p><p> [
53、3] 宋寶華Linux 設(shè)備驅(qū)動(dòng)開發(fā)詳解[M] 北京:人民郵電出版社,2008.2.</p><p> [4] 劉淼嵌入式系統(tǒng)接口設(shè)計(jì)與Linux 驅(qū)動(dòng)程序開發(fā)[M] 北京:北京航空航天大學(xué)出版社,2006.5.</p><p> [5] 高建華, 王殊基于S3C2410 型微處理器和UDA1341TS 型立體聲音頻編解碼器的嵌入式音頻系統(tǒng)設(shè)計(jì)國外電子元器件2006.6:35-37.&
54、lt;/p><p> [6] 趙敏,楊恢先,湯安平基于S3C2440 的嵌入式Linux 系統(tǒng)移植的研究與實(shí)現(xiàn)2008.12:1947-1950</p><p> [7] 龔舟, 康燁基于Linux 的通用視頻音頻采集系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)電腦知識(shí)與技術(shù)2008.6:676-677.</p><p> 附錄1 mixer.c</p><p>&l
55、t;b> /*</b></p><p><b> * mixer.c</b></p><p> * 對各種混音通道的增益進(jìn)行調(diào)節(jié),其所有的功能都</p><p> * 通過讀寫/dev/mixer 設(shè)備文件來完成</p><p><b> */</b></p>
56、<p> #include <unistd.h></p><p> #include <stdlib.h></p><p> #include <stdio.h></p><p> #include <sys/ioctl.h></p><p> #include <
57、fcntl.h></p><p> #include <linux/soundcard.h></p><p> /* 用來存儲(chǔ)所有可用混音設(shè)備的名稱*/</p><p> const char *sound_device_names[] = SOUND_DEVICE_NAMES;</p><p> int fd; /
58、* 混音設(shè)備所對應(yīng)的文件描述符*/</p><p> int devmask, stereodevs; /* 混音器信息對應(yīng)的位圖掩碼*/</p><p> char *name;</p><p> /* 顯示命令的使用方法及所有可用的混音設(shè)備*/</p><p> void usage()</p><p>&
59、lt;b> {</b></p><p><b> int i;</b></p><p> fprintf(stderr, "usage: %s <device> <left-gain%%> <right-gain%%>\n"</p><p> " %s
60、<device> <gain%%>\n\n"</p><p> "Where <device> is one of:\n", name, name);</p><p> for (i = 0 ; i < SOUND_MIXER_NRDEVICES ; i++)</p><p> if ((
61、1 << i) & devmask) /* 只顯示有效的混音設(shè)備*/</p><p> fprintf(stderr, "%s ", sound_device_names[i]);</p><p> fprintf(stderr, "\n");</p><p><b> exit(1);&l
62、t;/b></p><p><b> }</b></p><p> int main(int argc, char *argv[])</p><p><b> {</b></p><p> int left, right, level; /* 增益設(shè)置*/</p><
63、;p> int status; /* 系統(tǒng)調(diào)用的返回值*/</p><p> int device; /* 選用的混音設(shè)備*/</p><p> char *dev; /* 混音設(shè)備的名稱*/</p><p><b> int i;</b></p><p> name = argv[0];</p&g
64、t;<p> /* 以只讀方式打開混音設(shè)備*/</p><p> fd = open("/dev/mixer", O_RDONLY);</p><p> if (fd == -1) {</p><p> perror("unable to open /dev/mixer");</p><
65、;p><b> exit(1);</b></p><p><b> }</b></p><p> /* 獲得所需要的信息*/</p><p> status = ioctl(fd, SOUND_MIXER_READ_DEVMASK, &devmask);</p><p> i
66、f (status == -1)</p><p> perror("SOUND_MIXER_READ_DEVMASK ioctl failed");</p><p> status = ioctl(fd, SOUND_MIXER_READ_STEREODEVS, &stereodevs);</p><p> if (status =
67、= -1)</p><p> perror("SOUND_MIXER_READ_STEREODEVS ioctl failed");</p><p> /* 檢查用戶輸入*/</p><p> if (argc != 3 && argc != 4)</p><p><b> usage()
68、;</b></p><p> /* 保存用戶輸入的混音器名稱*/</p><p> dev = argv[1];</p><p> /* 確定即將用到的混音設(shè)備*/</p><p> for (i = 0 ; i < SOUND_MIXER_NRDEVICES ; i++)</p><p>
69、 if (((1 << i) & devmask) && !strcmp(dev, sound_device_names[i]))</p><p><b> break;</b></p><p> if (i == SOUND_MIXER_NRDEVICES) { /* 沒有找到匹配項(xiàng)*/</p><p>
70、; fprintf(stderr, "%s is not a valid mixer device\n", dev);</p><p><b> usage();</b></p><p><b> }</b></p><p> /* 查找到有效的混音設(shè)備*/</p><p&g
71、t; device = i;</p><p> /* 獲取增益值*/</p><p> if (argc == 4) {</p><p> /* 左、右聲道均給定*/</p><p> left = atoi(argv[2]);</p><p> right = atoi(argv[3]);</p&g
72、t;<p><b> } else {</b></p><p> /* 左、右聲道設(shè)為相等*/</p><p> left = atoi(argv[2]);</p><p> right = atoi(argv[2]);</p><p><b> }</b></p>
73、;<p> /* 對非立體聲設(shè)備給出警告信息*/</p><p> if ((left != right) && !((1 << i) & stereodevs)) {</p><p> fprintf(stderr, "warning: %s is not a stereo device\n", dev);<
74、;/p><p><b> }</b></p><p> /* 將兩個(gè)聲道的值合到同一變量中*/</p><p> level = (right << 8) + left;</p><p><b> /* 設(shè)置增益*/</b></p><p> status
75、= ioctl(fd, MIXER_WRITE(device), &level);</p><p> if (status == -1) {</p><p> perror("MIXER_WRITE ioctl failed");</p><p><b> exit(1);</b></p><
76、;p><b> }</b></p><p> /* 獲得從驅(qū)動(dòng)返回的左右聲道的增益*/</p><p> left = level & 0xff;</p><p> right = (level & 0xff00) >> 8;</p><p> /* 顯示實(shí)際設(shè)置的增益*/&l
77、t;/p><p> fprintf(stderr, "%s gain set to %d%% / %d%%\n", dev, left, right);</p><p> /* 關(guān)閉混音設(shè)備*/</p><p> close(fd);</p><p><b> return 0;</b></
78、p><p><b> }</b></p><p><b> 附錄2 dsp.c</b></p><p><b> /*</b></p><p><b> * dsp.c</b></p><p> * 先錄制幾秒種音頻數(shù)據(jù),將其
79、存放在內(nèi)存緩沖區(qū)中,然后再進(jìn)行回放,</p><p> * 其所有的功能都是通過讀寫/dev/dsp 設(shè)備文件來完成</p><p><b> */</b></p><p> #include <unistd.h></p><p> #include <fcntl.h></p>
80、<p> #include <sys/types.h></p><p> #include <sys/ioctl.h></p><p> #include <stdlib.h></p><p> #include <stdio.h></p><p> #include &
81、lt;linux/soundcard.h></p><p> #define LENGTH 3 /* 存儲(chǔ)秒數(shù)*/</p><p> #define RATE 8000 /* 采樣頻率*/</p><p> #define SIZE 8 /* 量化位數(shù)*/</p><p> #define CHANNELS 1 /* 聲道數(shù)目*
82、/</p><p> /* 用于保存數(shù)字音頻數(shù)據(jù)的內(nèi)存緩沖區(qū)*/</p><p> unsigned char buf[LENGTH*RATE*SIZE*CHANNELS/8];</p><p> int main()</p><p><b> {</b></p><p> int fd
83、; /* 聲音設(shè)備的文件描述符*/</p><p> int arg; /* 用于ioctl 調(diào)用的參數(shù)*/</p><p> int status; /* 系統(tǒng)調(diào)用的返回值*/</p><p> /* 打開聲音設(shè)備*/</p><p> fd = open("/dev/dsp", O_RDWR);</p&g
84、t;<p> if (fd < 0) {</p><p> perror("open of /dev/dsp failed");</p><p><b> exit(1);</b></p><p><b> }</b></p><p> /* 設(shè)置采
85、樣時(shí)的量化位數(shù)*/</p><p> arg = SIZE;</p><p> status = ioctl(fd, SOUND_PCM_WRITE_BITS, &arg);</p><p> if (status == -1)</p><p> perror("SOUND_PCM_WRITE_BITS ioctl
86、failed");</p><p> if (arg != SIZE)</p><p> perror("unable to set sample size");</p><p> /* 設(shè)置采樣時(shí)的聲道數(shù)目*/</p><p> arg = CHANNELS;</p><p>
87、 status = ioctl(fd, SOUND_PCM_WRITE_CHANNELS, &arg);</p><p> if (status == -1)</p><p> perror("SOUND_PCM_WRITE_CHANNELS ioctl failed");</p><p> if (arg != CHANNELS)
88、</p><p> perror("unable to set number of channels");</p><p> /* 設(shè)置采樣時(shí)的采樣頻率*/</p><p> arg = RATE;</p><p> status = ioctl(fd, SOUND_PCM_WRITE_RATE, &arg
89、);</p><p> if (status == -1)</p><p> perror("SOUND_PCM_WRITE_WRITE ioctl failed");</p><p> /* 循環(huán),直到按下Control-C */</p><p> while (1) {</p><p>
90、 printf("Say something:\n");</p><p> status = read(fd, buf, sizeof(buf)); /* 錄音*/</p><p> if (status != sizeof(buf))</p><p> perror("read wrong number of bytes&qu
91、ot;);</p><p> printf("You said:\n");</p><p> status = write(fd, buf, sizeof(buf)); /* 回放*/</p><p> if (status != sizeof(buf))</p><p> perror("wrote w
92、rong number of bytes");</p><p> /* 在繼續(xù)錄音前等待回放結(jié)束*/</p><p> status = ioctl(fd, SOUND_PCM_SYNC, 0);</p><p> if (status == -1)</p><p> perror("SOUND_PCM_SYNC
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于S3C2440的嵌入式系統(tǒng)驅(qū)動(dòng)程序設(shè)計(jì).pdf
- 基于S3C2440和Linux的嵌入式驅(qū)動(dòng)程序設(shè)計(jì).pdf
- 基于S3C2440和Linux的嵌入式網(wǎng)絡(luò)驅(qū)動(dòng)程序開發(fā).pdf
- arm嵌入式系統(tǒng)課程設(shè)計(jì)——mmcsd卡驅(qū)動(dòng)程序設(shè)計(jì)
- 基于S3C2440的嵌入式系統(tǒng)及VGA輸出設(shè)計(jì).pdf
- 基于S3C2440的嵌入式Linux的應(yīng)用.pdf
- 基于S3C2440A和Linux的嵌入式存儲(chǔ)設(shè)備驅(qū)動(dòng)程序的研究與開發(fā).pdf
- 嵌入式Linux音頻設(shè)備的驅(qū)動(dòng)設(shè)計(jì)與研究.pdf
- 基于S3C2440嵌入式視頻監(jiān)控平臺(tái)研究與設(shè)計(jì).pdf
- 基于S3C2440的嵌入式Linux移動(dòng)圖像監(jiān)控系統(tǒng)設(shè)計(jì).pdf
- 嵌入式RFID的驅(qū)動(dòng)程序設(shè)計(jì).pdf
- s3c2440嵌入式系統(tǒng)的開發(fā)工具
- 基于PCI總線的嵌入式設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)與研究.pdf
- 基于S3C2440和嵌入式Linux的輸入輸出設(shè)備驅(qū)動(dòng)開發(fā).pdf
- 基于S3C2440的嵌入式視頻前端控制器設(shè)計(jì).pdf
- 基于ARM的嵌入式系統(tǒng)驅(qū)動(dòng)程序設(shè)計(jì).pdf
- 基于S3C2440+Linux的無線射頻模塊的驅(qū)動(dòng)程序設(shè)計(jì).pdf
- 嵌入式驅(qū)動(dòng)程序設(shè)計(jì)與實(shí)現(xiàn).pdf
- 基于S3C2440的linux嵌入式視頻監(jiān)控系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn).pdf
- 基于S3C2440嵌入式Linux系統(tǒng)的研究與應(yīng)用.pdf
評(píng)論
0/150
提交評(píng)論