第一篇:嵌入式系統語音采集與播放程序設計
ARM9嵌入式系統課程設計
--嵌入式系統語音采集與播放程序設計
班級: 學號: 姓名:
指導老師:
課程設計時間:2011.6.29---2011.7.8
江蘇大學
目錄
第一章 引言.........................................................1 1.1 設計目的......................................................1 1.2 設計任務與要求................................................1 第二章 課程設計平臺構建與流程.......................................2 2.1 嵌入式系統平臺構建............................................2 2.2 課程設計流程..................................................3 2.3 課程設計硬件結構與工作原理...................................3 第三章 BOOTLOADER移植與下載.......................................11 3.1 VIVI源代碼安裝...............................................11 3.2 VIVI源代碼分析與移植.........................................11 3.3 VIVI編譯與下載...............................................12 第四章 LINUX內核移植與下載........................................14 4.1 LINUX內核源代碼安裝..........................................14 4.2 LINUX內核源代碼分析與移植....................................14 4.3 LINUX內核編譯與下載..........................................15 第五章 課程設計功能模塊程序設計與交叉編譯..........................24 5.1 課程設計模塊功能.............................................24 5.2 功能模塊驅動程序設計.........................................24 5.3 功能模塊交叉編譯.............................................28 第六章 根文件系統建立與文件系統下載................................29 6.1 根文件系統分析...............................................29 6.2 文件系統映像文件生成.........................................30 6.3 文件系統下載.................................................31 6.4 功能模塊運行與調試...........................................32 第七章 課程設計總結與體會..........................................34 7.1 得出的結論...................................................34 7.2課程設計過程中遇到的問題及解決方法...........................34 7.3 心得體會.....................................................34 參考文獻...........................................................36
第一章 引言
1.1 設計目的
分析Linux操作系統下音頻設備驅動的結構,編寫應用測試程序,實現UDA1341芯片的實時錄音及放音功能,進一步熟悉vivi、Linux內核和根文件系統的編譯和燒寫至開發板的開發流程。
1.2 設計任務與要求
在Samsung公司S3C2410處理器的edukit-Ⅲ開發板上,在嵌入式linux操作系統環境下,根據語音芯片UDA1341的驅動程序和語音數據的特點編寫語音采集與播放的應用測試程序,實現語音數據的采集和實時播放功能。1.要求本系統實時的采集與播放
2.通過麥克風錄制一段語音信息,對其進行播放 第二章 課程設計平臺構建與流程
2.1 嵌入式系統平臺構建
2.1.1軟件部分
1)Linux或Windows 98/2000/NT/XP 2)cygwin cygwin是一個在windows平臺上運行的unix/Linux模擬環境,是cygnus solutions公司開發 3)Embest IDE 英蓓特提供的一個嵌入式開發的集成環境。4)windows中的超級終端
5)Embest online Flash Programmer for ARM 燒寫相關文件到NorFlash中的工具。
6)建立linux的交叉編譯環境,各項源代碼的安裝等 2.1.2硬件部分
1)EduKit-II實驗平臺 2)S3C2410核心子板 3)PC機 2.2 課程設計流程
圖2.1 設計流程
2.3 課程設計硬件結構與工作原理
2.3.1硬件模塊(1)
SCLLRCIIS控制器SDOSDIMCL 圖2.2 典型的IIS總線上的設備
(2)IIS總線結構
IIS總線只處理聲音數據,其他控制信號等則需單獨提供。IIS總線使用3根串行總線,分別是:提供分時復用功能的SD線(Serial data,串行數據),WS線(Word select,字段選擇(聲道選擇))和SCK線(Continuous Serial clock,連續的時鐘信號)。
音頻編解碼4 ADDRTxFIFODATASFTRBRFCRxFIFOSDCNTLCHHCSCLKIPSR_APCLKIPSR_BSCLKGLRCKCDCLK
圖2.3 IIS總線接口內部結構
S3C2410A IIS總線接口各模塊的功能描述如下:
● BRFC 表示總線接口、寄存器區和狀態機。總線接口邏輯和FIFO訪問由狀態機控制。
● IPSR 表示兩個5位的前置分頻器ISPR_A和ISPR_B,一個前置分頻器作為IIS總線接口的主時鐘發生器,另一個前置分頻器作為外部音頻編解碼器CODEC的時鐘發生器。
● TxFIFO和RxFIFO 表示兩個64字節的FIFO。在發送數據時,數據寫到TxFIFO,在接收數據時,數據從RxFIFO讀取。
● SCLKG 表示主IISCLK發生器。在主設模式時,由主時鐘產生串行位時鐘。● CHNC 表示通道發生器和狀態機。通道狀態機用于產生和控制IISCLK和IISLRCK。
● SFTR 表示16位移位寄存器。在發送模式時,并行數據移入SFTR并轉換成串行數據輸出;在接收模式時,串行數據移入SFTR并轉換成并行數據輸出。具體的相關寄存器的位功能描述請參觀相關資料。2.3.2 工作原理
常用的數字音頻處理集成電路包括A/D、D/A、DSP、數字濾波器和數字音頻I/O接口及設備(麥克風、話筒)等。麥克風輸入的模擬音頻信號經A/D轉換、音頻編碼器實現模擬音頻信號到數字音頻信號轉換,編碼后的數字音頻信號通過控制器送入DSP或微處理器相應的處理。音頻輸出時,數字音頻信號(音頻數據)經控制器給音頻解碼器,經D/A轉換后由揚聲器輸出。
數字音頻涉及概念很多,重要的是理解:采樣和量化。采樣就是每隔一定時間讀一次聲音信號的幅度,而量化則是將采樣得到的聲音信號幅度轉換為數字值。從本質上講,采樣是時間上的數字化,而量化則是幅度上的數字化。
根據奈奎斯特(Nyquist)采樣理論采樣頻率應高于輸入信號的最高頻率兩倍。為了保證聲音不失真,采樣頻率應該在40kHz左右。常用的音頻采樣頻率有8kHz、11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz等,要達到DVD的音質需要采用更高的采樣頻率。
量化是對模擬音頻信號的幅度數字化,量化位數決定模擬信號數字化以后的動態范圍,常用的有8位、12位和16位。量化位越高,信號的動態范圍越大,數字化后的音頻信號就越接近原始信號,但所需要的存儲空間也越大。
聲道有單聲道、雙聲道和多聲道。雙聲道又稱立體聲,在硬件中有兩條線路,音質和音色都優于單聲道,但數字化后占據的存儲空間的大小要比單聲道多一倍。多聲道能提供更好的聽覺感受,不過占用的存儲空間也更大。
數字音頻數據有PCM、MP3、WMA、WAV、Ogg Vorbis、RA、AAC、ATRAC 3等多種不同的文件格式。
1)IIS總線
IIS總線(IIS,Inter-IC Sound Bus,數字音頻集成電路通信總線)是Philip公司提出的音頻總線協議,它是一種串行的數字音頻總線協議,是音頻數據編碼或解碼常用的串行音頻數字接口。
(1)IIS總線的傳輸模式
數據的發送方和接收方需要采用相同的時鐘信號來控制數據傳輸,數據傳輸方(主設)必須產生字段選擇信號、時鐘信號和需要傳輸的數據信號。在一個復雜的數字音頻系統中,可能會有多個發送方和接收方,通常采用系統主控制模式,主控制模塊控制數字音頻數據在不同集成電路(設備)間的傳輸,數據發送方就需要在主控制模塊的協調下發送數據。IIS總線的三種傳輸模式如圖2、3、4所示,這些模式的配置一般需通過軟件來實現。
clock SCKTRANSMITTERword select WSdata SDRECEIVERTRANSMITTER=MASTER
圖2.4發送器為主設時的傳輸模式
clock SCKTRANSMITTERword select WSdata SDRECEIVERRECEIVER=MASTER
圖2.5 接收器為主設時的傳輸模式
CONTROLLERclock SCKTRANSMITTERword select WSdata SDRECEIVERCONTROLLER=MASTER
圖2.6 控制器為主設時的傳輸模式(2)IIS總線時序 1串行數據(SD)○串行數據的傳輸由時鐘信號同步控制,且串行數據線每次傳輸1字節的數據。當音頻數據被數字化成二進制流后,傳輸時先將數據分成字節(如8位、16位等),每個字節的數據傳輸從左邊的二進制位MSB(Most Significant Bit)開始。當接收方和發送方的數據字段寬度不一樣時,發送方不考慮接收方的數據字段寬度。如果發送方發送的數據字段寬度小于系統字段寬度,就在低位補0;如果發送方的數據字段寬度大于接收方的寬度,則超過LSB(Least Significant Bit)的部分被截斷。
2字段選擇(WS)○音頻系統一般包含有左右兩個聲道,字段選擇(WS)用來選擇左聲道或者右聲道,WS=0表示選擇左聲道;WS=0表示選擇左聲道。如果不在外部加以控制,WS會在MSB傳輸前的一個時鐘周期發生變化,使數據接收方和發送方保持同步。此外,WS能讓接收設備存儲前1字節,并且準備接收后1字節。
3時鐘信號(SCK)○在IIS總線中,任何一個能夠產生時鐘信號的電路都可以稱為主設備,從設備從外部時鐘輸入得到時鐘信號。IIS的規范中制定了一系列關于時鐘信號頻率和延時的限制。
圖2.7 IIS總線時序
(3)IIS總線接口的工作方式
IIS總線接口是用來連接外部的標準編解碼器(CODEC)的接口。S3C2410A提供一個IIS總線接口,能用來連接一個外部8/16位立體聲音頻CODEC,支持IIS 總線數據格式和MSB-justified數據格式。該接口對FIFO的訪問提供DMA傳輸模式,而不是采用中斷模式。它可以同時發送數據和接收數據,也可以只發送或只接收數據。在只發送和只接收模式,S3C2410A的IIS總線接口有以下三種工作方式。
1正常傳輸方式 ○在正常傳輸方式,對于發送和接收FIFO,IIS控制寄存器有一個FIFO就緒標志位。當FIFO準備發送數據時,如果發送FIFO不空,則FIFO就緒標志位為“1”;如果發送FIFO為空,該標志為“0”。在接收數據時,當接收FIFO是不滿時,FIFO就緒標志位為“1”,指示可以接收數據;若接收FIFO滿,則該標志為“0”。通過FIFO就緒標志位,可以確定CPU讀/寫FIFO的時間。
2DMA傳輸方式 ○在DMA傳輸方式,利用DMA控制器來控制發送和接收FIFO的數據存取,由FIFO就緒標志來自動請求DMA的服務。
3發送和接收方式 ○在發送和接收方式,IIS總線接口可以同時發送和接收數據。(4)S3C2410A IIS總線接口的音頻串行接口格式
S3C2410A的IIS總線接口支持IIS總線數據格式和MSB-justified數據格式。IIS總線格式 ○IIS總線有IISDI(串行數據輸入)、IISDO(串行數據輸出)、IISLRCK(左/右通道選擇)和IISCLK(串行位時鐘)4條線,產生IISLRCK和IISCLK信號的為主設備。串行數據以2的補碼發送,首先發送是MSB位。首先發送MSB位可以使發送方和接收方具有不同的字長度,發送方不必知道接收方能處理的位數,同樣接收方也不必知道發送方正發來多少位的數據。
當系統字長度大于發送器的字長度時,數據發送時,字被切斷(最低數據位設置為0)發送。接收器接收數據時,如果接收到的數據字長比接收器的字長更長時,則多的數據位被忽略。另一方面,如果接收器收到的數據位數比它的字長短時,則缺少的位設置為0。因此,MSB有固定的位置,而LSB的位置與字長度 有關。在IISLRCK發生改變的一個時鐘周期,發送器發送下一個字的MSB位。
發送器發送的串行數據可以在時鐘信號的上升沿或下降沿同步。然而,串行數據必須在串行時鐘信號的上升沿鎖存到接收器,所以發送數據使用上升沿進行同步時會一些限制。
左右通道選擇線指示當前正發送的通道。IISLRCK可以在串行時鐘的上升沿或者下降沿改變,不需要同步。在從模式,這個信號在串行時鐘的上升沿被鎖存。IISLRCK在MSB位發送的前一個時鐘周期內發生改變,這樣可以使從發送器同步發送串行數據。另外,允許接收器存儲前一個字,并清除輸入以接收下一個字。
2MSB-justified數據格式 ○MSB-justified總線格式在體系結構上與IIS總線格式相同。與IIS總線格式唯一不同的是,只要IISLRCK有變化,MSB-justified格式要求發送器總是發送下一個字的最高位。
2)音頻編解碼芯片UDAl341TS UDA1431TS可把通過麥克風音頻輸入通道輸入的立體聲模擬信號轉化為IIS格式的數字信號,傳送給S3C2410的IIS控制器,然后CPU使用DMA控制器把得到的數字信號存放的一塊內存空間上;同樣DMA控制器也能把已存的數字信號通過IIS格式發送給UDAl341TS芯片,由該芯片轉換成模擬信號,通過耳機音頻輸出通道輸出。利用UDA1341TS內部的PGA(可編程增益放大器)、AGC(自動增益控制)功能對模擬信號進行處理。對于數字信號,UDA1341TS提供DSP(數字音頻處理)功能。
S3C2410A的IIS接口線分別與UDA1431TS的BCK、WS、DATAI、SYSCLK相連。當UDA1431TS芯片工作在微控制器輸入模式時,使用UDA1431TS的L3總線(L3DATA、L3MODE和L3CLOCK)。L3DATA、L3MODE和L3CLOCK分別表示與微處理器接口的數據線(L3DATA)、模式控制線(L3MODE)和時鐘線(L3CLOCK)。微控制器通過對UDA1431TS中的數字音頻處理參數進行配置。S3C2410A沒有與L3總線配套的專用接口,可以利用通用I/O口進行控制。第三章 Bootloader移植與下載
3.1 Vivi源代碼安裝
進入cygwin,Vivi源代碼的安裝:
$> source /tmp/edukit-2410/set_env_linux.sh?// Linux編譯環境變量設置,第一次打開Cygwin必須設置。
$> cd $WORKDIR $> tar-xvjf /tmp/edukit-2410/source/vivi/vivi-20030929.tar.bz2 $> ls
? vivi ?? ?為$WORKDIR目錄下其他內容
正確解壓后,可以看到多了一個vivi目錄,即vivi源代碼的安裝目錄,后面的vivi配置及編譯都得進入vivi目錄進行。再為EduKit2410實驗系統打入vivi源代碼的補丁文件:
$> cd vivi $> patch-p1
vivi的代碼包括arch,init,lib,drivers和include等幾個目錄,共200多條文件。
Vivi主要包括下面幾個目錄:
arch:此目錄包括了所有vivi支持的目標板的子目錄,例如s3c2410目錄。drivers:其中包括了引導內核需要的設備的驅動程序(MTD和串口)。MTD目錄下分map、nand和nor三個目錄。
init:這個目錄只有main.c和version.c兩個文件。和普通的C程序一樣,vivi將從main函數開始執行。lib:一些平臺公共的接口代碼,比如time.c里的udelay()和mdelay()。include:頭文件的公共目錄,其中的s3c2410.h定義了這塊處理器的一些寄存器。Platform/smdk2410.h定義了與開發板相關的資源配置參數,我們往往只需要修改這個文件就可以配置目標板的參數,如波特率、引導參數、物理內存映射等。
3.3 Vivi編譯與下載
1)Vivi源代碼的編譯
然后執行以下命令進行編譯:
$> source /tmp/edukit-2410/set_env_linux.sh? Linux編譯環境變量設置
$> cd $WORKDIR/vivi $> make clean
圖3.1 vivi編譯
$> make menuconfig?輸入配置smdk2410-amd:Nor Flash boot
smdk2410:Nand boot
或
圖3.2 圖形界面下配置內核文件
其中,運行make menuconfig后,選擇Load an Alternate Configuration file,配置文件名稱如下:
smdk2410:編譯 vivi 在 Nand Flash(K9S5608)中運行; smdk2410-amd:編譯 vivi 在 Nor Flash(AM29LV160DB)中運行。這兩個配置文件在usrlocalsrcedukit-2410viviarchdef-configs中,須復制
到usrlocalsrcedukit-2410vivi中;或者可以在 menuconfig 中輸入全部路徑。配置好后,輸入:$> make
圖3.3 vivi映像文件生成
如果編過程中沒有出現錯誤,則編譯后的執行文件存放于 vivi 目錄下。2)下載:
在下載模式下,vivi為用戶提供一個命令行人機接口,通過人機接口可使用vivi提供的一些命令。如嵌入式系統沒有鍵盤和顯示,可以利用vivi中的串口,將其和宿主機連接起來,利用宿主機中的串口軟件(如Windows中的超級終端或Linux中的minicom)來控制。第四章 Linux內核移植與下載
4.1 Linux內核源代碼安裝
linux源代碼安裝
運行cygwin,執行以下命令完成cygwin 環境下的Linux源代碼的安裝: $> source /tmp/edukit-2410/set_env_linux.sh Linux編譯環境變量設置
$> cd $WORKDIR $> tar –xvjf /tmp/edukit-2410/linux-2.4.18-rmk7-pxa1-mz5-i2c.tar.bz2 $> ls ? kernel ? ?為$WORKDIR 目錄下其他內容
圖4.1 linux內核安裝
正確解壓后,相比之前可以看到多了一個kernel目錄,即kernel源代碼的安裝目錄,后面的Linux配置及編譯都得在kernel目錄進行。
實驗中提供的linux內核已經包含了Linux源代碼的補丁文件、I2C和網絡驅動模塊
4.2 Linux內核源代碼分析與移植
4.2.1 Linux源代碼分析
Linux內核由5個主要的子系統組成。這5個子系統分別是進程調度(SCHED)、內存管理(MM)、虛擬文件系統(Virtual File System,VFS)、網絡接口(NET)和進程間通信(IPC)。
進程調度控制著進程對CPU的訪問。當需要選擇下一個進程運行時,由調度 程序選擇最值得運行的進程。可運行進程實際是僅等待CPU資源的進程,如果某個進程在等待其它資源,則該進程是不可運行進程。Linux使用了比較簡單的基于優先級的進程調度算法選擇新的進程。
內存管理允許多個進程安全地共享主內存區域。Linux的內存管理支持虛擬內存,即在計算機中運行的程序,其代碼、數據和堆棧的總量可以超過實際內存的大小,操作系統只將當前使用的程序塊保留在內存中,其余的程序塊則保留在磁盤上。必要時,操作系統負責在磁盤和內存之間交換程序塊。內存管理從邏輯上可以分為硬件無關的部分和硬件相關的部分。硬件無關的部分提供了進程的映射和虛擬內存的對換;硬件相關的部分為內存管理硬件提供了虛擬接口。
虛擬文件系統隱藏了各種不同硬件的具體細節,為所有設備提供了統一的接口,虛擬文件系統還支持多達數十種不同的文件系統,這也是Linux較有特色的部分。虛擬文件系統可分為邏輯文件系統和設備驅動程序。邏輯文件系統指Linux所支持的文件系統,如ext2、fat等,設備驅動程序指為每一種硬件控制器所編寫的設備驅動程序模塊。
網絡接口提供了對各種網絡標準的存取和各種網絡硬件的支持。網絡接口可分為網絡協議和網絡驅動程序兩部分。網絡協議部分負責實現每一種可能的網絡傳輸協議,網絡設備驅動程序負責與硬件設備進行通信,每一種可能的硬件設備都有相應的設備驅動程序
4.2.2 Linux內核及硬件模塊驅動移植
內核和文件系統、圖形用戶系統(GUI窗口系統)可以分開,它們的開發、移植、下載甚至運行都是可以分開的。內核移植是一個比較復雜的任務,也是嵌入式系統開發中非常重要的一個過程。內核移植一般包括內核配置、內核編譯和內核下載3大步驟。
4.3 Linux內核編譯與下載
4.3.1 Linux內核源代碼安裝
運行cygwin,執行以下命令完成cygwin環境下的Linux內核源代碼的安裝: $> source /tmp/edukit-2410/set_env_linux.sh //Linux 編譯環境變量設置 $> cd $WORKDIR $> tar –xvjf /tmp/edukit-2410/linux-2.4.18-rmk7-pxa1-mz5-i2c.tar.bz2 $> ls ? kernel ? //?為$WORKDIR 目錄下其他內容
正確解壓后,可以看到多了一個kernel目錄,即kernel內核源代碼的安裝目錄,后面的Linux內核配置及編譯都得進入kernel目錄進行。實驗中提供的linux內核已經包含了Linux源代碼的補丁文件、IIC和網絡驅動模塊。4.3.2 Linux內核的編譯 $> cd kernel
圖4.2 $> make mrproper 清除所有的舊的配置和舊的編譯目標文件等 $> make xconfig 在圖形界面下對內核進行配置(配置方法之一)執行make xconfig 后,彈出如圖4.3的內核定制界面:
圖4.3 內核定制界面
選擇按鈕”Load Configuration from File”,如圖4.4輸入smdk2410:
圖4.4 內核配置文件
選擇配置sound ,設置Sound support為y:
設置BT878 audio dma為y: 設置SMDK-2410 audio support為y:
設置OSS sound modules為y:
根據提示加載配置文件后,點擊按鈕”Store Configuration to File”,如圖4.5輸入audio1:
圖4.5 存儲配置文件
保存,Save and Exit。如圖4.6
圖4.6 $> make dep //搜索Linux編譯輸出與源代碼之間的依賴關系并生成依賴文件。
圖4.7
$> make clean //清除構造內核時生成的目標文件、模塊文件和臨時文件。$> make zImage //生成壓縮的內核映像文件。
圖4.8 編譯通過后,在/usr/local/src/edukit-2410/kernel/arch/arm/boot/目錄下生成內核的壓縮映像文件為“zImage”,此文件是最后要燒寫到開發板的內核映像文件。
4.3.1 Linux內核下載
內核下載:
1)啟動超級終端(波特率為115200),連好串口線,在開機瞬間快速按空格鍵,進入vivi控制臺命令行下;打開S3C2410&NandFlash_vivi.cfg,在Flash Programmer的Progarm頁中選擇:vivi.bon&load.bin文件進行燒寫。如圖4.9
圖4.9 燒寫界面
點擊按鈕Progarm開始燒寫,直到燒寫成功;連接串口到PC機COM1,運行成功;連接串口線到 PC 機 COM1,運行光盤中提供的 Windows 超級終端 Hyper Terminal.ht;開發板重新加電,程序運行后,在超級終端上可以看到串口輸出類似以下信息:
圖4.10 超級終端界面
看到以上信息后,表示正在等待用戶從超級終端下載文件。這時,請點擊超 級終端菜單“傳送”選擇 Xmodem 方式下載 vivi.nand 文件,點擊 OK 后等待下載燒寫結束即可。
圖4.11 添加傳送文件
圖4.12 下載vivi nada 2)在vivi啟動等待中,敲入空格鍵進入vivi界面環境,并輸入以下命令: vivi> load flash kernel x <回車> ?燒寫更新內核約4分鐘即可燒寫完畢,如圖4.13
圖4.13 等待下載
3)立即選擇要發送的文件,比如zImage文件,這里Linux環境下源代碼arch/arm/boot目錄下的zImage內核映像文件已轉移到 windows某目錄下。要選擇合適的xmodem協議。以上操作完成 后,單擊“發送,幾分鐘后即可發送完畢。
圖4.14 發送zImage
圖4.15 下載成功 第五章 課程設計功能模塊程序設計與交叉編譯
5.1 課程設計模塊功能
5.1.1 三個模塊:
I2S音頻總線接口電路 ;音頻編解碼器芯片udal41; DMA控制器; 5.1.2工作過程:
麥克風輸入的模擬音頻信號在音頻編解碼器中經過A/D轉換和編碼將模擬信號轉換成數字信號,將這些數字信號先傳給I2S音頻總線接口電路中的FIFO,再由DMA控制器送入DSP中做相應的處理,這是錄音的過程;DMA控制器將DSP中存儲的信號傳送給I2S音頻總線接口電路中的FIFO,再發送給音頻編解碼芯片進行D/A轉換,通過耳機輸出模擬信號。
5.2 功能模塊驅動程序設計
5.2.1 關于驅動結構體
由于目前許多硬件廠商在出售各種產品時,一般都不帶Linux下的設備驅動程序,而且編寫驅動程序的工作量占整個系統工作量的很大的一部分,這使得Linux下設備驅動程序的開發變得越來越重要。
本課程設計不要求自己編寫驅動程序,但要求分析UDAl341TS驅動程序,以便編寫出語音采集與播放的應用測試程序,同時為以后編寫驅動程序打好基礎。嵌入式Linux系統下的IIS音頻驅動程序是在/usr/local/src/edukit-2410/drivers/sound 中,3c2410-uda1341.c 文件即是。
關于結構體:
在音頻驅動程序中有2個比較重要的結構體: typedef struct { int size;/* buffer size */ char *start;/* point to actual buffer */(內存虛擬地址起始地址)dma_addr_t dma_addr;/* physical buffer address */(內存物理地址起始地址)
struct semaphore sem;/* down before touching the buffer */ int master;/* owner for buffer allocation, contain size when true */(內存大小)
} audio_buf_t;typedef struct { audio_buf_t *buffers;/* pointer to audio buffer structures */ audio_buf_t *buf;/* current buffer used by read/write */ u_int buf_idx;/* index for the pointer above */ u_int fragsize;/* fragment i.e.buffer size */(音頻緩沖區片大小)
u_int nbfrags;/* nbr of fragments */(音頻緩沖區片數量)dmach_t dma_ch;/* DMA channel(channel2 for audio)*/ } audio_stream_t;audio_stream_t是一個管理多緩沖區的結構體,為音頻流數據組成了一個環形緩沖區。audio_buf_t管理一段內存,audio_stream_t管理N個audio_buf_t。
音頻驅動的兩個file_operations結構定義如下: static struct file_operations smdk2410_audio_fops = { llseek: smdk2410_audio_llseek, write: smdk2410_audio_write, read: smdk2410_audio_read, poll: smdk2410_audio_poll, ioctl: smdk2410_audio_ioctl, open: smdk2410_audio_open, release: smdk2410_audio_release };static struct file_operations smdk2410_mixer_fops = { ioctl: smdk2410_mixer_ioctl, open: smdk2410_mixer_open, release: smdk2410_mixer_release };這里定義了兩種類型設備的file_operations結構,前者是DSP設備,后者是混頻器設備。Linux 內核內部通過file結構識別設備,通過file_operations數據結構體提供文件系統的入口點函數,也就是訪問設備驅動程序里的函數。file_operations結構體原型是在
read()、write()、open()和ioctl()是struct file_operations結構體中的接口函數。
1)read()函數:由已打開的文件讀取數據,即播放。
(1)函數定義:ssize_t read(struct file *file, char *buffer, size_t count, loff_t * ppos);(2)函數說明:把參數file所指的文件傳送count個字節到buffer指針所指的內存中;若參數count為0,則read()不會有作用并返回0;(3)返回值:返回值為實際讀取到的字節數,如果返回0,表示已到達文件尾或是無可讀取的數據,此外文件讀寫位置會隨讀取到的字節移動。如果正確會返回實際讀到的字節數,最好能將返回值與參數count作比較,若返回的字節數比要求讀取的字節數少,則有可能讀到了文件尾、從管道(pipe)或終端機讀取,或者是read()被信號中斷了讀取動作。當有錯誤發生時則返回-1,錯誤代碼存入errno中,而文件讀寫位置則無法預期;2)write()函數:將數據寫入已打開的文件內,即錄音。
(1)函數定義:ssize_t write(struct file *file, const char *buffer, size_t count, loff_t * ppos);(2)函數說明:把參數buffer所指的內存寫入count個字節到參數file所指的文件內。當然,文件讀寫位置也會隨之移動;(3)返回值:若正確會返回實際寫入的字節數;當有錯誤發生時則返回-1,錯誤代碼存入errno中。
3)open()函數:打開音頻設備。
(1)函數定義:int(*open)(struct inode *inode, struct file *file);(2)函數說明:參數inode為設備特殊文件的incode(索引結點)結構的指針,參數file是指向這一設備的文件結構的指針。open()的主要任務是確定硬件是否處在就緒狀態,驗證次設備號的合法性,控制使用設備的進程數;
(3)返回值:如果打開文件成功,open會返回一個文件描述符,以后對文件的所有操作就可以對這個文件描述符進行操作。比如程序中open()函數的返回值賦給了應用程序中的devfd,后面則可以對其進行操作;若打開失敗返回負數。
4)ioctl()函數:用于設置編碼比特、采樣頻率和選擇聲道。(1)函數定義:int ioctl(struct inode *inode, struct file *file,unsigned int cmd, unsigned long arg);(2)函數說明:設備驅動程序中對設備的I/O通道進行管理的特殊控制函數,可以通過它向設備傳遞控制信息或從設備取得狀態信息,實現用戶程序命令和驅動命令的相互聯系;
(3)返回值:執行成功返回正數,失敗返回-1。
5)s3c2410_uda1341_init()函數:動態加載驅動模塊時的初始化函數。(1)函數定義:int __init s3c2410_uda1341_init(void);
(2)函數說明:該函數首先會初始化I/O和UDA1341 芯片,然后申請2個DMA 通道用于音頻傳輸。將輸出音頻緩沖區的DMA通道設為通道2,輸入音頻緩沖區的DMA 通道設為通道1。最后調用register_sound_dsp()和register_sound_mixer()兩個函數來分別注冊驅動設備;
(3)返回值:初始化成功,返回0;DMA 通道初始化設置失敗,返回負數。6)void __exit s3c2410_uda1341_exit()函數:動態卸載驅動模塊時調用的函數。
(1)函數定義:void __exit s3c2410_uda1341_exit(void);
(2)函數說明:注銷音頻設備,分兩次調用audio_clear_dma()函數來分 別釋放已申請的音頻輸入和音頻輸出的DMA 通道;
(3)返回值:無。
5.3 功能模塊交叉編譯
用命令Makefile來編譯:
圖5.1 編譯測試文件
將test文件拷貝到D:cygwinusrlocalsrcedukit-2410rootbin中 執行以下命令生成新的文件系統映象:
$>cd $WORKDIR/ $>$SOURCEDIR/mkcramfs root root.cramfs.new
圖5.2 生成系統映像文件
生成文件系統映象文件root.cramfs.new。第六章 根文件系統建立與文件系統下載
6.1 根文件系統分析
6.1.1 cramfs 目錄結構
一個完整的根文件系統通常包含以下幾個目錄: /bin 應用程序存放目錄。
/sbin 系統管理員服務程序,其中最重要的就是供內核初始化之后執行的/sbin/init 進程。
/lib 存放程序運行所需要的動態庫。/proc 系統狀態文件目錄。/dev 驅動程序存放目錄。
/etc 系統配置文件及用戶數據存放目錄。
/mnt 用于設備安裝的目錄,通常包含etc 子目錄和為塊設備安裝保留目錄。/usr 用于存放用戶程序和配置文件的目錄,可以根據需要進行設置。一般情況下都要把已經規劃好的目錄結構轉換成一個映象文件,即使用命令工具mkcramfs(cygwin下為mkcramfs.exe),把相應的cramfs 目錄樹壓縮為單一的映象文件。其命令格式為:
mkcramfs [-h] [-e edition] [-i file] [-n name] dirname outfile 使用mkcramfs.exe 在cygwin 下編譯生成文件系統映象文件root.cramfs,再固化到開發系統FLASH 上運行。6.1.2 構建cramfs 文件系統
按照本節實驗原理中自行構建一個cramfs 文件系統。運行cygwin,執行以下命令解壓安裝:
$> source /tmp/edukit-2410/set_env_linux.sh //Linux 編譯環境變量設置
$> cd $WORKDIR/
圖6.1 構建文件系統
$> tar-xvjf /tmp/edukit-2410/root.cramfs.tar.bz2 $> ls ? root ? root 文件夾中就是我們想要的cramfs 文件系統
6.2 文件系統映像文件生成
6.2.1 編譯一個應用測試程序test.c 按設計原理要求編寫一個應用程序test.c,存放在/home/app/audio目錄下,進入該目錄后執行以下命令編譯鏈接測試程序:
$> cd /home/app/audio $> make(也可以編寫Makefile 來編譯)
圖6.2 編譯test文件
6.2.2 拷貝測試程序到文件系統中,并編譯生成文件系統映象
把剛才編譯輸出的test文件拷貝到文件系統所在的工作目錄 root/usr/audio 目錄下,執行以下命令生成新的文件系統映象:
$> cd $WORKDIR/ $> $SOURCEDIR/mkcramfs root root.cramfs.new
圖6.3 生成映象
剛剛編譯生成的文件系統映象root.cramfs.new 中已經包含測試程序。
6.3 文件系統下載
(1)首先SW104 設為短接(從Nand Flash 啟動),確定已經成功燒寫vivi 和linux kernel,加電運行可以看到vivi 啟動信息,輸入空格進入命令狀態;
(2)雙擊運行Download.pjf 工程文件(將啟動Embest IDE 環境),點擊連接Remote connect,程序應該正在運行(此時命令按鈕STOP 為紅色);在超級終端輸入help 看看有沒有反應,如果沒反應,點擊IDE 按鈕:Reset->Start(F5);再輸入help 測試,直到有反應為止;
(3)如果超級終端可以輸出一些信息,再點擊IDE 中的Stop,配置Debug 的Download 地址為0x30000000,并點擊IDE 菜單Project 選擇Settings 項,在Download 頁下拉Category 到Download 項,在Download File 選擇root.cramfs.new 文件,路徑為d:Cygwinusrlocalsrcedukit-2410點擊確定后:
圖6.4 選擇加載的文件
首先點擊IDE 菜單DEBUG 選擇Download 下載文件系統映象 約1-2 分鐘
圖6.5 下載成功
其次下載完畢后,點擊Start(F5)然后在超級終端里輸入:load flash root j(燒寫更新文件系統)
圖6.6 燒寫
注意:只能在“vivi的燒寫”和linux內核操作完成后,才可以按以上方法正確燒寫root映象到NandFlash。重起實驗板,觀測超級終端窗口提示信息,引導整個系統啟動到linux行命令輸入狀態。在超級終端輸入一些linux命令查看執行結果是否正確。
6.4 功能模塊運行與調試
重新加電,在超級終端根據提示啟動Linux,按提示輸入cd bin、./test指令。
圖6.7 輸入指令
圖6.8 在控制臺下運行測試程序
程序執行完后。如圖6.9。
圖6.9 程序運行時超級終端的輸出
第七章 課程設計總結與體會
7.1 得出的結論
通過按上述步驟執行相關應用程序,可以實現對語音的實時采集和播放。需改進的地方:通過錄制一段語音信息,錄制完成后再播放
7.2課程設計過程中遇到的問題及解決方法
1.在給vivi打補丁時,$> patch-p1
2.在圖形界面下進行內核配置時按實驗指導書配置導致少了sound這一步導致出錯。
3.重新在圖形界面下配置后,發現無法生成壓縮映像文件。請教研究生后解決了。原來之前配置錯誤生成了boot文件夾,要把之前boot刪掉后重新編譯。4.在調試時輸入cd bin,./test指令后超級終端無反應。查找后發現,原來在根文件系統編譯時沒把生成的test文件復制到文件系統所在的工作目錄root/bin目錄下。重新編譯后把生成的test文件復制后在調試后可以進行錄放測試。
7.3 心得體會
課程設計剛開始的時候,思緒全無,我真的感到 “書到用時方恨少”,所以又重新把書和實驗指導看了幾遍,對知識系統而全面進行了梳理,對許多不理解的地方通過上網搜索翻閱圖書弄懂,終于熟練掌握了基本理論知識,而且領悟諸多平時學習沒有注意到的細節步驟,學會了如何思考的思維方式,找到了設計的靈感。
雖然每天要頂著30多度的高溫在宿舍跟實驗室之間往返,流了不少汗水,感覺確實不舒服,可最后看到自己的成果后心里很充實很高興。
在課程設計過程中遇到了這樣那樣的困難。有時候是電腦出問題了,有時候
是實驗箱出毛病,有時候是自己在操作過程中操作錯誤無法繼續,可在研究生學長和其他同學的幫忙下都一一解決。使我深深感覺到團隊力量的強大。
最后再次感謝陳老師這學期兢兢業業地給我們傳授知識,感謝三位研究生犧牲自己的時間在炎熱的夏天幫助我們解決遇到的問題!
參考文獻
[1]徐英慧,等.ARM9嵌入式系統設計——基于S3C2410與Linux[M].北京:北京航空航天大學出版社,2007.[2]于明,等.ARM9嵌入式系統設計與開發教程[M].北京:電子工業出版社,2006.[3]田澤.ARM9嵌入式開發實驗與實踐[M].北京:北京航空航天大學出版社,2006.[4]孫天澤,等.嵌入式設計及Linux驅動開發指南——基于ARM9處理器[M].2版.北京:電子工業出版社,2007.[5]周立功,等.ARM9&WinCE實驗與實踐——基于S3C2410[M].北京:北京航空航天大學出版社,2007.[6]Samsung Electronics.S3C2410A-200MHz
&
266MHz
32-Bit
RISC Microprocessor USER’S MANUAL Revision 1.0.http://www.tmdps.cn [7]魏洪興.嵌入式系統設計師教程[M].北京:清華大學出版社,2006.[8]張紀坤,等.嵌入式Linux系統開發技術詳解——基于ARM[M].北京:人民郵電出版社,2006.[9]吳明輝,等.基于ARM的嵌入式系統開發與應用[M].北京:人民郵電出版社,2004.[10]王田苗.嵌入式系統設計與實例開發[M].2版.北京:清華大學出版社,2003.[11]俞建新,等.嵌入式應用程序開發綜合實驗9例[M].北京:清華大學出版社,2004.[12]許海雁,等.嵌入式系統技術與應用[M].北京:機械工業出版社,2002.36
第二篇:嵌入式系統數字圖像采集接口電路設計經驗總結
摘要:本文介紹了兩種用于嵌入式系統的數字圖像采集接口方法,I/O接口和內存直接寫入。在對采集速度要求不高的應用中,I/O接口方法可以簡化接口電路設計,減少系統資源。對于要求實時進行圖像處理的系統,直接寫入內存法可以在不需要處理器干預的情況下,直接將圖像數據寫入系統存儲區內,實現高速圖像采集。
關鍵詞:嵌入式系統,圖像采集,電路設計
Abstract: In this paper, we present two different interfaces between digital a image sensors and a processor for embed systems, I/O mode and DMW(Direct Memory Write)mode.In I/O mode, processor can read image data through I/O port, and the interface is simple.In DMW mode, image data can be write into RAM directly while a processor is suspended.Key words: Embed System, Image Capture, Electronic Circuit
一、引言
隨著半導體技術的飛速發展,具有圖像功能的嵌入式應用愈來愈多。從數碼相機、可視電話、多功能移動電話等消費產品到門禁、數字視頻監視等工業控制及安防產品,圖像采集和處理已成為重要的組成部分之一。圖像采集需要進行同步信號的處理,比通常的A/D數據采集過程復雜,電路的設計也較為困難。傳統PC上的圖像采集卡都是在Philips、Brooktree等半導體公司提供的接口芯片基礎上,由專業公司開發生產。在嵌入式系統中不同的處理器和圖像傳感器的信號定義及接口方式不同,沒有通用的接口芯片。另外,利用系統中的現有資源設計圖像采集電路,可以減少器件數量、縮小產品體積和降低系統成本。所以,通常嵌入式系統中要求自行設計圖像采集接口電路。本文針對不同采集速度的要求,提出了兩種圖像采集接口電路的設計方法。
目前市場上主流的圖像傳感器有CCD、CMOS兩種器件,其中CMOS器件上世紀90年代產生,近年來得到了迅速發展。傳感器的輸出有模擬和數字兩種。由于CMOS器件功耗小、使用方便,具有直接數字圖像輸出功能,作者在設計時選用了CMOS數字輸出圖像傳感器件。其他方式器件的接口設計與此類似,將在討論中說明。
本文內容做如下安排:第二部分簡述圖像信號的特點;第三、四部分分別介紹I/O和內存直接寫入兩種接口設計方法;最后部分是討論。
二、圖像信號介紹
圖1給出了采樣時鐘(PCLK)和輸出數據(D)之間的時序關系。在讀取圖像數據時用PCLK鎖存輸出數據。除采樣時鐘(PCLK)和數據輸出(D)外,還有水平方向的行同步信號(HSYNC))和垂直方向的場同步信號(VSYNC)。對于隔行掃描器件,還有幀同步信號(FRAME)。如圖2,一幀包括兩場。圖2中窄的矩形條是同步脈沖,同步脈沖期間數據端口輸出的數據無效。
PLCK存在時,圖像數據端口連續不斷地輸出數據。由于行之間以及場之間輸出數據無效,在采集圖像數據必須考慮同步信號,讀取有效數據才能保證圖像的完整性。
三、I/O接口設計
對于MCU、DSP處理器,I/O是最方便的訪問方式之一。以I/O方式讀取圖像數據不僅可以簡化電路設計,而且程序也很簡單。但由于讀取每一個像素都要檢測狀態,在處理器速度低的情況下,讀取圖像慢。在處理器速度快或圖像采集速度要求不高的應用中,I/O接口方式是一個較好的選擇。
1、電路原理和結構
在圖像傳感器和處理器之間,利用兩個鎖存器分別鎖存狀態和圖像數據,處理器通過兩個I/O端口分別讀取。圖3中,在采樣時鐘的上升沿數據鎖存器保存傳感器輸出的圖像數據,當處理器通過I/O口讀取圖像時,數據鎖存器輸出數據。其它情況下,鎖存器輸出處于高阻狀態。處理器通過狀態鎖存器讀取同步信號和圖像就緒(Ready)指示信號。在數據鎖存器保存圖像數據的同時,狀態鎖存器產生Ready信號(從‘0’到‘1’)。處理器讀取圖像數據時,Ready信號自動清除(從‘1’到‘0’)。處理器讀取狀態時鎖存器驅動總線,其他情況下輸出處于高阻狀態。
2、圖像讀取流程
要保證圖像的完整性就必須從一場圖像的第一行開始讀取,對于隔行掃描輸出的圖像則必須從一幀的第一行開始讀取。讀取每行圖像數據時,則從該行的第一個像素開始。因此,在讀取圖像數據前應先判斷場和行的起始位置。圖4是通過I/O接口方式讀取圖像數據的流程。讀取每個像素數據前先查詢數據狀態,如果數據已準備好則讀取數據。
3、同步信號檢測
為了簡化電路設計,用處理器直接讀取同步信號,然后找出場和行的起始位置。
從圖2可以看出,處理器讀取同步信號時,信號可能處在同步脈沖狀態(‘1’)或正常狀態(‘0‘)。對于那些同步信號反向的器件,則分別為‘0’和‘1’。如果信號處于同步脈沖狀態,第一次檢測到的正常狀態就起始位置。如果信號處于正常狀態,則首先檢測到脈沖狀態,然后用同樣的方法確定起始位置。
通過上述方法可以檢測出場的起始位置和行起始位置。
4、用VHDL設計鎖存器
在應用中,以上兩個鎖存器的功能和其他邏輯集中在一起,用可編程邏輯器件實現。下面分別為它們的VHDL表示。
設DO(0-7)是鎖存器輸出端,DI(0-7)是鎖存器輸入端,DM(0-7)是中間狀態,Data_R是數據讀信號(低電平時有效),則數據鎖存器的VHDL描述為:
Process(reset, PCLK)--鎖存圖像數據
Begin If reset='0' then DM<=“00000000”;--清除數據
Else if PCLK'event and PCLK='1' then DM<=DI;--鎖存數據
End if;End process;Process(DM, Data_R)--讀取圖像數據
Begin If Data_R='0' then DO<=DM;--輸出圖像數據
Else DO<=“ZZZZZZZZ”--輸出高阻
End if;End process;進一步設數據有效狀態為Dstatus, 狀態讀寫信號為Status_R(低點平時有效),則狀態鎖存器的VHDL描述為:
Process(reset, PCLK,Data_R)--數據有效狀態控制
Begin If reset='0' or Data_R='0' then Dstatus<='0';--清除狀態
Else if PCLK'enent and PCLK='1' then Dstatus<='1';--設置狀態
End if;End process;Process(Dstatus, Status_R)--讀取狀態和同步信號
Begin If Status_R='0' then DO0<=Dstatus;DO1<=VSYNC;DO2<=HSYNC;DO3<=FRAME;Else DO<=“ZZZZZZZZ”;--高阻狀態
End if;End process;
四、內存直接寫入接口設計
在處理器速度較慢且圖像數據輸出的頻率不能降低的情況下,采用上述I/O接口方法不能得到完整的圖像。另外,有些應用中要求能夠實時采集圖像。為此,我們設計了高速數據圖像采集方法―內存直接寫入法。由于SRAM訪問控制簡單,電路設計方便,被大量嵌入式系統采用,本文以SRAM作為存儲器。
1、電路原理和結構
內存直接寫入方法通過設計的圖像采集控制器(以下簡稱控制器)不需處理器參與,直接將圖像數據寫入系統中的內存中,實現高速圖像采集。
圖5是接口結構圖,當需要采集圖像時,處理器向控制器發出采集請求,請求信號capture_r從高到低。控制器接到請求脈沖后,發出處理器掛起請求信號HOLD,使處理器的外總線處于高阻狀態,釋放出總線。控制器收到處理器應答HOLDA后管理總線,同時檢測圖像同步信號。當檢測到圖像開始位置時,控制器自動產生地址和讀寫控制信號將圖像數據直接寫入內存中。圖像采集完成后,控制器自動將總線控制權交還處理器,處理器繼續運行,控制器中與采集相關的狀態復位。控制器可以根據同步信號或設定的采集圖像大小確定采集是否完成。
在圖5中,控制器包括同步信號檢測、地址發生器、SRAM寫控制器、總線控制器和處理器握手電路等主要部分。同步信號檢測確定每一場(幀)和每一行的起始位置;地址發生器產生寫SRAM所需的地址;SRAM寫控制器產生寫入時序;總線控制器在采集圖像時管理總線,采集完成后自動釋放;處理器握手電路接受處理器命令、發總線管理請求和應答處理器。
2、SRAM寫控制時序
采集圖像過程中,控制器自動將數據寫入到硬件設定的內存中。寫內存時,控制器產生RAM地址(A)、片選信號(/CS)、讀信號(/RD)和寫信號(/WD),同時鎖存傳感器輸出的數據并送到數據總線(D)上。每寫入一個數據后,地址(A)自動增1。采集時/CS保持有效(‘0’)狀態而/RD處于無效狀態(‘1’)。地址A的變化必須與/WD和數據鎖存器協調好才能保證圖像數據的有效性。
圖6是控制器產生的SRAM信號時序圖。用PCLK作為地址發生器的輸入時鐘,且在其上升沿更新地址值。同樣,在PCLK的上沿鎖存數據并輸出到總線上。將PCLK反相,作為/WD信號,使得在/WD的上升沿地址和數據穩定,確保寫入數據的有效性。
3、控制器主要功能的VHDL描述 描述控制器中全部功能的VHDL代碼較長,而且有些部分是常用的(如計數器等)。圖像采集狀態產生和同步信號的檢測是其中重要的部分。下面介紹這兩部分的VHDL描述。
圖像采集狀態 capture_s: 處理器的采集請求信號capture_r使capture_s從‘0’到‘1’,場地址發生器(計數器)的溢出位vcount_o,清除capture_s。
process(capture_r, reset, vcount_o)begin if reset='0' or vcount_o='1' then capture_s<='0';--清除
else if capture_r'event and capture_r='0' then capture_s<='1';--置狀態位
end if;end process;同步信號檢測:
只有在采集狀態capture_s有效時(‘1’)才檢測場同步信號,場同步信號下降沿置場有效狀態(vsync_s),場地址發生器溢出位vcount_o清除場有效狀態。只有在vsync_s有效情況下才檢測行同步信號,行同步信號下降沿置行有效狀態(hsync_s),行計數器溢出信號hcount_o清除行狀態。只有在行狀態有效的情況下計數器才工作,且將數據寫入RAM。
Process(capture_s,reset,vcount_o, vsync)Begin If reset='0' or vcount_o='1' or capture_s='0' then Vsync_s<='0';--清除
Else if vsync'event and vsync='0' then Vsync_s<='1';--置狀態位
End if;End process;Process(vsync_s, reset, hcount_o, hsync)Begin If vsync_s='0' or reset='0' or hcount_o='1' then Hsync_s<='0';--清除
Else if hsync'event and hsync='0' then Hsync_s<='1';--置狀態位
End if;End process;
五、討論
我們在基于TI公司的TMS320C3X系列DSP開發的嵌入式指紋圖像處理模塊中分別用上述兩種方法成功實現了指紋圖像的采集。
采用I/O接口方式最關鍵的是要求處理器的頻率遠高于圖像數據輸出的頻率。例如,如果處理的指令周期為20ns,讀取每個數據需要10個指令周期,則數據的輸出頻率不能超過5MHz,它低于一般的CMOS圖像傳感器件最快的數據輸出頻率。例如國內使用較多的OV7610和OV7620,其正常輸出數據頻率為13.5MHz。在應用過程中,通常改變傳感器中寄存器的設置值,降低其數據輸出頻率。本文選用的是CMOS數字輸出圖像傳感器。對于模擬視頻信號,在設計時應加同步分離和A/D轉換電路。圖像采集的數字接口和邏輯控制與本文相同。
在我們系統中所采集的是單色圖像,如果采集彩色圖像邏輯設計是相同的所不同的只是數據寬度和后期處理方式。
具體應用中可根據需求對上述設計進行修改以滿足不同的要求。
第三篇:嵌入式遠程視頻采集系統的設計與實現(基于S3C2410)
嵌入式遠程視頻采集系統的設計與實現(基于S3C2410)
發 布 時 間 : 2008-11-19 來 源 : 中電網 作 者 : 張永強,趙永勇,李崇德 瀏 覽 :
984
多媒體通信技術的發展為信息的獲取和傳輸提供了豐富的手段,視頻采集是其中不可缺少的重要組成部分,該系統基于S3C2410的ARM9芯片和嵌入式Linux操作系統,采用USB攝像頭捕捉視頻,經MPEG-4算法壓縮編碼,系統直接與網絡相連,用戶使用標準的網絡瀏覽器和流媒體播放程序即可查看遠程視頻影像。硬件系統
系統硬件平臺選用基于ARM9架構嵌入式芯片S3C2410,穩定工作在202MHz主頻,板載64MB SDRAM 64MB FLASH,主板資源包括:主USB口、從USB口、10M/100M以太網口,觸摸屏、彩色LCD、鍵盤、8個用戶自定義LED數碼管,A/D,RTC電路,2個串口、1個JTAG通用接口,音頻模塊,支持MPEG4,MP3編解碼,3個168PIN的擴展插座,32位的數據總線,保留充分擴展空間。
其中標配模塊包括:IC卡+PS2模塊、IDE硬盤+CF卡模塊、PCMCIA+SD/MMC模塊。另外可選配模塊有:GPS模塊,GPRS模塊,FPGA模塊,CAN+AD+DA模塊、紅外模塊、藍牙模塊、攝像頭模塊。軟件系統
2.1 內核配置與USB攝像頭驅動
假定已經搭建好嵌入式Linux的開發環境,下面第一步工作就是USB攝像頭的安裝與驅動。首先檢查Linux Kernel中是否已經添加了USB模塊的支持,并且加入Video4Linux支持。
Multimedia devices→Video For Linux
Video For Linux→[*]V4L information in proc filesystem
在主菜單的USB Support下還有各種攝像頭的驅動,選中將要使用的攝像頭芯片類型。
<>USB IBM(Xirlink)C-it Camera support<*>USB OV511 Camera support<>USB Philips Cameras <>USB SE401 Camera support<>USB STV680(Pencam)Camera support<>USB 3com HomeConnect(akavicam)support 在USB攝像頭選購時,優先考慮Linux內核公開支持的攝像頭芯片,不然要額外編寫相應的USB攝像頭驅動程序,然后進行編譯、安裝。在此選用網眼公司的V3000產品,他采用了OV511的芯片。
確定USB攝像頭被正常驅動后,下一步就是使用Video4Linux提供的API函數集來編寫視頻采集程序。
2.2 基于V4L設計的視頻采集模塊
在Linux下,所有外設都被看成是一種特殊的文件,稱為設備文件。系統調用是內核和應用程序之間的接口,而設備驅動程序則是內核和外設之間的接口。他完成設備的初始化和釋放、對設備文件的各種操作和中斷處理等功能,為應用程序屏蔽了外設硬件的細節,使得應用程序可以像普通文件一樣對外設進行操作。
Linux系統中的視頻子系統Video4Linux為視頻應用程序提供了一套統一的API,視頻應用程序通過標準的系統調用即可操作各種不同的視頻捕獲設備。Video4Linux向虛擬文件系統注冊視頻設備文件,應用程序通過操作視頻設備文件實現對視頻設備的訪問。
Linux下與Video4Linux相關設備及用途如表1所示。
這里主要針對設備文件/dev/video進行視頻捕捉方面的程序設計。
Linux下視頻采集流程如圖2所示。
其中用到的主要函數有:
Camera_open():用來開啟視頻設備文件,使用前需要首先聲明一個video_device類型的設備文件。
Camera_get_capability():通過調用ioctl()函數取得設備文件的相關信息,并存放到video_capability結構里。
Camera_get_picture():通過調用ioctl()函數取得圖像的相關信息,并且存放到video_picture結構里。
Camera_close():用來關閉設備文件。Camera_grab_image():用來抓取圖像,采用mmap方式,直接將設備文件/dev/video0映射到內存,加速文件I/O操作,還可以使多個線程共享數據。
剩下的還有設備初始化、參數設備等相關函數,不再詳述。
2.3 視頻壓縮編碼模塊
獲取圖像數據后,可以直接輸出到FrameBuffer進行顯示,由于本系統要將采集到的視頻影響通過網絡傳輸出去,所以在傳輸之前要對原始的圖像數據進行壓縮編碼,在此選用MPEG-4視頻編解碼方案。和其他標準相比,MPEG-4壓縮比更高,節省存儲空間,圖像質量更好,特別適合在低帶寬條件下傳輸視頻,并能保持圖像的質量。
MPEG-4中基于對象的視頻編碼過程可以分為3步進行:
(1)從原始視頻流中分割視頻對象。
(2)對視頻對象進行編碼,對不同視頻對象的運動信息、形狀信息、紋理信息分配不同的碼字。對輸入的任意形狀的VOP序列,用基于塊的混合編碼技術編碼,處理順序是先IVOP后PVOP,BVOP。在對VOP的形狀信息編碼后,取得任意形狀VOP的采樣,每個VOP劃分為不相交的宏塊,每個宏塊含有4個8×8象素塊進行運動補償以及紋理編碼,已編碼的VOP幀保存在幀存中,在當前VOP幀和已編碼VOP幀之間的計算運動矢量;對將編碼的塊和宏塊,計算他們的運動補償預測誤差;運動補償預測后的IVOP及誤差用8×8塊DCT變換,并進行DCT系數的量化,然后是游程編碼和熵編碼。
(3)對各個視頻對象的碼流進行復合,每個視頻對象的形狀、運動紋理信息復合成VOL比特流,各視頻對象視頻流復合成統一的碼流輸出。對視頻流進行壓縮編碼以后,接下來就要實現網絡傳輸部分的功能。
2.4 JRTPLIB網絡傳輸模塊
流媒體指的是在網絡中使用流技術傳輸的連續時基媒體,RTP是目前解決流媒體實時傳輸問題的好辦法,JRTPLIB是一個面向對象的RTP庫,他完全遵循RFC1889設計,下面講述如何在Linux平臺上運用RTP協議進行實時流媒體編程。
2.4.1 初始化 在使用JRTPLIB進行實時流媒體數據傳輸之前,首先應該生成RTPSession類的一個實例來表示此次RTP會話,然后調用Create()方法來對其進行初始化操作。RTPSession類的Create()方法只有一個參數,用來指明此次RTP會話所采用的端口號。
2.4.2 數據發送
當RTP會話成功建立起來之后,接下來就可以開始進行流媒體數據的實時傳輸了。首先需要設置好數據發送的目標地址,RTP協議允許同一會話存在多個目標地址,這可以通過調用RTPSession類的AddDestination()、DeleteDestination()和ClearDestinations()方法來完成。目標地址全部指定之后,接著就可以調用RTPSession類的SendPacket()方法,向所有的目標地址發送流媒體數據。
2.4.3 數據接收
對于流媒體數據的接收端,首先需要調用PollData()方法來接收發送過來的RTP或者RTCP數據報。由于同一個RTP會話中允許有多個參與者(源),因此既可以通過調用GotoFirstSource()和GotoNextSource()方法來遍歷所有的源,也可以通過調用GotoFisstSourceWithDat()和GotoNextSourceWithData()方法來遍歷那些攜帶有數據的源。在從RTP會話中檢測出有效的數據源之后,接下去就可以調用RTPSession類的GetNextPacket()方法從中抽取RTP數據報,當接收到的RTP數據報處理完之后,要及時釋放。
JRTPLIB為RTP數據報定義了3種接收模塊,通過調用RTPSession類的SetReceiveMode()方法可以設置下列這些接收模式:
RECEIVEMODE_ALL:缺省的接收模式,所有到達的RTP數據報都將被接受;RECEIVEMODE_IGNORESOME:除了某些特定的發送者之外,所有到達的RTP數據報都將被接受,而被拒絕的發送者列表可以通過調用AddToIgnoreList(),DeleteFromIgnoreList()和ClearIgnoreList()方法來進行設置;RECEIVEMODE_ACCEPTSOME:除了某些特定的發送者之外,所有到達的RTP數據報都將被拒絕,而被接受的發送者列表可以通過調用AddToAcceptList(),DeleteFromAcceptList和ClearAcceptList()方法來進行設置。
2.4.4 控制信息 JRTPLIB是一個高度封裝后的RTP庫,只要PollData()或者SendPacket()方法被成功調用,JRTPLIB就能夠自動對達到的RTCP數據報進行處理,并且還會需在要的時候發送RTCP數據報,從而能夠確保整個RTP會話過程的正確性。
在本系統中,使用RTPSession JRTPLIB類庫提供的方法來實現底層的RTP/RTCP操作,并且把他封裝在CrtpTransmitter類中,該類從Media Sink類繼承而來,接收到相應的媒體幀數據,使用RTPSession類庫的操作把數據發送到網絡上。結語
本系統基于S3C2410平臺和Linux操作系統,利用Video4Linux設計采集程序,使用MPEG-4壓縮編碼算法,通過實時流媒體傳輸技術實現了網絡傳輸,整個系統具有穩定可靠、安裝簡便、成本低廉等特點,可擴展應用在工業控制、視頻會議系統、可視電話、遠程監控系統等諸多領域。
第四篇:嵌入式程序設計課程設計
課程設計
課 程 名嵌入式軟件開發技術
題 目 基于嵌入式Linux的溫度監測系統的
設計與實現
專 業 計算機科學與技術(嵌入式系統方向)班 級 13計算機嵌入式系統班 學 號 學生姓名
2016年6月
摘要
溫度是個很普遍而又非常重要的參數,在日常生活、工農業生產以及科研領域都有著廣泛的應用。因此,研制能夠準確地測量和記錄這個參數值的系統具有十分重要的意義。
基于ARM的嵌入式溫度監測系統是采用嵌入式Linux作為操作系統,針對以S5PV210為處理器的開發板設計的一個嵌入式溫度監測系統。論文在分析了Linux設備驅動程序的基本工作原理基礎上,討論了開發中經常會碰到的中斷處理、擁塞處理、I/O端口,并在此基礎上實現了基于S5PV210嵌入式處理器的開、讀、寫、關外部RAM的字符設備驅動和網絡驅動。結合高精度溫度傳感器DS18B20,實現溫度的正確采集,并通過以太網絡將數據上傳給上位機客戶端。
論文首先介紹了通信網絡中各種設備特性、總線結構及傳輸技術,然后根據單片機與PC機之間的串行通信原理,用ubantu完成溫度監測系統的軟件設計與實現,為用戶提供一個友好的人機界面,對監測系統進行控制并顯示采集后的數據。本系統還通過多線程實現了多個客戶端與服務器的通信。
關鍵詞:S5PV210;嵌入式Linux操作系統;DS18B20;網絡編程
I
Abstract
Temperature is a very common and very important parameter, in daily life, industrial and agricultural production and scientific research fields have a wide range of applications.Therefore, it is very important to develop a system that can accurately measure and record the value of this parameter.The temperature monitoring system of base on the ARM is use of embedded Linux as the operating system for the processor to S5PV210 development board designed for an embedded temperature monitoring system.Based on the analysis of the basic working principle based on the Linux device drivers discussed development often encounter interrupt handling, congestion handling, I / O ports, and on this basis to achieve the embedded processor based on open S5PV210 reading, writing, characters off the external RAM device driver and network drives.Combined with precision temperature sensor DS18B20, to achieve the correct temperature acquisition, and upload the data via Ethernet to a PC client.At first,the paper introduces the characteristics of various devices in a communication network, the bus structure and transmission technology, and according to the principle of serial communication between SCM and PC, with ubantu complete temperature monitoring system software design and implementation, to provide users with a friendly man-machine interface, the monitoring system to control and display the data after collection.The system also enables communication via a plurality of multi-threaded client and the server.Key words:S5PV210;embedded Linux operating system;DS18B20;Network programming
II
1.引言.......................................................................................................................................1 1.1 設計背景及意義...............................................................................................................1 1.2 設計的主要內容................................................................................................................2 2.相關技術...............................................................................................................................2 2.1 嵌入式Linux......................................................................................................................2 2.2 S5PV210.............................................................................................................................3 2.3 socket網絡編程..............................................................................................................3 3.具體實現功能.......................................................................................................................4 3.1總體框架圖........................................................................................................................4 3.2客戶端功能........................................................................................................................5 3.3 服務器功能........................................................................................................................5 3.4 實驗板輸出信息...............................................................................................................5 4.具體實現過程.......................................................................................................................6 4.1 交叉編譯工具的安裝.......................................................................................................6 4.2 客戶端模塊的設計...........................................................................................................7 4.3 服務器模塊.......................................................................................................................8 4.4 LED點亮模塊..................................................................................................................10 4.5 溫度感應模塊.................................................................................................................11 5.測試結果分析.....................................................................................................................13 5.1 各模塊運行的效果.........................................................................................................13 5.2 可擴展功能......................................................................................................................15 6.總結與展望.......................................................................................................................15
第一章 引言
1.1 設計背景及意義
溫度作為工業、農業、國防和科研等部門最普遍的測量項目。它在工農業生產、現代科學研究以及高新技術開發過程中也是一個極其普遍而又非
常重要的參數。因此,在這些領域中,對于這個參數的測量與控制就顯得尤為重要,特別是在紡織工業、冶金、化工、食品、溫室種植,汽車制造以及氣象預報和科研實驗室等許多地方,都具有舉足輕重的作用。
以往這些工作大多是由人工完成,不但工作量大,記錄的數據少,對溫度的調節缺乏實時性,而且電路復雜,標定和校準也比較麻煩,難以滿足現代溫度測量的要求[1]。自從傳感器技術、微控制器技術和計算機技術日漸成熟之后,現代的溫度測量與控制系統克服了以往系統中存在的一些問題,比如對環境溫度的控制與調節以及數據的記錄都由微控制器或計算機自動完成,人們的工作量大大地降低,而且測得的數據也更加的精確,對環境溫度的調節更具有實時性[2]。
1.2 設計的主要內容
此次主要采用嵌入式Linux作為操作系統,針對以S5PV210為處理器的開發板設計的一個嵌入式溫度監測系統。在Linux設備驅動程序的基本工作原理基礎上,討論了開發中經常會碰到的中斷處理、擁塞處理、I/O端口,并在此基礎上實現了基于S5PV210嵌入式處理器的開、讀、寫、關外部RAM的字符設備驅動和網絡驅動。結合高精度溫度傳感器DS18B20,實現溫度的正確采集,并通過以太網絡將數據上傳給上位機客戶端。
溫度監測系統根據Linux中的網絡通信技術和串口通信技術來傳輸數據。用ubantu完成溫度監測系統的軟件設計與實現,為用戶提供一個友好的人機界面,對監測系統進行控制并顯示采集后的數據。本系統還通過多線程實現了多個客戶端與服務器的通信。
第二章 相關技術
2.1 嵌入式Linux Linux是UNIX系統的一套免費使用和自由傳播的類Unix操作系統,是一個基于POSIX和UNIX的多用戶、多任務、支持多線程和多CPU的操作系統。它能運行主要的UNIX工具軟件、應用程序和網絡協議。支持32位和64位硬件。Linux繼承了Unix以網絡為核心的設計思想,是一個性能穩定的多用戶網絡操作系統。它誕生與1991年的10月5日。以后借助與Internet
網,并進過全世界各地計算機愛好者的共同努力下,現已成為世界上使用最多的一種UNIX類操作系統,并且使用人數還在迅猛增漲。
本次設計采用Linux作為嵌入式操作系統的原因有以下幾點:[3] 1)低成本開發系統: 2)可應用于多種硬件平臺 3)可定制的內核 4)性能優異 5)良好的網絡支持
2.2 S5PV210
S5PV210又名“蜂鳥”(Hummingbird),是三星推出的一款適用于智能手機和平板電腦等多媒體設備的應用處理器。
S5PV210采用了ARM CortexTM-A8內核,ARM V7指令集,主頻可達1GHZ,64/32位內部總線結構,32/32KB的數據/指令一級緩存,512KB的二級緩存,可以實現2000DMIPS(每秒運算20億條指令集)的高性能運算能力。
包含很多強大的硬件編解碼功能,內建MFC(Multi Format Codec),支持MPEG-1/2/4,H.263,H.264等格式視頻的編解碼,支持模擬/數字TV輸出。JPEG硬件編解碼,最大支持8000x8000分辨率
內建高性能PowerVR SGX540 3D圖形引擎和2D圖形引擎,支持2D/3D圖形加速,是第五代PowerVR產品,其多邊形生成率為2800萬多邊形/秒,像素填充率可達2.5億/秒,在3D和多媒體方面比以往大幅提升,能夠支持DX9,SM3.0,OpenGL2.0等PC級別顯示技術。
具備IVA3硬件加速器,具備出色的圖形解碼性能,可以支持全高清、多標準的視頻編碼,流暢播放和錄制30幀/秒的1920×1080像素(1080p)的視頻文件,可以更快解碼更高質量的圖像和視頻,同時,內建的HDMIv1.3,可以將高清視頻輸出到外部顯示器上。
2.3 socket網絡編程
Socket是進程通訊的一種方式,即調用這個網絡庫的一些API函數實現分布在不同主機的相關進程之間的數據交換。[4] 幾個定義:
(1)IP地址:即依照TCP/IP協議分配給本地主機的網絡地址,兩個進程要通訊,任一進程首先要知道通訊對方的位置,即對方的IP。
(2)端口號:用來辨別本地通訊進程,一個本地的進程在通訊時均會占用一個端口號,不同的進程端口號不同,因此在通訊前必須要分配一個沒有被訪問的端口號。
(3)連接:指兩個進程間的通訊鏈路。
(4)半相關:網絡中用一個三元組可以在全局唯一標志一個進程:(協議,本地地址,本地端口號)
這樣一個三元組,叫做一個半相關,它指定連接的每半部分。(4)全相關:一個完整的網間進程通信需要由兩個進程組成,并且只能使用同一種高層協議。也就是說,不可能通信的一端用TCP協議,而另一端用UDP協議。因此一個完整的網間通信需要一個五元組來標識:(協議,本地地址,本地端口號,遠地地址,遠地端口號)
這樣一個五元組,叫做一個相關(association),即兩個協議相同的半相關才能組合成一個合適的相關,或完全指定組成一連接。
第三章 具體實現功能
3.1總體框架圖
圖1 項目總體框架圖
3.2客戶端功能
1)顯示簡單的用戶界面 2)發送命令給服務器 3)接收服務器傳輸的數據 4)顯示溫度數據
3.3 服務器功能
1)接收客戶端發送的命令 2)處理命令
3)把命令轉發給硬件 4)獲取硬件處理所得的數據 5)把該數據傳給客戶端
3.4 實驗板輸出信息
1)LED燈按照客戶端的指令亮滅 2)蜂鳴器唱歌
3)核心板控制輸出溫度傳感器的數據到服務器
第四章 具體實現過程
個應用系統要完成各項功能,首先必須有較完善的硬件作保證。同時還必須得到相應設計合理的軟件的支持,尤其是微機應用高速發展的今天,許多由硬件完成的工作,都可通過軟件編程而代替。甚至有些必須采用很復雜的硬件電路才能完成的工作,用軟件編和有時會變得很簡單。因此充分利用其內部豐富的硬件資源和軟件資源。
程序設計語言有三種:機器語言、匯編語言、高級語言。本系統運用的是高級語言所編寫,也就是C語言。所用到的開發平臺為ubuntu系統。
4.1 交叉編譯工具的安裝
(1)考慮到現今Linux平臺發展,交叉編譯平臺編統一為arm-linux-gcc-4.4.3(2)在windows系統下,建立一個共享目錄,如:e:/linux_file(3)將光盤目錄linux中的arm-linux-gcc-4.4.3.tar.gz 復制到e:/linux_file(4)注意在進行虛擬機設置時使共享目錄的有效,并添加共享目錄e:/linux_file(5)進入linux操作系統,root目錄下建立一個Armcode的子目錄,將共享目錄下的文件arm-linux-gcc-4.4.3.tar.gz復制到該目錄(6)然后進入到該目錄,執行解壓命令:#cd /root/Armcode;#tar xvzf arm-linux-gcc-4.4.3.tgz –C /;注意:C 后面有個空格,并且C 是大寫的,它是英文單詞“Change”的第一個字母,在此是改變目錄的意思。(7)執行
該
命
令,將
把
arm-linux-gcc
安
裝
到/opt/FriendlyARM/toolschain /4.4.3/bin 目錄。
(8)把編譯器路徑加入系統環境變量,運行命令:#gedit /root/.bashrc 編輯/root/.bashrc 文件,在最后一行添加:export PATH=$PATH: /opt/FriendlyARM/toolschain/4.4.3/bin(9)重新登錄系統(不必重啟機器,開始->logout 即可),使以上設置生效,在命令行輸入:arm-linux-gcc –v,會出現如下信息,這說明交叉編譯環境已經成功安裝。
4.2 客戶端模塊的設計
用戶界面的顯示:
void interface_print(char *temp){ system(“clear”);printf(“e[31m*******************2016梧*********************e[0mn”);printf(“e[31m*
*e[0mn”);printf(“e[31m*e[0m e[32m點亮LED1: on1
on2e[0me[31m
*e[0mn”);printf(“e[31m*e[0m e[33m關閉LED1: off1
off2e[0me[31m
*e[0mn”);printf(“e[31m*e[0m e[34m開蜂鳴器: onb
songe[0me[31m
*e[0mn”);printf(“e[31m*e[0m e[35m獲取溫度: get
e[31m *e[0mn”,temp);printf(“e[31m*e[0m e[36m退
出: e[0me[31m
*e[0mn”);printf(“e[31m*
*e[0mn”);printf(“e[31m******************未
來**********************e[0mn”);}
發送命令給服務器:
/*5.調用I/O函數(read/write)與客戶端通訊。*/ int i = 5;int pos;while(1){
ret = poll(pfd,2,-1);
if(ret > 0){
if(pfd[0].revents == POLLIN){
interface_print(temp);
/*從終端讀取數據*/
memset(buf,0,sizeof(buf));
ret = read(pfd[0].fd,buf,sizeof(buf)-1);7
州學院
|
點亮LED2:
|
關閉LED2:
|
播放音樂:
|
溫度:[%s]e[0m quit
|
的大
神
們
} if(ret > 0){
}
/*發送數據給服務器*/ write(sockfd,buf,ret);
接受服務器傳輸的數據:
if(pfd[1].revents == POLLIN){
if(!strncmp(buf,“get”,3)){
/*接收服務器發送的信息*/
memset(temp,0,sizeof(temp));
ret = read(pfd[1].fd,temp,sizeof(temp)-1);
if(ret > 0){
temp[ret-1] = ' 主站蜘蛛池模板: 亚洲老熟女av一区二区在线播放| 熟女熟妇伦av网站| 久久久久久久曰本精品免费看| 青青草国产免费国产是公开| 日韩吃奶摸下aa片免费观看| 色综合色综合久久综合频道88| 在线 欧美 中文 亚洲 精品| 亚洲乳大丰满中文字幕| 久久无码人妻一区二区三区午夜| 亚洲伊人色欲综合网无码中文| 日产电影一区二区三区| 强辱丰满人妻hd中文字幕| 推油少妇久久99久久99久久| 免费无码又爽又刺激高潮的动漫| 欧美怡春院一区二区三区| 精品一区二区无码av| 少妇人妻精品一区二区三区| 欧美日韩国产精品自在自线| 中日韩精品视频在线观看| 99无码精品二区在线视频| 强行糟蹋人妻hd中文字| 国产精品久久自在自线| 亚洲成熟丰满熟妇高潮xxxxx| 精品9e精品视频在线观看| 成人小说亚洲一区二区三区| 国产无遮挡18禁无码网站| 国产片精品av在线观看夜色| 国产精品高潮呻吟av久久黄| 青青青青国产免费线在线观看| 韩日午夜在线资源一区二区| 亚洲天天做日日做天天欢毛片| 777米奇色狠狠888俺也去乱| 国内老熟妇对白hdxxxx| 色综合视频一区中文字幕| 久久在线视频免费观看| 国产精品一区二区久久乐下载| 夜爽8888视频在线观看| 欧美牲交a欧美牲交aⅴ免费下载| 最新2020无码中文字幕在线视频| 国产精品情侣呻吟对白视频| 少妇高潮灌满白浆毛片免费看|