第一篇:嵌入式遠(yuǎn)程視頻采集系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)(基于S3C2410)
嵌入式遠(yuǎn)程視頻采集系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)(基于S3C2410)
發(fā) 布 時 間 : 2008-11-19 來 源 : 中電網(wǎng) 作 者 : 張永強(qiáng),趙永勇,李崇德 瀏 覽 :
984
多媒體通信技術(shù)的發(fā)展為信息的獲取和傳輸提供了豐富的手段,視頻采集是其中不可缺少的重要組成部分,該系統(tǒng)基于S3C2410的ARM9芯片和嵌入式Linux操作系統(tǒng),采用USB攝像頭捕捉視頻,經(jīng)MPEG-4算法壓縮編碼,系統(tǒng)直接與網(wǎng)絡(luò)相連,用戶使用標(biāo)準(zhǔn)的網(wǎng)絡(luò)瀏覽器和流媒體播放程序即可查看遠(yuǎn)程視頻影像。硬件系統(tǒng)
系統(tǒng)硬件平臺選用基于ARM9架構(gòu)嵌入式芯片S3C2410,穩(wěn)定工作在202MHz主頻,板載64MB SDRAM 64MB FLASH,主板資源包括:主USB口、從USB口、10M/100M以太網(wǎng)口,觸摸屏、彩色LCD、鍵盤、8個用戶自定義LED數(shù)碼管,A/D,RTC電路,2個串口、1個JTAG通用接口,音頻模塊,支持MPEG4,MP3編解碼,3個168PIN的擴(kuò)展插座,32位的數(shù)據(jù)總線,保留充分?jǐn)U展空間。
其中標(biāo)配模塊包括:IC卡+PS2模塊、IDE硬盤+CF卡模塊、PCMCIA+SD/MMC模塊。另外可選配模塊有:GPS模塊,GPRS模塊,F(xiàn)PGA模塊,CAN+AD+DA模塊、紅外模塊、藍(lán)牙模塊、攝像頭模塊。軟件系統(tǒng)
2.1 內(nèi)核配置與USB攝像頭驅(qū)動
假定已經(jīng)搭建好嵌入式Linux的開發(fā)環(huán)境,下面第一步工作就是USB攝像頭的安裝與驅(qū)動。首先檢查Linux Kernel中是否已經(jīng)添加了USB模塊的支持,并且加入Video4Linux支持。
Multimedia devices→Video For Linux
Video For Linux→[*]V4L information in proc filesystem
在主菜單的USB Support下還有各種攝像頭的驅(qū)動,選中將要使用的攝像頭芯片類型。
<>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攝像頭選購時,優(yōu)先考慮Linux內(nèi)核公開支持的攝像頭芯片,不然要額外編寫相應(yīng)的USB攝像頭驅(qū)動程序,然后進(jìn)行編譯、安裝。在此選用網(wǎng)眼公司的V3000產(chǎn)品,他采用了OV511的芯片。
確定USB攝像頭被正常驅(qū)動后,下一步就是使用Video4Linux提供的API函數(shù)集來編寫視頻采集程序。
2.2 基于V4L設(shè)計(jì)的視頻采集模塊
在Linux下,所有外設(shè)都被看成是一種特殊的文件,稱為設(shè)備文件。系統(tǒng)調(diào)用是內(nèi)核和應(yīng)用程序之間的接口,而設(shè)備驅(qū)動程序則是內(nèi)核和外設(shè)之間的接口。他完成設(shè)備的初始化和釋放、對設(shè)備文件的各種操作和中斷處理等功能,為應(yīng)用程序屏蔽了外設(shè)硬件的細(xì)節(jié),使得應(yīng)用程序可以像普通文件一樣對外設(shè)進(jìn)行操作。
Linux系統(tǒng)中的視頻子系統(tǒng)Video4Linux為視頻應(yīng)用程序提供了一套統(tǒng)一的API,視頻應(yīng)用程序通過標(biāo)準(zhǔn)的系統(tǒng)調(diào)用即可操作各種不同的視頻捕獲設(shè)備。Video4Linux向虛擬文件系統(tǒng)注冊視頻設(shè)備文件,應(yīng)用程序通過操作視頻設(shè)備文件實(shí)現(xiàn)對視頻設(shè)備的訪問。
Linux下與Video4Linux相關(guān)設(shè)備及用途如表1所示。
這里主要針對設(shè)備文件/dev/video進(jìn)行視頻捕捉方面的程序設(shè)計(jì)。
Linux下視頻采集流程如圖2所示。
其中用到的主要函數(shù)有:
Camera_open():用來開啟視頻設(shè)備文件,使用前需要首先聲明一個video_device類型的設(shè)備文件。
Camera_get_capability():通過調(diào)用ioctl()函數(shù)取得設(shè)備文件的相關(guān)信息,并存放到video_capability結(jié)構(gòu)里。
Camera_get_picture():通過調(diào)用ioctl()函數(shù)取得圖像的相關(guān)信息,并且存放到video_picture結(jié)構(gòu)里。
Camera_close():用來關(guān)閉設(shè)備文件。Camera_grab_image():用來抓取圖像,采用mmap方式,直接將設(shè)備文件/dev/video0映射到內(nèi)存,加速文件I/O操作,還可以使多個線程共享數(shù)據(jù)。
剩下的還有設(shè)備初始化、參數(shù)設(shè)備等相關(guān)函數(shù),不再詳述。
2.3 視頻壓縮編碼模塊
獲取圖像數(shù)據(jù)后,可以直接輸出到FrameBuffer進(jìn)行顯示,由于本系統(tǒng)要將采集到的視頻影響通過網(wǎng)絡(luò)傳輸出去,所以在傳輸之前要對原始的圖像數(shù)據(jù)進(jìn)行壓縮編碼,在此選用MPEG-4視頻編解碼方案。和其他標(biāo)準(zhǔn)相比,MPEG-4壓縮比更高,節(jié)省存儲空間,圖像質(zhì)量更好,特別適合在低帶寬條件下傳輸視頻,并能保持圖像的質(zhì)量。
MPEG-4中基于對象的視頻編碼過程可以分為3步進(jìn)行:
(1)從原始視頻流中分割視頻對象。
(2)對視頻對象進(jìn)行編碼,對不同視頻對象的運(yùn)動信息、形狀信息、紋理信息分配不同的碼字。對輸入的任意形狀的VOP序列,用基于塊的混合編碼技術(shù)編碼,處理順序是先IVOP后PVOP,BVOP。在對VOP的形狀信息編碼后,取得任意形狀VOP的采樣,每個VOP劃分為不相交的宏塊,每個宏塊含有4個8×8象素塊進(jìn)行運(yùn)動補(bǔ)償以及紋理編碼,已編碼的VOP幀保存在幀存中,在當(dāng)前VOP幀和已編碼VOP幀之間的計(jì)算運(yùn)動矢量;對將編碼的塊和宏塊,計(jì)算他們的運(yùn)動補(bǔ)償預(yù)測誤差;運(yùn)動補(bǔ)償預(yù)測后的IVOP及誤差用8×8塊DCT變換,并進(jìn)行DCT系數(shù)的量化,然后是游程編碼和熵編碼。
(3)對各個視頻對象的碼流進(jìn)行復(fù)合,每個視頻對象的形狀、運(yùn)動紋理信息復(fù)合成VOL比特流,各視頻對象視頻流復(fù)合成統(tǒng)一的碼流輸出。對視頻流進(jìn)行壓縮編碼以后,接下來就要實(shí)現(xiàn)網(wǎng)絡(luò)傳輸部分的功能。
2.4 JRTPLIB網(wǎng)絡(luò)傳輸模塊
流媒體指的是在網(wǎng)絡(luò)中使用流技術(shù)傳輸?shù)倪B續(xù)時基媒體,RTP是目前解決流媒體實(shí)時傳輸問題的好辦法,JRTPLIB是一個面向?qū)ο蟮腞TP庫,他完全遵循RFC1889設(shè)計(jì),下面講述如何在Linux平臺上運(yùn)用RTP協(xié)議進(jìn)行實(shí)時流媒體編程。
2.4.1 初始化 在使用JRTPLIB進(jìn)行實(shí)時流媒體數(shù)據(jù)傳輸之前,首先應(yīng)該生成RTPSession類的一個實(shí)例來表示此次RTP會話,然后調(diào)用Create()方法來對其進(jìn)行初始化操作。RTPSession類的Create()方法只有一個參數(shù),用來指明此次RTP會話所采用的端口號。
2.4.2 數(shù)據(jù)發(fā)送
當(dāng)RTP會話成功建立起來之后,接下來就可以開始進(jìn)行流媒體數(shù)據(jù)的實(shí)時傳輸了。首先需要設(shè)置好數(shù)據(jù)發(fā)送的目標(biāo)地址,RTP協(xié)議允許同一會話存在多個目標(biāo)地址,這可以通過調(diào)用RTPSession類的AddDestination()、DeleteDestination()和ClearDestinations()方法來完成。目標(biāo)地址全部指定之后,接著就可以調(diào)用RTPSession類的SendPacket()方法,向所有的目標(biāo)地址發(fā)送流媒體數(shù)據(jù)。
2.4.3 數(shù)據(jù)接收
對于流媒體數(shù)據(jù)的接收端,首先需要調(diào)用PollData()方法來接收發(fā)送過來的RTP或者RTCP數(shù)據(jù)報(bào)。由于同一個RTP會話中允許有多個參與者(源),因此既可以通過調(diào)用GotoFirstSource()和GotoNextSource()方法來遍歷所有的源,也可以通過調(diào)用GotoFisstSourceWithDat()和GotoNextSourceWithData()方法來遍歷那些攜帶有數(shù)據(jù)的源。在從RTP會話中檢測出有效的數(shù)據(jù)源之后,接下去就可以調(diào)用RTPSession類的GetNextPacket()方法從中抽取RTP數(shù)據(jù)報(bào),當(dāng)接收到的RTP數(shù)據(jù)報(bào)處理完之后,要及時釋放。
JRTPLIB為RTP數(shù)據(jù)報(bào)定義了3種接收模塊,通過調(diào)用RTPSession類的SetReceiveMode()方法可以設(shè)置下列這些接收模式:
RECEIVEMODE_ALL:缺省的接收模式,所有到達(dá)的RTP數(shù)據(jù)報(bào)都將被接受;RECEIVEMODE_IGNORESOME:除了某些特定的發(fā)送者之外,所有到達(dá)的RTP數(shù)據(jù)報(bào)都將被接受,而被拒絕的發(fā)送者列表可以通過調(diào)用AddToIgnoreList(),DeleteFromIgnoreList()和ClearIgnoreList()方法來進(jìn)行設(shè)置;RECEIVEMODE_ACCEPTSOME:除了某些特定的發(fā)送者之外,所有到達(dá)的RTP數(shù)據(jù)報(bào)都將被拒絕,而被接受的發(fā)送者列表可以通過調(diào)用AddToAcceptList(),DeleteFromAcceptList和ClearAcceptList()方法來進(jìn)行設(shè)置。
2.4.4 控制信息 JRTPLIB是一個高度封裝后的RTP庫,只要PollData()或者SendPacket()方法被成功調(diào)用,JRTPLIB就能夠自動對達(dá)到的RTCP數(shù)據(jù)報(bào)進(jìn)行處理,并且還會需在要的時候發(fā)送RTCP數(shù)據(jù)報(bào),從而能夠確保整個RTP會話過程的正確性。
在本系統(tǒng)中,使用RTPSession JRTPLIB類庫提供的方法來實(shí)現(xiàn)底層的RTP/RTCP操作,并且把他封裝在CrtpTransmitter類中,該類從Media Sink類繼承而來,接收到相應(yīng)的媒體幀數(shù)據(jù),使用RTPSession類庫的操作把數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)上。結(jié)語
本系統(tǒng)基于S3C2410平臺和Linux操作系統(tǒng),利用Video4Linux設(shè)計(jì)采集程序,使用MPEG-4壓縮編碼算法,通過實(shí)時流媒體傳輸技術(shù)實(shí)現(xiàn)了網(wǎng)絡(luò)傳輸,整個系統(tǒng)具有穩(wěn)定可靠、安裝簡便、成本低廉等特點(diǎn),可擴(kuò)展應(yīng)用在工業(yè)控制、視頻會議系統(tǒng)、可視電話、遠(yuǎn)程監(jiān)控系統(tǒng)等諸多領(lǐng)域。
第二篇:嵌入式視頻采集系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)_韓相軍
嵌入式視頻采集系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
首都師范大學(xué)% 韓相軍關(guān)永王萬森王雪立
Han,Xiangjun Guan,Yong Wang,Wansen Wang,Xueli 摘要!較為理想的嵌入式視頻采集系統(tǒng)是基于!“# 的視頻采集系統(tǒng) & 本文重點(diǎn)闡述了嵌入式視頻采集系統(tǒng)的硬 ’
軟件設(shè)計(jì)
環(huán)節(jié)以及開發(fā)中的一些關(guān)鍵技術(shù)問題(首先以
$%”&’()%*+’
構(gòu)建視頻采集的硬件系統(tǒng) & 詳細(xì)介紹了 $,#-.-(’“//0.’.以
及所設(shè)計(jì)的視頻采集系統(tǒng)原理 & 該系統(tǒng)在 12’3&((控制下能實(shí)時將視頻像進(jìn)行采集 ’
編碼和傳輸)最后提出嵌入式系統(tǒng)的開
發(fā)流程并分析嵌入式系統(tǒng)開發(fā)中的一些問題 * 關(guān)鍵詞!視頻采集)嵌入式系統(tǒng))”#$%&’(#)*& 中圖分類號 +“,%-./* 文獻(xiàn)標(biāo)識碼!0 01234563!45678 69:65565;<56= 27>?@A6 3B3?69 <3 ?C6;<56= 27>?@A6 3B3?69 :7365 =D!”EF ?C6 >7>6A
+.’’FG’HI’J&’’)K’.G&G’’&)G’% 引言
視頻采集系統(tǒng)是數(shù)字圖像獲取的最基本手段 & 是
進(jìn)行數(shù)字圖像處理 + 多媒體和網(wǎng)絡(luò)傳輸?shù)那疤?& 它可
為各種圖像處理算法提供待處理的原始數(shù)字圖像和 算法驗(yàn)證平臺 & 隨著人們對視頻圖像需求的激增和各 種圖像和視頻新的壓縮標(biāo)準(zhǔn)相繼提出 & 如
QP’*&’QP
’*+’REST’’REST+ 和
UEST’(((等 & 對高性能視頻
采集系統(tǒng)的研究將成為一個熱點(diǎn) * 按系統(tǒng)的處理器不 同嵌入式視頻采集系統(tǒng)大致可分為三類 VW.X 基于專用
視頻圖像芯片的視頻采集系統(tǒng))W’X 基于 EY 的視頻采 集系統(tǒng))W&X 基于)”E 的視頻采集系統(tǒng) * 基于專用視頻圖像芯片的視頻采集系統(tǒng)其核心 處理單元為專用圖像芯片 & 該圖像芯片決定系統(tǒng)的功 能 & 其應(yīng)用主要針對某一類產(chǎn)品 $ 如數(shù)碼攝像機(jī) %& 所
以具有一定的局限性 * 而基于 EY 機(jī)的視頻采集系統(tǒng)
最為普遍的就是基于視頻采集卡獲取數(shù)字化視頻信 息 & 通過運(yùn)行相應(yīng)的 EY 程序?qū)崿F(xiàn)視頻的采集 ’ 顯示與 存儲 & 但是目前基于 EY 的算法程序通常處理時間較 長 & 很難實(shí)現(xiàn)實(shí)時的圖像處理應(yīng)用 * 相比基于專用視頻圖像芯片和基于 EY 的視頻采 集系統(tǒng)而言 & 嵌入式視頻采集系統(tǒng)可完成視頻的實(shí)時 采集 ’
傳輸以及各種視頻壓縮算法和圖像處理算法的 實(shí)現(xiàn) & 根據(jù)不同的應(yīng)用 & 可以編制不同的圖像處理程 序 & 所以具有更大的靈活性 & 并且設(shè)計(jì)與實(shí)現(xiàn)簡單 & 硬
件設(shè)計(jì)一般采用基于)“E 的視頻采集系統(tǒng) F 即 ,YY)Z 視頻信號處理芯片 ZYE[)]E^/SE_)Z)”E-的模式 實(shí)現(xiàn) * 其中 & 視頻信號處理芯片進(jìn)行信號的 /)轉(zhuǎn)換 & YE_)或 SE_)或 ]E^/ 用于視頻采樣控制 &)“E 對采
集的數(shù)據(jù)進(jìn)行處理 * 嵌入式視頻圖像采集系統(tǒng)主要包 括硬件設(shè)計(jì) ’
軟件設(shè)計(jì)和操作系統(tǒng) & 個部分 *.嵌
入式視頻采集系統(tǒng)的硬件設(shè)計(jì).P.視頻采集系統(tǒng)的基本構(gòu)成 基于)”E 的視頻采集系統(tǒng)要求對視頻信號具備 采集 ’
實(shí)時顯示 & 對圖像的處理和分析功能 * 因此 & 一
個視頻采集系統(tǒng)通??捎扇缦挛宀糠謽?gòu)成 V 視頻圖像 的采集 ’
視頻圖像的顯示輸出 ’
各種同步邏輯控制 ’ 視
頻圖像的分析和處理 ’
視頻數(shù)據(jù)的存儲 * 因此 & 對于視
頻采集系統(tǒng)的基本構(gòu)成可用圖.所示框圖描述 * 圖.視頻采集系統(tǒng)的基本框圖
韓相軍 # 碩士研究生
北京市自然科學(xué)基金資助項(xiàng)目 $*’)&’’-%)北京市教委
科技發(fā)展計(jì)劃面上項(xiàng)目 $7E&’’).’’&F’.%%)北京市高 等學(xué)校 &’’H
教育教學(xué)改革立項(xiàng)項(xiàng)目 $&’’H’IH% 嵌入式系統(tǒng)應(yīng)用 中文核心期刊!微計(jì)算機(jī)信息 “(嵌入式與 SOC)2006 年第 22 卷第 1-2 期 360元 / 年郵局訂閱號 # 82-946??!”# 格式輸出 $ 數(shù)據(jù)輸出格式是通過 $%& 總線編程來 選擇的 $’()*+,-的內(nèi)部寄存器初始化也通過 $.& 串
行接口來完成 % 對于不同的輸入制式 & 不同的采集要
求和不同的處理要求 $ 其幀緩存要求是不相同的 $ 如 對于)/012 制
$’314 5’67-+ 視頻輸入 $ 采樣后按 89.9.格式輸出 $ 一幀數(shù)據(jù)為
:.-!*:7!.“-6;<=>?@A$ 若
緩存三幀圖像 $ 則需要 <=>?@A 空間的采集幀緩存 $ 若 按 89+9+ 格式輸出 $ 則只需.=>?@A 的幀緩存 % 系統(tǒng)可選 擇
;=!<.1>B@ 的 C24/= 在系統(tǒng)中即作為采集幀緩存 和處理后的數(shù)據(jù)幀緩存 $ 也可作下載程序的存儲器使 用 % 系統(tǒng)提供串行接口 $ 可與外部設(shè)備進(jìn)行通信和傳 輸圖像數(shù)據(jù) % 其中
DBEBFG DH.I<--J)K/ 實(shí)現(xiàn)以下四 點(diǎn)功能 # L+M 完成系統(tǒng)中視頻采集和輸出部分的同步信號 和消隱信號的控制 $ 其中主要包括 ’(),+,-和
C//:+%+ 的行同步信號 & 場同步信號 & 消隱信號 ’ L%N 將部分邏輯單元設(shè)計(jì)為 J$JO 作數(shù)據(jù)緩存 $ 完 成外接 J$JO 的同步讀寫控制 $ 承擔(dān) ’#),+,-與 2C)的數(shù)據(jù)傳送工作 ’ P ’=C<.-2=78.與計(jì) 算機(jī)的數(shù)據(jù)通信工作以及從計(jì)算機(jī)加載各種圖像處 理算法 ’ L8N 對 ’#)*+*-輸出的數(shù)字圖像進(jìn)行預(yù)處理 $ 其中 主要包括圖像數(shù)據(jù)的色度空間轉(zhuǎn)換如!3# 到 4K5 的 轉(zhuǎn)換 $ 數(shù)據(jù)格式轉(zhuǎn)換如將 89.9.轉(zhuǎn)換為 89.9-’ L*N 作數(shù)據(jù)總線接口 $ 實(shí)現(xiàn)數(shù)據(jù)的驅(qū)動傳輸?shù)裙δ?% ’=C<.-2=78.在系統(tǒng)中是各類算法實(shí)現(xiàn)的核心 器件 $ 根據(jù)不同的應(yīng)用場合 $ 可以編制不同的算法處 理程序 $ 使得該系統(tǒng)具有了很強(qiáng)的靈活性與通用性 % 值得強(qiáng)調(diào)的一點(diǎn)是為了便于操作系統(tǒng)中的其它外設(shè) $ 在該系統(tǒng)中 $’=C<.-2=78.的外部存儲器接口控制 寄存器必須配置為優(yōu)先使用外部存儲器模式 %!嵌 入式視頻圖像采集系統(tǒng)的軟件 設(shè)計(jì) 一個完整的嵌入式系統(tǒng)由圖 < 所示的 8 部分來 組成 % 圖 < 嵌入式系統(tǒng)組成 圖 < 中的底層是硬件系統(tǒng) $ 核心是嵌入式處理器(嵌入芯片)$ 通常這樣構(gòu)成的系統(tǒng)又被稱為是 CO& LC?I@AQ RF &SBTN 系統(tǒng) % 在硬件系統(tǒng)的上面是 5C)L 板級 支持包 N$ 包括各種必要的對底層硬件系統(tǒng)的屏蔽 $ 引 導(dǎo)上層操作系統(tǒng)在硬件系統(tǒng)上的正確運(yùn)行 % 操作系統(tǒng) 正確運(yùn)行之后還需要開發(fā)各種設(shè)備驅(qū)動程序 $ 目的是 給用戶的應(yīng)用程序開發(fā)提供對底層設(shè)備的屏蔽 $ 提供 一個統(tǒng)一的用戶開發(fā)接口 L/)$N% 5C)是指系統(tǒng)內(nèi)核在特定的硬件系統(tǒng)上面運(yùn)行所 需要的初始化代碼和各種設(shè)備驅(qū)動程序 % 它主要包 括 # 系統(tǒng)初始化 $ 初始化 &)3 寄存器和測試 &)3 的型 號版本等 $ 它和 5RR@ERUVAW 中的初始化部分共同完成 所有的系統(tǒng)準(zhǔn)備工作 $ 使得系統(tǒng)處于預(yù)期的穩(wěn)定工作 狀態(tài) ’ 內(nèi)存管理 $ 在沒有 ==”L 內(nèi)存管理單元 N 的系統(tǒng) 里面主要是數(shù)據(jù) HUHSA 和程序 HUHSA 的管理 $ 在具有 ==“ 單元的系統(tǒng)中還要包括 ==” 的各種表的管理 $ 它主要用來實(shí)現(xiàn)內(nèi)存的映射 ’ 中斷控制器管理 $ 對于 一個 4’OC 來說 $ 中斷是不可缺少的部分 % 嵌入式操作系統(tǒng)相關(guān)技術(shù)已經(jīng)成熟 $ 由于 0BFXG 具有源碼開放 & 開發(fā)工具豐富 & 技術(shù)支持廣泛等特點(diǎn) $ 視頻圖像采集系統(tǒng)選用嵌入式 0BFXG 操作系統(tǒng) LYQ# >AVVAV 0BFXG OTAWU@BRF C?I@AQN% 0BFXG 中的中斷管理 包括中斷號的申請和釋放 & 中斷屏蔽和中斷服務(wù) & 中 斷向量分配等 $ 時鐘和設(shè)備驅(qū)動程序 % 驅(qū)動程序是利用操作系統(tǒng)提供的接口 $ 完成對底 層硬件的操作 % 驅(qū)動程序的開發(fā) $ 是在操作系統(tǒng)提供 的接口基礎(chǔ)上編寫對底層硬件的操作和控制程序 $ 然 后加入到操作系統(tǒng)的內(nèi)核 % 用戶對某一個設(shè)備的訪 問 $ 首先是將用戶的各種操作傳遞給操作系統(tǒng) $ 然后 由操作系統(tǒng)調(diào)用設(shè)備的驅(qū)動程序 $ 完成對硬件的各種 數(shù)據(jù)傳輸 $ 所以驅(qū)動程序必須要告訴操作系統(tǒng)該硬件 的各種操作程序的入口地址 % 特別對于 0BFXG 下的驅(qū) 動程序開發(fā) $ 經(jīng)過調(diào)試通過的驅(qū)動程序可以編譯為一 個模塊動態(tài)地裝載入操作系統(tǒng)內(nèi)核或者從操作系統(tǒng) 內(nèi)核中刪除 Z 因此驅(qū)動程序在 0BFXG 中是可以作為內(nèi) 核的一部分來編寫 % 對于用戶程序開發(fā) $ 與通用)& 上面開發(fā)應(yīng)用程 序類似 % 但是在嵌入式應(yīng)用中 $ 應(yīng)用程序一般是作為 文件系統(tǒng)的一部分加入到操作系統(tǒng)的內(nèi)核 $ 然后重新 編譯內(nèi)核 $ 最后生成一個可以執(zhí)行的二進(jìn)制壓縮映像 文件加載到系統(tǒng)的存儲空間 % 加載的加入了用戶應(yīng)用 程序的操作系統(tǒng)一般還必須固化 $ 燒到系統(tǒng)的 JEUIS 中 % 在系統(tǒng)運(yùn)行時 $ 根據(jù)操作系統(tǒng)的 $*$’ 函數(shù)轉(zhuǎn)到用 戶程序執(zhí)行 % “結(jié) 論 基于 2C)的視頻采集系統(tǒng) $ 由于可以靈活的修改 其圖像處理算法 $ 它的應(yīng)用主要面向用戶的特定需求 和對實(shí)時性有較高要求的場合 % 隨著技術(shù)的 L 見 +8;頁 N BSP 嵌入式系統(tǒng)應(yīng)用!現(xiàn)場總線技術(shù)應(yīng)用 200 例.;”!“# 基于 $%& 的視頻采集系統(tǒng) 圖 # 給出了基于 ’(%)#*$(+,# 與 ’-&.!./ 構(gòu) 成的視頻采集系統(tǒng) ”’(%)#/$(+,# 可以直接和視頻 編解碼器接口 “ 該系統(tǒng)可同時完成四路視頻圖像的實(shí) 時采集 # 傳輸以及各種視頻壓縮算法和圖像處理算法 的實(shí)現(xiàn) ” 根據(jù)不同的應(yīng)用 “ 可以編制不同的圖像處理 程序 $ ’(%)#/$(+,# 有自己的圖像處理庫函數(shù) ” 可以 實(shí)現(xiàn)各類圖像處理算法 $ 因此 “ 該系統(tǒng)具有更大的靈 活性與通用性 $ 圖 # 基于 ’-&.!./ 與 $%& 的視頻采集系統(tǒng)!”#“!’(%)#/$(+,# 簡介 ’(%)#/$(+,# 是 ’0 推出的一款面向數(shù)字多媒體 應(yīng)用的 $%&” 它在 ’0 的 1+,2 $%& 內(nèi)核基礎(chǔ)上進(jìn)一步 集成了完備的視頻 3 音頻輸入 3 輸出接口 % 以太網(wǎng)接口 # &104++ 總線等片上外設(shè) “ 不僅能使用戶很方便地對音 頻 5 視頻等各種復(fù)雜的運(yùn)算進(jìn)行高速處理 ” 還能為方 便 # 無縫地接口視頻 3 音頻編解碼器件和以太網(wǎng) 3&10 總 線等數(shù)據(jù)傳輸接口 & 因此 “ 它非常適用于-60&% 數(shù)字視 頻服務(wù)器 % 多通道數(shù)字視頻錄像機(jī) 7$-89% 多通道數(shù)字 視頻監(jiān)控等應(yīng)用 & $(+,# 的程序 3 數(shù)據(jù)空間以字節(jié)為單位進(jìn)行統(tǒng)一 編址 ” 整個尋址空間為 ,:8& 其片上存儲器 % 片上外 設(shè) % 及外部存儲器接口 7;(0<9 均映射到此 ,:8 的空間 中 & $(+,# 通過外部存貯器接口 7;(0<9 訪問片外存儲 器 7<=>?@%%$AB(%CBA’%B’B9“ 如圖 # 所示 ”$(+,# 共有三個視頻口 “ 分別為-&/%-&!和 -&-&/ 與-&!則與 (D8%&%(DB%& 復(fù)用引腳的 ” 其功能選擇由 $(+,# 上的外設(shè)配置寄存器 7&;A1<:9 進(jìn)行配置的 & $(+,# 支持多種外部接口!&10 接口 %E&0 接口和以太 網(wǎng)(B1 接口 “ 這些接口信號復(fù)用相同的引腳 ” 它們的 功能選擇和配置是在上電復(fù)位時通過檢測 $(+,# 上 的特殊引腳 7&10F;G%(B1F;G%E$.%&10F;;B09 的狀 態(tài)來實(shí)現(xiàn)的 &!H#“# 視頻 B3$ 采樣電路!’-&.!./ 在圖 # 系統(tǒng)中 ”’-&.!./ 是由 ’0 公司推出的一款 高性能視頻解碼器 “ 可將 G’%1%&BI 視頻信號轉(zhuǎn)換成 數(shù)字色差信號 7JC-,K#K#9” 支持兩個復(fù)合視頻或一個 % 端子輸入 & 輸出格式為 0’C 4A 8’L+.+“ 并支持 (>DM6NO?O6P ’(復(fù)制保護(hù)以及高級的-80 功能 & 不僅如 此 ”’-&.!./ 還具備了封裝小 7)# 腳的 ’Q<&9% 功耗小 的特點(diǎn) 7R!./ST9& 因此 “ 它非常適用于便攜 % 批量大 % 高質(zhì)量和高性能的視頻產(chǎn)品 & ’-&.!./ 可接受 # 路復(fù) 合視頻信號 71-8%9 輸入和!路超級視頻信號 7%U-OVW6 即 %XYWMU-OVW6”J319 輸入 & 該芯片包含一個擴(kuò)展端口 ’ZU 端口(用于數(shù)字視頻 ’ 雙向半雙工(“ 它可直接連接 倒(&;: 或視頻電話進(jìn)行編解碼 $ ’-&.!./ 的圖像端 口 ’0U 端口(支持 [ 位或!+ 位的輸出數(shù)據(jù)并帶輔助參 考數(shù)據(jù)可直接與-:B 控制器接口 $ ’-&.!./ 提供 0 # 1 總線接口 ” 其最高傳輸速率為 ,//]O^?_?“ 通過它可以 完成芯片的初始化以及設(shè)置修改等操作 $ ’-&.!./ 作 為 0 # 1 總線的從設(shè)備 ” 最多可配置為 # 個不同的從設(shè) 備地址 “ 一條 0 # 1 總線只能同時訪問 # 個 ’-&.!./ 配 置口 ” 所以 $(+,# 可以連接 , 個 ’-&.!./“ 進(jìn)行 , 路 視頻輸入 $!H#H)視頻 $_B 電路!%BB‘!#!圖 # 系統(tǒng)中視頻 $_B 由視頻編碼器 %BB‘!#!完 成 $ %BB‘!#!支持 &BI 與 G’%1 格式的視頻編碼 ” 其 輸入支持 8’H+.+ 格式的數(shù)字視頻 $ %BB‘!#!有!路 復(fù)合視頻 71-8%9 輸出和!路超級視頻 7%U-OVW6“J_19 輸 出 ” 其系統(tǒng)像素時鐘頻率為!)H.(Ea“ 它可以直接接收(&;: 解碼數(shù)據(jù)和采用 ,K#K# 格式每行 ‘#/ 有效像素 的 110A 兼容 JC-數(shù)據(jù) ” 其內(nèi)部包含同步 _ 時鐘產(chǎn)生 器和數(shù)模轉(zhuǎn)換器兩部分電路 $ %BB‘!#! 同樣需要通過 0 # 1 總線進(jìn)行初始化和設(shè)置修改等操作 $ 從圖 # 中可看出 “-&/ 既要做視頻輸入口 ” 也要支 持視頻輸出口 “ 即-&/ 可以工作在 1>Y^XMW 與 $O?Y=>b 兩種作模式 $ 但這兩種工作模式不能同時使用作模式 不能同時使用 $ 當(dāng)-&/ 作為 [U 位的 8’H+.+ 視頻采集 口時 ” 僅需視頻數(shù)據(jù)流串行時鐘和采集使能控制信 號 “ 串行數(shù)據(jù)流串行時鐘由 ’-&.!./ 的 %1Ic” 采集使 能控制信號則由 ’-&.!./ 的 0G’A;Q_:&1I_-8Ic 引 腳配置為通用輸出引腳來控制 “ 此時 %BB‘!#!E 不起 作用 $ 當(dāng)-&/ 作為 [U 位的 8’H+.+ 顯示口時 ”%BB‘!#!需要 E%JG17 行同步信號 9%-%JG17 場同步信號 9%II1 7#‘(Ea 的行鎖存號 9 控制 $!H#H, 系統(tǒng)原理 圖 # 系統(tǒng)其主要功能是完成視頻圖像的采集 % 處 理 % 存儲和傳輸 $ 系統(tǒng)的視頻輸入可以是 G’%1%&BI 和 %;1B(制式的任何一種 “ 或者采用 % 端子輸入 $ ’-&.!./ 完成視頻信號的 B_$ 轉(zhuǎn)換 ” 為后續(xù)處理提供 數(shù)字視頻數(shù)據(jù) “ 同時它還分離出行 % 場同步信號并輸 出系統(tǒng)時鐘供視頻 $_B 芯片和 <0 EMAC/MDIO TVP5150 EMIF64 HPI16/HPI32 TMS320DM642 (600MHz 4800MIPS) EDMA 64 Channels L1P Cache 16KB L1D Cache 16KB L2 Cache 256KB Parallel executive Units 32 bit Timers 66MHZ PCI32 20/10b VP0 20/10b VP1 20/10b VP2A TVP5150 TVP5150 TVP5150 20/10b VP2B Xilinx XC2S300 FPGA SAA7121 嵌入式系統(tǒng)應(yīng)用)變頻器與軟啟動器應(yīng)用 200 例 * #‘中文核心期刊!微計(jì)算機(jī)信息 ”(嵌入式與 SOC)2006 年第 22 卷第 1-2 期 360元 / 年郵局訂閱號 # 82-946!!模糊量 $ 可歸納一系列控制規(guī)則 $ 例如規(guī)則!“ #$ %&!’(!)* +,-.&/!’ +!0* 1234 5!’ 6!7 %!8)909%%9:* : 為規(guī)則數(shù) $+!)&+;0&% 及 6!為語言變量 $ 則由第;條規(guī)則構(gòu)成的模糊關(guān)系為 # 6!* >.+!0 > 6!* 而對于一定 &? 和 &/?$ 相應(yīng)的輸出為 # 5!8@&?>.+!= >6!*A > @&/?>.+!B > 6!*A 則 #585!.!8)$0$%$:* 圖 C 模糊控制框圖 根據(jù)控制經(jīng)驗(yàn) $ 將其中將語言變量分成七級 # 正 大.D6*$ 正中.DE*$ 正小.DFG$ 零.H*$ 負(fù)小.,F*$ 負(fù)中.,E*$ 負(fù)大.,6*’ 在實(shí)際控制中 $ 由于被控對象只能接受一個 確定的控制信號 $ 而模糊推理是一個模糊集合 $ 因此 $ 必須建立精確量和模糊量之間的轉(zhuǎn)換關(guān)系 9 即從輸出 的模糊集合中 $ 判決出一個精確量(在此采用固定量 化因子 & 比例因子及隸屬度最大原則 $ 進(jìn)行離散推理 $ 求出各相應(yīng)的控制表 $ 并將數(shù)據(jù)存入-FD 內(nèi)存 $ 以便 在線使用 $ 實(shí)施實(shí)時控制(圖 I 1J 中斷采樣子程序 軟件采用定時器 1J 中斷方式 9 中斷服務(wù)子程序如 圖 I 所示(系統(tǒng)每隔一個時間段進(jìn)行一次中斷 9 啟動!K ” 轉(zhuǎn)換 9 同時完成數(shù)據(jù)采集 & 數(shù)字 #$“ 控制 & 控制量輸 出 & 溫度顯示及數(shù)據(jù)保存等功能(定時器 1)中斷 $ 為-FD 處理器和計(jì)算機(jī)通訊 $ 發(fā)送數(shù)據(jù) $ 便于計(jì)算機(jī)繪制 溫度跟蹤曲線 $ 鍵盤中斷 $ 完成鍵盤掃描和獲取鍵值(此外 9 為了減小系統(tǒng)在平衡位置的振蕩 9 在軟件上采取 了數(shù)據(jù)濾波 & 設(shè)定死區(qū)等措施(!結(jié) 語 基于-FD0LJM 模糊 N 數(shù)字 D;O 差熱天平采用計(jì)算 機(jī)控制技術(shù) $ 能夠?qū)崿F(xiàn)溫度發(fā)控制 $ 并在液晶屏和計(jì) 算機(jī)上實(shí)時顯示溫度及溫度跟蹤曲線(實(shí)驗(yàn)中對控制 算法進(jìn)行多次實(shí)驗(yàn)和調(diào)整 9 取得了很好的控制效果 $ 達(dá) 到了預(yù)期的設(shè)計(jì)目的(參考文獻(xiàn) @)A 安穎 9 劉麗娜 P 基于-FD 的高速信號采集與處理系統(tǒng)的設(shè)計(jì))Q*% 微計(jì) 算機(jī)信息 $0JJC9)RCMNCS @0A 孫增圻 $ 等 P 智能控制理論與技術(shù) @EAP 北京 # 清華大學(xué)出版社 $)SSMP @TA 于海生 $ 等 P 微型計(jì)算機(jī)控制技術(shù) @EAP 北京 # 清華大學(xué)出版社 $)SSSP @LA 張念淮 $ 等 P 5F6 總線接口開發(fā)指南 @EAP 北京 # 國防工業(yè)出版社 $0JJ)作者簡介 # 李智強(qiáng) $ 男 $)SMI&$ 河南工業(yè)大學(xué)電氣工程 學(xué)院 $ 碩士(籍貫 # 山東 + 郭廣靈 $ 女 $)SM)&$ 河南工業(yè) 大學(xué)電氣工程學(xué)院 $ 高級實(shí)驗(yàn)師(,!”###$ 河南鄭州河南工業(yè)大學(xué)電氣工程學(xué)院韓相軍 關(guān)永王萬森王雪立 %<166’7’ 12 F(21-G)/+1(H(7+(’’-+(78 <)I+/)6 J1-!G)6 *(+,’-.+/08K’+L+(78D###E$= &)(8M+)(7L;(@;)(8 N1(7 O)(78O)(.’(O)(78M;’6+ U 投稿日期 R0JJCPIP)IG U 修稿日期 R0JJCPIP0VG e α dt d ec E EC e c α U u D/A y D/A u α T0 A/D ADC FIFO 《 #’(技術(shù)應(yīng)用)** 例》 DSP 開發(fā)與應(yīng)用)LV 基于ARM的視頻采集系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn) 摘要 本文根據(jù)家庭視頻采集系統(tǒng)的要求,提出一種基于ARM的網(wǎng)絡(luò)視頻采集方案。方案要求視頻的實(shí)時傳輸、實(shí)時監(jiān)控。本系統(tǒng)以Intel Xscale 芯片和嵌入式Linux系統(tǒng)為平臺,在平臺中搭建網(wǎng)絡(luò)視頻服務(wù)器,并以它為中介,負(fù)責(zé)將USB攝像頭采集到得視頻數(shù)據(jù)傳輸?shù)骄W(wǎng)絡(luò)服務(wù)器中,最后發(fā)送到申請監(jiān)控的遠(yuǎn)程PC機(jī)中,遠(yuǎn)程PC只需在網(wǎng)頁中便能實(shí)時的看到監(jiān)控端的視頻圖像。 論文首先闡述了嵌入式網(wǎng)絡(luò)視頻采集技術(shù)的發(fā)展、現(xiàn)狀和前景,然后介紹了嵌入式硬件系統(tǒng)結(jié)構(gòu)和嵌入式Linux操作系統(tǒng)的特點(diǎn),闡述了嵌入式硬件整體結(jié)構(gòu),使大家大體的完整的對系統(tǒng)硬件有詳細(xì)的了解,實(shí)際記錄了嵌入式操作系統(tǒng)內(nèi)核的編譯和移植,介紹了Bootloader的基本原理和啟動過程,實(shí)現(xiàn)了視頻采集程序的編譯和移植,研究了嵌入式一般驅(qū)動程序的使用。隨后,本文詳細(xì)描述了視頻采集程序的整體結(jié)構(gòu)框圖和具體功能代碼塊、網(wǎng)絡(luò)通信編程技術(shù)、圖像編解碼、嵌入式視頻服。 關(guān)鍵詞:ARM;嵌入式;Linux;視頻采集 I 目錄 摘 要.............................................................................................................................I 第1章 引言.................................................................................................................1 1.1 課題的背景和來源..........................................................................................1 1.2本文的內(nèi)容及主要工作..................................................................................1 第2章 嵌入式ARM系統(tǒng)硬件結(jié)構(gòu)簡介..................................................................3 2.1 視頻監(jiān)控系統(tǒng)結(jié)構(gòu)簡介..................................................................................3 2.2 ARM處理器簡介.............................................................................................3 2.3 XSCALE體系結(jié)構(gòu)............................................................................................4 2.4 主要硬件電路說明..........................................................................................7 第3章 嵌入式ARM系統(tǒng)軟件結(jié)構(gòu)..........................................................................9 3.1 LINUX操作系統(tǒng)簡介.......................................................................................9 3.2 交叉編譯環(huán)境的建立....................................................................................10 3.3 嵌入式LINUX操作系統(tǒng)移植........................................................................11 3.3.1 BootLorder移植...................................................................................11 3.3.2 Linux 內(nèi)核移植...................................................................................12 3.3.3 嵌入式文件系統(tǒng).................................................................................13 3.4 LINUX下的程序調(diào)試.....................................................................................14 第4章 USB設(shè)備驅(qū)動程序設(shè)計(jì)...............................................................................15 4.1 設(shè)備驅(qū)動程序簡介........................................................................................15 4.2 LINUX下驅(qū)動程序的實(shí)現(xiàn).............................................................................18 4.3 USB攝像頭驅(qū)動程序設(shè)計(jì)............................................................................20 第5章 視頻采集功能的設(shè)計(jì)...................................................................................23 5.1 基于V4L的編程...........................................................................................24 5.1.1 攝像頭相關(guān)數(shù)據(jù)結(jié)構(gòu).........................................................................24 5.1.2 攝像頭基本功能實(shí)現(xiàn).........................................................................25 5.1.3 視頻數(shù)據(jù)采集.....................................................................................29 5.2 圖像編解碼....................................................................................................32 5.2.1 編解碼介紹.........................................................................................32 5.2.2 系統(tǒng)壓縮技術(shù).....................................................................................33 第1章引言 1.1課題的背景和來源 二十一世紀(jì)的網(wǎng)絡(luò)化、數(shù)字化讓人們的生活每天都發(fā)生著翻天覆地的變化,獲取信息的方便和快捷可以使人們在信息化的今天領(lǐng)先一步創(chuàng)造出巨大的利益,而獲取信息的重要途徑就是眼睛。據(jù)統(tǒng)計(jì),人類采集信息的80%來自視覺。圖像和視頻是對客觀事物生動、形象的描述,是一種最直觀的表現(xiàn)方式。而視頻監(jiān)控技術(shù)因?yàn)樗奖憧旖?、生動形象、信息豐富等特點(diǎn)日益受到人們的青睞,并在各行各業(yè)得到廣泛的應(yīng)用。與此同時,現(xiàn)代網(wǎng)絡(luò)和數(shù)字技術(shù)的快速發(fā)展也為視頻監(jiān)控技術(shù)的發(fā)展奠定了堅(jiān)實(shí)的基礎(chǔ)。 二十一世紀(jì),嵌入式技術(shù)、多媒體處理技術(shù)進(jìn)一步發(fā)展,為視頻監(jiān)控系統(tǒng)的發(fā)展提供了新的出路——嵌入式視頻監(jiān)控系統(tǒng)。嵌入式系統(tǒng)是以應(yīng)用為中心,軟硬件可以剪裁,具有高穩(wěn)定、低成本、功耗低、速度快、實(shí)時好的專用計(jì)算機(jī)系統(tǒng),它由嵌入式微處理器,配以周邊硬件設(shè)備,接口電路組成。嵌入式系統(tǒng)內(nèi)部使用嵌入式操作系統(tǒng),安裝專用的功能軟件。嵌入式技術(shù)把硬件和軟件集于一體,獨(dú)立工作。嵌入式視頻監(jiān)控系統(tǒng)比其他視頻采集系統(tǒng)在布局區(qū)域范圍上要廣泛;由于使用IP技術(shù),嵌入式視頻監(jiān)控技術(shù)比其他視頻采集系統(tǒng)更具緊密的結(jié)合度,能夠充分利用現(xiàn)代網(wǎng)絡(luò)技術(shù)的成果,并能構(gòu)成復(fù)雜的視頻監(jiān)控網(wǎng)絡(luò);性能上,嵌入式視頻采集系統(tǒng)繼承了嵌入式技術(shù)的優(yōu)點(diǎn),非常適合自動化的環(huán)境。 因此,嵌入式視頻采集技術(shù)正在我國快速的發(fā)展,積極的研究會加強(qiáng)我們在這方面技術(shù)的學(xué)習(xí),也會為視頻監(jiān)控技術(shù)的發(fā)展貢獻(xiàn)力量。 1.2本文的內(nèi)容及主要工作 根據(jù)畢業(yè)設(shè)計(jì)的初衷,我們需要設(shè)計(jì)基于ARM的網(wǎng)絡(luò)視頻采集系統(tǒng)。在監(jiān)控系統(tǒng)中,視頻采集、傳輸、播放的功能不是由專門視頻處理芯片完成,而是由軟件實(shí)現(xiàn)。 論文首先介紹了嵌入式ARM系統(tǒng)的硬件結(jié)構(gòu)和軟件結(jié)構(gòu),方便大家熟悉ARM和Linux系統(tǒng),包括嵌入式設(shè)備的硬件結(jié)構(gòu),邏輯框圖和Linux的基本操作、安裝方法;第二,研究了嵌入式的一些驅(qū)動程序,主要是攝像頭驅(qū)動程序 V4L,系統(tǒng)中選用的攝像頭芯片——中星微301;第三,研究了視頻監(jiān)控的具體流程和實(shí)現(xiàn)方式,讓大家在總體上對整個系統(tǒng)有一個大概的認(rèn)知。 本次設(shè)計(jì)的目的只有一個,就是實(shí)現(xiàn)視頻的實(shí)時監(jiān)控。圍繞它,不管是硬件結(jié)構(gòu)還是軟件流程,都需要學(xué)習(xí)和研究,不斷調(diào)試,決不放棄。 總之,論文的內(nèi)容都是圍繞如何建立一個視頻采集系統(tǒng)。無論是從哪個方面,我們都是為這個目標(biāo)而努力。2 第2章嵌入式ARM系統(tǒng)硬件結(jié)構(gòu)簡介 2.1視頻監(jiān)控系統(tǒng)結(jié)構(gòu)簡介 網(wǎng)絡(luò)視頻監(jiān)控系統(tǒng)是基于嵌入式技術(shù)設(shè)計(jì)的。嵌入式并沒有統(tǒng)一的定義,但目前有一個廣泛而又被認(rèn)可的規(guī)范:將軟件產(chǎn)品固化到硬件平臺上,完成應(yīng)有的功能既是嵌入式。 基于嵌入式ARM技術(shù)的視頻監(jiān)控系統(tǒng)服務(wù)器端采用攝像頭不斷的采集圖像,壓縮成視頻流,然后通過網(wǎng)絡(luò)發(fā)送到申請監(jiān)控的客戶端。監(jiān)控系統(tǒng)的使用者可以在遠(yuǎn)程實(shí)現(xiàn)網(wǎng)頁上的實(shí)時監(jiān)控和一些簡單的功能操作。系統(tǒng)整體結(jié)構(gòu)如圖2.1所示[1]。 LCDJTAG攝像頭ZC301CPU單元Intel Xscale以太網(wǎng)控制器遠(yuǎn)程PC客戶端SDRAMFLASH 圖2.1 系統(tǒng)整體結(jié)構(gòu)圖 該系統(tǒng)中CPU采用基于ARM的PXA270微處理器,通過在其上運(yùn)行Linux操作系統(tǒng),執(zhí)行Boa視頻服務(wù)器,接受并處理來自攝像頭的圖像信號,通過以太網(wǎng)控制器發(fā)送至遠(yuǎn)端,實(shí)現(xiàn)視頻數(shù)據(jù)的遠(yuǎn)程傳輸和接受,達(dá)到視頻監(jiān)控的目的[2]。 2.2ARM處理器簡介 ARM,既是一個公司的名字,也是對一類微處理器的通稱。ARM嵌入式微處理器是全球領(lǐng)先的16/32位RISK處理器芯片知識產(chǎn)權(quán)設(shè)計(jì)供應(yīng)商ARM(AdvancedRISKMachines)公司的產(chǎn)品。ARM公司本身不直接從事芯片生產(chǎn),而是依靠轉(zhuǎn)讓設(shè)計(jì)許可,由合作公司生產(chǎn)各具特色的芯片。 ARM處理器以其完整的體系結(jié)構(gòu),極小的體積、極低的功耗、極低的成本、極高的性能,及時根據(jù)嵌入對象的不同進(jìn)行功能上的擴(kuò)展的優(yōu)勢,在眾多種類的嵌入式微處理器中脫穎而出。基于ARM技術(shù)的微處理器應(yīng)用占據(jù)了32位RISC微處理器75%以上的市場份額,ARM技術(shù)正在逐步滲入到我們生活的各個方面。 采用RISC架構(gòu)的ARM微處理器一般具有如下特點(diǎn): (1)采用固定長度的指令格式,指令規(guī)整、簡單、基本尋址方式有2~3種;(2)使用單周期指令,便于流水線操作執(zhí)行; (3)大量使用寄存器,數(shù)據(jù)處理指令只對寄存器進(jìn)行操作,以提高指令的執(zhí)行效率; (4)所有的指令都可根據(jù)前面的執(zhí)行結(jié)果決定是否被執(zhí)行,從而提高指令的執(zhí)行效率; (5)可用加載/存儲指令批量傳輸數(shù)據(jù),以提高數(shù)據(jù)的傳輸效率;(6)可在一條數(shù)據(jù)處理指令中同時完成邏輯處理和移位處理;(7)在循環(huán)處理中使用地址的自動增減來提高運(yùn)行效率。 目前,ARM處理器有ARM7、ARM9、ARM9E、ARM10、ARM10E、SecurCore、StrongARM和XScale等系列。每個系列除了具有ARM體系結(jié)構(gòu)的共同特點(diǎn)以外,都有各自的特點(diǎn)和應(yīng)用領(lǐng)域。 2.3XScale體系結(jié)構(gòu) Xscale核是采用ARM V5TE架構(gòu)的處理器,是Intel公司的StrongARM的升級換代產(chǎn)品,它具有高性能、低功耗等特點(diǎn),并在流水線設(shè)計(jì)、DSP處理和指令設(shè)計(jì)中有很大改進(jìn)[3]。ARM的體系結(jié)構(gòu)是基于RISK的,XScale是ARM處理器的一種,所以XScale具有RISK的基本特性。而且針對嵌入式系統(tǒng),XScale構(gòu)架還引入了Pentium處理器工藝和系統(tǒng)結(jié)構(gòu)技術(shù),實(shí)現(xiàn)了Pentium微處理器體系結(jié)構(gòu)的一系列高性能技術(shù),達(dá)到了高性能、低功耗和小體積等嵌入式系統(tǒng)要求的特性。它的特點(diǎn)有:超流水線、高主頻、存儲體系、分支預(yù)測和指令集體系結(jié)構(gòu)。本設(shè)計(jì)采用的就是基于英特爾Xscale構(gòu)架的一種32位嵌入式處理器,它除了應(yīng)用于掌上電腦之中外,還可以應(yīng)用于智能手機(jī)、網(wǎng)絡(luò)存儲設(shè)備、骨干網(wǎng)路由器等電子設(shè)備。 PXA27x系列處理器是英特爾當(dāng)前最新推出的嵌入式處理器。它的時鐘頻率從312到624MHz不等,并內(nèi)建64MB的堆棧型Intel StrataFlash內(nèi)存。內(nèi)置了英特爾的無線MMX技術(shù),能夠顯著提升多媒體性能。 OURS-PXA270-EP是一款基于INTEL XSCALE PXA270處理器,針對高效 嵌入式系統(tǒng)教學(xué)和實(shí)驗(yàn)科研的平臺。這款設(shè)備主要包括核心板與底版兩個部分,核心板主要集成了高速的PXA270 CPU,配套的存儲器,網(wǎng)卡等設(shè)備;底版主要是各種類型的接口與擴(kuò)展口。 核心板(8層PCB電路)系統(tǒng)包括: CPU: INTEL PXA270(520M),支持GDB調(diào)試; SDRAM: 64M 工作在104M外頻上; FLASH: 32M INTEL Nor FLASH;Net: 10/100M Ethernet controller(LAN91C111);SUPERIO: WINBOND 83977;CPLD: XILINX 95144(117USER IO);總線驅(qū)動器: 若干;核心板正面如圖2.2所示,核心板背面如圖2.3所示。 SDRAMCPUdrvdrvCPLDdrvFLASHdrvdrvFLASHLDOdrv 圖2.2 核心板正面圖 SDRAMdrvEthernetdrvdrvdrv100PIN CONNECTORSuperIOLDO 圖2.3 核心板背面圖 底版(4層PCB電路)如圖2.4所示。包括: Ethernet: 10/100接口1個 UART: 6個(包括RS232,RS485,IRDA,全功能串口)USB1.1:2個(1個host 一個device)PS2:2個(KEYBOARD&MOUSE)標(biāo)準(zhǔn)并口:1個 PCMCIA: 1個 IDE:1個 SD/MMC: 1個 SMC:1個 CAMERA:1個 96PIN功能擴(kuò)展口:2個 4X5 小鍵盤 CPU_JTAG CPLD_JTAG LED SHARP LQ080V3DG01 8寸真彩LCD 640X480 VGA 640X480 LED 8X8點(diǎn)陣 一組7段LED數(shù)碼管 4個 串口irda串口串口串口LCD接口LCD接口并口VGALED點(diǎn)陣音頻1音頻2音頻3PCMCIA 卡LED數(shù)碼管SMC 卡核心板SDPSPSUSBUSB485NET鍵盤 圖2.4 底版圖 2.4主要硬件電路說明 嵌入式設(shè)備除了以ARM芯片為主要控制單元,也有很多周邊電路和外圍設(shè)備,它們有的幫助ARM處理信號、有的負(fù)責(zé)存儲數(shù)據(jù)、有的進(jìn)行網(wǎng)絡(luò)連接、有的用來數(shù)據(jù)通信,這些周邊設(shè)備缺一不可,不能替代。 首先介紹CPU核心總線[4],總線是CPU和其他設(shè)備的橋梁。CPU是通過總線信號來控制SDRAM ,FLASH,網(wǎng)卡,SUPERIO等外部設(shè)備的,無論是低速還是高速,只要是與總線相關(guān)的芯片,都要和CPU總線信號有關(guān)。其次,研究嵌入式系統(tǒng)內(nèi)存——SDRAM。SDRAM是嵌入式系統(tǒng)的內(nèi)存,具有單位空間存儲容量大和價格便宜的優(yōu)點(diǎn),已廣泛應(yīng)用在各種嵌入式系統(tǒng)中。當(dāng)系統(tǒng)啟動時,CPU首先從復(fù)位地址0x0處讀取啟動代碼,在完成系統(tǒng)的初始化后,程序代碼一般應(yīng)調(diào)入SDRAM中運(yùn)行,以提高系統(tǒng)的運(yùn)行速度。同時,系統(tǒng)及用戶堆棧、運(yùn)行數(shù)據(jù)也都放在SDRAM中。SDRAM的存儲單元可以理解為一個電容,總是傾向于放電,為避免數(shù)據(jù)丟失,必須定時刷新(充電)。因此,要在系統(tǒng)中使用SDRAM,就要求微處理器具有刷新控制邏輯,或在系統(tǒng)中另外加入刷新控制邏輯電路。PXA270芯片在片內(nèi)具有獨(dú)立的SDRAM刷新控制邏輯,可方便地與SDRAM接口。除了SDRAM,F(xiàn)LASH也是一種存儲媒介。FLASH一般具有NOR型和NAND型。NAND型FLASH單元密度高,寫入和擦除速度非???,而且一般NAND型FLASH的存儲容量很大。NOR型FLASH的優(yōu)點(diǎn)是芯片內(nèi)執(zhí)行命令,這樣應(yīng)用程序可以直接在FLASH內(nèi)運(yùn)行,不用進(jìn)入內(nèi)存,使得它的傳輸效率很高。嵌入式設(shè)備最大的優(yōu)點(diǎn)就是網(wǎng)絡(luò)功能強(qiáng)大,它能像PC一樣方便地連接到互聯(lián)網(wǎng)上,這些功能都是網(wǎng)絡(luò)控制器的作用。也就是Ethernet Controller,本系統(tǒng)采用SMSC公司的單芯片的網(wǎng)絡(luò)控制器,LAN91C111。它可以工作在兩種速度下,10M以太網(wǎng)或者100M以太網(wǎng)。LAN91C111的工作流程是,驅(qū)動程序?qū)⒁l(fā)送的數(shù)據(jù)包按指定格式寫入芯片并啟動發(fā)送命令,LAN91C111會自動把數(shù)據(jù)包轉(zhuǎn)換成物理幀格式在物理信道上傳輸;反之芯片收到物理信號后自動將其還原成數(shù)據(jù),并按指定格式存放在芯片RAM中以便主機(jī)程序取用。就是LAN91C111完成數(shù)據(jù)包和電信號之間的相互轉(zhuǎn)換。最后,說明一下串口電路,在嵌入式視頻監(jiān)控系統(tǒng)中,串口起到了很重要地作用,嵌入式系統(tǒng)啟動的信息都可以通過串口傳到PC上,極大地方便了系統(tǒng)的移植和軟件的調(diào)試。大多數(shù)情況下,嵌入式CPU的串口0會作為CPU的一個終端,為用戶與CPU交互提供基本的輸出輸入信息。當(dāng)CPU運(yùn)行BOOT代碼時,通常只有這個終端 ;運(yùn)行LINUX內(nèi)核時,如果有LCD顯示,串口0與LCD終端會同時有效。串口0終端的交互 方式是命令行的模式,在BOOT階段,支持簡單的BOOT命令。8 第3章嵌入式ARM系統(tǒng)軟件結(jié)構(gòu) 3.1Linux操作系統(tǒng)簡介 Linux是一個類似Unix的操作系統(tǒng),它起源于芬蘭一個名為LinusTorvaldS的業(yè)余愛好者,現(xiàn)已成為最流行的一款開放源代碼的操作系統(tǒng)。Linux從問世至今,短短時間內(nèi)已發(fā)展成為一個功能強(qiáng)大、設(shè)計(jì)完善的操作系統(tǒng)。Linux系統(tǒng)不僅能夠運(yùn)行于PC平臺,還在嵌入式系統(tǒng)方面大放光芒。由于Linux的源碼開放,內(nèi)核精簡且性能強(qiáng)悍,不依賴于具體廠商,能廣泛適用于各種硬件設(shè)備,系統(tǒng)二次開發(fā)成本極低,因此在IT業(yè)界已經(jīng)達(dá)成共識,即采用嵌入式Linux作為嵌入式操作系統(tǒng)是大勢所趨[5]。 嵌入式Linux是目前嵌入式系統(tǒng)領(lǐng)域中發(fā)展勢頭非常迅猛的系統(tǒng)。嵌入式Linux是指對Linux經(jīng)過小型化裁剪后,能夠固化在容量只有幾百K字節(jié)或幾M字節(jié)的存儲器芯片或單片機(jī)中,應(yīng)用于特定嵌入式場合的專用操作系統(tǒng)。目前正在開發(fā)的嵌入式系統(tǒng)中,49%的項(xiàng)目選擇嵌入式Linux作為操作系統(tǒng)。嵌入式Linux現(xiàn)已成為嵌入式操作系統(tǒng)的理想選擇[6]。目前基于嵌入式Linux的應(yīng)用已經(jīng)遍布很多領(lǐng)域,比如移動多媒體設(shè)備、手持設(shè)備、車載導(dǎo)航系統(tǒng)、機(jī)械控制等。嵌入式Linux分為兩種類型:在沒有使用MMU的平臺上(無內(nèi)存虛實(shí)地址轉(zhuǎn)換和映射)的一般為uCLinux;而在有MMU平臺上,則使用原本地嵌入式Linux版本。由于在目前的主流嵌入式ARM中大多不具有MMU,因此只用IM左右的內(nèi)核就能實(shí)現(xiàn)網(wǎng)絡(luò)功能和任務(wù)調(diào)度的Linux系統(tǒng)就可以適用于從高端服務(wù)器到嵌入式應(yīng)用的各級平臺。ARM技術(shù)和Linux成功地結(jié)合,應(yīng)用于數(shù)以千計(jì)的商業(yè)產(chǎn)品中。從便攜式消費(fèi)品、網(wǎng)絡(luò)和無線設(shè)備,到自動化設(shè)備、醫(yī)療設(shè)備和存儲產(chǎn)品,這一應(yīng)用列表與日俱增。ARM和Linux的結(jié)合充分滿足了各類應(yīng)用對嵌入式平臺高性能、低功耗和低價格的要求,通過開發(fā)環(huán)境、開源社區(qū)和ARM的商業(yè)伙伴的優(yōu)勢為嵌入式開發(fā)提供了更靈活的選擇。 本次設(shè)計(jì)的開發(fā)環(huán)境為redhat9.0系統(tǒng),在Windows XP 下安裝虛擬機(jī),在虛擬機(jī)中安裝Linux系統(tǒng),這樣可以屏蔽底層差別,避免硬件驅(qū)動帶來的麻煩,而且還能方便的使用串口、并口、USB接口,快速的進(jìn)入實(shí)驗(yàn)環(huán)境。圖3.1為虛擬機(jī)下Linux系統(tǒng)啟動后的情況。 圖3.1 虛擬機(jī)下Linux操作系統(tǒng) 3.2交叉編譯環(huán)境的建立 通常嵌入式系統(tǒng)的軟件編譯和執(zhí)行是在兩個不同平臺上進(jìn)行的。編譯是在宿主機(jī),一般為裝有Linux的pc;執(zhí)行是在目標(biāo)機(jī),即嵌入式系統(tǒng)的硬件平臺。一般是在宿主機(jī)上通過跨平臺交叉編譯器把源文件編譯成目標(biāo)平臺上可執(zhí)行的文件,再通過串口、并口或者網(wǎng)絡(luò)下載至目標(biāo)平臺上的FLASH或者其它存儲介質(zhì),然后由目標(biāo)機(jī)來運(yùn)行這些軟件。這里所說的跨平臺編譯器和一般的編譯器功能類似,都是把源代碼通過編譯器編譯成目標(biāo)文件,然后通過鏈接器、可重定位器程序和定位器把目標(biāo)文件重新定位成可執(zhí)行文件。和通用的編譯器之間最大的差別就在于跨平臺編譯器編譯出來的可執(zhí)行程序通常只能在特定CPU所屬平臺上運(yùn)行。所以一般來說每種CPU都對應(yīng)有不同的跨平臺編譯器。 本系統(tǒng)采用基于XScale的PXA270,可以使用常用的ARM-LINUX-GCC交叉編譯器。要成功構(gòu)建完整的交叉編譯環(huán)境需要在宿主機(jī)上創(chuàng)建一系列的工具包括C/C++編譯器、匯編器、鏈接器、嵌入式系統(tǒng)的標(biāo)準(zhǔn)C庫和GDB代碼級調(diào)試器。成功建立好開發(fā)環(huán)境后便可以運(yùn)用這些工具進(jìn)行嵌入式系統(tǒng)開發(fā)[7]。 3.3嵌入式Linux操作系統(tǒng)移植 3.3.1BootLorder移植 BootLoader是系統(tǒng)加電后運(yùn)行的第一段代碼。一般只是在啟動時運(yùn)行很短的時間,然而對一個嵌入式系統(tǒng)來說,這一部分卻是整個系統(tǒng)的一個無比重要的組成部分,不可缺少。在一般嵌入式系統(tǒng)中,系統(tǒng)復(fù)位或者加電后通常從地址0x00000000處開始執(zhí)行,而這個地址一般正是存放的BootLoader啟動代碼。通過這段程序,可以初始化硬件設(shè)備、建立內(nèi)存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適的狀態(tài),以便為最終加載操作系統(tǒng)內(nèi)核準(zhǔn)備好正確的環(huán)境。 BootLoader一般情況下需要包含以下幾個必備的功能 :(l)初始化處理器。這個動作都是用匯編語言完成的,稱為重置碼(resetcode)或者稱為bootcode,而且對于每個CPU都不一樣的,當(dāng)電源接通后就會執(zhí)行這個動作,通常只有兩三個匯編指令,目的是將CPU的控制權(quán)轉(zhuǎn)給硬件初始化的程序。 (2)初始化一些必要的硬件。這個動作也大都由匯編語言來完成,主要是初始化CPU、SDRAM等,其他的硬件,例如串口,可以由c語言等比較高級的程序語言來完成后續(xù)動作。 (3)設(shè)置處理器的寄存器以及內(nèi)存,關(guān)掉所有的輸入管腳(包括中斷管腳),以防止突然有信號進(jìn)入妨礙接下來的硬件初始化動作。然后初始化串口,以便后續(xù)運(yùn)行的程序能夠同HOST端進(jìn)行通信,便于調(diào)試。 (4)從特定的位置把操作系統(tǒng)和文件系統(tǒng)調(diào)入內(nèi)存,并設(shè)置一些操作系統(tǒng)所必需的參數(shù),然后把CPU控制權(quán)交給操作系統(tǒng)。有的BootLoader會先從串口或者網(wǎng)絡(luò)等其他途徑得到內(nèi)核的映像文件,然后把這些文件寫入目標(biāo)系統(tǒng)的FLASH或者其它存儲介質(zhì),最后再把內(nèi)核載入RAM執(zhí)行,交出控制權(quán)。 一般BootLoader都包含兩種不同的操作模式:“啟動加載”模式和“下載”模式,這種區(qū)別僅對于開發(fā)人員才有意義。從最終用戶的角度看,BootLoader的作用就是用來加載操作系統(tǒng),而并不存在所謂的啟動加載模式與下載模式的區(qū)別。 (l)啟動加載(Bootloading)模式:這種模式也稱為“自主”(Autonomous)模式,即BootLoader從目標(biāo)機(jī)上的某個固態(tài)存儲設(shè)備上將操作系統(tǒng)加載到RAM中運(yùn)行,整個過程并沒有用戶的介入。這種模式是BootLoader的正常工作模式,因此在嵌入式產(chǎn)品發(fā)布的時候,BootLoader顯然必須工作在這種模式下。 (2)下載(Downloading)模式:在這種模式下,目標(biāo)機(jī)上的BootLoader將通過串 口連接或者網(wǎng)絡(luò)連接等通信手段從主機(jī)(HOST)下載文件,比如下載內(nèi)核映像和根文件系統(tǒng)映像等。從主機(jī)下載的文件通常首先被BootL0ader保存到目標(biāo)機(jī)的RAM中,然后再被BootLoader寫到目標(biāo)機(jī)上的FLASH類固態(tài)存儲設(shè)備中。BootLoader的這種模式通常在第一次安裝內(nèi)核與根文件系統(tǒng)時被使用,此外,以后的系統(tǒng)更新也會使用BootLoader的這種工作模式。工作于這種模式下的BootLoader通常都會向它的終端用戶提供一個簡單的命令行接口。 BootLoader的實(shí)現(xiàn)依賴于CPU的體系結(jié)構(gòu),一般來說啟動過程分為兩個階段。 第一階段依賴于CPU體系結(jié)構(gòu)的代碼,比如設(shè)備初始化代碼等,通常都放在第一階段中,而且通常都用匯編語言來實(shí)現(xiàn),運(yùn)行效率比較高。這個階段完成的任務(wù)一般如下:(l)硬件設(shè)備初始化(屏蔽所有的中斷、關(guān)閉處理器內(nèi)部的指令/數(shù)據(jù)cache);(2)為第二階段準(zhǔn)備RA.M空間;(3)復(fù)制BootLoader的第二階段代碼到RAM空間中;(4)設(shè)置好堆棧并跳轉(zhuǎn)到第二階段的C程序入口點(diǎn)。 第二階段則通常用C語言來實(shí)現(xiàn),這樣可以實(shí)現(xiàn)復(fù)雜的功能,而且代碼會具有更好的可讀性和可移植性。這個階段主要任務(wù)有:(l)初始化本階段要使用的硬件設(shè)備;(2)檢測系統(tǒng)內(nèi)存映射;(3)將內(nèi)核映像和根文件系統(tǒng)從FLASH讀到RAM中;(4)為內(nèi)核設(shè)置啟動參數(shù);(5)調(diào)用內(nèi)核文件運(yùn)行。 本設(shè)計(jì)中的Bootloader采用Blob,Blob是Boot Loader Object的縮寫,是一款功能強(qiáng)大的Bootloader。Blob最初是由Jan-Derk Bakker和Erik Mouw兩人為一塊名為LART(Linux Advanced Radio Terminal)的開發(fā)板寫的,該板使用的處理器是StrongARM SA-1100,現(xiàn)在Blob已經(jīng)被成功移植到許多基于ARM的CPU上了。本設(shè)計(jì)中的Intel Xcale就是采用Blob作為Bootloader[8]。 3.3.2Linux 內(nèi)核移植 選用嵌入式Linux作為目標(biāo)機(jī)操作系統(tǒng),一方面由于Linux是一款免費(fèi)的操作系統(tǒng),能很好的降低成本,同時Linux的開發(fā)應(yīng)用現(xiàn)在已經(jīng)成為熱門,有大量的資源可用于學(xué)習(xí)與重復(fù)應(yīng)用,并且Linux系統(tǒng)具有良好的可移植性和可裁剪性,能自動支持多任務(wù)管理。一般常用的GUI如QT/E,MiniGUI等都支持Linux。 Linux的開發(fā)工具也都可以很方便的免費(fèi)獲得。 系統(tǒng)采用的嵌入式Linux內(nèi)核為隨實(shí)驗(yàn)平臺光盤中的Linux內(nèi)核,它是針對這套實(shí)驗(yàn)平臺所配置的Linux內(nèi)核,內(nèi)核版本為Linux2.4.20[9]。在實(shí)驗(yàn)過程中,只需要在這個內(nèi)核的基礎(chǔ)上進(jìn)行添加和刪減所需要和不需要的功能,編譯后就可以使用了。 在編譯內(nèi)核之前,需要對內(nèi)核進(jìn)行必要的配置,通過虛擬機(jī)進(jìn)入/pxa270_linux/linux/目錄后在終端執(zhí)行make menuconfig[10]命令,就可以可視化的配置內(nèi)核需要的功能和要求,本次試驗(yàn),主要是針對視頻方面,選擇了對V4L的靜態(tài)加載、對spca5xx攝像頭驅(qū)動的動態(tài)加載,這樣就結(jié)束了對內(nèi)核的配置。編譯內(nèi)核需要創(chuàng)建內(nèi)核依賴關(guān)系、創(chuàng)建內(nèi)核鏡像文件和創(chuàng)建內(nèi)核模塊。首先執(zhí)行makedep命令,讀取配置過程生成的配置文件,來創(chuàng)建對應(yīng)于配置的依賴關(guān)系樹,從而決定哪些需要編譯而哪些不需要;接著需要makeclean刪除前面步驟留下的文件,以避免出現(xiàn)一些錯誤;然后便可以生成所需要的內(nèi)核文件了,用make zlmage來實(shí)現(xiàn)得到可移植的內(nèi)核。內(nèi)核文件通過并口下載線燒寫入開發(fā)板中,便可以通過BootLoader加載運(yùn)行。 3.3.3嵌入式文件系統(tǒng) 嵌入式Linux操作系統(tǒng)一般采用FLASH作為存儲介質(zhì)。FLASH具有獨(dú)特的物理特性,所以必須使用專門的嵌入式文件系統(tǒng)。嵌入式系統(tǒng)對文件的操作是通過層次結(jié)構(gòu)實(shí)現(xiàn)的。對于用戶程序來說,文件是有結(jié)構(gòu)的文件,用戶程序通過對文件IO函數(shù)操作文件。嵌入式文件系統(tǒng)是嵌入式操作系統(tǒng)的一部分,它的任務(wù)是對邏輯文件進(jìn)行管理,其工作包括提供對邏輯文件的操作(復(fù)制、刪除、修改等)接口,方便用戶操作文件和目錄。在文件系統(tǒng)內(nèi)部,根據(jù)存儲設(shè)備的特點(diǎn),使用不同的文件組織模式來實(shí)現(xiàn)文件的邏輯結(jié)構(gòu)。此外,文件系統(tǒng)要對管理文件的安全性負(fù)責(zé)。文件系統(tǒng)不能直接控制物理設(shè)備,它是通過FLASH驅(qū)動實(shí)現(xiàn)控制的[11]。 目前FLASH支持的文件系統(tǒng)技術(shù)主要有JFFS2,YAFFS2,TrueFFS,F(xiàn)TL/NTFL,RAMFS,CRAMFS和ROMFS等等。本系統(tǒng)采用的是JFFS2文件系統(tǒng)。 JFFS2文件系統(tǒng)是專門為NAND閃存設(shè)計(jì)的嵌入式文件系統(tǒng),根據(jù)NAND閃存以頁面為單位存取的特點(diǎn),將文件組織成固定大小的數(shù)據(jù)段。利用NAND閃存提供的每個頁面16B的備用空間來存放ECC(ErrorCorrectionCode)和文件系統(tǒng)的組織信息、,不僅能夠?qū)崿F(xiàn)錯誤檢測和壞塊處理,也能夠提高文件系統(tǒng)的加 載速度。JFFS2采用一種多策略混合的垃圾回收算法,結(jié)合了貪心策略的高效性和隨機(jī)選擇的平均性,達(dá)到了兼顧損耗平均和系統(tǒng)開銷的目的。它是日志結(jié)構(gòu)的文件系統(tǒng),提供了損耗平衡和掉電保護(hù),可以有效地避免意外掉電對文件系統(tǒng)一致性和完整性的影響。JFFS2文件系統(tǒng)是按層次結(jié)構(gòu)設(shè)計(jì)的,分為文件系統(tǒng)管理層接口、JFFS2內(nèi)部實(shí)現(xiàn)層和NAND接口層,這樣就簡化了其與系統(tǒng)的接口設(shè)計(jì),可以方便地集成到系統(tǒng)中去。與YAFFS相比,它增加了一些功能,因此功能更強(qiáng)。 3.4Linux下的程序調(diào)試 調(diào)試是程序開發(fā)過程中必不可少的一個重要環(huán)節(jié),通用PC機(jī)的程序調(diào)試與嵌入式操作系統(tǒng)的調(diào)試環(huán)境上有著明顯的區(qū)別,前者調(diào)試器和被調(diào)試的程序往往是運(yùn)行在同一臺機(jī)器上,是相同操作系統(tǒng)下的兩個不同的進(jìn)程,調(diào)試器通過操作系統(tǒng)專用調(diào)用接口控制被調(diào)試進(jìn)程,后者通常為遠(yuǎn)程調(diào)試,調(diào)試器一般運(yùn)行于桌面操作系統(tǒng)上,而被調(diào)試的程序則運(yùn)行在嵌入式系統(tǒng)之上,因此需要協(xié)調(diào)這兩個程序之間的通信。Linux下的調(diào)試工具非常的少,gdb是Linux下最著名的調(diào)試工具,它是GNUC自帶的調(diào)試工具,它可以使開發(fā)人員了解程序運(yùn)行的詳細(xì)細(xì)節(jié),從而消除程序的錯誤,達(dá)到調(diào)試的目的,gdb還具有遠(yuǎn)程調(diào)試功能,可以滿足嵌入式系統(tǒng)調(diào)試的要求,在調(diào)試過程中PC機(jī)也稱為宿主機(jī)和嵌入式系統(tǒng)通過串口協(xié)議或者TCP/IP協(xié)議連接起來,遠(yuǎn)程主機(jī)上運(yùn)行被gdb規(guī)范斷點(diǎn)改造過的內(nèi)核,當(dāng)條件成立時,斷點(diǎn)被激活,然后等待本地宿主機(jī)的連接命令,一旦連接成功,宿主機(jī)就可以向遠(yuǎn)程嵌入式系統(tǒng)發(fā)送調(diào)試命令了。在調(diào)試過程中g(shù)db通過調(diào)試stub來完成通信功能,調(diào)試stub是嵌入式操作系統(tǒng)中的一小段代碼,它提供了運(yùn)行g(shù)db的宿主機(jī)和嵌入式系統(tǒng)進(jìn)程之間交互的一個媒介。 除了使用調(diào)試器外還可以直接在程序中使用printf()或printk打印函數(shù),這種方法功能比較弱,效率低下,但在內(nèi)核模塊調(diào)試時這是唯一的方法。14 第4章USB設(shè)備驅(qū)動程序設(shè)計(jì) 4.1設(shè)備驅(qū)動程序簡介 Linux系統(tǒng)中,設(shè)備驅(qū)動程序扮演著特殊的角色。它就像一個獨(dú)立的黑盒子一樣,使某個特定的硬件可以相應(yīng)一個定義良好的內(nèi)部編程接口并且完成隱藏設(shè)備的作用。用戶只需調(diào)用一組標(biāo)準(zhǔn)化的函數(shù)完成操作,而且這些操作與特定的驅(qū)動程序無關(guān)。驅(qū)動程序的任務(wù)就是將這些函數(shù)映射到作用硬件的具體操作上。這樣的模塊化的驅(qū)動程序結(jié)構(gòu)使得Linux系統(tǒng)中的驅(qū)動程序可以獨(dú)立于內(nèi)核的其他部分,可以在需要使用的時候?qū)Ⅱ?qū)動“插入”內(nèi)核。 從系統(tǒng)運(yùn)行順序來看,硬件平臺啟動運(yùn)行Linux后,啟用了MMU單元即內(nèi)存管理單元,在這種模式下系統(tǒng)不能直接對物理地址進(jìn)行訪問。若要對某一硬件外設(shè)進(jìn)行讀寫,需要通過內(nèi)核調(diào)用該硬件的驅(qū)動來實(shí)現(xiàn)。 上面已經(jīng)說過,驅(qū)動程序的作用在于向應(yīng)用程序提供訪問硬件設(shè)備的接口,驅(qū)動程序屏蔽了硬件實(shí)現(xiàn)上的細(xì)節(jié)操作,于是應(yīng)用程序可以像操作普通文件一樣對硬件設(shè)備進(jìn)行操作。Linux以模塊的形式加載設(shè)備類型,通常是一個模塊對應(yīng)實(shí)現(xiàn)一個設(shè)備驅(qū)動。模塊是內(nèi)核的一部分,它們沒有被編譯到內(nèi)核中,而是分別被編譯并鏈接成一組目標(biāo)文件。可以根據(jù)用戶的需要在不需要對內(nèi)核進(jìn)行重新編譯的情況下動態(tài)載入正在運(yùn)行的內(nèi)核,或從正在運(yùn)行的內(nèi)核中卸載。利用這種機(jī)制,內(nèi)核尺寸可以保持在最小,并具有最大的靈活性,也便于檢驗(yàn)新的內(nèi)核代碼,而不需要重新編譯內(nèi)核并重新引導(dǎo)。設(shè)備驅(qū)動程序一般需要完成以下功能:(l)對設(shè)備初始化和釋放;(2)把數(shù)據(jù)從內(nèi)核傳送到硬件和從硬件讀取數(shù)據(jù);(3)讀取應(yīng)用程序傳送給設(shè)備文件的數(shù)據(jù)和回送應(yīng)用程序的請求數(shù)據(jù);(4)檢測和處理設(shè)備出現(xiàn)的錯誤。 在Linux操作系統(tǒng)下有兩類主要設(shè)備文件類型:塊設(shè)備、字符設(shè)備。用戶進(jìn)程正是通過設(shè)備文件來與硬件打交道。每個設(shè)備文件都有其文件屬性,表示是字符設(shè)備還是塊設(shè)備。另外每個文件都有2個設(shè)備號,第一個是主設(shè)備號,標(biāo)識驅(qū)動程序;第二個是從設(shè)備號,標(biāo)識使用同一個設(shè)備驅(qū)動程序的不同硬件設(shè)備。設(shè)備文件的主設(shè)備號必須與設(shè)備驅(qū)動程序在登記時申請的設(shè)備號一致,否則用戶進(jìn)程將無法訪問驅(qū)動程序。 Linux驅(qū)動程序可以分為三個主要部分: 15 (l)自動配置和初始化子程序,負(fù)責(zé)檢測所要驅(qū)動的硬件設(shè)備是否存在和能否正常工作。如果該設(shè)備正常,則對這個設(shè)備及其他必需的條件位口中斷、DMA通道)進(jìn)行申一請并初始化。這部分驅(qū)動程序僅在初始化時被調(diào)用一次。 (2)服務(wù)于I/O請求的子程序,又稱為驅(qū)動程序的上半部分。調(diào)用這部分程序是由于系統(tǒng)調(diào)用的結(jié)果。這部分程序在執(zhí)行時,系統(tǒng)仍認(rèn)為是與進(jìn)行調(diào)用的進(jìn)程屬于同一個進(jìn)程,只是由用戶態(tài)變成了核心態(tài),但仍具有進(jìn)行此系統(tǒng)調(diào)用的用戶程序的運(yùn)行環(huán)境,因而可以在其中調(diào)用與進(jìn)程運(yùn)行環(huán)境相關(guān)的函數(shù)。 (3)中斷服務(wù)子程序,又稱為驅(qū)動程序的下半部分。在Linux操作系統(tǒng)中,并不是直接從中斷向量表中調(diào)用設(shè)備驅(qū)動程序的中斷服務(wù)子程序,而是由Linux系統(tǒng)來接收硬件中斷,再由系統(tǒng)調(diào)用中斷服務(wù)子程序。中斷可以在任何一個進(jìn)程運(yùn)行時產(chǎn)生,因而在中斷服務(wù)子程序被調(diào)用時,不能依賴于任何進(jìn)程的狀態(tài),也就不能調(diào)用任何與進(jìn)程運(yùn)行環(huán)境有關(guān)的函數(shù)。因?yàn)樵O(shè)備驅(qū)動程序一般支持同一類型的若干設(shè)備,所以一般在系統(tǒng)調(diào)用中斷服務(wù)子程序時,都帶有一個或多個參數(shù),以唯一標(biāo)識請求服務(wù)的設(shè)備。 在系統(tǒng)內(nèi)部,I/O設(shè)備的存取通過設(shè)備驅(qū)動程序提供的一組固定的入口點(diǎn)來進(jìn)行,這組入口點(diǎn)在驅(qū)動程序初始化時向系統(tǒng)進(jìn)行登記,以便在系統(tǒng)適當(dāng)?shù)臅r候調(diào)用。一般來說,字符型設(shè)備驅(qū)動程序能夠提供如下幾個入口點(diǎn):(1)open入口點(diǎn):打開設(shè)備準(zhǔn)備I/O操作,對字符特別設(shè)備進(jìn)行打開操作,都會調(diào)用設(shè)備的open入口點(diǎn)。open子程序必須對將要進(jìn)行的I/O操作做好必要的準(zhǔn)備工作,如清除緩沖區(qū)等。如果設(shè)備是獨(dú)占的,即同一時刻只能有一個程序訪問此設(shè)備,則open子程序必須設(shè)置一些標(biāo)志以表示設(shè)備的狀態(tài)。 (2)close入口點(diǎn):關(guān)閉一個設(shè)備,當(dāng)最后一次使用設(shè)備結(jié)束后,調(diào)用dose子程序。獨(dú)占設(shè)備必須標(biāo)記設(shè)備可再次使用。 (3)read入口點(diǎn):讀取設(shè)備,對于有緩沖區(qū)的I/0操作,一般從緩沖區(qū)里讀取設(shè)備數(shù)據(jù)。 (4)write入口點(diǎn):向設(shè)備寫數(shù)據(jù),對于有緩沖區(qū)的I/O操作,一般向緩沖區(qū)里寫入數(shù)據(jù)。 (5)ioctl入口點(diǎn):執(zhí)行讀寫之外的操作。 USB(Universal Serial Bus)即“通用串行外部總線”,用途廣泛,可以外接硬盤、鍵盤、鼠標(biāo)、打印機(jī)等多種設(shè)備,USB能夠使用盡可能少的接口支持盡可能多的外設(shè),尤為適合在嵌入式設(shè)備中使用,是嵌入式接口標(biāo)準(zhǔn)的一個很好的選擇。 USB總線規(guī)范有1.1版和2.0版。USB1.1支持兩種傳輸速率:低速1.5Mbit/s、全速12Mbit/s,這樣的速率完全滿足鼠標(biāo)、鍵盤、CD-ROM等設(shè)備,但是在嵌入式視頻監(jiān)控系統(tǒng)中,這樣的速度還是很慢。所以,USB2.0提供了一種更好的傳輸速率:高速,它可以達(dá)到480Mbit/s。USB2.0向下兼容USB1.1,可以將遵循USB1.1規(guī)范的設(shè)備連接到USB2.0控制器上,也可以把USB2.0的設(shè)備鏈接到USB1.1控制器上。 USB總線的硬件拓?fù)浣Y(jié)構(gòu)[12]如圖4.1所示。 USB主機(jī)控制器USB設(shè)備根集線器USB設(shè)備USB設(shè)備集線器USB設(shè)備集線器USB設(shè)備集線器USB設(shè)備USB設(shè)備USB設(shè)備USB設(shè)備 圖4.1 USB總線硬件拓?fù)鋱D USB主機(jī)控制器通過根集線器與其他USB設(shè)備相連。集線器也屬于USB設(shè)備,通過它可以在一個USB接口上擴(kuò)展出多個接口。除根集線器外,最多可以層疊5個集線器,每條USB電纜的最大長度是5m,所以USB總線的最大距離為30m。一條USB總線上可以外接127個設(shè)備,包括根集線器和其他集線器。整個結(jié)構(gòu)圖是一個星狀結(jié)構(gòu),一條USB總線上所有設(shè)備共享一條通往主機(jī)的數(shù)據(jù)通道,同一時刻只能有一個設(shè)備與主機(jī)通信。 通過USB主機(jī)控制器來管理外接的USB設(shè)備,USB主機(jī)控制器共分3種:UHCI、OHCI和EHCI。在配置Linux內(nèi)核的時候,看到的“HCD”字樣表示“Host Controller Drivers”,即主機(jī)控制器驅(qū)動程序。 USB驅(qū)動程序分為兩類:USB主機(jī)控制器驅(qū)動程序(Host Controller Drivers)、USB設(shè)備驅(qū)動程序(USB device drivers)。它們在內(nèi)核中的層次如圖4.2所示。 UserUSB Device DriversUSB Host Controller DriversHardware 圖4.2 USB驅(qū)動程序?qū)哟谓Y(jié)構(gòu) 在試驗(yàn)中,教學(xué)平臺上的Linux嵌入式內(nèi)核已經(jīng)配置了USB主機(jī)控制器驅(qū)動程序,只需要添加需要的USB設(shè)備驅(qū)動程序,就能實(shí)現(xiàn)USB設(shè)備的正常使用。 4.2Linux下驅(qū)動程序的實(shí)現(xiàn) Linux操作系統(tǒng)下對硬件設(shè)備進(jìn)行驅(qū)動開發(fā)的一般步驟如下:(l)注冊設(shè)備 在系統(tǒng)啟動時或者在模塊加載的時候需要將設(shè)備和重要的數(shù)據(jù)結(jié)構(gòu)登記到內(nèi)核的設(shè)備數(shù)組中,并確定該設(shè)備的主次設(shè)備號。在Linux系統(tǒng)中,對于字符設(shè)備一般通過調(diào)用register_chrdev向系統(tǒng)注冊設(shè)備驅(qū)動程序,register_chrdev在fs/deviees.c文件中的定義如下:int register_chrdev(unsigned int major,const char*name,struct file_operations fops)定義中的major是設(shè)備驅(qū)動程序向系統(tǒng)申請的主設(shè)備號,如果major為O,則系統(tǒng)為該驅(qū)動程序動態(tài)的分配一個主設(shè)備號,不過此設(shè)備號是臨時的;name是設(shè)備名:fops是各個調(diào)用入口點(diǎn)的說明。函數(shù)返回O表示注冊成功,返回-INVAL表示申請的主設(shè)備號非法,返回-EBUSY表示申請的主設(shè)備號正在被其它設(shè)備驅(qū)動程序使用。 以后對設(shè)備驅(qū)動程序的file_operations的操作都可以通過該主設(shè)備號的索引來完成。register_chrdev函數(shù)操作成功后,設(shè)備名便出現(xiàn)在/proc/devices文件目錄中,使用命令cat/proc/devices可以查看設(shè)備的工作狀態(tài)。 (2)定義操作集 驅(qū)動程序中要通過一系列函數(shù)完成對設(shè)備的不同操作,這些操作在面向?qū)ο缶幊绦g(shù)語中也稱為方法,該操作集通過數(shù)據(jù)結(jié)構(gòu)file_operations實(shí)現(xiàn)。內(nèi)核內(nèi)部通過file結(jié)構(gòu)識別設(shè)備,通過file_operations數(shù)據(jù)結(jié)構(gòu)提供的文件系統(tǒng)的入口點(diǎn)函數(shù)訪問設(shè)備。 file_operations定義在 int(*release)(struct inode*, struct file*);int(*fsync)(struct file*, struct dentry*, int datasync);int(*fsyne)(int, struct file*, int);int(*lock)(struct file*,int, struct file_lock*);ssize_t(*readv)(struct file*, const struct iovec*, unsigned long, loff_t*);ssize_t(*writev)(struct file*, const struct iovec*, unsigned long, loff_t*);ssize_t(*sendpage)(struct file*, struct page*, int, size_t, loff_t*, int);unsigned long(*get_unmapped_area)(struct file*, unsigned long, unsigned long,unsigned long, unsigned long);} 這個結(jié)構(gòu)的每一個成員的名字對應(yīng)一個系統(tǒng)調(diào)用,在用戶程序利用系統(tǒng)調(diào)用對設(shè)備文件進(jìn)行諸如讀/寫操作時,系統(tǒng)調(diào)用會通過設(shè)備文件的主設(shè)備號找到相應(yīng)的驅(qū)動程序,然后讀取這個數(shù)據(jù)結(jié)構(gòu)的相應(yīng)函數(shù)指針,把控制權(quán)交給該函數(shù)。對于具體的設(shè)備驅(qū)動并不需要實(shí)現(xiàn)結(jié)構(gòu)中所有的例程,只要完成設(shè)備功能就可以了。例如對于一個常見的字符設(shè)備驅(qū)動來說,可能只有操作open(),write(),read(),ioctl()和close(),當(dāng)用戶程序通過系統(tǒng)調(diào)用訪問設(shè)備時,最終要通過這些操作集來完成。 (3)卸載模塊 當(dāng)不再需要使用一個模塊或設(shè)備時,需要將其從內(nèi)核中卸載下來,這時會動態(tài)調(diào)用模塊中的module_exit()函數(shù),并需要在該函數(shù)中調(diào)用modul_unregister_chrdev()或module_unregister_blkdev()釋放掛入內(nèi)核的數(shù)據(jù)結(jié)構(gòu)同時釋放該設(shè)備號。 4.3USB攝像頭驅(qū)動程序設(shè)計(jì) 攝像頭屬于視頻設(shè)備,在Linux內(nèi)核中,VideoforLinux(簡稱V4L)是關(guān)于視頻設(shè)備的驅(qū)動標(biāo)準(zhǔn)。這個標(biāo)準(zhǔn)為應(yīng)用程序定義了一系列的接口函數(shù),內(nèi)核、驅(qū)動和應(yīng)用程序都是依靠這個標(biāo)準(zhǔn)來進(jìn)行交流。本系統(tǒng)所使用的USB攝像頭正是基于該標(biāo)準(zhǔn)來編寫驅(qū)動和應(yīng)用程序的。 Linux內(nèi)核是依據(jù)設(shè)備號來操作設(shè)備文件的,在內(nèi)核中,攝像頭對應(yīng)的設(shè)備文件名為/dev/video0,主設(shè)備號是81,次設(shè)備號根據(jù)攝像頭數(shù)目來確定,本系統(tǒng)中僅使用一個攝像頭,所以可以通過mknod/dev/video0 c 81 0來創(chuàng)建節(jié)點(diǎn)。USB攝像頭驅(qū)動程序?qū)崿F(xiàn)原理如圖4.3所示。 USB攝像頭的驅(qū)動和通用設(shè)備的驅(qū)動準(zhǔn)則一樣,但需要與內(nèi)核提供的視頻驅(qū)動掛鉤。即首先在驅(qū)動中聲明一個 video_device結(jié)構(gòu),并為其指定文件操作函數(shù)指針數(shù)組fops,向系統(tǒng)注冊。在應(yīng)用程序發(fā)出文件操作的相關(guān)命令時,核心根據(jù)這些指針調(diào)用相應(yīng)函數(shù),并將該結(jié)構(gòu)作為參數(shù)傳遞給它們。這樣,就完成了驅(qū)動和核心之間的通信。 例如: Static struct video_devie vdev_template={……}; 聲明 video_deviee,指出掛接驅(qū)動 用戶進(jìn)程系統(tǒng)調(diào)用攝像頭驅(qū)動文件操作接口接收緩沖區(qū)發(fā)送緩沖區(qū)中斷服務(wù)程序攝像頭 圖4.3 攝像頭驅(qū)動實(shí)現(xiàn)框圖 Static Struct file_operation spcasxx_fops= {……}; 聲明本驅(qū)動的文件操作函數(shù)指針 Struct video_device*vdev=video_devdata(file);從文件指針中提取出 video_deviee結(jié)構(gòu) 在video_deviee結(jié)構(gòu)中,有一個私有指針priv,可以將它指向一塊保留內(nèi)存。在這塊內(nèi)存中,保存著本驅(qū)動、本設(shè)備的相關(guān)初始化信息。這塊內(nèi)存的申請、初始化、指針指向等工作都是在USB驅(qū)動的枚舉函數(shù)probe中完成。這樣,在枚舉函數(shù)將控制權(quán)返還給系統(tǒng)后,因?yàn)閮?nèi)核不銷毀保留內(nèi)存,所以驅(qū)動仍然保留著自己的信息。在驅(qū)動卸載函數(shù)中需要將申請的各塊內(nèi)存全部釋放。 Linux系統(tǒng)中任何USB傳輸都通過URB實(shí)現(xiàn)。為提高速度,可以考慮擴(kuò)大URB的緩沖,這樣可以降低每個USB事務(wù)中握手信息所占比例,提高有效數(shù)據(jù)的輸速度。但是受限于總線帶寬和具體的USB設(shè)備芯片,單純擴(kuò)大URB的緩沖不能無限制地解決問題。USB在操作系統(tǒng)中每次傳輸都要包括URB的建立、發(fā)出、回收、數(shù)據(jù)整理等階段,這些時間不產(chǎn)生有效數(shù)據(jù)。因此可以建立兩個URB,在等待一個URB被回收時,也就是圖像正在被傳感器采集時,處理、初始化另一個URB,并在回收后立刻將其發(fā)出。兩個URB交替使用,大大減少了額外時間。 由于嵌入式平臺上運(yùn)行的Linux2.4.20內(nèi)核,內(nèi)部已經(jīng)集成了對USB2.0的支持,所以無需移植相應(yīng)的USB驅(qū)動。 在設(shè)計(jì)中,攝像頭芯片采用中星微的Z301系列芯片,Linux2.4內(nèi)核并不支持這種芯片,所以我們通過移植芯片驅(qū)動程序來達(dá)到目的。芯片的驅(qū)動程序是spca5**系列,如果不重新編譯內(nèi)核的話,將驅(qū)動程序動態(tài)加載就可以正常使用。設(shè)計(jì)中動態(tài)加載的命令使用insmod命令,它和modprobe命令在使用上有所不同,modprobe在加載模塊時不用指定模塊文件的絕對路徑,也不用帶模塊文件的后綴.o或.ko;而insmod需要的是模塊的所在目錄的絕對路徑,并且一定要帶有模塊文件名后綴的.o或者.ko。但是在功能上,它們所達(dá)到的效果基本相同[13]。22 第5章視頻采集功能的設(shè)計(jì) 視頻采集程序是基于V4L開發(fā)的,包括攝像頭的初始化、打開/關(guān)閉、參數(shù)設(shè)置和數(shù)據(jù)讀取等操作,視頻采集程序流程圖如圖5.1所示[14]。 開始初始化攝像頭init_videoIn()打開攝像頭open_v4l()獲取攝像頭參數(shù)icotl(int->vd,int cmd,..)設(shè)置攝像頭參數(shù)ioctl()獲取一幀圖像N一幀是否截取完畢Y存儲并準(zhǔn)備傳輸N是否終止視頻采集Y關(guān)閉攝像頭終止 圖5.1 視頻采集程序流程圖 5.1基于V4L的編程 5.1.1攝像頭相關(guān)數(shù)據(jù)結(jié)構(gòu) 攝像頭的組成部分是傳感器、DSP、鏡頭、外殼、USB連線、電路板和周邊電路構(gòu)成,其中最重要的是傳感器和DSP(數(shù)字信號處理器)。本系統(tǒng)選用的攝像頭采用了CMOS傳感器和中星微301處理器。 V4L[15]提供了一系列的接口應(yīng)用程序,可以利用這些程序?qū)崿F(xiàn)對攝像頭的調(diào)用,其中有read、open、ioctl等。V4l同時將這些函數(shù)和參數(shù)封裝成一個數(shù)據(jù)結(jié)構(gòu)vdIn。struct vdIn { int fd;char *videodevice;struct video_mmap vmmap;struct video_capability videocap;int mmapsize;struct video_mbuf videombuf;struct video_picture videopict;struct video_window videowin;struct video_channel videochan;struct video_param videoparam; int cameratype;char *cameraname;char bridge[9];int sizenative;int sizeothers;int palette;int norme;int channel;int grabMethod;unsigned char *pFramebuffer;unsigned char *ptframe [4]; };int framelock [4];pthread_mutex_t grabmutex;int framesizeIn;volatile int frame_cour;int bppIn;int hdrwidth;int hdrheight;int formatIn;int signalquit; int fd :打開攝像頭時,open函數(shù)返回的文件描述符,其他函數(shù)使用這個描述符對攝像頭進(jìn)行操作。 struct video_mmap vmmap: 用于內(nèi)存映射的結(jié)構(gòu)體。 struct video_capability videocap :描述攝像頭基本信息,如設(shè)備名稱、支持的最大分辨率、信號源信息、信道數(shù)等。 struct video_mbuf videombuf :在進(jìn)行內(nèi)存映射時讀取幀的信息,實(shí)際上是輸入到攝像頭存儲緩存中的幀信息。 struct video_picture videopict :攝像頭采集圖像的屬性,如亮度、色調(diào)、對比度、色度、深度等。 struct video_window videowin :表示采集窗口參數(shù),如分辨率等。struct video_channal videochan :關(guān)于信號源的屬性。 5.1.2攝像頭基本功能實(shí)現(xiàn) (1)初始化攝像頭參數(shù) 在對攝像頭進(jìn)行操作之前,要對攝像頭進(jìn)行初始化,即對vdIn這個結(jié)構(gòu)進(jìn)行初始化。使用init_videoIn 函數(shù)。 int init_videoIn(struct vdIn *vd, char *device, int width, int height, int format, int grabmethod){ int err =-1;int i;if(vd == NULL || device == NULL)return-1; } if(width == 0 || height == 0)return-1;grabmethod = 1;//read by default;if(grab method < 0 || grabmethod > 1)// check format vd->videodevice = NULL;vd->cameraname = NULL;vd->videodevice = NULL;vd->videodevice =(char *)realloc(vd->videodevice, 16);vd->cameraname =(char *)realloc(vd->cameraname, 32);snprintf(vd->videodevice, 12, “%s”, device);if(debug)printf(“video %s n”,vd->videodevice);memset(vd->cameraname, 0, sizeof(vd->cameraname));memset(vd->bridge, 0, sizeof(vd->bridge));vd->signalquit = 1;vd->hdrwidth = width;vd->hdrheight = height;vd->formatIn = format; vd->bppIn = GetDepth(vd->formatIn);vd->grabMethod = grabmethod;vd->pFramebuffer = NULL;err = init_v4l(vd);for(i = 0;i < OUTFRMNUMB;i++){ } vd->frame_cour = 0;pthread_mutex_init(&vd->grabmutex, NULL);return err;vd->ptframe[i] = NULL;(unsigned char *)realloc(vd->ptframe[i], sizeof(struct frame_t)+(size_t)vd->framelock[i] = 0;vd->framesizeIn); (2)打開攝像頭 在Linux中,類似攝像頭的設(shè)備是作為文件來看待的,叫做設(shè)備文件。我們可以使用open函數(shù)來對設(shè)備進(jìn)行打開操作,open帶有兩個參數(shù),第一個為設(shè)備文件名稱,本實(shí)驗(yàn)的攝像頭設(shè)備名稱是/dev/video0,第二個則是打開的類型。 在使用open函數(shù)打開攝像頭之前,要判斷是否有攝像頭設(shè)備,即檢查參數(shù)videodevice是否為空。Open函數(shù)執(zhí)行結(jié)束后會返回?cái)z像頭的文件描述符,如果返回值為-1,則說明打開設(shè)備出錯。 int open_v4l(char *vd->videodevice){ if(!vd->videodevice){ printf(“No device file, ERROR opening V4L interface”); return-1;} if((vd->fd=open(vd->videodevice, O_RDWR))==-1){ printf(“ERROR opening V4L interface”); return-1;} return vd->fd;}(3)獲取攝像頭參數(shù) 成功打開攝像頭后,需要獲取攝像頭的一些參數(shù),利用ioctl函數(shù)控制I/O通道來實(shí)現(xiàn)。Ioctl函數(shù)的使用是ioctl(int->fd, int cmd,……),fd代表文件描述符,cmd表示用戶對設(shè)備的控制命令,第三個參數(shù)是一個其他的參數(shù)。其中,cmd包括VIDIOCGCAP(獲得video_capbility中有關(guān)攝像頭的信息)、VIDIOCGPICT(獲取圖像信息)、VIDIOCSPICT(改變圖像信息)、VIDIOCGMBUF(獲取攝像頭存儲緩沖區(qū)幀信息)、VIDIOCAMCAPTURE(獲取視頻圖像)、VIDIOSYNC(判斷攝像頭是否截取成功)等。 讀取video_capability中有關(guān)攝像頭的信息 if(ioctl(vd->fd, VIDIOCGCAP, &(vd->videocap))==-1){ printf(“Fail to get video_capability!/n”);return-1;} 讀取video_picture中的圖像信息 printf(“Fail to get video_picture!/n”);return-1;} if(ioctl(vd->fd, VIDIOCGPICT, &(vd->videopict))==-1){ 讀取video_window信息 if(ioctl(vd->fd,VIDIOCGWIN,&(vd->videowin))==-1){ printf(“Fail to get video_window!/n”); return-1;}(4)設(shè)置攝像頭參數(shù) 在對攝像頭參數(shù)進(jìn)行設(shè)置的時候,應(yīng)該按照以下步驟:比如更改圖像信息,首先,先給video_picture結(jié)構(gòu)中所要修改的變量賦值,如vd->videopict.palette=vd->formaIn;vd->videopict.depth=GetDepth(vd->formatIn);然后通過ioctl函數(shù)的VIDIOCSPICT來設(shè)置,如if(ioctl(vd->fd,VIDIOCSPICT,&(vd->videopict))<0){ printf(Fail to set videopict params with VIDIOCSPICT!/n“);return-1;} 在設(shè)置好了之后可以通過VIDIOCGPICT命令來查詢圖像信息設(shè)置是否成功。(5)關(guān)閉攝像頭 在Linux編程過程中,必須養(yǎng)成一個好的編程習(xí)慣,就是在開啟一個設(shè)備后一定要關(guān)閉它,這樣可以避免很多諸如內(nèi)存泄露等嚴(yán)重的問題。 本系統(tǒng)支持兩種讀取方式來獲得視頻流,它們是內(nèi)存映射和直接讀取,所以首先需要判斷視頻采集的方式,如果是內(nèi)存映射,則在系統(tǒng)任務(wù)完成后關(guān)閉內(nèi)存映射,然后關(guān)閉攝像頭設(shè)備。同樣道理,如果采用的是直接讀取,則在任務(wù)完成后關(guān)閉直接讀取,然后在關(guān)閉攝像頭設(shè)備。在代碼中,采用了一個判斷語句,判斷vd->grabMethod的值來判斷系統(tǒng)采用哪種讀取方式。int close_v4l(struct vdIn *vd){ int i;if(vd->grabMethod){ } else { free(vd->pFramebuffer);vd->pFramebuffer = NULL;if(debug)printf(“unmapping frame buffern”);munmap(vd->pFramebuffer, vd->mmapsize); } } if(debug)printf(“close video_devicen”);close(vd->fd);/* dealloc the whole buffers */ if(vd->videodevice){ } if(vd->cameraname){ } for(i = 0;i < OUTFRMNUMB;i++){ } pthread_mutex_destroy(&vd->grabmutex);if(vd->ptframe[i]){ } free(vd->ptframe[i]);vd->ptframe[i] = NULL;vd->framelock[i] = 0;if(debug)printf(“freeing output buffer %dn”, i); free(vd->cameraname);vd->cameraname = NULL;free(vd->videodevice);vd->videodevice = NULL;5.1.3視頻數(shù)據(jù)采集 視頻數(shù)據(jù)的采集是系統(tǒng)實(shí)現(xiàn)的第一步,是所有工作的前提。嵌入式Linux系統(tǒng)支持兩種視頻數(shù)據(jù)采集的方式:內(nèi)存映射、直接讀取視頻。 (1)內(nèi)存映射 內(nèi)存映射方式是通過mmap系統(tǒng)調(diào)用函數(shù)來實(shí)現(xiàn)的。mmap系統(tǒng)調(diào)用使得進(jìn)程之間通過映射同一個普通文件實(shí)現(xiàn)共享內(nèi)存。普通文件被映射到進(jìn)程地址空間 后,進(jìn)程可以像訪問普通內(nèi)存一樣對文件進(jìn)行訪問,不必再調(diào)用read()、write()等操作。 首先,使用ioctl系統(tǒng)調(diào)用的VIDIOCSFBUF命令獲得攝像頭存儲緩沖區(qū)的幀信息,之后初始化video_mbuf,修改video_mmap中的設(shè)置,重新設(shè)置圖像信息,如幀的垂直及水平分辨率、彩色顯示格式等。為了防止緩沖區(qū)的內(nèi)容與有用信息疊加產(chǎn)生干擾,在初始化之前可以先調(diào)用memset(&(vd->videombuf),0,sizeof(vd->videombuf)來清零緩沖區(qū)。然后使用函數(shù)vd->map=(unsigned char*)mmap(O,vd->mbuf.size,PROT_READ|PROT_WRITE,MAP_SHARED,vd->fd,ff_t offset)使設(shè)備內(nèi)容映射到內(nèi)存區(qū),其中第一個參數(shù)為共享內(nèi)存的起始地址,一般設(shè)為0,表示由系統(tǒng)分配;第二個參數(shù)為映射到調(diào)用進(jìn)程地址空間的字節(jié)數(shù),它從被映射文件開頭offset個字節(jié)開始算起;第三個參數(shù)指定共享內(nèi)存的訪問權(quán)限(PROT_READ(可讀),PROT_WRITE(可寫),PROT_EXEC(可執(zhí)行));第四個參數(shù)可以是MAP_SHARED或者M(jìn)AP_PRIVATE;第五個參數(shù)為設(shè)備描述符。mmap()成功調(diào)用后返回系統(tǒng)實(shí)際分配的起始地址。 內(nèi)存映射方式下真正進(jìn)行視頻截取的是ioctl系統(tǒng)調(diào)用的VIDIOCMCAPTURE命令,若函數(shù)成功調(diào)用,再用VIDIOCSYNC命令來判斷圖像截取是否己經(jīng)完畢,若該函數(shù)調(diào)用成功,則表明一幀圖像的截取已完成,便開始下一幀圖像數(shù)據(jù)的截取,并將當(dāng)前截取的幀號按緩沖區(qū)總幀數(shù)的模加上l。 vd->vmmap.height=vd->hdrheight;vd->vmmap.width=vd->hdrwidth;vd->vmmap.format=vd->formatln;/*判斷圖像截取是否完成*/ if(ioctl(vd->fd,VIDIOCSYNC,&vd->vmmap.frame)<0){ perror(??cvsync errn);erreur=-I;} while((vd->framelock [vd->frame_cour]!=0)&&vd->signalquit)usleep(1000);temps=ms_time(); pthread_mutex_lock(&vd->grabmutex);jpegsize=convertframe(vd->ptframe[vd->frame_cour]+sizeof(struct frame_t),vd->pFramebuffer+vd->videombuf.offsets[vd->vmmap.frame],vd->hdrwidth,vd->hdrheight,vd->formatln,vd->framesizeIn);headerframe=(struct frame_t*)vd->ptframe [vd->frame_cour]; snprintf(headerframe->header, 5,”%s”.”SPCA”); headerframe->seqtimes=ms_time();headerframe->w=vd->hdrwidth;headerframe->h=vd->hdrheight;headerframe->size=((jpegsize<0)? 0: jpegsize);headerframe->format=vd->formatln;headerframe->nbframe=frame++;pthread_mutex_unlock(&vd->grabmutex);/*截取視頻幀*/ if((ioctl(vd->fd,VIDIOCMCAPTURE,&(vd->vmmap)))<0){ perror(“cmcapture”); if(debug)printf(“>>cmcapture err n”);erreur=-l;} vd->vmmap.frame=(vd->vmmap.frame+1)%vd->videombuf.frames;vd->frame_cour=(vd->frame_cour+l)%OUT FRMNUMB;(2)直接讀取方式 直接讀取視頻數(shù)據(jù)是通過read系統(tǒng)調(diào)用函數(shù)來實(shí)現(xiàn)。read是一個用來從指定的文件或設(shè)備中讀取數(shù)據(jù)的系統(tǒng)調(diào)用。參數(shù)表為read(fd,(void*)pFramebuff,(size_t)framesizeln)。其中fd為文件描述符,pFramebuffer為指向存放數(shù)據(jù)的內(nèi)存的指針,framesizeln為需要讀取的數(shù)據(jù)的長度。對于攝像頭設(shè)備的讀取,需要先分配內(nèi)存空間,用來存儲從攝像頭讀取過來的視頻數(shù)據(jù),然后直接調(diào)用read系統(tǒng)調(diào)用讀取視頻數(shù)據(jù),返回值為實(shí)際讀取的視頻幀大小,也正是在視頻傳輸過程中發(fā)送的視頻數(shù)據(jù)大小。 size=vd->framesizeln;vd->pFramebuffer=(unsigned char*)realloc(vd->pFramebuffer,(size_t)size);Len=read(vd->fd, vd->pFramebuffer, size);if(len<0){ if(debug)printf(“v41 read errorn”); if(debug)printf(“l(fā)en %d asked %dn”, len, size);return 0;} /*是否有其他進(jìn)程正在使用該視頻幀*/ while((vd->framelock [vd->frame_cour]!=0)&&vd->signalquit) headerframe->deltatimes=(int)(headerframe->seqtimes-timecourant); usleep(1000);temps=ms_time(); pthread_mutex_lock(&vd->grabmutex);jpegsize=convertframe(vd->ptframe[vd->frame_cour]+sizeof(structframe_t),vd->pFramebuffer,vd->hdrwidth,vd->hdrheight,vd->formatln,vd->framesizeln);headerframe=(struct frame_t*)vd->ptframe [vd->frame_cour];snprintf(headerframe->header, 5,”%s”,”SPCA”);headerframe->seqtimes=ms_time();headerframe->deltatimes=(int)(headerframe->seqtimes-timecourant);headerframe->w=vd->hdrwidth;headerframe->h=vd->hdrheight;headerframe->size=((jpegsize<0)? 0: jpegsize);headerframe->format=vd->formatln;headerframe->nbframe=frame++;vd->frame_cour=(vd->frame_cour+1)%OUTFRMNUMB;pthread_mutex_unlock(&vd->grabmutex);5.2圖像編解碼 5.2.1編解碼介紹 通過攝像頭采集到數(shù)據(jù)后,還并不能把它們直接通過網(wǎng)卡傳輸,因?yàn)檫@樣的數(shù)據(jù)很大,網(wǎng)絡(luò)不能承擔(dān)如此龐大的數(shù)據(jù)傳輸。所以,必須將采集到得數(shù)據(jù)進(jìn)行編碼,壓縮數(shù)據(jù)大小。通過這樣的操作,我們采集到得數(shù)據(jù)就會變得很小,然后再把這些數(shù)據(jù)通過網(wǎng)絡(luò)傳輸。同樣的道理,在輸出端我們還要把接收到的已經(jīng)壓縮的數(shù)據(jù)還原回來,這就涉及到解碼的內(nèi)容。通過這一系列的操作,圖像和視頻數(shù)據(jù)就實(shí)現(xiàn)的遠(yuǎn)程的傳輸。如果沒有編解碼,遠(yuǎn)程傳輸就是實(shí)際上不可能的事情,所以圖像的編解碼是非常重要的。 現(xiàn)在普遍使用的編解碼技術(shù)。對于靜態(tài)圖像,普遍使用靜態(tài)壓縮JPEG標(biāo)準(zhǔn);對于動態(tài)視頻,普遍使用動態(tài)壓縮MPEG標(biāo)準(zhǔn)。 JPEG是由ISO和CCITT為靜態(tài)圖像壓縮所建立的國際上第一個靜態(tài)圖像壓縮標(biāo)準(zhǔn),JPEG有著較高的壓縮比,復(fù)雜度適中,既可以用硬件實(shí)現(xiàn),也可以用軟件實(shí)現(xiàn),實(shí)用性強(qiáng),被廣泛使用于計(jì)算機(jī)和通信行業(yè)。 MPEG中文譯名為動態(tài)圖像專家組。到目前為止,MPEG標(biāo)準(zhǔn)主要有五個,32 MPEG- 1、MPEG- 2、MPEG- 4、MPEG-7和MPEG-21。它是由ISO/IEC1172壓縮編碼標(biāo)準(zhǔn)得出的視頻壓縮格式,MPEG的出現(xiàn)使視聽傳播進(jìn)入數(shù)碼化時代。MPEG標(biāo)準(zhǔn)的視頻壓縮編碼技術(shù)主要利用了具有運(yùn)動補(bǔ)償?shù)膸g壓縮編碼技術(shù)以減少時間冗余度,利用DCT技術(shù)以減少圖像的空間冗余度,利用熵編碼技術(shù)在信息表示方面減少了統(tǒng)計(jì)冗余度。通過一系列技術(shù),極大的體現(xiàn)了壓縮性能[16]。 5.2.2系統(tǒng)壓縮技術(shù) 由于本系統(tǒng)要求實(shí)現(xiàn)遠(yuǎn)程視頻傳輸,為了達(dá)到預(yù)計(jì)的設(shè)計(jì)要求,設(shè)計(jì)采用基于MJPEG算法的壓縮技術(shù)進(jìn)行視頻壓縮。MJPEG和MPEG的不同點(diǎn)在于MJPEG不使用幀間編碼。可是MJPEG與MPEG仍然是一脈相承的,它對MEPG進(jìn)行了一些改進(jìn)和發(fā)展,功能更加強(qiáng)大,能發(fā)送高質(zhì)圖片、清晰視頻,編碼容易實(shí)現(xiàn)。但MJPEG也有一些缺點(diǎn),由于功能的提升,MJPEG對帶寬的要求很高,編碼效率低。 參考文獻(xiàn) 1.張永強(qiáng),趙勇勇,李崇德.嵌入式遠(yuǎn)程視頻采集系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2006,05(02):57-60.2.Jing Li, Weidong Hao.Research and Design of Embedded Network Video Monitoring System Based on Linux[C].The 2008 International Conference on Embedded Software and Systems Symposia, 2008, 1310-1313.3.陳章龍,唐志強(qiáng),涂時亮.嵌入式技術(shù)與系統(tǒng)——Intel Xscale 結(jié)構(gòu)與開發(fā)[M].北 京:北京航空航天大學(xué)出版社,2004,143.4.奧爾博公司.PXA270嵌入式實(shí)驗(yàn)開發(fā)系統(tǒng)——Linux實(shí)驗(yàn)指導(dǎo)[M],2007.5.Seon Gyu Kim and Sung Ho Cho.Implementation of an Embedded Software Modem Platform[J].Division of Electrical & Computer Engineering,2006,04(2):5-9 6.杜春雷.ARM體系結(jié)構(gòu)與編程[M].北京:清華大學(xué)出版社,2003.7.朱珍民,隋雪青.嵌入式實(shí)時操作系統(tǒng)及其應(yīng)用開發(fā)[M].北京:北京郵電大學(xué)出版社,2006.8.李亞峰 歐文盛.ARM嵌入式Linux系統(tǒng)開發(fā)從入門到精通[M].北京:清華大學(xué) 33 出版社,2007,51-54.9.李善平.Linux內(nèi)核2.4版源代碼分析大全[M].北京:機(jī)械工業(yè)出版社,2002.10.廖日坤.ARM嵌入式應(yīng)用開發(fā)技術(shù)白金手冊[M].北京:中國電力出版社,2007, 284-290.11.劉昆.Linux環(huán)境下宿主機(jī)與ARM開發(fā)板NFS服務(wù)的配置[J].科技資訊,2008,05(04):65-80.12.韋東山.嵌入式Linux應(yīng)用開發(fā)完全手冊[M].北京:人民教育出版社,2008.13.孫紀(jì)坤,張小全.嵌入式Linux系統(tǒng)開發(fā)技術(shù)詳解——基于ARM[M].北京:人民郵電出版社,2006.14.李冰,孫建平,譚悅,張啟勤.基于嵌入式Linux與S3C2410的網(wǎng)絡(luò)視頻監(jiān)控[J].河北:華北電力大學(xué)學(xué)報(bào),2006,2(4):15-30.15.董玲,朱宏,楊忠孝.基于ARM的嵌入式Linux應(yīng)用程序開發(fā)研究[J].電子測試,2008,05(06):40-60.16.Yongqiang Zhang, Bing Zhang.Design of Embedded Audio and Video Compression System[J].Workshop on Intelligent Information Technology Application,2007,12(8):76-90.17.Xing Zhang, Li-Ming Song.Implementation of Video Data Transmission Between ARM and DSP Through Embedded Linux[C].The 2008 International Conference on Embedded Software and Systems Symposia,2008,292-295.18.張躍進(jìn),謝昕.嵌入式網(wǎng)絡(luò)數(shù)字視頻監(jiān)控系統(tǒng)的設(shè)計(jì)[J].計(jì)算機(jī)工程與設(shè)計(jì),2009,12(9):70-100.19.Yi Wu, Jiangyong Cai, Xiao Lin, Lianfeng Shen.The Design and Realization of the Wireless Video Monitoring System Based on Embedded Linux and CDMA1X[C].The 2008 International Conference on Embedded Software and Systems Symposia, 2008, 179-184.20.王先春,郭杰榮,胡惟文,樊希平.基于ARM_Linux的嵌入式Web服務(wù)器的設(shè)計(jì)與實(shí)現(xiàn)[J].微計(jì)算機(jī)信息,2007,14(7):90-95.34 基于A8的嵌入式Linux遠(yuǎn)程視頻監(jiān)控系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn) 摘 要:將網(wǎng)絡(luò)技術(shù)和嵌入式技術(shù)相結(jié)合的遠(yuǎn)程視頻監(jiān)控系統(tǒng)是視頻采集技術(shù)的發(fā)展趨勢,文中提出了一種基于對等網(wǎng)絡(luò)模型的嵌入式遠(yuǎn)程視頻監(jiān)控系統(tǒng)的設(shè)計(jì)方案。該方案將嵌入式系統(tǒng)和Web開發(fā)技術(shù)相結(jié)合,再利用USB攝像頭作為視頻監(jiān)控系統(tǒng)的終端進(jìn)行圖像采集,并使用網(wǎng)絡(luò)TCP協(xié)議將其遠(yuǎn)程發(fā)送給服務(wù)器終端。相較于傳統(tǒng)的Client/Server網(wǎng)絡(luò)模型,本系統(tǒng)實(shí)現(xiàn)采用對等網(wǎng)絡(luò)模型,即確定發(fā)送命令的控制程序既可以是客戶端,又可以是服務(wù)端。文中選擇嵌入式開發(fā)平臺ARM系列A8處理器進(jìn)行研究和設(shè)計(jì),并采用PC機(jī)下的Linux系統(tǒng)作為主機(jī)開發(fā)環(huán)境。 關(guān)鍵詞:嵌入式;視頻監(jiān)控;網(wǎng)絡(luò)遠(yuǎn)程控制;對等網(wǎng)絡(luò) 中圖分類號:TP39 文獻(xiàn)標(biāo)識碼:A 文章編號:2095-1302(2016)05-00-03 0 引 言 網(wǎng)絡(luò)遠(yuǎn)程控制(Network Remote Control,NRC)是利用計(jì)算機(jī)網(wǎng)絡(luò)對遠(yuǎn)程計(jì)算機(jī)進(jìn)行操作的一種控制方式。計(jì)算機(jī)技術(shù)和網(wǎng)絡(luò)技術(shù)目前都在高速發(fā)展,現(xiàn)在監(jiān)控系統(tǒng)已經(jīng)發(fā)展到網(wǎng)絡(luò)視頻監(jiān)控系統(tǒng)[1]。網(wǎng)絡(luò)視頻監(jiān)控具有數(shù)字視頻監(jiān)控和網(wǎng)絡(luò)傳輸技術(shù)的優(yōu)點(diǎn),其具有不受地理位置約束、擴(kuò)展方便簡單、信息處理較容易等特點(diǎn),可以使遠(yuǎn)程的管理和維護(hù)變成現(xiàn)實(shí),只要是網(wǎng)絡(luò)覆蓋的地方,就能實(shí)現(xiàn)網(wǎng)絡(luò)監(jiān)控[2]。嵌入式系統(tǒng)向網(wǎng)絡(luò)發(fā)展已成必然趨勢,目前嵌入式系統(tǒng)對網(wǎng)絡(luò)協(xié)議如TCP/IP協(xié)議和HTTP協(xié)議的支持也越來越廣泛。系統(tǒng)硬件設(shè)備選擇與配置 系統(tǒng)硬件設(shè)備選擇凌陽嵌入式A8教學(xué)實(shí)驗(yàn)系統(tǒng)進(jìn)行設(shè)計(jì)與實(shí)現(xiàn)。該實(shí)驗(yàn)箱基于ARM CortexTM-A8內(nèi)核的處理器S5PV210,該芯片又名“蜂鳥”(Hummingbird),是三星公司推出的一款適用于智能手機(jī)和平板電腦等多媒體設(shè)備的應(yīng)用處理器[3]。本系統(tǒng)使用了人機(jī)交互模塊的USB接口、多媒體模塊攝像頭接口及通信模塊以太網(wǎng)接口。 1.1 USB攝像頭 攝像頭屬于視頻類設(shè)備。在目前的Linux核心中,視頻部分的標(biāo)準(zhǔn)是Video for Linux(簡稱V4L)。這個標(biāo)準(zhǔn)其實(shí)定義了一套接口,內(nèi)核、驅(qū)動、應(yīng)用程序以這個接口為標(biāo)準(zhǔn)進(jìn)行交流。目前的V4L涵蓋了視、音頻流捕捉及處理等內(nèi)容,USB攝像頭也屬于它支持的范疇。 本系統(tǒng)所采用的嵌入式Linux操作系統(tǒng)如果需要使用USB攝像頭則必須在內(nèi)核配置時添加Video4Linux驅(qū)動和對USB攝像頭驅(qū)動模塊的支持。本系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)采用靜態(tài)加載以上驅(qū)動。首先進(jìn)入Linux源代碼所在的目錄,在終端輸入make menuconfig命令,在基于Ncurses內(nèi)核配置圖形界面進(jìn)行內(nèi)核選項(xiàng)的配置。選中多媒體設(shè)備選項(xiàng)“Multimedia device->”,進(jìn)入多媒體設(shè)備配置界面,選中“Video For Linux”,加載Video4Linux模塊,就可以使內(nèi)核實(shí)現(xiàn)對Video4Linux驅(qū)動的支持,為視頻采集設(shè)備提供編程接口。在內(nèi)核配置主界面,選中USB支持選項(xiàng)“USB support―>”,選中“USB Multimedia device”選項(xiàng)下的“USB OV511 Camera support”,使內(nèi)核中加入OV511接口芯片的USB數(shù)字?jǐn)z像頭的驅(qū)動支持。OV511 USB 攝像頭驅(qū)動配置界面如圖1所示。 圖1 OV511 USB 攝像頭驅(qū)動配置界面 1.2 開啟幀緩沖設(shè)備 幀緩沖(Frame Buffer,F(xiàn)B)是Linux為顯示設(shè)備提供的一個接口,是把顯存抽象后的一種設(shè)備,它允許上層應(yīng)用程序在圖形模式下直接對顯示緩沖區(qū)進(jìn)行讀寫操作。由于FB設(shè)備驅(qū)動為受限驅(qū)動,因此必須進(jìn)行設(shè)備開啟。本系統(tǒng)開發(fā)環(huán)境采用發(fā)行版Linux操作系統(tǒng)Ubuntu10.10,Ubuntu下啟用FB設(shè)備的一般步驟如下所示: 安裝v86d和hwinfo兩個包查看顯卡是否支持,并設(shè)置本機(jī)支持模式。 修改啟動文件/etc/default/grub,如圖2所示。 圖2 修改啟動文件圖 修改modules文件/etc/initramfs-tools/modules,如圖3所示。 圖3 修改modules文件 更新以上兩個文件并重啟系統(tǒng),即可查看到FB設(shè)備,具體如圖4所示。 圖4 查看FB設(shè)備系統(tǒng)軟件設(shè)計(jì) 本系統(tǒng)軟件由攝像頭驅(qū)動模塊、圖像采集模塊、網(wǎng)絡(luò)傳輸模塊和網(wǎng)絡(luò)服務(wù)器模塊組成[4]。攝像頭驅(qū)動模塊使得攝像頭為應(yīng)用程序編寫提供系統(tǒng)編程接口。功能主要包括攝像頭設(shè)備信息的獲取與設(shè)置、設(shè)備的打開和關(guān)閉、信號通道選擇、窗口初始化等。圖像采集模塊的作用是使用編程接口獲取攝像頭采集來的圖像信息并進(jìn)行暫時存儲。服務(wù)器通過網(wǎng)絡(luò)傳輸模塊與遠(yuǎn)程監(jiān)控PC機(jī)端進(jìn)行信息交流。 2.1 V4L圖像信息采集流程 V4L圖像信息采集流程分為如下幾步: (1)打開攝像頭設(shè)備 int vd->fd = open(“/dev/video0”,O_RDWR); (2)讀video_capability 中的信息,成功后可讀取vd->capability各分量ioctl(vd->fd,VIDIOCGCAP,&(vd->capability)); (3)讀video_picture中的信息,成功后可讀取圖像的屬性ioctl(vd->fd,VIDIOCGPICT,&(vd->picture)); (4)初始化channel int i; for(i = 0; i capability.channels; i++){ vd->channel[i].channel = i; ARM9嵌入式系統(tǒng)課程設(shè)計(jì) --嵌入式系統(tǒng)語音采集與播放程序設(shè)計(jì) 班級: 學(xué)號: 姓名: 指導(dǎo)老師: 課程設(shè)計(jì)時間:2011.6.29---2011.7.8 江蘇大學(xué) 目錄 第一章 引言.........................................................1 1.1 設(shè)計(jì)目的......................................................1 1.2 設(shè)計(jì)任務(wù)與要求................................................1 第二章 課程設(shè)計(jì)平臺構(gòu)建與流程.......................................2 2.1 嵌入式系統(tǒng)平臺構(gòu)建............................................2 2.2 課程設(shè)計(jì)流程..................................................3 2.3 課程設(shè)計(jì)硬件結(jié)構(gòu)與工作原理...................................3 第三章 BOOTLOADER移植與下載.......................................11 3.1 VIVI源代碼安裝...............................................11 3.2 VIVI源代碼分析與移植.........................................11 3.3 VIVI編譯與下載...............................................12 第四章 LINUX內(nèi)核移植與下載........................................14 4.1 LINUX內(nèi)核源代碼安裝..........................................14 4.2 LINUX內(nèi)核源代碼分析與移植....................................14 4.3 LINUX內(nèi)核編譯與下載..........................................15 第五章 課程設(shè)計(jì)功能模塊程序設(shè)計(jì)與交叉編譯..........................24 5.1 課程設(shè)計(jì)模塊功能.............................................24 5.2 功能模塊驅(qū)動程序設(shè)計(jì).........................................24 5.3 功能模塊交叉編譯.............................................28 第六章 根文件系統(tǒng)建立與文件系統(tǒng)下載................................29 6.1 根文件系統(tǒng)分析...............................................29 6.2 文件系統(tǒng)映像文件生成.........................................30 6.3 文件系統(tǒng)下載.................................................31 6.4 功能模塊運(yùn)行與調(diào)試...........................................32 第七章 課程設(shè)計(jì)總結(jié)與體會..........................................34 7.1 得出的結(jié)論...................................................34 7.2課程設(shè)計(jì)過程中遇到的問題及解決方法...........................34 7.3 心得體會.....................................................34 參考文獻(xiàn)...........................................................36 第一章 引言 1.1 設(shè)計(jì)目的 分析Linux操作系統(tǒng)下音頻設(shè)備驅(qū)動的結(jié)構(gòu),編寫應(yīng)用測試程序,實(shí)現(xiàn)UDA1341芯片的實(shí)時錄音及放音功能,進(jìn)一步熟悉vivi、Linux內(nèi)核和根文件系統(tǒng)的編譯和燒寫至開發(fā)板的開發(fā)流程。 1.2 設(shè)計(jì)任務(wù)與要求 在Samsung公司S3C2410處理器的edukit-Ⅲ開發(fā)板上,在嵌入式linux操作系統(tǒng)環(huán)境下,根據(jù)語音芯片UDA1341的驅(qū)動程序和語音數(shù)據(jù)的特點(diǎn)編寫語音采集與播放的應(yīng)用測試程序,實(shí)現(xiàn)語音數(shù)據(jù)的采集和實(shí)時播放功能。1.要求本系統(tǒng)實(shí)時的采集與播放 2.通過麥克風(fēng)錄制一段語音信息,對其進(jìn)行播放 第二章 課程設(shè)計(jì)平臺構(gòu)建與流程 2.1 嵌入式系統(tǒng)平臺構(gòu)建 2.1.1軟件部分 1)Linux或Windows 98/2000/NT/XP 2)cygwin cygwin是一個在windows平臺上運(yùn)行的unix/Linux模擬環(huán)境,是cygnus solutions公司開發(fā) 3)Embest IDE 英蓓特提供的一個嵌入式開發(fā)的集成環(huán)境。4)windows中的超級終端 5)Embest online Flash Programmer for ARM 燒寫相關(guān)文件到NorFlash中的工具。 6)建立linux的交叉編譯環(huán)境,各項(xiàng)源代碼的安裝等 2.1.2硬件部分 1)EduKit-II實(shí)驗(yàn)平臺 2)S3C2410核心子板 3)PC機(jī) 2.2 課程設(shè)計(jì)流程 圖2.1 設(shè)計(jì)流程 2.3 課程設(shè)計(jì)硬件結(jié)構(gòu)與工作原理 2.3.1硬件模塊(1) SCLLRCIIS控制器SDOSDIMCL 圖2.2 典型的IIS總線上的設(shè)備 (2)IIS總線結(jié)構(gòu) IIS總線只處理聲音數(shù)據(jù),其他控制信號等則需單獨(dú)提供。IIS總線使用3根串行總線,分別是:提供分時復(fù)用功能的SD線(Serial data,串行數(shù)據(jù)),WS線(Word select,字段選擇(聲道選擇))和SCK線(Continuous Serial clock,連續(xù)的時鐘信號)。 音頻編解碼4 ADDRTxFIFODATASFTRBRFCRxFIFOSDCNTLCHHCSCLKIPSR_APCLKIPSR_BSCLKGLRCKCDCLK 圖2.3 IIS總線接口內(nèi)部結(jié)構(gòu) S3C2410A IIS總線接口各模塊的功能描述如下: ● BRFC 表示總線接口、寄存器區(qū)和狀態(tài)機(jī)。總線接口邏輯和FIFO訪問由狀態(tài)機(jī)控制。 ● IPSR 表示兩個5位的前置分頻器ISPR_A和ISPR_B,一個前置分頻器作為IIS總線接口的主時鐘發(fā)生器,另一個前置分頻器作為外部音頻編解碼器CODEC的時鐘發(fā)生器。 ● TxFIFO和RxFIFO 表示兩個64字節(jié)的FIFO。在發(fā)送數(shù)據(jù)時,數(shù)據(jù)寫到TxFIFO,在接收數(shù)據(jù)時,數(shù)據(jù)從RxFIFO讀取。 ● SCLKG 表示主IISCLK發(fā)生器。在主設(shè)模式時,由主時鐘產(chǎn)生串行位時鐘?!?CHNC 表示通道發(fā)生器和狀態(tài)機(jī)。通道狀態(tài)機(jī)用于產(chǎn)生和控制IISCLK和IISLRCK。 ● SFTR 表示16位移位寄存器。在發(fā)送模式時,并行數(shù)據(jù)移入SFTR并轉(zhuǎn)換成串行數(shù)據(jù)輸出;在接收模式時,串行數(shù)據(jù)移入SFTR并轉(zhuǎn)換成并行數(shù)據(jù)輸出。具體的相關(guān)寄存器的位功能描述請參觀相關(guān)資料。2.3.2 工作原理 常用的數(shù)字音頻處理集成電路包括A/D、D/A、DSP、數(shù)字濾波器和數(shù)字音頻I/O接口及設(shè)備(麥克風(fēng)、話筒)等。麥克風(fēng)輸入的模擬音頻信號經(jīng)A/D轉(zhuǎn)換、音頻編碼器實(shí)現(xiàn)模擬音頻信號到數(shù)字音頻信號轉(zhuǎn)換,編碼后的數(shù)字音頻信號通過控制器送入DSP或微處理器相應(yīng)的處理。音頻輸出時,數(shù)字音頻信號(音頻數(shù)據(jù))經(jīng)控制器給音頻解碼器,經(jīng)D/A轉(zhuǎn)換后由揚(yáng)聲器輸出。 數(shù)字音頻涉及概念很多,重要的是理解:采樣和量化。采樣就是每隔一定時間讀一次聲音信號的幅度,而量化則是將采樣得到的聲音信號幅度轉(zhuǎn)換為數(shù)字值。從本質(zhì)上講,采樣是時間上的數(shù)字化,而量化則是幅度上的數(shù)字化。 根據(jù)奈奎斯特(Nyquist)采樣理論采樣頻率應(yīng)高于輸入信號的最高頻率兩倍。為了保證聲音不失真,采樣頻率應(yīng)該在40kHz左右。常用的音頻采樣頻率有8kHz、11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz等,要達(dá)到DVD的音質(zhì)需要采用更高的采樣頻率。 量化是對模擬音頻信號的幅度數(shù)字化,量化位數(shù)決定模擬信號數(shù)字化以后的動態(tài)范圍,常用的有8位、12位和16位。量化位越高,信號的動態(tài)范圍越大,數(shù)字化后的音頻信號就越接近原始信號,但所需要的存儲空間也越大。 聲道有單聲道、雙聲道和多聲道。雙聲道又稱立體聲,在硬件中有兩條線路,音質(zhì)和音色都優(yōu)于單聲道,但數(shù)字化后占據(jù)的存儲空間的大小要比單聲道多一倍。多聲道能提供更好的聽覺感受,不過占用的存儲空間也更大。 數(shù)字音頻數(shù)據(jù)有PCM、MP3、WMA、WAV、Ogg Vorbis、RA、AAC、ATRAC 3等多種不同的文件格式。 1)IIS總線 IIS總線(IIS,Inter-IC Sound Bus,數(shù)字音頻集成電路通信總線)是Philip公司提出的音頻總線協(xié)議,它是一種串行的數(shù)字音頻總線協(xié)議,是音頻數(shù)據(jù)編碼或解碼常用的串行音頻數(shù)字接口。 (1)IIS總線的傳輸模式 數(shù)據(jù)的發(fā)送方和接收方需要采用相同的時鐘信號來控制數(shù)據(jù)傳輸,數(shù)據(jù)傳輸方(主設(shè))必須產(chǎn)生字段選擇信號、時鐘信號和需要傳輸?shù)臄?shù)據(jù)信號。在一個復(fù)雜的數(shù)字音頻系統(tǒng)中,可能會有多個發(fā)送方和接收方,通常采用系統(tǒng)主控制模式,主控制模塊控制數(shù)字音頻數(shù)據(jù)在不同集成電路(設(shè)備)間的傳輸,數(shù)據(jù)發(fā)送方就需要在主控制模塊的協(xié)調(diào)下發(fā)送數(shù)據(jù)。IIS總線的三種傳輸模式如圖2、3、4所示,這些模式的配置一般需通過軟件來實(shí)現(xiàn)。 clock SCKTRANSMITTERword select WSdata SDRECEIVERTRANSMITTER=MASTER 圖2.4發(fā)送器為主設(shè)時的傳輸模式 clock SCKTRANSMITTERword select WSdata SDRECEIVERRECEIVER=MASTER 圖2.5 接收器為主設(shè)時的傳輸模式 CONTROLLERclock SCKTRANSMITTERword select WSdata SDRECEIVERCONTROLLER=MASTER 圖2.6 控制器為主設(shè)時的傳輸模式(2)IIS總線時序 1串行數(shù)據(jù)(SD)○串行數(shù)據(jù)的傳輸由時鐘信號同步控制,且串行數(shù)據(jù)線每次傳輸1字節(jié)的數(shù)據(jù)。當(dāng)音頻數(shù)據(jù)被數(shù)字化成二進(jìn)制流后,傳輸時先將數(shù)據(jù)分成字節(jié)(如8位、16位等),每個字節(jié)的數(shù)據(jù)傳輸從左邊的二進(jìn)制位MSB(Most Significant Bit)開始。當(dāng)接收方和發(fā)送方的數(shù)據(jù)字段寬度不一樣時,發(fā)送方不考慮接收方的數(shù)據(jù)字段寬度。如果發(fā)送方發(fā)送的數(shù)據(jù)字段寬度小于系統(tǒng)字段寬度,就在低位補(bǔ)0;如果發(fā)送方的數(shù)據(jù)字段寬度大于接收方的寬度,則超過LSB(Least Significant Bit)的部分被截?cái)唷?/p> 2字段選擇(WS)○音頻系統(tǒng)一般包含有左右兩個聲道,字段選擇(WS)用來選擇左聲道或者右聲道,WS=0表示選擇左聲道;WS=0表示選擇左聲道。如果不在外部加以控制,WS會在MSB傳輸前的一個時鐘周期發(fā)生變化,使數(shù)據(jù)接收方和發(fā)送方保持同步。此外,WS能讓接收設(shè)備存儲前1字節(jié),并且準(zhǔn)備接收后1字節(jié)。 3時鐘信號(SCK)○在IIS總線中,任何一個能夠產(chǎn)生時鐘信號的電路都可以稱為主設(shè)備,從設(shè)備從外部時鐘輸入得到時鐘信號。IIS的規(guī)范中制定了一系列關(guān)于時鐘信號頻率和延時的限制。 圖2.7 IIS總線時序 (3)IIS總線接口的工作方式 IIS總線接口是用來連接外部的標(biāo)準(zhǔn)編解碼器(CODEC)的接口。S3C2410A提供一個IIS總線接口,能用來連接一個外部8/16位立體聲音頻CODEC,支持IIS 總線數(shù)據(jù)格式和MSB-justified數(shù)據(jù)格式。該接口對FIFO的訪問提供DMA傳輸模式,而不是采用中斷模式。它可以同時發(fā)送數(shù)據(jù)和接收數(shù)據(jù),也可以只發(fā)送或只接收數(shù)據(jù)。在只發(fā)送和只接收模式,S3C2410A的IIS總線接口有以下三種工作方式。 1正常傳輸方式 ○在正常傳輸方式,對于發(fā)送和接收FIFO,IIS控制寄存器有一個FIFO就緒標(biāo)志位。當(dāng)FIFO準(zhǔn)備發(fā)送數(shù)據(jù)時,如果發(fā)送FIFO不空,則FIFO就緒標(biāo)志位為“1”;如果發(fā)送FIFO為空,該標(biāo)志為“0”。在接收數(shù)據(jù)時,當(dāng)接收FIFO是不滿時,FIFO就緒標(biāo)志位為“1”,指示可以接收數(shù)據(jù);若接收FIFO滿,則該標(biāo)志為“0”。通過FIFO就緒標(biāo)志位,可以確定CPU讀/寫FIFO的時間。 2DMA傳輸方式 ○在DMA傳輸方式,利用DMA控制器來控制發(fā)送和接收FIFO的數(shù)據(jù)存取,由FIFO就緒標(biāo)志來自動請求DMA的服務(wù)。 3發(fā)送和接收方式 ○在發(fā)送和接收方式,IIS總線接口可以同時發(fā)送和接收數(shù)據(jù)。(4)S3C2410A IIS總線接口的音頻串行接口格式 S3C2410A的IIS總線接口支持IIS總線數(shù)據(jù)格式和MSB-justified數(shù)據(jù)格式。IIS總線格式 ○IIS總線有IISDI(串行數(shù)據(jù)輸入)、IISDO(串行數(shù)據(jù)輸出)、IISLRCK(左/右通道選擇)和IISCLK(串行位時鐘)4條線,產(chǎn)生IISLRCK和IISCLK信號的為主設(shè)備。串行數(shù)據(jù)以2的補(bǔ)碼發(fā)送,首先發(fā)送是MSB位。首先發(fā)送MSB位可以使發(fā)送方和接收方具有不同的字長度,發(fā)送方不必知道接收方能處理的位數(shù),同樣接收方也不必知道發(fā)送方正發(fā)來多少位的數(shù)據(jù)。 當(dāng)系統(tǒng)字長度大于發(fā)送器的字長度時,數(shù)據(jù)發(fā)送時,字被切斷(最低數(shù)據(jù)位設(shè)置為0)發(fā)送。接收器接收數(shù)據(jù)時,如果接收到的數(shù)據(jù)字長比接收器的字長更長時,則多的數(shù)據(jù)位被忽略。另一方面,如果接收器收到的數(shù)據(jù)位數(shù)比它的字長短時,則缺少的位設(shè)置為0。因此,MSB有固定的位置,而LSB的位置與字長度 有關(guān)。在IISLRCK發(fā)生改變的一個時鐘周期,發(fā)送器發(fā)送下一個字的MSB位。 發(fā)送器發(fā)送的串行數(shù)據(jù)可以在時鐘信號的上升沿或下降沿同步。然而,串行數(shù)據(jù)必須在串行時鐘信號的上升沿鎖存到接收器,所以發(fā)送數(shù)據(jù)使用上升沿進(jìn)行同步時會一些限制。 左右通道選擇線指示當(dāng)前正發(fā)送的通道。IISLRCK可以在串行時鐘的上升沿或者下降沿改變,不需要同步。在從模式,這個信號在串行時鐘的上升沿被鎖存。IISLRCK在MSB位發(fā)送的前一個時鐘周期內(nèi)發(fā)生改變,這樣可以使從發(fā)送器同步發(fā)送串行數(shù)據(jù)。另外,允許接收器存儲前一個字,并清除輸入以接收下一個字。 2MSB-justified數(shù)據(jù)格式 ○MSB-justified總線格式在體系結(jié)構(gòu)上與IIS總線格式相同。與IIS總線格式唯一不同的是,只要IISLRCK有變化,MSB-justified格式要求發(fā)送器總是發(fā)送下一個字的最高位。 2)音頻編解碼芯片UDAl341TS UDA1431TS可把通過麥克風(fēng)音頻輸入通道輸入的立體聲模擬信號轉(zhuǎn)化為IIS格式的數(shù)字信號,傳送給S3C2410的IIS控制器,然后CPU使用DMA控制器把得到的數(shù)字信號存放的一塊內(nèi)存空間上;同樣DMA控制器也能把已存的數(shù)字信號通過IIS格式發(fā)送給UDAl341TS芯片,由該芯片轉(zhuǎn)換成模擬信號,通過耳機(jī)音頻輸出通道輸出。利用UDA1341TS內(nèi)部的PGA(可編程增益放大器)、AGC(自動增益控制)功能對模擬信號進(jìn)行處理。對于數(shù)字信號,UDA1341TS提供DSP(數(shù)字音頻處理)功能。 S3C2410A的IIS接口線分別與UDA1431TS的BCK、WS、DATAI、SYSCLK相連。當(dāng)UDA1431TS芯片工作在微控制器輸入模式時,使用UDA1431TS的L3總線(L3DATA、L3MODE和L3CLOCK)。L3DATA、L3MODE和L3CLOCK分別表示與微處理器接口的數(shù)據(jù)線(L3DATA)、模式控制線(L3MODE)和時鐘線(L3CLOCK)。微控制器通過對UDA1431TS中的數(shù)字音頻處理參數(shù)進(jìn)行配置。S3C2410A沒有與L3總線配套的專用接口,可以利用通用I/O口進(jìn)行控制。第三章 Bootloader移植與下載 3.1 Vivi源代碼安裝 進(jìn)入cygwin,Vivi源代碼的安裝: $> source /tmp/edukit-2410/set_env_linux.sh?// Linux編譯環(huán)境變量設(shè)置,第一次打開Cygwin必須設(shè)置。 $> cd $WORKDIR $> tar-xvjf /tmp/edukit-2410/source/vivi/vivi-20030929.tar.bz2 $> ls ? vivi ?? ?為$WORKDIR目錄下其他內(nèi)容 正確解壓后,可以看到多了一個vivi目錄,即vivi源代碼的安裝目錄,后面的vivi配置及編譯都得進(jìn)入vivi目錄進(jìn)行。再為EduKit2410實(shí)驗(yàn)系統(tǒng)打入vivi源代碼的補(bǔ)丁文件: $> cd vivi $> patch-p1 vivi的代碼包括arch,init,lib,drivers和include等幾個目錄,共200多條文件。 Vivi主要包括下面幾個目錄: arch:此目錄包括了所有vivi支持的目標(biāo)板的子目錄,例如s3c2410目錄。drivers:其中包括了引導(dǎo)內(nèi)核需要的設(shè)備的驅(qū)動程序(MTD和串口)。MTD目錄下分map、nand和nor三個目錄。 init:這個目錄只有main.c和version.c兩個文件。和普通的C程序一樣,vivi將從main函數(shù)開始執(zhí)行。lib:一些平臺公共的接口代碼,比如time.c里的udelay()和mdelay()。include:頭文件的公共目錄,其中的s3c2410.h定義了這塊處理器的一些寄存器。Platform/smdk2410.h定義了與開發(fā)板相關(guān)的資源配置參數(shù),我們往往只需要修改這個文件就可以配置目標(biāo)板的參數(shù),如波特率、引導(dǎo)參數(shù)、物理內(nèi)存映射等。 3.3 Vivi編譯與下載 1)Vivi源代碼的編譯 然后執(zhí)行以下命令進(jìn)行編譯: $> source /tmp/edukit-2410/set_env_linux.sh? Linux編譯環(huán)境變量設(shè)置 $> cd $WORKDIR/vivi $> make clean 圖3.1 vivi編譯 $> make menuconfig?輸入配置smdk2410-amd:Nor Flash boot smdk2410:Nand boot 或 圖3.2 圖形界面下配置內(nèi)核文件 其中,運(yùn)行make menuconfig后,選擇Load an Alternate Configuration file,配置文件名稱如下: smdk2410:編譯 vivi 在 Nand Flash(K9S5608)中運(yùn)行; smdk2410-amd:編譯 vivi 在 Nor Flash(AM29LV160DB)中運(yùn)行。這兩個配置文件在usrlocalsrcedukit-2410viviarchdef-configs中,須復(fù)制 到usrlocalsrcedukit-2410vivi中;或者可以在 menuconfig 中輸入全部路徑。配置好后,輸入:$> make 圖3.3 vivi映像文件生成 如果編過程中沒有出現(xiàn)錯誤,則編譯后的執(zhí)行文件存放于 vivi 目錄下。2)下載: 在下載模式下,vivi為用戶提供一個命令行人機(jī)接口,通過人機(jī)接口可使用vivi提供的一些命令。如嵌入式系統(tǒng)沒有鍵盤和顯示,可以利用vivi中的串口,將其和宿主機(jī)連接起來,利用宿主機(jī)中的串口軟件(如Windows中的超級終端或Linux中的minicom)來控制。第四章 Linux內(nèi)核移植與下載 4.1 Linux內(nèi)核源代碼安裝 linux源代碼安裝 運(yùn)行cygwin,執(zhí)行以下命令完成cygwin 環(huán)境下的Linux源代碼的安裝: $> source /tmp/edukit-2410/set_env_linux.sh Linux編譯環(huán)境變量設(shè)置 $> cd $WORKDIR $> tar –xvjf /tmp/edukit-2410/linux-2.4.18-rmk7-pxa1-mz5-i2c.tar.bz2 $> ls ? kernel ? ?為$WORKDIR 目錄下其他內(nèi)容 圖4.1 linux內(nèi)核安裝 正確解壓后,相比之前可以看到多了一個kernel目錄,即kernel源代碼的安裝目錄,后面的Linux配置及編譯都得在kernel目錄進(jìn)行。 實(shí)驗(yàn)中提供的linux內(nèi)核已經(jīng)包含了Linux源代碼的補(bǔ)丁文件、I2C和網(wǎng)絡(luò)驅(qū)動模塊 4.2 Linux內(nèi)核源代碼分析與移植 4.2.1 Linux源代碼分析 Linux內(nèi)核由5個主要的子系統(tǒng)組成。這5個子系統(tǒng)分別是進(jìn)程調(diào)度(SCHED)、內(nèi)存管理(MM)、虛擬文件系統(tǒng)(Virtual File System,VFS)、網(wǎng)絡(luò)接口(NET)和進(jìn)程間通信(IPC)。 進(jìn)程調(diào)度控制著進(jìn)程對CPU的訪問。當(dāng)需要選擇下一個進(jìn)程運(yùn)行時,由調(diào)度 程序選擇最值得運(yùn)行的進(jìn)程??蛇\(yùn)行進(jìn)程實(shí)際是僅等待CPU資源的進(jìn)程,如果某個進(jìn)程在等待其它資源,則該進(jìn)程是不可運(yùn)行進(jìn)程。Linux使用了比較簡單的基于優(yōu)先級的進(jìn)程調(diào)度算法選擇新的進(jìn)程。 內(nèi)存管理允許多個進(jìn)程安全地共享主內(nèi)存區(qū)域。Linux的內(nèi)存管理支持虛擬內(nèi)存,即在計(jì)算機(jī)中運(yùn)行的程序,其代碼、數(shù)據(jù)和堆棧的總量可以超過實(shí)際內(nèi)存的大小,操作系統(tǒng)只將當(dāng)前使用的程序塊保留在內(nèi)存中,其余的程序塊則保留在磁盤上。必要時,操作系統(tǒng)負(fù)責(zé)在磁盤和內(nèi)存之間交換程序塊。內(nèi)存管理從邏輯上可以分為硬件無關(guān)的部分和硬件相關(guān)的部分。硬件無關(guān)的部分提供了進(jìn)程的映射和虛擬內(nèi)存的對換;硬件相關(guān)的部分為內(nèi)存管理硬件提供了虛擬接口。 虛擬文件系統(tǒng)隱藏了各種不同硬件的具體細(xì)節(jié),為所有設(shè)備提供了統(tǒng)一的接口,虛擬文件系統(tǒng)還支持多達(dá)數(shù)十種不同的文件系統(tǒng),這也是Linux較有特色的部分。虛擬文件系統(tǒng)可分為邏輯文件系統(tǒng)和設(shè)備驅(qū)動程序。邏輯文件系統(tǒng)指Linux所支持的文件系統(tǒng),如ext2、fat等,設(shè)備驅(qū)動程序指為每一種硬件控制器所編寫的設(shè)備驅(qū)動程序模塊。 網(wǎng)絡(luò)接口提供了對各種網(wǎng)絡(luò)標(biāo)準(zhǔn)的存取和各種網(wǎng)絡(luò)硬件的支持。網(wǎng)絡(luò)接口可分為網(wǎng)絡(luò)協(xié)議和網(wǎng)絡(luò)驅(qū)動程序兩部分。網(wǎng)絡(luò)協(xié)議部分負(fù)責(zé)實(shí)現(xiàn)每一種可能的網(wǎng)絡(luò)傳輸協(xié)議,網(wǎng)絡(luò)設(shè)備驅(qū)動程序負(fù)責(zé)與硬件設(shè)備進(jìn)行通信,每一種可能的硬件設(shè)備都有相應(yīng)的設(shè)備驅(qū)動程序 4.2.2 Linux內(nèi)核及硬件模塊驅(qū)動移植 內(nèi)核和文件系統(tǒng)、圖形用戶系統(tǒng)(GUI窗口系統(tǒng))可以分開,它們的開發(fā)、移植、下載甚至運(yùn)行都是可以分開的。內(nèi)核移植是一個比較復(fù)雜的任務(wù),也是嵌入式系統(tǒng)開發(fā)中非常重要的一個過程。內(nèi)核移植一般包括內(nèi)核配置、內(nèi)核編譯和內(nèi)核下載3大步驟。 4.3 Linux內(nèi)核編譯與下載 4.3.1 Linux內(nèi)核源代碼安裝 運(yùn)行cygwin,執(zhí)行以下命令完成cygwin環(huán)境下的Linux內(nèi)核源代碼的安裝: $> source /tmp/edukit-2410/set_env_linux.sh //Linux 編譯環(huán)境變量設(shè)置 $> cd $WORKDIR $> tar –xvjf /tmp/edukit-2410/linux-2.4.18-rmk7-pxa1-mz5-i2c.tar.bz2 $> ls ? kernel ? //?為$WORKDIR 目錄下其他內(nèi)容 正確解壓后,可以看到多了一個kernel目錄,即kernel內(nèi)核源代碼的安裝目錄,后面的Linux內(nèi)核配置及編譯都得進(jìn)入kernel目錄進(jìn)行。實(shí)驗(yàn)中提供的linux內(nèi)核已經(jīng)包含了Linux源代碼的補(bǔ)丁文件、IIC和網(wǎng)絡(luò)驅(qū)動模塊。4.3.2 Linux內(nèi)核的編譯 $> cd kernel 圖4.2 $> make mrproper 清除所有的舊的配置和舊的編譯目標(biāo)文件等 $> make xconfig 在圖形界面下對內(nèi)核進(jìn)行配置(配置方法之一)執(zhí)行make xconfig 后,彈出如圖4.3的內(nèi)核定制界面: 圖4.3 內(nèi)核定制界面 選擇按鈕”Load Configuration from File”,如圖4.4輸入smdk2410: 圖4.4 內(nèi)核配置文件 選擇配置sound ,設(shè)置Sound support為y: 設(shè)置BT878 audio dma為y: 設(shè)置SMDK-2410 audio support為y: 設(shè)置OSS sound modules為y: 根據(jù)提示加載配置文件后,點(diǎn)擊按鈕”Store Configuration to File”,如圖4.5輸入audio1: 圖4.5 存儲配置文件 保存,Save and Exit。如圖4.6 圖4.6 $> make dep //搜索Linux編譯輸出與源代碼之間的依賴關(guān)系并生成依賴文件。 圖4.7 $> make clean //清除構(gòu)造內(nèi)核時生成的目標(biāo)文件、模塊文件和臨時文件。$> make zImage //生成壓縮的內(nèi)核映像文件。 圖4.8 編譯通過后,在/usr/local/src/edukit-2410/kernel/arch/arm/boot/目錄下生成內(nèi)核的壓縮映像文件為“zImage”,此文件是最后要燒寫到開發(fā)板的內(nèi)核映像文件。 4.3.1 Linux內(nèi)核下載 內(nèi)核下載: 1)啟動超級終端(波特率為115200),連好串口線,在開機(jī)瞬間快速按空格鍵,進(jìn)入vivi控制臺命令行下;打開S3C2410&NandFlash_vivi.cfg,在Flash Programmer的Progarm頁中選擇:vivi.bon&load.bin文件進(jìn)行燒寫。如圖4.9 圖4.9 燒寫界面 點(diǎn)擊按鈕Progarm開始燒寫,直到燒寫成功;連接串口到PC機(jī)COM1,運(yùn)行成功;連接串口線到 PC 機(jī) COM1,運(yùn)行光盤中提供的 Windows 超級終端 Hyper Terminal.ht;開發(fā)板重新加電,程序運(yùn)行后,在超級終端上可以看到串口輸出類似以下信息: 圖4.10 超級終端界面 看到以上信息后,表示正在等待用戶從超級終端下載文件。這時,請點(diǎn)擊超 級終端菜單“傳送”選擇 Xmodem 方式下載 vivi.nand 文件,點(diǎn)擊 OK 后等待下載燒寫結(jié)束即可。 圖4.11 添加傳送文件 圖4.12 下載vivi nada 2)在vivi啟動等待中,敲入空格鍵進(jìn)入vivi界面環(huán)境,并輸入以下命令: vivi> load flash kernel x <回車> ?燒寫更新內(nèi)核約4分鐘即可燒寫完畢,如圖4.13 圖4.13 等待下載 3)立即選擇要發(fā)送的文件,比如zImage文件,這里L(fēng)inux環(huán)境下源代碼arch/arm/boot目錄下的zImage內(nèi)核映像文件已轉(zhuǎn)移到 windows某目錄下。要選擇合適的xmodem協(xié)議。以上操作完成 后,單擊“發(fā)送,幾分鐘后即可發(fā)送完畢。 圖4.14 發(fā)送zImage 圖4.15 下載成功 第五章 課程設(shè)計(jì)功能模塊程序設(shè)計(jì)與交叉編譯 5.1 課程設(shè)計(jì)模塊功能 5.1.1 三個模塊: I2S音頻總線接口電路 ;音頻編解碼器芯片udal41; DMA控制器; 5.1.2工作過程: 麥克風(fēng)輸入的模擬音頻信號在音頻編解碼器中經(jīng)過A/D轉(zhuǎn)換和編碼將模擬信號轉(zhuǎn)換成數(shù)字信號,將這些數(shù)字信號先傳給I2S音頻總線接口電路中的FIFO,再由DMA控制器送入DSP中做相應(yīng)的處理,這是錄音的過程;DMA控制器將DSP中存儲的信號傳送給I2S音頻總線接口電路中的FIFO,再發(fā)送給音頻編解碼芯片進(jìn)行D/A轉(zhuǎn)換,通過耳機(jī)輸出模擬信號。 5.2 功能模塊驅(qū)動程序設(shè)計(jì) 5.2.1 關(guān)于驅(qū)動結(jié)構(gòu)體 由于目前許多硬件廠商在出售各種產(chǎn)品時,一般都不帶Linux下的設(shè)備驅(qū)動程序,而且編寫驅(qū)動程序的工作量占整個系統(tǒng)工作量的很大的一部分,這使得Linux下設(shè)備驅(qū)動程序的開發(fā)變得越來越重要。 本課程設(shè)計(jì)不要求自己編寫驅(qū)動程序,但要求分析UDAl341TS驅(qū)動程序,以便編寫出語音采集與播放的應(yīng)用測試程序,同時為以后編寫驅(qū)動程序打好基礎(chǔ)。嵌入式Linux系統(tǒng)下的IIS音頻驅(qū)動程序是在/usr/local/src/edukit-2410/drivers/sound 中,3c2410-uda1341.c 文件即是。 關(guān)于結(jié)構(gòu)體: 在音頻驅(qū)動程序中有2個比較重要的結(jié)構(gòu)體: typedef struct { int size;/* buffer size */ char *start;/* point to actual buffer */(內(nèi)存虛擬地址起始地址)dma_addr_t dma_addr;/* physical buffer address */(內(nèi)存物理地址起始地址) struct semaphore sem;/* down before touching the buffer */ int master;/* owner for buffer allocation, contain size when true */(內(nèi)存大?。?/p> } 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 */(音頻緩沖區(qū)片大?。?/p> u_int nbfrags;/* nbr of fragments */(音頻緩沖區(qū)片數(shù)量)dmach_t dma_ch;/* DMA channel(channel2 for audio)*/ } audio_stream_t;audio_stream_t是一個管理多緩沖區(qū)的結(jié)構(gòu)體,為音頻流數(shù)據(jù)組成了一個環(huán)形緩沖區(qū)。audio_buf_t管理一段內(nèi)存,audio_stream_t管理N個audio_buf_t。 音頻驅(qū)動的兩個file_operations結(jié)構(gòu)定義如下: 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 };這里定義了兩種類型設(shè)備的file_operations結(jié)構(gòu),前者是DSP設(shè)備,后者是混頻器設(shè)備。Linux 內(nèi)核內(nèi)部通過file結(jié)構(gòu)識別設(shè)備,通過file_operations數(shù)據(jù)結(jié)構(gòu)體提供文件系統(tǒng)的入口點(diǎn)函數(shù),也就是訪問設(shè)備驅(qū)動程序里的函數(shù)。file_operations結(jié)構(gòu)體原型是在 read()、write()、open()和ioctl()是struct file_operations結(jié)構(gòu)體中的接口函數(shù)。 1)read()函數(shù):由已打開的文件讀取數(shù)據(jù),即播放。 (1)函數(shù)定義:ssize_t read(struct file *file, char *buffer, size_t count, loff_t * ppos);(2)函數(shù)說明:把參數(shù)file所指的文件傳送count個字節(jié)到buffer指針?biāo)傅膬?nèi)存中;若參數(shù)count為0,則read()不會有作用并返回0;(3)返回值:返回值為實(shí)際讀取到的字節(jié)數(shù),如果返回0,表示已到達(dá)文件尾或是無可讀取的數(shù)據(jù),此外文件讀寫位置會隨讀取到的字節(jié)移動。如果正確會返回實(shí)際讀到的字節(jié)數(shù),最好能將返回值與參數(shù)count作比較,若返回的字節(jié)數(shù)比要求讀取的字節(jié)數(shù)少,則有可能讀到了文件尾、從管道(pipe)或終端機(jī)讀取,或者是read()被信號中斷了讀取動作。當(dāng)有錯誤發(fā)生時則返回-1,錯誤代碼存入errno中,而文件讀寫位置則無法預(yù)期;2)write()函數(shù):將數(shù)據(jù)寫入已打開的文件內(nèi),即錄音。 (1)函數(shù)定義:ssize_t write(struct file *file, const char *buffer, size_t count, loff_t * ppos);(2)函數(shù)說明:把參數(shù)buffer所指的內(nèi)存寫入count個字節(jié)到參數(shù)file所指的文件內(nèi)。當(dāng)然,文件讀寫位置也會隨之移動;(3)返回值:若正確會返回實(shí)際寫入的字節(jié)數(shù);當(dāng)有錯誤發(fā)生時則返回-1,錯誤代碼存入errno中。 3)open()函數(shù):打開音頻設(shè)備。 (1)函數(shù)定義:int(*open)(struct inode *inode, struct file *file);(2)函數(shù)說明:參數(shù)inode為設(shè)備特殊文件的incode(索引結(jié)點(diǎn))結(jié)構(gòu)的指針,參數(shù)file是指向這一設(shè)備的文件結(jié)構(gòu)的指針。open()的主要任務(wù)是確定硬件是否處在就緒狀態(tài),驗(yàn)證次設(shè)備號的合法性,控制使用設(shè)備的進(jìn)程數(shù); (3)返回值:如果打開文件成功,open會返回一個文件描述符,以后對文件的所有操作就可以對這個文件描述符進(jìn)行操作。比如程序中open()函數(shù)的返回值賦給了應(yīng)用程序中的devfd,后面則可以對其進(jìn)行操作;若打開失敗返回負(fù)數(shù)。 4)ioctl()函數(shù):用于設(shè)置編碼比特、采樣頻率和選擇聲道。(1)函數(shù)定義:int ioctl(struct inode *inode, struct file *file,unsigned int cmd, unsigned long arg);(2)函數(shù)說明:設(shè)備驅(qū)動程序中對設(shè)備的I/O通道進(jìn)行管理的特殊控制函數(shù),可以通過它向設(shè)備傳遞控制信息或從設(shè)備取得狀態(tài)信息,實(shí)現(xiàn)用戶程序命令和驅(qū)動命令的相互聯(lián)系; (3)返回值:執(zhí)行成功返回正數(shù),失敗返回-1。 5)s3c2410_uda1341_init()函數(shù):動態(tài)加載驅(qū)動模塊時的初始化函數(shù)。(1)函數(shù)定義:int __init s3c2410_uda1341_init(void); (2)函數(shù)說明:該函數(shù)首先會初始化I/O和UDA1341 芯片,然后申請2個DMA 通道用于音頻傳輸。將輸出音頻緩沖區(qū)的DMA通道設(shè)為通道2,輸入音頻緩沖區(qū)的DMA 通道設(shè)為通道1。最后調(diào)用register_sound_dsp()和register_sound_mixer()兩個函數(shù)來分別注冊驅(qū)動設(shè)備; (3)返回值:初始化成功,返回0;DMA 通道初始化設(shè)置失敗,返回負(fù)數(shù)。6)void __exit s3c2410_uda1341_exit()函數(shù):動態(tài)卸載驅(qū)動模塊時調(diào)用的函數(shù)。 (1)函數(shù)定義:void __exit s3c2410_uda1341_exit(void); (2)函數(shù)說明:注銷音頻設(shè)備,分兩次調(diào)用audio_clear_dma()函數(shù)來分 別釋放已申請的音頻輸入和音頻輸出的DMA 通道; (3)返回值:無。 5.3 功能模塊交叉編譯 用命令Makefile來編譯: 圖5.1 編譯測試文件 將test文件拷貝到D:cygwinusrlocalsrcedukit-2410rootbin中 執(zhí)行以下命令生成新的文件系統(tǒng)映象: $>cd $WORKDIR/ $>$SOURCEDIR/mkcramfs root root.cramfs.new 圖5.2 生成系統(tǒng)映像文件 生成文件系統(tǒng)映象文件root.cramfs.new。第六章 根文件系統(tǒng)建立與文件系統(tǒng)下載 6.1 根文件系統(tǒng)分析 6.1.1 cramfs 目錄結(jié)構(gòu) 一個完整的根文件系統(tǒng)通常包含以下幾個目錄: /bin 應(yīng)用程序存放目錄。 /sbin 系統(tǒng)管理員服務(wù)程序,其中最重要的就是供內(nèi)核初始化之后執(zhí)行的/sbin/init 進(jìn)程。 /lib 存放程序運(yùn)行所需要的動態(tài)庫。/proc 系統(tǒng)狀態(tài)文件目錄。/dev 驅(qū)動程序存放目錄。 /etc 系統(tǒng)配置文件及用戶數(shù)據(jù)存放目錄。 /mnt 用于設(shè)備安裝的目錄,通常包含etc 子目錄和為塊設(shè)備安裝保留目錄。/usr 用于存放用戶程序和配置文件的目錄,可以根據(jù)需要進(jìn)行設(shè)置。一般情況下都要把已經(jīng)規(guī)劃好的目錄結(jié)構(gòu)轉(zhuǎn)換成一個映象文件,即使用命令工具mkcramfs(cygwin下為mkcramfs.exe),把相應(yīng)的cramfs 目錄樹壓縮為單一的映象文件。其命令格式為: mkcramfs [-h] [-e edition] [-i file] [-n name] dirname outfile 使用mkcramfs.exe 在cygwin 下編譯生成文件系統(tǒng)映象文件root.cramfs,再固化到開發(fā)系統(tǒng)FLASH 上運(yùn)行。6.1.2 構(gòu)建cramfs 文件系統(tǒng) 按照本節(jié)實(shí)驗(yàn)原理中自行構(gòu)建一個cramfs 文件系統(tǒng)。運(yùn)行cygwin,執(zhí)行以下命令解壓安裝: $> source /tmp/edukit-2410/set_env_linux.sh //Linux 編譯環(huán)境變量設(shè)置 $> cd $WORKDIR/ 圖6.1 構(gòu)建文件系統(tǒng) $> tar-xvjf /tmp/edukit-2410/root.cramfs.tar.bz2 $> ls ? root ? root 文件夾中就是我們想要的cramfs 文件系統(tǒng) 6.2 文件系統(tǒng)映像文件生成 6.2.1 編譯一個應(yīng)用測試程序test.c 按設(shè)計(jì)原理要求編寫一個應(yīng)用程序test.c,存放在/home/app/audio目錄下,進(jìn)入該目錄后執(zhí)行以下命令編譯鏈接測試程序: $> cd /home/app/audio $> make(也可以編寫Makefile 來編譯) 圖6.2 編譯test文件 6.2.2 拷貝測試程序到文件系統(tǒng)中,并編譯生成文件系統(tǒng)映象 把剛才編譯輸出的test文件拷貝到文件系統(tǒng)所在的工作目錄 root/usr/audio 目錄下,執(zhí)行以下命令生成新的文件系統(tǒng)映象: $> cd $WORKDIR/ $> $SOURCEDIR/mkcramfs root root.cramfs.new 圖6.3 生成映象 剛剛編譯生成的文件系統(tǒng)映象root.cramfs.new 中已經(jīng)包含測試程序。 6.3 文件系統(tǒng)下載 (1)首先SW104 設(shè)為短接(從Nand Flash 啟動),確定已經(jīng)成功燒寫vivi 和linux kernel,加電運(yùn)行可以看到vivi 啟動信息,輸入空格進(jìn)入命令狀態(tài); (2)雙擊運(yùn)行Download.pjf 工程文件(將啟動Embest IDE 環(huán)境),點(diǎn)擊連接Remote connect,程序應(yīng)該正在運(yùn)行(此時命令按鈕STOP 為紅色);在超級終端輸入help 看看有沒有反應(yīng),如果沒反應(yīng),點(diǎn)擊IDE 按鈕:Reset->Start(F5);再輸入help 測試,直到有反應(yīng)為止; (3)如果超級終端可以輸出一些信息,再點(diǎn)擊IDE 中的Stop,配置Debug 的Download 地址為0x30000000,并點(diǎn)擊IDE 菜單Project 選擇Settings 項(xiàng),在Download 頁下拉Category 到Download 項(xiàng),在Download File 選擇root.cramfs.new 文件,路徑為d:Cygwinusrlocalsrcedukit-2410點(diǎn)擊確定后: 圖6.4 選擇加載的文件 首先點(diǎn)擊IDE 菜單DEBUG 選擇Download 下載文件系統(tǒng)映象 約1-2 分鐘 圖6.5 下載成功 其次下載完畢后,點(diǎn)擊Start(F5)然后在超級終端里輸入:load flash root j(燒寫更新文件系統(tǒng)) 圖6.6 燒寫 注意:只能在“vivi的燒寫”和linux內(nèi)核操作完成后,才可以按以上方法正確燒寫root映象到NandFlash。重起實(shí)驗(yàn)板,觀測超級終端窗口提示信息,引導(dǎo)整個系統(tǒng)啟動到linux行命令輸入狀態(tài)。在超級終端輸入一些linux命令查看執(zhí)行結(jié)果是否正確。 6.4 功能模塊運(yùn)行與調(diào)試 重新加電,在超級終端根據(jù)提示啟動Linux,按提示輸入cd bin、./test指令。 圖6.7 輸入指令 圖6.8 在控制臺下運(yùn)行測試程序 程序執(zhí)行完后。如圖6.9。 圖6.9 程序運(yùn)行時超級終端的輸出 第七章 課程設(shè)計(jì)總結(jié)與體會 7.1 得出的結(jié)論 通過按上述步驟執(zhí)行相關(guān)應(yīng)用程序,可以實(shí)現(xiàn)對語音的實(shí)時采集和播放。需改進(jìn)的地方:通過錄制一段語音信息,錄制完成后再播放 7.2課程設(shè)計(jì)過程中遇到的問題及解決方法 1.在給vivi打補(bǔ)丁時,$> patch-p1 2.在圖形界面下進(jìn)行內(nèi)核配置時按實(shí)驗(yàn)指導(dǎo)書配置導(dǎo)致少了sound這一步導(dǎo)致出錯。 3.重新在圖形界面下配置后,發(fā)現(xiàn)無法生成壓縮映像文件。請教研究生后解決了。原來之前配置錯誤生成了boot文件夾,要把之前boot刪掉后重新編譯。4.在調(diào)試時輸入cd bin,./test指令后超級終端無反應(yīng)。查找后發(fā)現(xiàn),原來在根文件系統(tǒng)編譯時沒把生成的test文件復(fù)制到文件系統(tǒng)所在的工作目錄root/bin目錄下。重新編譯后把生成的test文件復(fù)制后在調(diào)試后可以進(jìn)行錄放測試。 7.3 心得體會 課程設(shè)計(jì)剛開始的時候,思緒全無,我真的感到 “書到用時方恨少”,所以又重新把書和實(shí)驗(yàn)指導(dǎo)看了幾遍,對知識系統(tǒng)而全面進(jìn)行了梳理,對許多不理解的地方通過上網(wǎng)搜索翻閱圖書弄懂,終于熟練掌握了基本理論知識,而且領(lǐng)悟諸多平時學(xué)習(xí)沒有注意到的細(xì)節(jié)步驟,學(xué)會了如何思考的思維方式,找到了設(shè)計(jì)的靈感。 雖然每天要頂著30多度的高溫在宿舍跟實(shí)驗(yàn)室之間往返,流了不少汗水,感覺確實(shí)不舒服,可最后看到自己的成果后心里很充實(shí)很高興。 在課程設(shè)計(jì)過程中遇到了這樣那樣的困難。有時候是電腦出問題了,有時候 是實(shí)驗(yàn)箱出毛病,有時候是自己在操作過程中操作錯誤無法繼續(xù),可在研究生學(xué)長和其他同學(xué)的幫忙下都一一解決。使我深深感覺到團(tuán)隊(duì)力量的強(qiáng)大。 最后再次感謝陳老師這學(xué)期兢兢業(yè)業(yè)地給我們傳授知識,感謝三位研究生犧牲自己的時間在炎熱的夏天幫助我們解決遇到的問題! 參考文獻(xiàn) [1]徐英慧,等.ARM9嵌入式系統(tǒng)設(shè)計(jì)——基于S3C2410與Linux[M].北京:北京航空航天大學(xué)出版社,2007.[2]于明,等.ARM9嵌入式系統(tǒng)設(shè)計(jì)與開發(fā)教程[M].北京:電子工業(yè)出版社,2006.[3]田澤.ARM9嵌入式開發(fā)實(shí)驗(yàn)與實(shí)踐[M].北京:北京航空航天大學(xué)出版社,2006.[4]孫天澤,等.嵌入式設(shè)計(jì)及Linux驅(qū)動開發(fā)指南——基于ARM9處理器[M].2版.北京:電子工業(yè)出版社,2007.[5]周立功,等.ARM9&WinCE實(shí)驗(yàn)與實(shí)踐——基于S3C2410[M].北京:北京航空航天大學(xué)出版社,2007.[6]Samsung Electronics.S3C2410A-200MHz & 266MHz 32-Bit RISC Microprocessor USER’S MANUAL Revision 1.0.http://004km.cn [7]魏洪興.嵌入式系統(tǒng)設(shè)計(jì)師教程[M].北京:清華大學(xué)出版社,2006.[8]張紀(jì)坤,等.嵌入式Linux系統(tǒng)開發(fā)技術(shù)詳解——基于ARM[M].北京:人民郵電出版社,2006.[9]吳明輝,等.基于ARM的嵌入式系統(tǒng)開發(fā)與應(yīng)用[M].北京:人民郵電出版社,2004.[10]王田苗.嵌入式系統(tǒng)設(shè)計(jì)與實(shí)例開發(fā)[M].2版.北京:清華大學(xué)出版社,2003.[11]俞建新,等.嵌入式應(yīng)用程序開發(fā)綜合實(shí)驗(yàn)9例[M].北京:清華大學(xué)出版社,2004.[12]許海雁,等.嵌入式系統(tǒng)技術(shù)與應(yīng)用[M].北京:機(jī)械工業(yè)出版社,2002.36第三篇:基于ARM的視頻采集系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
第四篇:基于A8的嵌入式Linux遠(yuǎn)程視頻監(jiān)控系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
第五篇:嵌入式系統(tǒng)語音采集與播放程序設(shè)計(jì)