久久99精品久久久久久琪琪,久久人人爽人人爽人人片亞洲,熟妇人妻无码中文字幕,亚洲精品无码久久久久久久

嵌入式遠程視頻采集系統(tǒng)的設計與實現(xiàn)(基于S3C2410)

時間:2019-05-13 02:08:24下載本文作者:會員上傳
簡介:寫寫幫文庫小編為你整理了多篇相關的《嵌入式遠程視頻采集系統(tǒng)的設計與實現(xiàn)(基于S3C2410)》,但愿對你工作學習有幫助,當然你在寫寫幫文庫還可以找到更多《嵌入式遠程視頻采集系統(tǒng)的設計與實現(xiàn)(基于S3C2410)》。

第一篇:嵌入式遠程視頻采集系統(tǒng)的設計與實現(xiàn)(基于S3C2410)

嵌入式遠程視頻采集系統(tǒng)的設計與實現(xiàn)(基于S3C2410)

發(fā) 布 時 間 : 2008-11-19 來 源 : 中電網(wǎng) 作 者 : 張永強,趙永勇,李崇德 瀏 覽 :

984

多媒體通信技術的發(fā)展為信息的獲取和傳輸提供了豐富的手段,視頻采集是其中不可缺少的重要組成部分,該系統(tǒng)基于S3C2410的ARM9芯片和嵌入式Linux操作系統(tǒng),采用USB攝像頭捕捉視頻,經(jīng)MPEG-4算法壓縮編碼,系統(tǒng)直接與網(wǎng)絡相連,用戶使用標準的網(wǎng)絡瀏覽器和流媒體播放程序即可查看遠程視頻影像。硬件系統(tǒng)

系統(tǒng)硬件平臺選用基于ARM9架構嵌入式芯片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的擴展插座,32位的數(shù)據(jù)總線,保留充分擴展空間。

其中標配模塊包括:IC卡+PS2模塊、IDE硬盤+CF卡模塊、PCMCIA+SD/MMC模塊。另外可選配模塊有:GPS模塊,GPRS模塊,F(xiàn)PGA模塊,CAN+AD+DA模塊、紅外模塊、藍牙模塊、攝像頭模塊。軟件系統(tǒng)

2.1 內核配置與USB攝像頭驅動

假定已經(jīng)搭建好嵌入式Linux的開發(fā)環(huán)境,下面第一步工作就是USB攝像頭的安裝與驅動。首先檢查Linux Kernel中是否已經(jīng)添加了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攝像頭選購時,優(yōu)先考慮Linux內核公開支持的攝像頭芯片,不然要額外編寫相應的USB攝像頭驅動程序,然后進行編譯、安裝。在此選用網(wǎng)眼公司的V3000產(chǎn)品,他采用了OV511的芯片。

確定USB攝像頭被正常驅動后,下一步就是使用Video4Linux提供的API函數(shù)集來編寫視頻采集程序。

2.2 基于V4L設計的視頻采集模塊

在Linux下,所有外設都被看成是一種特殊的文件,稱為設備文件。系統(tǒng)調用是內核和應用程序之間的接口,而設備驅動程序則是內核和外設之間的接口。他完成設備的初始化和釋放、對設備文件的各種操作和中斷處理等功能,為應用程序屏蔽了外設硬件的細節(jié),使得應用程序可以像普通文件一樣對外設進行操作。

Linux系統(tǒng)中的視頻子系統(tǒng)Video4Linux為視頻應用程序提供了一套統(tǒng)一的API,視頻應用程序通過標準的系統(tǒng)調用即可操作各種不同的視頻捕獲設備。Video4Linux向虛擬文件系統(tǒng)注冊視頻設備文件,應用程序通過操作視頻設備文件實現(xiàn)對視頻設備的訪問。

Linux下與Video4Linux相關設備及用途如表1所示。

這里主要針對設備文件/dev/video進行視頻捕捉方面的程序設計。

Linux下視頻采集流程如圖2所示。

其中用到的主要函數(shù)有:

Camera_open():用來開啟視頻設備文件,使用前需要首先聲明一個video_device類型的設備文件。

Camera_get_capability():通過調用ioctl()函數(shù)取得設備文件的相關信息,并存放到video_capability結構里。

Camera_get_picture():通過調用ioctl()函數(shù)取得圖像的相關信息,并且存放到video_picture結構里。

Camera_close():用來關閉設備文件。Camera_grab_image():用來抓取圖像,采用mmap方式,直接將設備文件/dev/video0映射到內存,加速文件I/O操作,還可以使多個線程共享數(shù)據(jù)。

剩下的還有設備初始化、參數(shù)設備等相關函數(shù),不再詳述。

2.3 視頻壓縮編碼模塊

獲取圖像數(shù)據(jù)后,可以直接輸出到FrameBuffer進行顯示,由于本系統(tǒng)要將采集到的視頻影響通過網(wǎng)絡傳輸出去,所以在傳輸之前要對原始的圖像數(shù)據(jù)進行壓縮編碼,在此選用MPEG-4視頻編解碼方案。和其他標準相比,MPEG-4壓縮比更高,節(jié)省存儲空間,圖像質量更好,特別適合在低帶寬條件下傳輸視頻,并能保持圖像的質量。

MPEG-4中基于對象的視頻編碼過程可以分為3步進行:

(1)從原始視頻流中分割視頻對象。

(2)對視頻對象進行編碼,對不同視頻對象的運動信息、形狀信息、紋理信息分配不同的碼字。對輸入的任意形狀的VOP序列,用基于塊的混合編碼技術編碼,處理順序是先IVOP后PVOP,BVOP。在對VOP的形狀信息編碼后,取得任意形狀VOP的采樣,每個VOP劃分為不相交的宏塊,每個宏塊含有4個8×8象素塊進行運動補償以及紋理編碼,已編碼的VOP幀保存在幀存中,在當前VOP幀和已編碼VOP幀之間的計算運動矢量;對將編碼的塊和宏塊,計算他們的運動補償預測誤差;運動補償預測后的IVOP及誤差用8×8塊DCT變換,并進行DCT系數(shù)的量化,然后是游程編碼和熵編碼。

(3)對各個視頻對象的碼流進行復合,每個視頻對象的形狀、運動紋理信息復合成VOL比特流,各視頻對象視頻流復合成統(tǒng)一的碼流輸出。對視頻流進行壓縮編碼以后,接下來就要實現(xiàn)網(wǎng)絡傳輸部分的功能。

2.4 JRTPLIB網(wǎng)絡傳輸模塊

流媒體指的是在網(wǎng)絡中使用流技術傳輸?shù)倪B續(xù)時基媒體,RTP是目前解決流媒體實時傳輸問題的好辦法,JRTPLIB是一個面向對象的RTP庫,他完全遵循RFC1889設計,下面講述如何在Linux平臺上運用RTP協(xié)議進行實時流媒體編程。

2.4.1 初始化 在使用JRTPLIB進行實時流媒體數(shù)據(jù)傳輸之前,首先應該生成RTPSession類的一個實例來表示此次RTP會話,然后調用Create()方法來對其進行初始化操作。RTPSession類的Create()方法只有一個參數(shù),用來指明此次RTP會話所采用的端口號。

2.4.2 數(shù)據(jù)發(fā)送

當RTP會話成功建立起來之后,接下來就可以開始進行流媒體數(shù)據(jù)的實時傳輸了。首先需要設置好數(shù)據(jù)發(fā)送的目標地址,RTP協(xié)議允許同一會話存在多個目標地址,這可以通過調用RTPSession類的AddDestination()、DeleteDestination()和ClearDestinations()方法來完成。目標地址全部指定之后,接著就可以調用RTPSession類的SendPacket()方法,向所有的目標地址發(fā)送流媒體數(shù)據(jù)。

2.4.3 數(shù)據(jù)接收

對于流媒體數(shù)據(jù)的接收端,首先需要調用PollData()方法來接收發(fā)送過來的RTP或者RTCP數(shù)據(jù)報。由于同一個RTP會話中允許有多個參與者(源),因此既可以通過調用GotoFirstSource()和GotoNextSource()方法來遍歷所有的源,也可以通過調用GotoFisstSourceWithDat()和GotoNextSourceWithData()方法來遍歷那些攜帶有數(shù)據(jù)的源。在從RTP會話中檢測出有效的數(shù)據(jù)源之后,接下去就可以調用RTPSession類的GetNextPacket()方法從中抽取RTP數(shù)據(jù)報,當接收到的RTP數(shù)據(jù)報處理完之后,要及時釋放。

JRTPLIB為RTP數(shù)據(jù)報定義了3種接收模塊,通過調用RTPSession類的SetReceiveMode()方法可以設置下列這些接收模式:

RECEIVEMODE_ALL:缺省的接收模式,所有到達的RTP數(shù)據(jù)報都將被接受;RECEIVEMODE_IGNORESOME:除了某些特定的發(fā)送者之外,所有到達的RTP數(shù)據(jù)報都將被接受,而被拒絕的發(fā)送者列表可以通過調用AddToIgnoreList(),DeleteFromIgnoreList()和ClearIgnoreList()方法來進行設置;RECEIVEMODE_ACCEPTSOME:除了某些特定的發(fā)送者之外,所有到達的RTP數(shù)據(jù)報都將被拒絕,而被接受的發(fā)送者列表可以通過調用AddToAcceptList(),DeleteFromAcceptList和ClearAcceptList()方法來進行設置。

2.4.4 控制信息 JRTPLIB是一個高度封裝后的RTP庫,只要PollData()或者SendPacket()方法被成功調用,JRTPLIB就能夠自動對達到的RTCP數(shù)據(jù)報進行處理,并且還會需在要的時候發(fā)送RTCP數(shù)據(jù)報,從而能夠確保整個RTP會話過程的正確性。

在本系統(tǒng)中,使用RTPSession JRTPLIB類庫提供的方法來實現(xiàn)底層的RTP/RTCP操作,并且把他封裝在CrtpTransmitter類中,該類從Media Sink類繼承而來,接收到相應的媒體幀數(shù)據(jù),使用RTPSession類庫的操作把數(shù)據(jù)發(fā)送到網(wǎng)絡上。結語

本系統(tǒng)基于S3C2410平臺和Linux操作系統(tǒng),利用Video4Linux設計采集程序,使用MPEG-4壓縮編碼算法,通過實時流媒體傳輸技術實現(xiàn)了網(wǎng)絡傳輸,整個系統(tǒng)具有穩(wěn)定可靠、安裝簡便、成本低廉等特點,可擴展應用在工業(yè)控制、視頻會議系統(tǒng)、可視電話、遠程監(jiān)控系統(tǒng)等諸多領域。

第二篇:嵌入式視頻采集系統(tǒng)的設計與實現(xiàn)_韓相軍

嵌入式視頻采集系統(tǒng)的設計與實現(xiàn)

首都師范大學% 韓相軍關永王萬森王雪立

Han,Xiangjun Guan,Yong Wang,Wansen Wang,Xueli 摘要!較為理想的嵌入式視頻采集系統(tǒng)是基于!“# 的視頻采集系統(tǒng) & 本文重點闡述了嵌入式視頻采集系統(tǒng)的硬 ’

軟件設計

環(huán)節(jié)以及開發(fā)中的一些關鍵技術問題(首先以

$%”&’()%*+’

構建視頻采集的硬件系統(tǒng) & 詳細介紹了 $,#-.-(’“//0.’.以

及所設計的視頻采集系統(tǒng)原理 & 該系統(tǒng)在 12’3&((控制下能實時將視頻像進行采集 ’

編碼和傳輸)最后提出嵌入式系統(tǒng)的開

發(fā)流程并分析嵌入式系統(tǒng)開發(fā)中的一些問題 * 關鍵詞!視頻采集)嵌入式系統(tǒng))”#$%&’(#)*& 中圖分類號 +“,%-./* 文獻標識碼!0 01234563!45678 69:65565;<56= 27>?@A6 3B3?69 <3 ?C6;<56= 27>?@A6 3B3?69 :7365 =D!”EF ?C6 >7>6A ?@A6 C7A5I7A6 7D5 3=H?I7A6 3B3?69 7D5 3=96 J6B ?62CD=8=GB K@63?<=D3L /? H?@A6 C7A5I7A6 3B3?69 <3 :@<8? @3?@A6 3B3?69 >A86 7A6 ?@A6F 6D2=56 7D5 ?A7D39<2?@A6 A678M?<96 @D56A ?C6 12’3&((N 3 2=D?A=8896D? >A=265@A6 =H ?C6 69:65565 3B3!?69 7D5 3=96 K@63?<=D3 =H ?C6 3B3?69 <3 >@? H=AI7A5 H<8;65?3@48)AB18<<8<;?8453>CD 29238B)“E$%&’(E)*& 文章編號

+.’’FG’HI’J&’’)K’.G&G’’&)G’% 引言

視頻采集系統(tǒng)是數(shù)字圖像獲取的最基本手段 & 是

進行數(shù)字圖像處理 + 多媒體和網(wǎng)絡傳輸?shù)那疤?& 它可

為各種圖像處理算法提供待處理的原始數(shù)字圖像和 算法驗證平臺 & 隨著人們對視頻圖像需求的激增和各 種圖像和視頻新的壓縮標準相繼提出 & 如

QP’*&’QP

’*+’REST’’REST+ 和

UEST’(((等 & 對高性能視頻

采集系統(tǒng)的研究將成為一個熱點 * 按系統(tǒng)的處理器不 同嵌入式視頻采集系統(tǒng)大致可分為三類 VW.X 基于專用

視頻圖像芯片的視頻采集系統(tǒng))W’X 基于 EY 的視頻采 集系統(tǒng))W&X 基于)”E 的視頻采集系統(tǒng) * 基于專用視頻圖像芯片的視頻采集系統(tǒng)其核心 處理單元為專用圖像芯片 & 該圖像芯片決定系統(tǒng)的功 能 & 其應用主要針對某一類產(chǎn)品 $ 如數(shù)碼攝像機 %& 所

以具有一定的局限性 * 而基于 EY 機的視頻采集系統(tǒng)

最為普遍的就是基于視頻采集卡獲取數(shù)字化視頻信 息 & 通過運行相應的 EY 程序實現(xiàn)視頻的采集 ’ 顯示與 存儲 & 但是目前基于 EY 的算法程序通常處理時間較 長 & 很難實現(xiàn)實時的圖像處理應用 * 相比基于專用視頻圖像芯片和基于 EY 的視頻采 集系統(tǒng)而言 & 嵌入式視頻采集系統(tǒng)可完成視頻的實時 采集 ’

傳輸以及各種視頻壓縮算法和圖像處理算法的 實現(xiàn) & 根據(jù)不同的應用 & 可以編制不同的圖像處理程 序 & 所以具有更大的靈活性 & 并且設計與實現(xiàn)簡單 & 硬

件設計一般采用基于)“E 的視頻采集系統(tǒng) F 即 ,YY)Z 視頻信號處理芯片 ZYE[)]E^/SE_)Z)”E-的模式 實現(xiàn) * 其中 & 視頻信號處理芯片進行信號的 /)轉換 & YE_)或 SE_)或 ]E^/ 用于視頻采樣控制 &)“E 對采

集的數(shù)據(jù)進行處理 * 嵌入式視頻圖像采集系統(tǒng)主要包 括硬件設計 ’

軟件設計和操作系統(tǒng) & 個部分 *.嵌

入式視頻采集系統(tǒng)的硬件設計.P.視頻采集系統(tǒng)的基本構成 基于)”E 的視頻采集系統(tǒng)要求對視頻信號具備 采集 ’

實時顯示 & 對圖像的處理和分析功能 * 因此 & 一

個視頻采集系統(tǒng)通常可由如下五部分構成 V 視頻圖像 的采集 ’

視頻圖像的顯示輸出 ’

各種同步邏輯控制 ’ 視

頻圖像的分析和處理 ’

視頻數(shù)據(jù)的存儲 * 因此 & 對于視

頻采集系統(tǒng)的基本構成可用圖.所示框圖描述 * 圖.視頻采集系統(tǒng)的基本框圖

韓相軍 # 碩士研究生

北京市自然科學基金資助項目 $*’)&’’-%)北京市教委

科技發(fā)展計劃面上項目 $7E&’’).’’&F’.%%)北京市高 等學校 &’’H

教育教學改革立項項目 $&’’H’IH% 嵌入式系統(tǒng)應用 中文核心期刊!微計算機信息 “(嵌入式與 SOC)2006 年第 22 卷第 1-2 期 360元 / 年郵局訂閱號 # 82-946!!”# 格式輸出 $ 數(shù)據(jù)輸出格式是通過 $%& 總線編程來 選擇的 $’()*+,-的內部寄存器初始化也通過 $.& 串

行接口來完成 % 對于不同的輸入制式 & 不同的采集要

求和不同的處理要求 $ 其幀緩存要求是不相同的 $ 如 對于)/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ù) % 其中

DBEBFG DH.I<--J)K/ 實現(xiàn)以下四 點功能 # L+M 完成系統(tǒng)中視頻采集和輸出部分的同步信號 和消隱信號的控制 $ 其中主要包括 ’(),+,-和

C//:+%+ 的行同步信號 & 場同步信號 & 消隱信號 ’ L%N 將部分邏輯單元設計為 J$JO 作數(shù)據(jù)緩存 $ 完 成外接 J$JO 的同步讀寫控制 $ 承擔 ’#),+,-與 2C)的數(shù)據(jù)傳送工作 ’ P

’=C<.-2=78.與計

算機的數(shù)據(jù)通信工作以及從計算機加載各種圖像處 理算法 ’ L8N 對

’#)*+*-輸出的數(shù)字圖像進行預處理 $ 其中

主要包括圖像數(shù)據(jù)的色度空間轉換如!3# 到 4K5 的 轉換 $ 數(shù)據(jù)格式轉換如將 89.9.轉換為 89.9-’ L*N 作數(shù)據(jù)總線接口 $ 實現(xiàn)數(shù)據(jù)的驅動傳輸?shù)裙δ?% ’=C<.-2=78.在系統(tǒng)中是各類算法實現(xiàn)的核心 器件 $ 根據(jù)不同的應用場合 $ 可以編制不同的算法處 理程序 $ 使得該系統(tǒng)具有了很強的靈活性與通用性 % 值得強調的一點是為了便于操作系統(tǒng)中的其它外設 $ 在該系統(tǒng)中 $’=C<.-2=78.的外部存儲器接口控制

寄存器必須配置為優(yōu)先使用外部存儲器模式 %!嵌

入式視頻圖像采集系統(tǒng)的軟件 設計

一個完整的嵌入式系統(tǒng)由圖 < 所示的 8 部分來 組成 % 圖 < 嵌入式系統(tǒng)組成 圖 < 中的底層是硬件系統(tǒng) $ 核心是嵌入式處理器(嵌入芯片)$ 通常這樣構成的系統(tǒng)又被稱為是 CO& LC?I@AQ RF &SBTN 系統(tǒng) % 在硬件系統(tǒng)的上面是 5C)L 板級 支持包 N$ 包括各種必要的對底層硬件系統(tǒng)的屏蔽 $ 引

導上層操作系統(tǒng)在硬件系統(tǒng)上的正確運行 % 操作系統(tǒng)

正確運行之后還需要開發(fā)各種設備驅動程序 $ 目的是

給用戶的應用程序開發(fā)提供對底層設備的屏蔽 $ 提供

一個統(tǒng)一的用戶開發(fā)接口 L/)$N% 5C)是指系統(tǒng)內核在特定的硬件系統(tǒng)上面運行所 需要的初始化代碼和各種設備驅動程序 % 它主要包 括 # 系統(tǒng)初始化 $ 初始化 &)3 寄存器和測試 &)3 的型 號版本等 $ 它和

5RR@ERUVAW 中的初始化部分共同完成 所有的系統(tǒng)準備工作 $ 使得系統(tǒng)處于預期的穩(wěn)定工作 狀態(tài) ’

內存管理 $ 在沒有 ==”L 內存管理單元 N 的系統(tǒng)

里面主要是數(shù)據(jù) HUHSA 和程序 HUHSA 的管理 $ 在具有 ==“ 單元的系統(tǒng)中還要包括 ==” 的各種表的管理 $ 它主要用來實現(xiàn)內存的映射 ’

中斷控制器管理 $ 對于 一個 4’OC 來說 $ 中斷是不可缺少的部分 % 嵌入式操作系統(tǒng)相關技術已經(jīng)成熟 $ 由于 0BFXG 具有源碼開放 & 開發(fā)工具豐富 & 技術支持廣泛等特點 $ 視頻圖像采集系統(tǒng)選用嵌入式 0BFXG 操作系統(tǒng) LYQ# >AVVAV 0BFXG OTAWU@BRF C?I@AQN% 0BFXG 中的中斷管理

包括中斷號的申請和釋放 & 中斷屏蔽和中斷服務 & 中

斷向量分配等 $ 時鐘和設備驅動程序 % 驅動程序是利用操作系統(tǒng)提供的接口 $ 完成對底 層硬件的操作 % 驅動程序的開發(fā) $ 是在操作系統(tǒng)提供 的接口基礎上編寫對底層硬件的操作和控制程序 $ 然

后加入到操作系統(tǒng)的內核 % 用戶對某一個設備的訪 問 $ 首先是將用戶的各種操作傳遞給操作系統(tǒng) $ 然后

由操作系統(tǒng)調用設備的驅動程序 $ 完成對硬件的各種 數(shù)據(jù)傳輸 $ 所以驅動程序必須要告訴操作系統(tǒng)該硬件 的各種操作程序的入口地址 % 特別對于 0BFXG 下的驅 動程序開發(fā) $ 經(jīng)過調試通過的驅動程序可以編譯為一

個模塊動態(tài)地裝載入操作系統(tǒng)內核或者從操作系統(tǒng) 內核中刪除 Z 因此驅動程序在 0BFXG 中是可以作為內 核的一部分來編寫 % 對于用戶程序開發(fā) $ 與通用)& 上面開發(fā)應用程 序類似 % 但是在嵌入式應用中 $ 應用程序一般是作為

文件系統(tǒng)的一部分加入到操作系統(tǒng)的內核 $ 然后重新 編譯內核 $ 最后生成一個可以執(zhí)行的二進制壓縮映像 文件加載到系統(tǒng)的存儲空間 % 加載的加入了用戶應用

程序的操作系統(tǒng)一般還必須固化 $ 燒到系統(tǒng)的 JEUIS 中 % 在系統(tǒng)運行時 $ 根據(jù)操作系統(tǒng)的 $*$’

函數(shù)轉到用 戶程序執(zhí)行 % “結 論 基于 2C)的視頻采集系統(tǒng) $ 由于可以靈活的修改 其圖像處理算法 $ 它的應用主要面向用戶的特定需求 和對實時性有較高要求的場合 % 隨著技術的 L 見 +8;頁 N

BSP

嵌入式系統(tǒng)應用!現(xiàn)場總線技術應用 200 例.;”!“# 基于 $%& 的視頻采集系統(tǒng) 圖 # 給出了基于 ’(%)#*$(+,# 與

’-&.!./ 構

成的視頻采集系統(tǒng) ”’(%)#/$(+,# 可以直接和視頻 編解碼器接口 “ 該系統(tǒng)可同時完成四路視頻圖像的實 時采集 # 傳輸以及各種視頻壓縮算法和圖像處理算法 的實現(xiàn) ” 根據(jù)不同的應用 “ 可以編制不同的圖像處理 程序

$ ’(%)#/$(+,#

有自己的圖像處理庫函數(shù) ” 可以 實現(xiàn)各類圖像處理算法 $ 因此 “ 該系統(tǒng)具有更大的靈 活性與通用性 $ 圖 # 基于 ’-&.!./ 與 $%& 的視頻采集系統(tǒng)!”#“!’(%)#/$(+,# 簡介

’(%)#/$(+,# 是 ’0 推出的一款面向數(shù)字多媒體 應用的 $%&” 它在 ’0 的

1+,2 $%& 內核基礎上進一步 集成了完備的視頻 3 音頻輸入 3 輸出接口 % 以太網(wǎng)接口 # &104++ 總線等片上外設 “ 不僅能使用戶很方便地對音 頻 5 視頻等各種復雜的運算進行高速處理 ” 還能為方 便 # 無縫地接口視頻 3 音頻編解碼器件和以太網(wǎng) 3&10 總

線等數(shù)據(jù)傳輸接口 & 因此 “ 它非常適用于-60&% 數(shù)字視 頻服務器 % 多通道數(shù)字視頻錄像機 7$-89% 多通道數(shù)字 視頻監(jiān)控等應用 & $(+,# 的程序 3 數(shù)據(jù)空間以字節(jié)為單位進行統(tǒng)一 編址 ” 整個尋址空間為 ,:8& 其片上存儲器 % 片上外 設 % 及外部存儲器接口 7;(0<9 均映射到此 ,:8 的空間 中 & $(+,# 通過外部存貯器接口 7;(0<9 訪問片外存儲 器

7<=>?@%%$AB(%CBA’%B’B9“ 如圖 # 所示 ”$(+,# 共有三個視頻口 “ 分別為-&/%-&!和

-&#&-&/ 與-&!則與

(D8%&%(DB%& 復用引腳的 ” 其功能選擇由 $(+,# 上的外設配置寄存器 7&;A1<:9 進行配置的 & $(+,# 支持多種外部接口!&10 接口 %E&0 接口和以太 網(wǎng)(B1 接口 “ 這些接口信號復用相同的引腳 ” 它們的

功能選擇和配置是在上電復位時通過檢測 $(+,# 上 的特殊引腳

7&10F;G%(B1F;G%E$.%&10F;;B09 的狀

態(tài)來實現(xiàn)的 &!H#“# 視頻 B3$ 采樣電路!’-&.!./ 在圖 # 系統(tǒng)中 ”’-&.!./ 是由 ’0 公司推出的一款 高性能視頻解碼器 “ 可將

G’%1%&BI 視頻信號轉換成 數(shù)字色差信號 7JC-,K#K#9” 支持兩個復合視頻或一個 % 端子輸入 & 輸出格式為 0’C 4A 8’L+.+“ 并支持

(>DM6NO?O6P ’(復制保護以及高級的-80 功能 & 不僅如 此 ”’-&.!./ 還具備了封裝小 7)# 腳的

’Q<&9% 功耗小 的特點 7R!./ST9& 因此 “ 它非常適用于便攜 % 批量大 % 高質量和高性能的視頻產(chǎn)品 & ’-&.!./ 可接受 # 路復

合視頻信號 71-8%9 輸入和!路超級視頻信號 7%U-OVW6 即

%XYWMU-OVW6”J319 輸入 & 該芯片包含一個擴展端口 ’ZU 端口(用于數(shù)字視頻 ’

雙向半雙工(“ 它可直接連接 倒(&;: 或視頻電話進行編解碼 $ ’-&.!./ 的圖像端 口 ’0U 端口(支持 [ 位或!+ 位的輸出數(shù)據(jù)并帶輔助參 考數(shù)據(jù)可直接與-:B 控制器接口 $ ’-&.!./ 提供 0 # 1 總線接口 ” 其最高傳輸速率為 ,//]O^?_?“ 通過它可以

完成芯片的初始化以及設置修改等操作 $ ’-&.!./ 作 為 0 # 1 總線的從設備 ” 最多可配置為 # 個不同的從設 備地址 “ 一條 0 # 1 總線只能同時訪問 # 個

’-&.!./ 配 置口 ” 所以 $(+,# 可以連接 , 個

’-&.!./“ 進行 , 路

視頻輸入 $!H#H)視頻 $_B 電路!%BB‘!#!圖 # 系統(tǒng)中視頻 $_B 由視頻編碼器 %BB‘!#!完 成

$ %BB‘!#!支持 &BI 與 G’%1

格式的視頻編碼 ” 其

輸入支持 8’H+.+

格式的數(shù)字視頻 $ %BB‘!#!有!路

復合視頻 71-8%9 輸出和!路超級視頻

7%U-OVW6“J_19 輸 出 ” 其系統(tǒng)像素時鐘頻率為!)H.(Ea“ 它可以直接接收(&;: 解碼數(shù)據(jù)和采用 ,K#K# 格式每行 ‘#/ 有效像素 的 110A 兼容 JC-數(shù)據(jù) ” 其內部包含同步 _ 時鐘產(chǎn)生

器和數(shù)模轉換器兩部分電路 $ %BB‘!#!

同樣需要通過 0 # 1 總線進行初始化和設置修改等操作 $ 從圖 # 中可看出 “-&/ 既要做視頻輸入口 ” 也要支

持視頻輸出口 “ 即-&/ 可以工作在 1>Y^XMW 與

$O?Y=>b 兩種作模式 $ 但這兩種工作模式不能同時使用作模式 不能同時使用 $ 當-&/ 作為 [U 位的 8’H+.+ 視頻采集 口時 ” 僅需視頻數(shù)據(jù)流串行時鐘和采集使能控制信 號 “ 串行數(shù)據(jù)流串行時鐘由 ’-&.!./ 的 %1Ic” 采集使

能控制信號則由 ’-&.!./ 的

0G’A;Q_:&1I_-8Ic 引

腳配置為通用輸出引腳來控制 “ 此時 %BB‘!#!E 不起 作用 $ 當-&/ 作為 [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_$ 轉換 ” 為后續(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)應用)變頻器與軟啟動器應用 200 例 * #‘中文核心期刊!微計算機信息 ”(嵌入式與 SOC)2006 年第 22 卷第 1-2 期 360元 / 年郵局訂閱號 # 82-946!!模糊量 $ 可歸納一系列控制規(guī)則 $ 例如規(guī)則!“ #$ %&!’(!)* +,-.&/!’ +!0* 1234 5!’ 6!7 %!8)909%%9:* : 為規(guī)則數(shù) $+!)&+;0&% 及 6!為語言變量 $ 則由第;條規(guī)則構成的模糊關系為 # 6!* >.+!0 > 6!* 而對于一定 &? 和 &/?$ 相應的輸出為 # 5!8@&?>.+!= >6!*A > @&/?>.+!B > 6!*A 則

#585!.!8)$0$%$:* 圖 C 模糊控制框圖 根據(jù)控制經(jīng)驗 $ 將其中將語言變量分成七級 # 正 大.D6*$ 正中.DE*$ 正小.DFG$ 零.H*$ 負小.,F*$ 負中.,E*$ 負大.,6*’

在實際控制中 $ 由于被控對象只能接受一個 確定的控制信號 $ 而模糊推理是一個模糊集合 $ 因此 $ 必須建立精確量和模糊量之間的轉換關系 9 即從輸出 的模糊集合中 $ 判決出一個精確量(在此采用固定量 化因子 & 比例因子及隸屬度最大原則 $ 進行離散推理 $ 求出各相應的控制表 $ 并將數(shù)據(jù)存入-FD 內存 $ 以便 在線使用 $ 實施實時控制(圖 I 1J 中斷采樣子程序 軟件采用定時器 1J 中斷方式 9 中斷服務子程序如 圖 I 所示(系統(tǒng)每隔一個時間段進行一次中斷 9 啟動!K ” 轉換 9 同時完成數(shù)據(jù)采集 & 數(shù)字 #$“ 控制 & 控制量輸 出 & 溫度顯示及數(shù)據(jù)保存等功能(定時器 1)中斷 $ 為-FD 處理器和計算機通訊 $ 發(fā)送數(shù)據(jù) $ 便于計算機繪制 溫度跟蹤曲線 $ 鍵盤中斷 $ 完成鍵盤掃描和獲取鍵值(此外 9 為了減小系統(tǒng)在平衡位置的振蕩 9 在軟件上采取 了數(shù)據(jù)濾波 & 設定死區(qū)等措施(!結 語 基于-FD0LJM 模糊 N 數(shù)字 D;O 差熱天平采用計算 機控制技術 $ 能夠實現(xiàn)溫度發(fā)控制 $ 并在液晶屏和計

算機上實時顯示溫度及溫度跟蹤曲線(實驗中對控制

算法進行多次實驗和調整 9 取得了很好的控制效果 $ 達

到了預期的設計目的(參考文獻 @)A 安穎 9 劉麗娜 P 基于-FD 的高速信號采集與處理系統(tǒng)的設計)Q*% 微計 算機信息

$0JJC9)RCMNCS @0A 孫增圻 $ 等 P 智能控制理論與技術 @EAP 北京 # 清華大學出版社 $)SSMP @TA 于海生 $ 等 P 微型計算機控制技術 @EAP 北京 # 清華大學出版社 $)SSSP @LA 張念淮 $ 等 P 5F6 總線接口開發(fā)指南 @EAP 北京 # 國防工業(yè)出版社 $0JJ)作者簡介 # 李智強 $ 男

$)SMI&$ 河南工業(yè)大學電氣工程 學院 $ 碩士(籍貫 # 山東 + 郭廣靈 $ 女 $)SM)&$ 河南工業(yè)

大學電氣工程學院 $ 高級實驗師(,!”###$ 河南鄭州河南工業(yè)大學電氣工程學院韓相軍

關永王萬森王雪立 %<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

《 #’(技術應用)** 例》

DSP 開發(fā)與應用)LV

第三篇:基于ARM的視頻采集系統(tǒng)的設計與實現(xiàn)

基于ARM的視頻采集系統(tǒng)的設計與實現(xiàn)

摘要

本文根據(jù)家庭視頻采集系統(tǒng)的要求,提出一種基于ARM的網(wǎng)絡視頻采集方案。方案要求視頻的實時傳輸、實時監(jiān)控。本系統(tǒng)以Intel Xscale 芯片和嵌入式Linux系統(tǒng)為平臺,在平臺中搭建網(wǎng)絡視頻服務器,并以它為中介,負責將USB攝像頭采集到得視頻數(shù)據(jù)傳輸?shù)骄W(wǎng)絡服務器中,最后發(fā)送到申請監(jiān)控的遠程PC機中,遠程PC只需在網(wǎng)頁中便能實時的看到監(jiān)控端的視頻圖像。

論文首先闡述了嵌入式網(wǎng)絡視頻采集技術的發(fā)展、現(xiàn)狀和前景,然后介紹了嵌入式硬件系統(tǒng)結構和嵌入式Linux操作系統(tǒng)的特點,闡述了嵌入式硬件整體結構,使大家大體的完整的對系統(tǒng)硬件有詳細的了解,實際記錄了嵌入式操作系統(tǒng)內核的編譯和移植,介紹了Bootloader的基本原理和啟動過程,實現(xiàn)了視頻采集程序的編譯和移植,研究了嵌入式一般驅動程序的使用。隨后,本文詳細描述了視頻采集程序的整體結構框圖和具體功能代碼塊、網(wǎng)絡通信編程技術、圖像編解碼、嵌入式視頻服。

關鍵詞:ARM;嵌入式;Linux;視頻采集

I

目錄

摘 要.............................................................................................................................I 第1章 引言.................................................................................................................1

1.1 課題的背景和來源..........................................................................................1 1.2本文的內容及主要工作..................................................................................1 第2章 嵌入式ARM系統(tǒng)硬件結構簡介..................................................................3

2.1 視頻監(jiān)控系統(tǒng)結構簡介..................................................................................3 2.2 ARM處理器簡介.............................................................................................3 2.3 XSCALE體系結構............................................................................................4 2.4 主要硬件電路說明..........................................................................................7 第3章 嵌入式ARM系統(tǒng)軟件結構..........................................................................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 內核移植...................................................................................12 3.3.3 嵌入式文件系統(tǒng).................................................................................13 3.4 LINUX下的程序調試.....................................................................................14 第4章 USB設備驅動程序設計...............................................................................15 4.1 設備驅動程序簡介........................................................................................15 4.2 LINUX下驅動程序的實現(xiàn).............................................................................18 4.3 USB攝像頭驅動程序設計............................................................................20 第5章 視頻采集功能的設計...................................................................................23 5.1 基于V4L的編程...........................................................................................24 5.1.1 攝像頭相關數(shù)據(jù)結構.........................................................................24 5.1.2 攝像頭基本功能實現(xiàn).........................................................................25 5.1.3 視頻數(shù)據(jù)采集.....................................................................................29 5.2 圖像編解碼....................................................................................................32 5.2.1 編解碼介紹.........................................................................................32 5.2.2 系統(tǒng)壓縮技術.....................................................................................33

第1章引言

1.1課題的背景和來源

二十一世紀的網(wǎng)絡化、數(shù)字化讓人們的生活每天都發(fā)生著翻天覆地的變化,獲取信息的方便和快捷可以使人們在信息化的今天領先一步創(chuàng)造出巨大的利益,而獲取信息的重要途徑就是眼睛。據(jù)統(tǒng)計,人類采集信息的80%來自視覺。圖像和視頻是對客觀事物生動、形象的描述,是一種最直觀的表現(xiàn)方式。而視頻監(jiān)控技術因為它方便快捷、生動形象、信息豐富等特點日益受到人們的青睞,并在各行各業(yè)得到廣泛的應用。與此同時,現(xiàn)代網(wǎng)絡和數(shù)字技術的快速發(fā)展也為視頻監(jiān)控技術的發(fā)展奠定了堅實的基礎。

二十一世紀,嵌入式技術、多媒體處理技術進一步發(fā)展,為視頻監(jiān)控系統(tǒng)的發(fā)展提供了新的出路——嵌入式視頻監(jiān)控系統(tǒng)。嵌入式系統(tǒng)是以應用為中心,軟硬件可以剪裁,具有高穩(wěn)定、低成本、功耗低、速度快、實時好的專用計算機系統(tǒng),它由嵌入式微處理器,配以周邊硬件設備,接口電路組成。嵌入式系統(tǒng)內部使用嵌入式操作系統(tǒng),安裝專用的功能軟件。嵌入式技術把硬件和軟件集于一體,獨立工作。嵌入式視頻監(jiān)控系統(tǒng)比其他視頻采集系統(tǒng)在布局區(qū)域范圍上要廣泛;由于使用IP技術,嵌入式視頻監(jiān)控技術比其他視頻采集系統(tǒng)更具緊密的結合度,能夠充分利用現(xiàn)代網(wǎng)絡技術的成果,并能構成復雜的視頻監(jiān)控網(wǎng)絡;性能上,嵌入式視頻采集系統(tǒng)繼承了嵌入式技術的優(yōu)點,非常適合自動化的環(huán)境。

因此,嵌入式視頻采集技術正在我國快速的發(fā)展,積極的研究會加強我們在這方面技術的學習,也會為視頻監(jiān)控技術的發(fā)展貢獻力量。

1.2本文的內容及主要工作

根據(jù)畢業(yè)設計的初衷,我們需要設計基于ARM的網(wǎng)絡視頻采集系統(tǒng)。在監(jiān)控系統(tǒng)中,視頻采集、傳輸、播放的功能不是由專門視頻處理芯片完成,而是由軟件實現(xiàn)。

論文首先介紹了嵌入式ARM系統(tǒng)的硬件結構和軟件結構,方便大家熟悉ARM和Linux系統(tǒng),包括嵌入式設備的硬件結構,邏輯框圖和Linux的基本操作、安裝方法;第二,研究了嵌入式的一些驅動程序,主要是攝像頭驅動程序

V4L,系統(tǒng)中選用的攝像頭芯片——中星微301;第三,研究了視頻監(jiān)控的具體流程和實現(xiàn)方式,讓大家在總體上對整個系統(tǒng)有一個大概的認知。

本次設計的目的只有一個,就是實現(xiàn)視頻的實時監(jiān)控。圍繞它,不管是硬件結構還是軟件流程,都需要學習和研究,不斷調試,決不放棄。

總之,論文的內容都是圍繞如何建立一個視頻采集系統(tǒng)。無論是從哪個方面,我們都是為這個目標而努力。2

第2章嵌入式ARM系統(tǒng)硬件結構簡介

2.1視頻監(jiān)控系統(tǒng)結構簡介

網(wǎng)絡視頻監(jiān)控系統(tǒng)是基于嵌入式技術設計的。嵌入式并沒有統(tǒng)一的定義,但目前有一個廣泛而又被認可的規(guī)范:將軟件產(chǎn)品固化到硬件平臺上,完成應有的功能既是嵌入式。

基于嵌入式ARM技術的視頻監(jiān)控系統(tǒng)服務器端采用攝像頭不斷的采集圖像,壓縮成視頻流,然后通過網(wǎng)絡發(fā)送到申請監(jiān)控的客戶端。監(jiān)控系統(tǒng)的使用者可以在遠程實現(xiàn)網(wǎng)頁上的實時監(jiān)控和一些簡單的功能操作。系統(tǒng)整體結構如圖2.1所示[1]。

LCDJTAG攝像頭ZC301CPU單元Intel Xscale以太網(wǎng)控制器遠程PC客戶端SDRAMFLASH

圖2.1 系統(tǒng)整體結構圖

該系統(tǒng)中CPU采用基于ARM的PXA270微處理器,通過在其上運行Linux操作系統(tǒng),執(zhí)行Boa視頻服務器,接受并處理來自攝像頭的圖像信號,通過以太網(wǎng)控制器發(fā)送至遠端,實現(xiàn)視頻數(shù)據(jù)的遠程傳輸和接受,達到視頻監(jiān)控的目的[2]。

2.2ARM處理器簡介

ARM,既是一個公司的名字,也是對一類微處理器的通稱。ARM嵌入式微處理器是全球領先的16/32位RISK處理器芯片知識產(chǎn)權設計供應商ARM(AdvancedRISKMachines)公司的產(chǎn)品。ARM公司本身不直接從事芯片生產(chǎn),而是依靠轉讓設計許可,由合作公司生產(chǎn)各具特色的芯片。

ARM處理器以其完整的體系結構,極小的體積、極低的功耗、極低的成本、極高的性能,及時根據(jù)嵌入對象的不同進行功能上的擴展的優(yōu)勢,在眾多種類的嵌入式微處理器中脫穎而出。基于ARM技術的微處理器應用占據(jù)了32位RISC微處理器75%以上的市場份額,ARM技術正在逐步滲入到我們生活的各個方面。

采用RISC架構的ARM微處理器一般具有如下特點:

(1)采用固定長度的指令格式,指令規(guī)整、簡單、基本尋址方式有2~3種;(2)使用單周期指令,便于流水線操作執(zhí)行;

(3)大量使用寄存器,數(shù)據(jù)處理指令只對寄存器進行操作,以提高指令的執(zhí)行效率;

(4)所有的指令都可根據(jù)前面的執(zhí)行結果決定是否被執(zhí)行,從而提高指令的執(zhí)行效率;

(5)可用加載/存儲指令批量傳輸數(shù)據(jù),以提高數(shù)據(jù)的傳輸效率;(6)可在一條數(shù)據(jù)處理指令中同時完成邏輯處理和移位處理;(7)在循環(huán)處理中使用地址的自動增減來提高運行效率。

目前,ARM處理器有ARM7、ARM9、ARM9E、ARM10、ARM10E、SecurCore、StrongARM和XScale等系列。每個系列除了具有ARM體系結構的共同特點以外,都有各自的特點和應用領域。

2.3XScale體系結構

Xscale核是采用ARM V5TE架構的處理器,是Intel公司的StrongARM的升級換代產(chǎn)品,它具有高性能、低功耗等特點,并在流水線設計、DSP處理和指令設計中有很大改進[3]。ARM的體系結構是基于RISK的,XScale是ARM處理器的一種,所以XScale具有RISK的基本特性。而且針對嵌入式系統(tǒng),XScale構架還引入了Pentium處理器工藝和系統(tǒng)結構技術,實現(xiàn)了Pentium微處理器體系結構的一系列高性能技術,達到了高性能、低功耗和小體積等嵌入式系統(tǒng)要求的特性。它的特點有:超流水線、高主頻、存儲體系、分支預測和指令集體系結構。本設計采用的就是基于英特爾Xscale構架的一種32位嵌入式處理器,它除了應用于掌上電腦之中外,還可以應用于智能手機、網(wǎng)絡存儲設備、骨干網(wǎng)路由器等電子設備。

PXA27x系列處理器是英特爾當前最新推出的嵌入式處理器。它的時鐘頻率從312到624MHz不等,并內建64MB的堆棧型Intel StrataFlash內存。內置了英特爾的無線MMX技術,能夠顯著提升多媒體性能。

OURS-PXA270-EP是一款基于INTEL XSCALE PXA270處理器,針對高效

嵌入式系統(tǒng)教學和實驗科研的平臺。這款設備主要包括核心板與底版兩個部分,核心板主要集成了高速的PXA270 CPU,配套的存儲器,網(wǎng)卡等設備;底版主要是各種類型的接口與擴展口。

核心板(8層PCB電路)系統(tǒng)包括:

CPU: INTEL PXA270(520M),支持GDB調試; SDRAM: 64M 工作在104M外頻上; FLASH: 32M INTEL Nor FLASH;Net: 10/100M Ethernet controller(LAN91C111);SUPERIO: WINBOND 83977;CPLD: XILINX 95144(117USER IO);總線驅動器: 若干;核心板正面如圖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)標準并口:1個 PCMCIA: 1個 IDE:1個 SD/MMC: 1個 SMC:1個 CAMERA:1個 96PIN功能擴展口:2個 4X5 小鍵盤

CPU_JTAG CPLD_JTAG LED SHARP LQ080V3DG01 8寸真彩LCD

640X480 VGA 640X480 LED 8X8點陣

一組7段LED數(shù)碼管

4個

串口irda串口串口串口LCD接口LCD接口并口VGALED點陣音頻1音頻2音頻3PCMCIA 卡LED數(shù)碼管SMC 卡核心板SDPSPSUSBUSB485NET鍵盤 圖2.4 底版圖

2.4主要硬件電路說明

嵌入式設備除了以ARM芯片為主要控制單元,也有很多周邊電路和外圍設備,它們有的幫助ARM處理信號、有的負責存儲數(shù)據(jù)、有的進行網(wǎng)絡連接、有的用來數(shù)據(jù)通信,這些周邊設備缺一不可,不能替代。

首先介紹CPU核心總線[4],總線是CPU和其他設備的橋梁。CPU是通過總線信號來控制SDRAM ,FLASH,網(wǎng)卡,SUPERIO等外部設備的,無論是低速還是高速,只要是與總線相關的芯片,都要和CPU總線信號有關。其次,研究嵌入式系統(tǒng)內存——SDRAM。SDRAM是嵌入式系統(tǒng)的內存,具有單位空間存儲容量大和價格便宜的優(yōu)點,已廣泛應用在各種嵌入式系統(tǒng)中。當系統(tǒng)啟動時,CPU首先從復位地址0x0處讀取啟動代碼,在完成系統(tǒng)的初始化后,程序代碼一般應調入SDRAM中運行,以提高系統(tǒng)的運行速度。同時,系統(tǒng)及用戶堆棧、運行數(shù)據(jù)也都放在SDRAM中。SDRAM的存儲單元可以理解為一個電容,總是傾向于放電,為避免數(shù)據(jù)丟失,必須定時刷新(充電)。因此,要在系統(tǒng)中使用SDRAM,就要求微處理器具有刷新控制邏輯,或在系統(tǒng)中另外加入刷新控制邏輯電路。PXA270芯片在片內具有獨立的SDRAM刷新控制邏輯,可方便地與SDRAM接口。除了SDRAM,F(xiàn)LASH也是一種存儲媒介。FLASH一般具有NOR型和NAND型。NAND型FLASH單元密度高,寫入和擦除速度非常快,而且一般NAND型FLASH的存儲容量很大。NOR型FLASH的優(yōu)點是芯片內執(zhí)行命令,這樣應用程序可以直接在FLASH內運行,不用進入內存,使得它的傳輸效率很高。嵌入式設備最大的優(yōu)點就是網(wǎng)絡功能強大,它能像PC一樣方便地連接到互聯(lián)網(wǎng)上,這些功能都是網(wǎng)絡控制器的作用。也就是Ethernet Controller,本系統(tǒng)采用SMSC公司的單芯片的網(wǎng)絡控制器,LAN91C111。它可以工作在兩種速度下,10M以太網(wǎng)或者100M以太網(wǎng)。LAN91C111的工作流程是,驅動程序將要發(fā)送的數(shù)據(jù)包按指定格式寫入芯片并啟動發(fā)送命令,LAN91C111會自動把數(shù)據(jù)包轉換成物理幀格式在物理信道上傳輸;反之芯片收到物理信號后自動將其還原成數(shù)據(jù),并按指定格式存放在芯片RAM中以便主機程序取用。就是LAN91C111完成數(shù)據(jù)包和電信號之間的相互轉換。最后,說明一下串口電路,在嵌入式視頻監(jiān)控系統(tǒng)中,串口起到了很重要地作用,嵌入式系統(tǒng)啟動的信息都可以通過串口傳到PC上,極大地方便了系統(tǒng)的移植和軟件的調試。大多數(shù)情況下,嵌入式CPU的串口0會作為CPU的一個終端,為用戶與CPU交互提供基本的輸出輸入信息。當CPU運行BOOT代碼時,通常只有這個終端 ;運行LINUX內核時,如果有LCD顯示,串口0與LCD終端會同時有效。串口0終端的交互

方式是命令行的模式,在BOOT階段,支持簡單的BOOT命令。8

第3章嵌入式ARM系統(tǒng)軟件結構

3.1Linux操作系統(tǒng)簡介

Linux是一個類似Unix的操作系統(tǒng),它起源于芬蘭一個名為LinusTorvaldS的業(yè)余愛好者,現(xiàn)已成為最流行的一款開放源代碼的操作系統(tǒng)。Linux從問世至今,短短時間內已發(fā)展成為一個功能強大、設計完善的操作系統(tǒng)。Linux系統(tǒng)不僅能夠運行于PC平臺,還在嵌入式系統(tǒng)方面大放光芒。由于Linux的源碼開放,內核精簡且性能強悍,不依賴于具體廠商,能廣泛適用于各種硬件設備,系統(tǒng)二次開發(fā)成本極低,因此在IT業(yè)界已經(jīng)達成共識,即采用嵌入式Linux作為嵌入式操作系統(tǒng)是大勢所趨[5]。

嵌入式Linux是目前嵌入式系統(tǒng)領域中發(fā)展勢頭非常迅猛的系統(tǒng)。嵌入式Linux是指對Linux經(jīng)過小型化裁剪后,能夠固化在容量只有幾百K字節(jié)或幾M字節(jié)的存儲器芯片或單片機中,應用于特定嵌入式場合的專用操作系統(tǒng)。目前正在開發(fā)的嵌入式系統(tǒng)中,49%的項目選擇嵌入式Linux作為操作系統(tǒng)。嵌入式Linux現(xiàn)已成為嵌入式操作系統(tǒng)的理想選擇[6]。目前基于嵌入式Linux的應用已經(jīng)遍布很多領域,比如移動多媒體設備、手持設備、車載導航系統(tǒng)、機械控制等。嵌入式Linux分為兩種類型:在沒有使用MMU的平臺上(無內存虛實地址轉換和映射)的一般為uCLinux;而在有MMU平臺上,則使用原本地嵌入式Linux版本。由于在目前的主流嵌入式ARM中大多不具有MMU,因此只用IM左右的內核就能實現(xiàn)網(wǎng)絡功能和任務調度的Linux系統(tǒng)就可以適用于從高端服務器到嵌入式應用的各級平臺。ARM技術和Linux成功地結合,應用于數(shù)以千計的商業(yè)產(chǎn)品中。從便攜式消費品、網(wǎng)絡和無線設備,到自動化設備、醫(yī)療設備和存儲產(chǎn)品,這一應用列表與日俱增。ARM和Linux的結合充分滿足了各類應用對嵌入式平臺高性能、低功耗和低價格的要求,通過開發(fā)環(huán)境、開源社區(qū)和ARM的商業(yè)伙伴的優(yōu)勢為嵌入式開發(fā)提供了更靈活的選擇。

本次設計的開發(fā)環(huán)境為redhat9.0系統(tǒng),在Windows XP 下安裝虛擬機,在虛擬機中安裝Linux系統(tǒng),這樣可以屏蔽底層差別,避免硬件驅動帶來的麻煩,而且還能方便的使用串口、并口、USB接口,快速的進入實驗環(huán)境。圖3.1為虛擬機下Linux系統(tǒng)啟動后的情況。

圖3.1 虛擬機下Linux操作系統(tǒng)

3.2交叉編譯環(huán)境的建立

通常嵌入式系統(tǒng)的軟件編譯和執(zhí)行是在兩個不同平臺上進行的。編譯是在宿主機,一般為裝有Linux的pc;執(zhí)行是在目標機,即嵌入式系統(tǒng)的硬件平臺。一般是在宿主機上通過跨平臺交叉編譯器把源文件編譯成目標平臺上可執(zhí)行的文件,再通過串口、并口或者網(wǎng)絡下載至目標平臺上的FLASH或者其它存儲介質,然后由目標機來運行這些軟件。這里所說的跨平臺編譯器和一般的編譯器功能類似,都是把源代碼通過編譯器編譯成目標文件,然后通過鏈接器、可重定位器程序和定位器把目標文件重新定位成可執(zhí)行文件。和通用的編譯器之間最大的差別就在于跨平臺編譯器編譯出來的可執(zhí)行程序通常只能在特定CPU所屬平臺上運行。所以一般來說每種CPU都對應有不同的跨平臺編譯器。

本系統(tǒng)采用基于XScale的PXA270,可以使用常用的ARM-LINUX-GCC交叉編譯器。要成功構建完整的交叉編譯環(huán)境需要在宿主機上創(chuàng)建一系列的工具包括C/C++編譯器、匯編器、鏈接器、嵌入式系統(tǒng)的標準C庫和GDB代碼級調試器。成功建立好開發(fā)環(huán)境后便可以運用這些工具進行嵌入式系統(tǒng)開發(fā)[7]。

3.3嵌入式Linux操作系統(tǒng)移植 3.3.1BootLorder移植

BootLoader是系統(tǒng)加電后運行的第一段代碼。一般只是在啟動時運行很短的時間,然而對一個嵌入式系統(tǒng)來說,這一部分卻是整個系統(tǒng)的一個無比重要的組成部分,不可缺少。在一般嵌入式系統(tǒng)中,系統(tǒng)復位或者加電后通常從地址0x00000000處開始執(zhí)行,而這個地址一般正是存放的BootLoader啟動代碼。通過這段程序,可以初始化硬件設備、建立內存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適的狀態(tài),以便為最終加載操作系統(tǒng)內核準備好正確的環(huán)境。

BootLoader一般情況下需要包含以下幾個必備的功能 :(l)初始化處理器。這個動作都是用匯編語言完成的,稱為重置碼(resetcode)或者稱為bootcode,而且對于每個CPU都不一樣的,當電源接通后就會執(zhí)行這個動作,通常只有兩三個匯編指令,目的是將CPU的控制權轉給硬件初始化的程序。

(2)初始化一些必要的硬件。這個動作也大都由匯編語言來完成,主要是初始化CPU、SDRAM等,其他的硬件,例如串口,可以由c語言等比較高級的程序語言來完成后續(xù)動作。

(3)設置處理器的寄存器以及內存,關掉所有的輸入管腳(包括中斷管腳),以防止突然有信號進入妨礙接下來的硬件初始化動作。然后初始化串口,以便后續(xù)運行的程序能夠同HOST端進行通信,便于調試。

(4)從特定的位置把操作系統(tǒng)和文件系統(tǒng)調入內存,并設置一些操作系統(tǒng)所必需的參數(shù),然后把CPU控制權交給操作系統(tǒng)。有的BootLoader會先從串口或者網(wǎng)絡等其他途徑得到內核的映像文件,然后把這些文件寫入目標系統(tǒng)的FLASH或者其它存儲介質,最后再把內核載入RAM執(zhí)行,交出控制權。

一般BootLoader都包含兩種不同的操作模式:“啟動加載”模式和“下載”模式,這種區(qū)別僅對于開發(fā)人員才有意義。從最終用戶的角度看,BootLoader的作用就是用來加載操作系統(tǒng),而并不存在所謂的啟動加載模式與下載模式的區(qū)別。

(l)啟動加載(Bootloading)模式:這種模式也稱為“自主”(Autonomous)模式,即BootLoader從目標機上的某個固態(tài)存儲設備上將操作系統(tǒng)加載到RAM中運行,整個過程并沒有用戶的介入。這種模式是BootLoader的正常工作模式,因此在嵌入式產(chǎn)品發(fā)布的時候,BootLoader顯然必須工作在這種模式下。

(2)下載(Downloading)模式:在這種模式下,目標機上的BootLoader將通過串

口連接或者網(wǎng)絡連接等通信手段從主機(HOST)下載文件,比如下載內核映像和根文件系統(tǒng)映像等。從主機下載的文件通常首先被BootL0ader保存到目標機的RAM中,然后再被BootLoader寫到目標機上的FLASH類固態(tài)存儲設備中。BootLoader的這種模式通常在第一次安裝內核與根文件系統(tǒng)時被使用,此外,以后的系統(tǒng)更新也會使用BootLoader的這種工作模式。工作于這種模式下的BootLoader通常都會向它的終端用戶提供一個簡單的命令行接口。

BootLoader的實現(xiàn)依賴于CPU的體系結構,一般來說啟動過程分為兩個階段。

第一階段依賴于CPU體系結構的代碼,比如設備初始化代碼等,通常都放在第一階段中,而且通常都用匯編語言來實現(xiàn),運行效率比較高。這個階段完成的任務一般如下:(l)硬件設備初始化(屏蔽所有的中斷、關閉處理器內部的指令/數(shù)據(jù)cache);(2)為第二階段準備RA.M空間;(3)復制BootLoader的第二階段代碼到RAM空間中;(4)設置好堆棧并跳轉到第二階段的C程序入口點。

第二階段則通常用C語言來實現(xiàn),這樣可以實現(xiàn)復雜的功能,而且代碼會具有更好的可讀性和可移植性。這個階段主要任務有:(l)初始化本階段要使用的硬件設備;(2)檢測系統(tǒng)內存映射;(3)將內核映像和根文件系統(tǒng)從FLASH讀到RAM中;(4)為內核設置啟動參數(shù);(5)調用內核文件運行。

本設計中的Bootloader采用Blob,Blob是Boot Loader Object的縮寫,是一款功能強大的Bootloader。Blob最初是由Jan-Derk Bakker和Erik Mouw兩人為一塊名為LART(Linux Advanced Radio Terminal)的開發(fā)板寫的,該板使用的處理器是StrongARM SA-1100,現(xiàn)在Blob已經(jīng)被成功移植到許多基于ARM的CPU上了。本設計中的Intel Xcale就是采用Blob作為Bootloader[8]。

3.3.2Linux 內核移植

選用嵌入式Linux作為目標機操作系統(tǒng),一方面由于Linux是一款免費的操作系統(tǒng),能很好的降低成本,同時Linux的開發(fā)應用現(xiàn)在已經(jīng)成為熱門,有大量的資源可用于學習與重復應用,并且Linux系統(tǒng)具有良好的可移植性和可裁剪性,能自動支持多任務管理。一般常用的GUI如QT/E,MiniGUI等都支持Linux。

Linux的開發(fā)工具也都可以很方便的免費獲得。

系統(tǒng)采用的嵌入式Linux內核為隨實驗平臺光盤中的Linux內核,它是針對這套實驗平臺所配置的Linux內核,內核版本為Linux2.4.20[9]。在實驗過程中,只需要在這個內核的基礎上進行添加和刪減所需要和不需要的功能,編譯后就可以使用了。

在編譯內核之前,需要對內核進行必要的配置,通過虛擬機進入/pxa270_linux/linux/目錄后在終端執(zhí)行make menuconfig[10]命令,就可以可視化的配置內核需要的功能和要求,本次試驗,主要是針對視頻方面,選擇了對V4L的靜態(tài)加載、對spca5xx攝像頭驅動的動態(tài)加載,這樣就結束了對內核的配置。編譯內核需要創(chuàng)建內核依賴關系、創(chuàng)建內核鏡像文件和創(chuàng)建內核模塊。首先執(zhí)行makedep命令,讀取配置過程生成的配置文件,來創(chuàng)建對應于配置的依賴關系樹,從而決定哪些需要編譯而哪些不需要;接著需要makeclean刪除前面步驟留下的文件,以避免出現(xiàn)一些錯誤;然后便可以生成所需要的內核文件了,用make zlmage來實現(xiàn)得到可移植的內核。內核文件通過并口下載線燒寫入開發(fā)板中,便可以通過BootLoader加載運行。

3.3.3嵌入式文件系統(tǒng)

嵌入式Linux操作系統(tǒng)一般采用FLASH作為存儲介質。FLASH具有獨特的物理特性,所以必須使用專門的嵌入式文件系統(tǒng)。嵌入式系統(tǒng)對文件的操作是通過層次結構實現(xiàn)的。對于用戶程序來說,文件是有結構的文件,用戶程序通過對文件IO函數(shù)操作文件。嵌入式文件系統(tǒng)是嵌入式操作系統(tǒng)的一部分,它的任務是對邏輯文件進行管理,其工作包括提供對邏輯文件的操作(復制、刪除、修改等)接口,方便用戶操作文件和目錄。在文件系統(tǒng)內部,根據(jù)存儲設備的特點,使用不同的文件組織模式來實現(xiàn)文件的邏輯結構。此外,文件系統(tǒng)要對管理文件的安全性負責。文件系統(tǒng)不能直接控制物理設備,它是通過FLASH驅動實現(xiàn)控制的[11]。

目前FLASH支持的文件系統(tǒng)技術主要有JFFS2,YAFFS2,TrueFFS,F(xiàn)TL/NTFL,RAMFS,CRAMFS和ROMFS等等。本系統(tǒng)采用的是JFFS2文件系統(tǒng)。

JFFS2文件系統(tǒng)是專門為NAND閃存設計的嵌入式文件系統(tǒng),根據(jù)NAND閃存以頁面為單位存取的特點,將文件組織成固定大小的數(shù)據(jù)段。利用NAND閃存提供的每個頁面16B的備用空間來存放ECC(ErrorCorrectionCode)和文件系統(tǒng)的組織信息、,不僅能夠實現(xiàn)錯誤檢測和壞塊處理,也能夠提高文件系統(tǒng)的加

載速度。JFFS2采用一種多策略混合的垃圾回收算法,結合了貪心策略的高效性和隨機選擇的平均性,達到了兼顧損耗平均和系統(tǒng)開銷的目的。它是日志結構的文件系統(tǒng),提供了損耗平衡和掉電保護,可以有效地避免意外掉電對文件系統(tǒng)一致性和完整性的影響。JFFS2文件系統(tǒng)是按層次結構設計的,分為文件系統(tǒng)管理層接口、JFFS2內部實現(xiàn)層和NAND接口層,這樣就簡化了其與系統(tǒng)的接口設計,可以方便地集成到系統(tǒng)中去。與YAFFS相比,它增加了一些功能,因此功能更強。

3.4Linux下的程序調試

調試是程序開發(fā)過程中必不可少的一個重要環(huán)節(jié),通用PC機的程序調試與嵌入式操作系統(tǒng)的調試環(huán)境上有著明顯的區(qū)別,前者調試器和被調試的程序往往是運行在同一臺機器上,是相同操作系統(tǒng)下的兩個不同的進程,調試器通過操作系統(tǒng)專用調用接口控制被調試進程,后者通常為遠程調試,調試器一般運行于桌面操作系統(tǒng)上,而被調試的程序則運行在嵌入式系統(tǒng)之上,因此需要協(xié)調這兩個程序之間的通信。Linux下的調試工具非常的少,gdb是Linux下最著名的調試工具,它是GNUC自帶的調試工具,它可以使開發(fā)人員了解程序運行的詳細細節(jié),從而消除程序的錯誤,達到調試的目的,gdb還具有遠程調試功能,可以滿足嵌入式系統(tǒng)調試的要求,在調試過程中PC機也稱為宿主機和嵌入式系統(tǒng)通過串口協(xié)議或者TCP/IP協(xié)議連接起來,遠程主機上運行被gdb規(guī)范斷點改造過的內核,當條件成立時,斷點被激活,然后等待本地宿主機的連接命令,一旦連接成功,宿主機就可以向遠程嵌入式系統(tǒng)發(fā)送調試命令了。在調試過程中gdb通過調試stub來完成通信功能,調試stub是嵌入式操作系統(tǒng)中的一小段代碼,它提供了運行gdb的宿主機和嵌入式系統(tǒng)進程之間交互的一個媒介。

除了使用調試器外還可以直接在程序中使用printf()或printk打印函數(shù),這種方法功能比較弱,效率低下,但在內核模塊調試時這是唯一的方法。14

第4章USB設備驅動程序設計

4.1設備驅動程序簡介

Linux系統(tǒng)中,設備驅動程序扮演著特殊的角色。它就像一個獨立的黑盒子一樣,使某個特定的硬件可以相應一個定義良好的內部編程接口并且完成隱藏設備的作用。用戶只需調用一組標準化的函數(shù)完成操作,而且這些操作與特定的驅動程序無關。驅動程序的任務就是將這些函數(shù)映射到作用硬件的具體操作上。這樣的模塊化的驅動程序結構使得Linux系統(tǒng)中的驅動程序可以獨立于內核的其他部分,可以在需要使用的時候將驅動“插入”內核。

從系統(tǒng)運行順序來看,硬件平臺啟動運行Linux后,啟用了MMU單元即內存管理單元,在這種模式下系統(tǒng)不能直接對物理地址進行訪問。若要對某一硬件外設進行讀寫,需要通過內核調用該硬件的驅動來實現(xiàn)。

上面已經(jīng)說過,驅動程序的作用在于向應用程序提供訪問硬件設備的接口,驅動程序屏蔽了硬件實現(xiàn)上的細節(jié)操作,于是應用程序可以像操作普通文件一樣對硬件設備進行操作。Linux以模塊的形式加載設備類型,通常是一個模塊對應實現(xiàn)一個設備驅動。模塊是內核的一部分,它們沒有被編譯到內核中,而是分別被編譯并鏈接成一組目標文件。可以根據(jù)用戶的需要在不需要對內核進行重新編譯的情況下動態(tài)載入正在運行的內核,或從正在運行的內核中卸載。利用這種機制,內核尺寸可以保持在最小,并具有最大的靈活性,也便于檢驗新的內核代碼,而不需要重新編譯內核并重新引導。設備驅動程序一般需要完成以下功能:(l)對設備初始化和釋放;(2)把數(shù)據(jù)從內核傳送到硬件和從硬件讀取數(shù)據(jù);(3)讀取應用程序傳送給設備文件的數(shù)據(jù)和回送應用程序的請求數(shù)據(jù);(4)檢測和處理設備出現(xiàn)的錯誤。

在Linux操作系統(tǒng)下有兩類主要設備文件類型:塊設備、字符設備。用戶進程正是通過設備文件來與硬件打交道。每個設備文件都有其文件屬性,表示是字符設備還是塊設備。另外每個文件都有2個設備號,第一個是主設備號,標識驅動程序;第二個是從設備號,標識使用同一個設備驅動程序的不同硬件設備。設備文件的主設備號必須與設備驅動程序在登記時申請的設備號一致,否則用戶進程將無法訪問驅動程序。

Linux驅動程序可以分為三個主要部分: 15

(l)自動配置和初始化子程序,負責檢測所要驅動的硬件設備是否存在和能否正常工作。如果該設備正常,則對這個設備及其他必需的條件位口中斷、DMA通道)進行申一請并初始化。這部分驅動程序僅在初始化時被調用一次。

(2)服務于I/O請求的子程序,又稱為驅動程序的上半部分。調用這部分程序是由于系統(tǒng)調用的結果。這部分程序在執(zhí)行時,系統(tǒng)仍認為是與進行調用的進程屬于同一個進程,只是由用戶態(tài)變成了核心態(tài),但仍具有進行此系統(tǒng)調用的用戶程序的運行環(huán)境,因而可以在其中調用與進程運行環(huán)境相關的函數(shù)。

(3)中斷服務子程序,又稱為驅動程序的下半部分。在Linux操作系統(tǒng)中,并不是直接從中斷向量表中調用設備驅動程序的中斷服務子程序,而是由Linux系統(tǒng)來接收硬件中斷,再由系統(tǒng)調用中斷服務子程序。中斷可以在任何一個進程運行時產(chǎn)生,因而在中斷服務子程序被調用時,不能依賴于任何進程的狀態(tài),也就不能調用任何與進程運行環(huán)境有關的函數(shù)。因為設備驅動程序一般支持同一類型的若干設備,所以一般在系統(tǒng)調用中斷服務子程序時,都帶有一個或多個參數(shù),以唯一標識請求服務的設備。

在系統(tǒng)內部,I/O設備的存取通過設備驅動程序提供的一組固定的入口點來進行,這組入口點在驅動程序初始化時向系統(tǒng)進行登記,以便在系統(tǒng)適當?shù)臅r候調用。一般來說,字符型設備驅動程序能夠提供如下幾個入口點:(1)open入口點:打開設備準備I/O操作,對字符特別設備進行打開操作,都會調用設備的open入口點。open子程序必須對將要進行的I/O操作做好必要的準備工作,如清除緩沖區(qū)等。如果設備是獨占的,即同一時刻只能有一個程序訪問此設備,則open子程序必須設置一些標志以表示設備的狀態(tài)。

(2)close入口點:關閉一個設備,當最后一次使用設備結束后,調用dose子程序。獨占設備必須標記設備可再次使用。

(3)read入口點:讀取設備,對于有緩沖區(qū)的I/0操作,一般從緩沖區(qū)里讀取設備數(shù)據(jù)。

(4)write入口點:向設備寫數(shù)據(jù),對于有緩沖區(qū)的I/O操作,一般向緩沖區(qū)里寫入數(shù)據(jù)。

(5)ioctl入口點:執(zhí)行讀寫之外的操作。

USB(Universal Serial Bus)即“通用串行外部總線”,用途廣泛,可以外接硬盤、鍵盤、鼠標、打印機等多種設備,USB能夠使用盡可能少的接口支持盡可能多的外設,尤為適合在嵌入式設備中使用,是嵌入式接口標準的一個很好的選擇。

USB總線規(guī)范有1.1版和2.0版。USB1.1支持兩種傳輸速率:低速1.5Mbit/s、全速12Mbit/s,這樣的速率完全滿足鼠標、鍵盤、CD-ROM等設備,但是在嵌入式視頻監(jiān)控系統(tǒng)中,這樣的速度還是很慢。所以,USB2.0提供了一種更好的傳輸速率:高速,它可以達到480Mbit/s。USB2.0向下兼容USB1.1,可以將遵循USB1.1規(guī)范的設備連接到USB2.0控制器上,也可以把USB2.0的設備鏈接到USB1.1控制器上。

USB總線的硬件拓撲結構[12]如圖4.1所示。

USB主機控制器USB設備根集線器USB設備USB設備集線器USB設備集線器USB設備集線器USB設備USB設備USB設備USB設備 圖4.1 USB總線硬件拓撲圖

USB主機控制器通過根集線器與其他USB設備相連。集線器也屬于USB設備,通過它可以在一個USB接口上擴展出多個接口。除根集線器外,最多可以層疊5個集線器,每條USB電纜的最大長度是5m,所以USB總線的最大距離為30m。一條USB總線上可以外接127個設備,包括根集線器和其他集線器。整個結構圖是一個星狀結構,一條USB總線上所有設備共享一條通往主機的數(shù)據(jù)通道,同一時刻只能有一個設備與主機通信。

通過USB主機控制器來管理外接的USB設備,USB主機控制器共分3種:UHCI、OHCI和EHCI。在配置Linux內核的時候,看到的“HCD”字樣表示“Host Controller Drivers”,即主機控制器驅動程序。

USB驅動程序分為兩類:USB主機控制器驅動程序(Host Controller Drivers)、USB設備驅動程序(USB device drivers)。它們在內核中的層次如圖4.2所示。

UserUSB Device DriversUSB Host Controller DriversHardware 圖4.2 USB驅動程序層次結構

在試驗中,教學平臺上的Linux嵌入式內核已經(jīng)配置了USB主機控制器驅動程序,只需要添加需要的USB設備驅動程序,就能實現(xiàn)USB設備的正常使用。

4.2Linux下驅動程序的實現(xiàn)

Linux操作系統(tǒng)下對硬件設備進行驅動開發(fā)的一般步驟如下:(l)注冊設備

在系統(tǒng)啟動時或者在模塊加載的時候需要將設備和重要的數(shù)據(jù)結構登記到內核的設備數(shù)組中,并確定該設備的主次設備號。在Linux系統(tǒng)中,對于字符設備一般通過調用register_chrdev向系統(tǒng)注冊設備驅動程序,register_chrdev在fs/deviees.c文件中的定義如下:int register_chrdev(unsigned int major,const char*name,struct file_operations fops)定義中的major是設備驅動程序向系統(tǒng)申請的主設備號,如果major為O,則系統(tǒng)為該驅動程序動態(tài)的分配一個主設備號,不過此設備號是臨時的;name是設備名:fops是各個調用入口點的說明。函數(shù)返回O表示注冊成功,返回-INVAL表示申請的主設備號非法,返回-EBUSY表示申請的主設備號正在被其它設備驅動程序使用。

以后對設備驅動程序的file_operations的操作都可以通過該主設備號的索引來完成。register_chrdev函數(shù)操作成功后,設備名便出現(xiàn)在/proc/devices文件目錄中,使用命令cat/proc/devices可以查看設備的工作狀態(tài)。

(2)定義操作集

驅動程序中要通過一系列函數(shù)完成對設備的不同操作,這些操作在面向對象編程術語中也稱為方法,該操作集通過數(shù)據(jù)結構file_operations實現(xiàn)。內核內部通過file結構識別設備,通過file_operations數(shù)據(jù)結構提供的文件系統(tǒng)的入口點函數(shù)訪問設備。

file_operations定義在中的函數(shù)指針表: struct file_operations { struct module*owner;loff_t(*llseek)(struct file*, loff_t, int);ssize_t(*read)(struct file*, size_t, loff_t*);ssize_t(*write)(struct file*, const char*, size_t, loff_t*);int(*readdir)(struct file*, void*, filldir_t*);unsigned int(*poll)(struct file*, struct poll_table_struct*);int(*ioctl)(struct inode*, struct file*, unsigned int, unsigned long);int(*mmap)(struct file*, struct vm_area_struct*);int(*open)(struct inode*, struct file*);int(*flush)(struct file*);

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);}

這個結構的每一個成員的名字對應一個系統(tǒng)調用,在用戶程序利用系統(tǒng)調用對設備文件進行諸如讀/寫操作時,系統(tǒng)調用會通過設備文件的主設備號找到相應的驅動程序,然后讀取這個數(shù)據(jù)結構的相應函數(shù)指針,把控制權交給該函數(shù)。對于具體的設備驅動并不需要實現(xiàn)結構中所有的例程,只要完成設備功能就可以了。例如對于一個常見的字符設備驅動來說,可能只有操作open(),write(),read(),ioctl()和close(),當用戶程序通過系統(tǒng)調用訪問設備時,最終要通過這些操作集來完成。

(3)卸載模塊

當不再需要使用一個模塊或設備時,需要將其從內核中卸載下來,這時會動態(tài)調用模塊中的module_exit()函數(shù),并需要在該函數(shù)中調用modul_unregister_chrdev()或module_unregister_blkdev()釋放掛入內核的數(shù)據(jù)結構同時釋放該設備號。

4.3USB攝像頭驅動程序設計

攝像頭屬于視頻設備,在Linux內核中,VideoforLinux(簡稱V4L)是關于視頻設備的驅動標準。這個標準為應用程序定義了一系列的接口函數(shù),內核、驅動和應用程序都是依靠這個標準來進行交流。本系統(tǒng)所使用的USB攝像頭正是基于該標準來編寫驅動和應用程序的。

Linux內核是依據(jù)設備號來操作設備文件的,在內核中,攝像頭對應的設備文件名為/dev/video0,主設備號是81,次設備號根據(jù)攝像頭數(shù)目來確定,本系統(tǒng)中僅使用一個攝像頭,所以可以通過mknod/dev/video0 c 81 0來創(chuàng)建節(jié)點。USB攝像頭驅動程序實現(xiàn)原理如圖4.3所示。

USB攝像頭的驅動和通用設備的驅動準則一樣,但需要與內核提供的視頻驅動掛鉤。即首先在驅動中聲明一個 video_device結構,并為其指定文件操作函數(shù)指針數(shù)組fops,向系統(tǒng)注冊。在應用程序發(fā)出文件操作的相關命令時,核心根據(jù)這些指針調用相應函數(shù),并將該結構作為參數(shù)傳遞給它們。這樣,就完成了驅動和核心之間的通信。

例如: Static struct video_devie vdev_template={……};

聲明 video_deviee,指出掛接驅動

用戶進程系統(tǒng)調用攝像頭驅動文件操作接口接收緩沖區(qū)發(fā)送緩沖區(qū)中斷服務程序攝像頭 圖4.3 攝像頭驅動實現(xiàn)框圖

Static Struct file_operation spcasxx_fops= {……};

聲明本驅動的文件操作函數(shù)指針 Struct video_device*vdev=video_devdata(file);從文件指針中提取出 video_deviee結構

在video_deviee結構中,有一個私有指針priv,可以將它指向一塊保留內存。在這塊內存中,保存著本驅動、本設備的相關初始化信息。這塊內存的申請、初始化、指針指向等工作都是在USB驅動的枚舉函數(shù)probe中完成。這樣,在枚舉函數(shù)將控制權返還給系統(tǒng)后,因為內核不銷毀保留內存,所以驅動仍然保留著自己的信息。在驅動卸載函數(shù)中需要將申請的各塊內存全部釋放。

Linux系統(tǒng)中任何USB傳輸都通過URB實現(xiàn)。為提高速度,可以考慮擴大URB的緩沖,這樣可以降低每個USB事務中握手信息所占比例,提高有效數(shù)據(jù)的輸速度。但是受限于總線帶寬和具體的USB設備芯片,單純擴大URB的緩沖不能無限制地解決問題。USB在操作系統(tǒng)中每次傳輸都要包括URB的建立、發(fā)出、回收、數(shù)據(jù)整理等階段,這些時間不產(chǎn)生有效數(shù)據(jù)。因此可以建立兩個URB,在等待一個URB被回收時,也就是圖像正在被傳感器采集時,處理、初始化另一個URB,并在回收后立刻將其發(fā)出。兩個URB交替使用,大大減少了額外時間。

由于嵌入式平臺上運行的Linux2.4.20內核,內部已經(jīng)集成了對USB2.0的支持,所以無需移植相應的USB驅動。

在設計中,攝像頭芯片采用中星微的Z301系列芯片,Linux2.4內核并不支持這種芯片,所以我們通過移植芯片驅動程序來達到目的。芯片的驅動程序是spca5**系列,如果不重新編譯內核的話,將驅動程序動態(tài)加載就可以正常使用。設計中動態(tài)加載的命令使用insmod命令,它和modprobe命令在使用上有所不同,modprobe在加載模塊時不用指定模塊文件的絕對路徑,也不用帶模塊文件的后綴.o或.ko;而insmod需要的是模塊的所在目錄的絕對路徑,并且一定要帶有模塊文件名后綴的.o或者.ko。但是在功能上,它們所達到的效果基本相同[13]。22

第5章視頻采集功能的設計

視頻采集程序是基于V4L開發(fā)的,包括攝像頭的初始化、打開/關閉、參數(shù)設置和數(shù)據(jù)讀取等操作,視頻采集程序流程圖如圖5.1所示[14]。

開始初始化攝像頭init_videoIn()打開攝像頭open_v4l()獲取攝像頭參數(shù)icotl(int->vd,int cmd,..)設置攝像頭參數(shù)ioctl()獲取一幀圖像N一幀是否截取完畢Y存儲并準備傳輸N是否終止視頻采集Y關閉攝像頭終止 圖5.1 視頻采集程序流程圖

5.1基于V4L的編程 5.1.1攝像頭相關數(shù)據(jù)結構

攝像頭的組成部分是傳感器、DSP、鏡頭、外殼、USB連線、電路板和周邊電路構成,其中最重要的是傳感器和DSP(數(shù)字信號處理器)。本系統(tǒng)選用的攝像頭采用了CMOS傳感器和中星微301處理器。

V4L[15]提供了一系列的接口應用程序,可以利用這些程序實現(xiàn)對攝像頭的調用,其中有read、open、ioctl等。V4l同時將這些函數(shù)和參數(shù)封裝成一個數(shù)據(jù)結構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ù)使用這個描述符對攝像頭進行操作。

struct video_mmap vmmap: 用于內存映射的結構體。

struct video_capability videocap :描述攝像頭基本信息,如設備名稱、支持的最大分辨率、信號源信息、信道數(shù)等。

struct video_mbuf videombuf :在進行內存映射時讀取幀的信息,實際上是輸入到攝像頭存儲緩存中的幀信息。

struct video_picture videopict :攝像頭采集圖像的屬性,如亮度、色調、對比度、色度、深度等。

struct video_window videowin :表示采集窗口參數(shù),如分辨率等。struct video_channal videochan :關于信號源的屬性。

5.1.2攝像頭基本功能實現(xiàn)

(1)初始化攝像頭參數(shù)

在對攝像頭進行操作之前,要對攝像頭進行初始化,即對vdIn這個結構進行初始化。使用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中,類似攝像頭的設備是作為文件來看待的,叫做設備文件。我們可以使用open函數(shù)來對設備進行打開操作,open帶有兩個參數(shù),第一個為設備文件名稱,本實驗的攝像頭設備名稱是/dev/video0,第二個則是打開的類型。

在使用open函數(shù)打開攝像頭之前,要判斷是否有攝像頭設備,即檢查參數(shù)videodevice是否為空。Open函數(shù)執(zhí)行結束后會返回攝像頭的文件描述符,如果返回值為-1,則說明打開設備出錯。

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通道來實現(xiàn)。Ioctl函數(shù)的使用是ioctl(int->fd, int cmd,……),fd代表文件描述符,cmd表示用戶對設備的控制命令,第三個參數(shù)是一個其他的參數(shù)。其中,cmd包括VIDIOCGCAP(獲得video_capbility中有關攝像頭的信息)、VIDIOCGPICT(獲取圖像信息)、VIDIOCSPICT(改變圖像信息)、VIDIOCGMBUF(獲取攝像頭存儲緩沖區(qū)幀信息)、VIDIOCAMCAPTURE(獲取視頻圖像)、VIDIOSYNC(判斷攝像頭是否截取成功)等。

讀取video_capability中有關攝像頭的信息

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ù)進行設置的時候,應該按照以下步驟:比如更改圖像信息,首先,先給video_picture結構中所要修改的變量賦值,如vd->videopict.palette=vd->formaIn;vd->videopict.depth=GetDepth(vd->formatIn);然后通過ioctl函數(shù)的VIDIOCSPICT來設置,如if(ioctl(vd->fd,VIDIOCSPICT,&(vd->videopict))<0){ printf(Fail to set videopict params with VIDIOCSPICT!/n“);return-1;} 在設置好了之后可以通過VIDIOCGPICT命令來查詢圖像信息設置是否成功。(5)關閉攝像頭

在Linux編程過程中,必須養(yǎng)成一個好的編程習慣,就是在開啟一個設備后一定要關閉它,這樣可以避免很多諸如內存泄露等嚴重的問題。

本系統(tǒng)支持兩種讀取方式來獲得視頻流,它們是內存映射和直接讀取,所以首先需要判斷視頻采集的方式,如果是內存映射,則在系統(tǒng)任務完成后關閉內存映射,然后關閉攝像頭設備。同樣道理,如果采用的是直接讀取,則在任務完成后關閉直接讀取,然后在關閉攝像頭設備。在代碼中,采用了一個判斷語句,判斷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)實現(xiàn)的第一步,是所有工作的前提。嵌入式Linux系統(tǒng)支持兩種視頻數(shù)據(jù)采集的方式:內存映射、直接讀取視頻。

(1)內存映射

內存映射方式是通過mmap系統(tǒng)調用函數(shù)來實現(xiàn)的。mmap系統(tǒng)調用使得進程之間通過映射同一個普通文件實現(xiàn)共享內存。普通文件被映射到進程地址空間

后,進程可以像訪問普通內存一樣對文件進行訪問,不必再調用read()、write()等操作。

首先,使用ioctl系統(tǒng)調用的VIDIOCSFBUF命令獲得攝像頭存儲緩沖區(qū)的幀信息,之后初始化video_mbuf,修改video_mmap中的設置,重新設置圖像信息,如幀的垂直及水平分辨率、彩色顯示格式等。為了防止緩沖區(qū)的內容與有用信息疊加產(chǎn)生干擾,在初始化之前可以先調用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)使設備內容映射到內存區(qū),其中第一個參數(shù)為共享內存的起始地址,一般設為0,表示由系統(tǒng)分配;第二個參數(shù)為映射到調用進程地址空間的字節(jié)數(shù),它從被映射文件開頭offset個字節(jié)開始算起;第三個參數(shù)指定共享內存的訪問權限(PROT_READ(可讀),PROT_WRITE(可寫),PROT_EXEC(可執(zhí)行));第四個參數(shù)可以是MAP_SHARED或者MAP_PRIVATE;第五個參數(shù)為設備描述符。mmap()成功調用后返回系統(tǒng)實際分配的起始地址。

內存映射方式下真正進行視頻截取的是ioctl系統(tǒng)調用的VIDIOCMCAPTURE命令,若函數(shù)成功調用,再用VIDIOCSYNC命令來判斷圖像截取是否己經(jīng)完畢,若該函數(shù)調用成功,則表明一幀圖像的截取已完成,便開始下一幀圖像數(shù)據(jù)的截取,并將當前截取的幀號按緩沖區(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)調用函數(shù)來實現(xiàn)。read是一個用來從指定的文件或設備中讀取數(shù)據(jù)的系統(tǒng)調用。參數(shù)表為read(fd,(void*)pFramebuff,(size_t)framesizeln)。其中fd為文件描述符,pFramebuffer為指向存放數(shù)據(jù)的內存的指針,framesizeln為需要讀取的數(shù)據(jù)的長度。對于攝像頭設備的讀取,需要先分配內存空間,用來存儲從攝像頭讀取過來的視頻數(shù)據(jù),然后直接調用read系統(tǒng)調用讀取視頻數(shù)據(jù),返回值為實際讀取的視頻幀大小,也正是在視頻傳輸過程中發(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;}

/*是否有其他進程正在使用該視頻幀*/ 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)卡傳輸,因為這樣的數(shù)據(jù)很大,網(wǎng)絡不能承擔如此龐大的數(shù)據(jù)傳輸。所以,必須將采集到得數(shù)據(jù)進行編碼,壓縮數(shù)據(jù)大小。通過這樣的操作,我們采集到得數(shù)據(jù)就會變得很小,然后再把這些數(shù)據(jù)通過網(wǎng)絡傳輸。同樣的道理,在輸出端我們還要把接收到的已經(jīng)壓縮的數(shù)據(jù)還原回來,這就涉及到解碼的內容。通過這一系列的操作,圖像和視頻數(shù)據(jù)就實現(xiàn)的遠程的傳輸。如果沒有編解碼,遠程傳輸就是實際上不可能的事情,所以圖像的編解碼是非常重要的。

現(xiàn)在普遍使用的編解碼技術。對于靜態(tài)圖像,普遍使用靜態(tài)壓縮JPEG標準;對于動態(tài)視頻,普遍使用動態(tài)壓縮MPEG標準。

JPEG是由ISO和CCITT為靜態(tài)圖像壓縮所建立的國際上第一個靜態(tài)圖像壓縮標準,JPEG有著較高的壓縮比,復雜度適中,既可以用硬件實現(xiàn),也可以用軟件實現(xiàn),實用性強,被廣泛使用于計算機和通信行業(yè)。

MPEG中文譯名為動態(tài)圖像專家組。到目前為止,MPEG標準主要有五個,32

MPEG-

1、MPEG-

2、MPEG-

4、MPEG-7和MPEG-21。它是由ISO/IEC1172壓縮編碼標準得出的視頻壓縮格式,MPEG的出現(xiàn)使視聽傳播進入數(shù)碼化時代。MPEG標準的視頻壓縮編碼技術主要利用了具有運動補償?shù)膸g壓縮編碼技術以減少時間冗余度,利用DCT技術以減少圖像的空間冗余度,利用熵編碼技術在信息表示方面減少了統(tǒng)計冗余度。通過一系列技術,極大的體現(xiàn)了壓縮性能[16]。

5.2.2系統(tǒng)壓縮技術

由于本系統(tǒng)要求實現(xiàn)遠程視頻傳輸,為了達到預計的設計要求,設計采用基于MJPEG算法的壓縮技術進行視頻壓縮。MJPEG和MPEG的不同點在于MJPEG不使用幀間編碼。可是MJPEG與MPEG仍然是一脈相承的,它對MEPG進行了一些改進和發(fā)展,功能更加強大,能發(fā)送高質圖片、清晰視頻,編碼容易實現(xiàn)。但MJPEG也有一些缺點,由于功能的提升,MJPEG對帶寬的要求很高,編碼效率低。

參考文獻

1.張永強,趙勇勇,李崇德.嵌入式遠程視頻采集系統(tǒng)的設計與實現(xiàn)[J].現(xiàn)代電子技術,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.陳章龍,唐志強,涂時亮.嵌入式技術與系統(tǒng)——Intel Xscale 結構與開發(fā)[M].北 京:北京航空航天大學出版社,2004,143.4.奧爾博公司.PXA270嵌入式實驗開發(fā)系統(tǒng)——Linux實驗指導[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體系結構與編程[M].北京:清華大學出版社,2003.7.朱珍民,隋雪青.嵌入式實時操作系統(tǒng)及其應用開發(fā)[M].北京:北京郵電大學出版社,2006.8.李亞峰 歐文盛.ARM嵌入式Linux系統(tǒng)開發(fā)從入門到精通[M].北京:清華大學 33

出版社,2007,51-54.9.李善平.Linux內核2.4版源代碼分析大全[M].北京:機械工業(yè)出版社,2002.10.廖日坤.ARM嵌入式應用開發(fā)技術白金手冊[M].北京:中國電力出版社,2007, 284-290.11.劉昆.Linux環(huán)境下宿主機與ARM開發(fā)板NFS服務的配置[J].科技資訊,2008,05(04):65-80.12.韋東山.嵌入式Linux應用開發(fā)完全手冊[M].北京:人民教育出版社,2008.13.孫紀坤,張小全.嵌入式Linux系統(tǒng)開發(fā)技術詳解——基于ARM[M].北京:人民郵電出版社,2006.14.李冰,孫建平,譚悅,張啟勤.基于嵌入式Linux與S3C2410的網(wǎng)絡視頻監(jiān)控[J].河北:華北電力大學學報,2006,2(4):15-30.15.董玲,朱宏,楊忠孝.基于ARM的嵌入式Linux應用程序開發(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.張躍進,謝昕.嵌入式網(wǎng)絡數(shù)字視頻監(jiān)控系統(tǒng)的設計[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服務器的設計與實現(xiàn)[J].微計算機信息,2007,14(7):90-95.34

第四篇:基于A8的嵌入式Linux遠程視頻監(jiān)控系統(tǒng)的設計與實現(xiàn)

基于A8的嵌入式Linux遠程視頻監(jiān)控系統(tǒng)的設計與實現(xiàn)

摘 要:將網(wǎng)絡技術和嵌入式技術相結合的遠程視頻監(jiān)控系統(tǒng)是視頻采集技術的發(fā)展趨勢,文中提出了一種基于對等網(wǎng)絡模型的嵌入式遠程視頻監(jiān)控系統(tǒng)的設計方案。該方案將嵌入式系統(tǒng)和Web開發(fā)技術相結合,再利用USB攝像頭作為視頻監(jiān)控系統(tǒng)的終端進行圖像采集,并使用網(wǎng)絡TCP協(xié)議將其遠程發(fā)送給服務器終端。相較于傳統(tǒng)的Client/Server網(wǎng)絡模型,本系統(tǒng)實現(xiàn)采用對等網(wǎng)絡模型,即確定發(fā)送命令的控制程序既可以是客戶端,又可以是服務端。文中選擇嵌入式開發(fā)平臺ARM系列A8處理器進行研究和設計,并采用PC機下的Linux系統(tǒng)作為主機開發(fā)環(huán)境。

關鍵詞:嵌入式;視頻監(jiān)控;網(wǎng)絡遠程控制;對等網(wǎng)絡

中圖分類號:TP39 文獻標識碼:A 文章編號:2095-1302(2016)05-00-03

0 引 言

網(wǎng)絡遠程控制(Network Remote Control,NRC)是利用計算機網(wǎng)絡對遠程計算機進行操作的一種控制方式。計算機技術和網(wǎng)絡技術目前都在高速發(fā)展,現(xiàn)在監(jiān)控系統(tǒng)已經(jīng)發(fā)展到網(wǎng)絡視頻監(jiān)控系統(tǒng)[1]。網(wǎng)絡視頻監(jiān)控具有數(shù)字視頻監(jiān)控和網(wǎng)絡傳輸技術的優(yōu)點,其具有不受地理位置約束、擴展方便簡單、信息處理較容易等特點,可以使遠程的管理和維護變成現(xiàn)實,只要是網(wǎng)絡覆蓋的地方,就能實現(xiàn)網(wǎng)絡監(jiān)控[2]。嵌入式系統(tǒng)向網(wǎng)絡發(fā)展已成必然趨勢,目前嵌入式系統(tǒng)對網(wǎng)絡協(xié)議如TCP/IP協(xié)議和HTTP協(xié)議的支持也越來越廣泛。系統(tǒng)硬件設備選擇與配置

系統(tǒng)硬件設備選擇凌陽嵌入式A8教學實驗系統(tǒng)進行設計與實現(xiàn)。該實驗箱基于ARM CortexTM-A8內核的處理器S5PV210,該芯片又名“蜂鳥”(Hummingbird),是三星公司推出的一款適用于智能手機和平板電腦等多媒體設備的應用處理器[3]。本系統(tǒng)使用了人機交互模塊的USB接口、多媒體模塊攝像頭接口及通信模塊以太網(wǎng)接口。

1.1 USB攝像頭

攝像頭屬于視頻類設備。在目前的Linux核心中,視頻部分的標準是Video for Linux(簡稱V4L)。這個標準其實定義了一套接口,內核、驅動、應用程序以這個接口為標準進行交流。目前的V4L涵蓋了視、音頻流捕捉及處理等內容,USB攝像頭也屬于它支持的范疇。

本系統(tǒng)所采用的嵌入式Linux操作系統(tǒng)如果需要使用USB攝像頭則必須在內核配置時添加Video4Linux驅動和對USB攝像頭驅動模塊的支持。本系統(tǒng)的設計與實現(xiàn)采用靜態(tài)加載以上驅動。首先進入Linux源代碼所在的目錄,在終端輸入make menuconfig命令,在基于Ncurses內核配置圖形界面進行內核選項的配置。選中多媒體設備選項“Multimedia device->”,進入多媒體設備配置界面,選中“Video For Linux”,加載Video4Linux模塊,就可以使內核實現(xiàn)對Video4Linux驅動的支持,為視頻采集設備提供編程接口。在內核配置主界面,選中USB支持選項“USB support―>”,選中“USB Multimedia device”選項下的“USB OV511 Camera support”,使內核中加入OV511接口芯片的USB數(shù)字攝像頭的驅動支持。OV511 USB 攝像頭驅動配置界面如圖1所示。

圖1 OV511 USB 攝像頭驅動配置界面

1.2 開啟幀緩沖設備

幀緩沖(Frame Buffer,F(xiàn)B)是Linux為顯示設備提供的一個接口,是把顯存抽象后的一種設備,它允許上層應用程序在圖形模式下直接對顯示緩沖區(qū)進行讀寫操作。由于FB設備驅動為受限驅動,因此必須進行設備開啟。本系統(tǒng)開發(fā)環(huán)境采用發(fā)行版Linux操作系統(tǒng)Ubuntu10.10,Ubuntu下啟用FB設備的一般步驟如下所示:

安裝v86d和hwinfo兩個包查看顯卡是否支持,并設置本機支持模式。

修改啟動文件/etc/default/grub,如圖2所示。

圖2 修改啟動文件圖

修改modules文件/etc/initramfs-tools/modules,如圖3所示。

圖3 修改modules文件

更新以上兩個文件并重啟系統(tǒng),即可查看到FB設備,具體如圖4所示。

圖4 查看FB設備系統(tǒng)軟件設計

本系統(tǒng)軟件由攝像頭驅動模塊、圖像采集模塊、網(wǎng)絡傳輸模塊和網(wǎng)絡服務器模塊組成[4]。攝像頭驅動模塊使得攝像頭為應用程序編寫提供系統(tǒng)編程接口。功能主要包括攝像頭設備信息的獲取與設置、設備的打開和關閉、信號通道選擇、窗口初始化等。圖像采集模塊的作用是使用編程接口獲取攝像頭采集來的圖像信息并進行暫時存儲。服務器通過網(wǎng)絡傳輸模塊與遠程監(jiān)控PC機端進行信息交流。

2.1 V4L圖像信息采集流程

V4L圖像信息采集流程分為如下幾步:

(1)打開攝像頭設備

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;

第五篇:嵌入式系統(tǒng)語音采集與播放程序設計

ARM9嵌入式系統(tǒng)課程設計

--嵌入式系統(tǒng)語音采集與播放程序設計

班級: 學號: 姓名:

指導老師:

課程設計時間:2011.6.29---2011.7.8

江蘇大學

目錄

第一章 引言.........................................................1 1.1 設計目的......................................................1 1.2 設計任務與要求................................................1 第二章 課程設計平臺構建與流程.......................................2 2.1 嵌入式系統(tǒng)平臺構建............................................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 第六章 根文件系統(tǒng)建立與文件系統(tǒng)下載................................29 6.1 根文件系統(tǒng)分析...............................................29 6.2 文件系統(tǒng)映像文件生成.........................................30 6.3 文件系統(tǒng)下載.................................................31 6.4 功能模塊運行與調試...........................................32 第七章 課程設計總結與體會..........................................34 7.1 得出的結論...................................................34 7.2課程設計過程中遇到的問題及解決方法...........................34 7.3 心得體會.....................................................34 參考文獻...........................................................36

第一章 引言

1.1 設計目的

分析Linux操作系統(tǒng)下音頻設備驅動的結構,編寫應用測試程序,實現(xiàn)UDA1341芯片的實時錄音及放音功能,進一步熟悉vivi、Linux內核和根文件系統(tǒng)的編譯和燒寫至開發(fā)板的開發(fā)流程。

1.2 設計任務與要求

在Samsung公司S3C2410處理器的edukit-Ⅲ開發(fā)板上,在嵌入式linux操作系統(tǒng)環(huán)境下,根據(jù)語音芯片UDA1341的驅動程序和語音數(shù)據(jù)的特點編寫語音采集與播放的應用測試程序,實現(xiàn)語音數(shù)據(jù)的采集和實時播放功能。1.要求本系統(tǒng)實時的采集與播放

2.通過麥克風錄制一段語音信息,對其進行播放 第二章 課程設計平臺構建與流程

2.1 嵌入式系統(tǒng)平臺構建

2.1.1軟件部分

1)Linux或Windows 98/2000/NT/XP 2)cygwin cygwin是一個在windows平臺上運行的unix/Linux模擬環(huán)境,是cygnus solutions公司開發(fā) 3)Embest IDE 英蓓特提供的一個嵌入式開發(fā)的集成環(huán)境。4)windows中的超級終端

5)Embest online Flash Programmer for ARM 燒寫相關文件到NorFlash中的工具。

6)建立linux的交叉編譯環(huán)境,各項源代碼的安裝等 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總線只處理聲音數(shù)據(jù),其他控制信號等則需單獨提供。IIS總線使用3根串行總線,分別是:提供分時復用功能的SD線(Serial data,串行數(shù)據(jù)),WS線(Word select,字段選擇(聲道選擇))和SCK線(Continuous Serial clock,連續(xù)的時鐘信號)。

音頻編解碼4 ADDRTxFIFODATASFTRBRFCRxFIFOSDCNTLCHHCSCLKIPSR_APCLKIPSR_BSCLKGLRCKCDCLK

圖2.3 IIS總線接口內部結構

S3C2410A IIS總線接口各模塊的功能描述如下:

● BRFC 表示總線接口、寄存器區(qū)和狀態(tài)機。總線接口邏輯和FIFO訪問由狀態(tài)機控制。

● 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ā)生器。在主設模式時,由主時鐘產(chǎn)生串行位時鐘。● CHNC 表示通道發(fā)生器和狀態(tài)機。通道狀態(tài)機用于產(chǎn)生和控制IISCLK和IISLRCK。

● SFTR 表示16位移位寄存器。在發(fā)送模式時,并行數(shù)據(jù)移入SFTR并轉換成串行數(shù)據(jù)輸出;在接收模式時,串行數(shù)據(jù)移入SFTR并轉換成并行數(shù)據(jù)輸出。具體的相關寄存器的位功能描述請參觀相關資料。2.3.2 工作原理

常用的數(shù)字音頻處理集成電路包括A/D、D/A、DSP、數(shù)字濾波器和數(shù)字音頻I/O接口及設備(麥克風、話筒)等。麥克風輸入的模擬音頻信號經(jīng)A/D轉換、音頻編碼器實現(xiàn)模擬音頻信號到數(shù)字音頻信號轉換,編碼后的數(shù)字音頻信號通過控制器送入DSP或微處理器相應的處理。音頻輸出時,數(shù)字音頻信號(音頻數(shù)據(jù))經(jīng)控制器給音頻解碼器,經(jīng)D/A轉換后由揚聲器輸出。

數(shù)字音頻涉及概念很多,重要的是理解:采樣和量化。采樣就是每隔一定時間讀一次聲音信號的幅度,而量化則是將采樣得到的聲音信號幅度轉換為數(shù)字值。從本質上講,采樣是時間上的數(shù)字化,而量化則是幅度上的數(shù)字化。

根據(jù)奈奎斯特(Nyquist)采樣理論采樣頻率應高于輸入信號的最高頻率兩倍。為了保證聲音不失真,采樣頻率應該在40kHz左右。常用的音頻采樣頻率有8kHz、11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz等,要達到DVD的音質需要采用更高的采樣頻率。

量化是對模擬音頻信號的幅度數(shù)字化,量化位數(shù)決定模擬信號數(shù)字化以后的動態(tài)范圍,常用的有8位、12位和16位。量化位越高,信號的動態(tài)范圍越大,數(shù)字化后的音頻信號就越接近原始信號,但所需要的存儲空間也越大。

聲道有單聲道、雙聲道和多聲道。雙聲道又稱立體聲,在硬件中有兩條線路,音質和音色都優(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ù)傳輸方(主設)必須產(chǎn)生字段選擇信號、時鐘信號和需要傳輸?shù)臄?shù)據(jù)信號。在一個復雜的數(shù)字音頻系統(tǒng)中,可能會有多個發(fā)送方和接收方,通常采用系統(tǒng)主控制模式,主控制模塊控制數(shù)字音頻數(shù)據(jù)在不同集成電路(設備)間的傳輸,數(shù)據(jù)發(fā)送方就需要在主控制模塊的協(xié)調下發(fā)送數(shù)據(jù)。IIS總線的三種傳輸模式如圖2、3、4所示,這些模式的配置一般需通過軟件來實現(xiàn)。

clock SCKTRANSMITTERword select WSdata SDRECEIVERTRANSMITTER=MASTER

圖2.4發(fā)送器為主設時的傳輸模式

clock SCKTRANSMITTERword select WSdata SDRECEIVERRECEIVER=MASTER

圖2.5 接收器為主設時的傳輸模式

CONTROLLERclock SCKTRANSMITTERword select WSdata SDRECEIVERCONTROLLER=MASTER

圖2.6 控制器為主設時的傳輸模式(2)IIS總線時序 1串行數(shù)據(jù)(SD)○串行數(shù)據(jù)的傳輸由時鐘信號同步控制,且串行數(shù)據(jù)線每次傳輸1字節(jié)的數(shù)據(jù)。當音頻數(shù)據(jù)被數(shù)字化成二進制流后,傳輸時先將數(shù)據(jù)分成字節(jié)(如8位、16位等),每個字節(jié)的數(shù)據(jù)傳輸從左邊的二進制位MSB(Most Significant Bit)開始。當接收方和發(fā)送方的數(shù)據(jù)字段寬度不一樣時,發(fā)送方不考慮接收方的數(shù)據(jù)字段寬度。如果發(fā)送方發(fā)送的數(shù)據(jù)字段寬度小于系統(tǒng)字段寬度,就在低位補0;如果發(fā)送方的數(shù)據(jù)字段寬度大于接收方的寬度,則超過LSB(Least Significant Bit)的部分被截斷。

2字段選擇(WS)○音頻系統(tǒng)一般包含有左右兩個聲道,字段選擇(WS)用來選擇左聲道或者右聲道,WS=0表示選擇左聲道;WS=0表示選擇左聲道。如果不在外部加以控制,WS會在MSB傳輸前的一個時鐘周期發(fā)生變化,使數(shù)據(jù)接收方和發(fā)送方保持同步。此外,WS能讓接收設備存儲前1字節(jié),并且準備接收后1字節(jié)。

3時鐘信號(SCK)○在IIS總線中,任何一個能夠產(chǎn)生時鐘信號的電路都可以稱為主設備,從設備從外部時鐘輸入得到時鐘信號。IIS的規(guī)范中制定了一系列關于時鐘信號頻率和延時的限制。

圖2.7 IIS總線時序

(3)IIS總線接口的工作方式

IIS總線接口是用來連接外部的標準編解碼器(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就緒標志位。當FIFO準備發(fā)送數(shù)據(jù)時,如果發(fā)送FIFO不空,則FIFO就緒標志位為“1”;如果發(fā)送FIFO為空,該標志為“0”。在接收數(shù)據(jù)時,當接收FIFO是不滿時,FIFO就緒標志位為“1”,指示可以接收數(shù)據(jù);若接收FIFO滿,則該標志為“0”。通過FIFO就緒標志位,可以確定CPU讀/寫FIFO的時間。

2DMA傳輸方式 ○在DMA傳輸方式,利用DMA控制器來控制發(fā)送和接收FIFO的數(shù)據(jù)存取,由FIFO就緒標志來自動請求DMA的服務。

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ù)據(jù)以2的補碼發(fā)送,首先發(fā)送是MSB位。首先發(fā)送MSB位可以使發(fā)送方和接收方具有不同的字長度,發(fā)送方不必知道接收方能處理的位數(shù),同樣接收方也不必知道發(fā)送方正發(fā)來多少位的數(shù)據(jù)。

當系統(tǒng)字長度大于發(fā)送器的字長度時,數(shù)據(jù)發(fā)送時,字被切斷(最低數(shù)據(jù)位設置為0)發(fā)送。接收器接收數(shù)據(jù)時,如果接收到的數(shù)據(jù)字長比接收器的字長更長時,則多的數(shù)據(jù)位被忽略。另一方面,如果接收器收到的數(shù)據(jù)位數(shù)比它的字長短時,則缺少的位設置為0。因此,MSB有固定的位置,而LSB的位置與字長度 有關。在IISLRCK發(fā)生改變的一個時鐘周期,發(fā)送器發(fā)送下一個字的MSB位。

發(fā)送器發(fā)送的串行數(shù)據(jù)可以在時鐘信號的上升沿或下降沿同步。然而,串行數(shù)據(jù)必須在串行時鐘信號的上升沿鎖存到接收器,所以發(fā)送數(shù)據(jù)使用上升沿進行同步時會一些限制。

左右通道選擇線指示當前正發(fā)送的通道。IISLRCK可以在串行時鐘的上升沿或者下降沿改變,不需要同步。在從模式,這個信號在串行時鐘的上升沿被鎖存。IISLRCK在MSB位發(fā)送的前一個時鐘周期內發(fā)生改變,這樣可以使從發(fā)送器同步發(fā)送串行數(shù)據(jù)。另外,允許接收器存儲前一個字,并清除輸入以接收下一個字。

2MSB-justified數(shù)據(jù)格式 ○MSB-justified總線格式在體系結構上與IIS總線格式相同。與IIS總線格式唯一不同的是,只要IISLRCK有變化,MSB-justified格式要求發(fā)送器總是發(fā)送下一個字的最高位。

2)音頻編解碼芯片UDAl341TS UDA1431TS可把通過麥克風音頻輸入通道輸入的立體聲模擬信號轉化為IIS格式的數(shù)字信號,傳送給S3C2410的IIS控制器,然后CPU使用DMA控制器把得到的數(shù)字信號存放的一塊內存空間上;同樣DMA控制器也能把已存的數(shù)字信號通過IIS格式發(fā)送給UDAl341TS芯片,由該芯片轉換成模擬信號,通過耳機音頻輸出通道輸出。利用UDA1341TS內部的PGA(可編程增益放大器)、AGC(自動增益控制)功能對模擬信號進行處理。對于數(shù)字信號,UDA1341TS提供DSP(數(shù)字音頻處理)功能。

S3C2410A的IIS接口線分別與UDA1431TS的BCK、WS、DATAI、SYSCLK相連。當UDA1431TS芯片工作在微控制器輸入模式時,使用UDA1431TS的L3總線(L3DATA、L3MODE和L3CLOCK)。L3DATA、L3MODE和L3CLOCK分別表示與微處理器接口的數(shù)據(jù)線(L3DATA)、模式控制線(L3MODE)和時鐘線(L3CLOCK)。微控制器通過對UDA1431TS中的數(shù)字音頻處理參數(shù)進行配置。S3C2410A沒有與L3總線配套的專用接口,可以利用通用I/O口進行控制。第三章 Bootloader移植與下載

3.1 Vivi源代碼安裝

進入cygwin,Vivi源代碼的安裝:

$> source /tmp/edukit-2410/set_env_linux.sh?// Linux編譯環(huán)境變量設置,第一次打開Cygwin必須設置。

$> cd $WORKDIR $> tar-xvjf /tmp/edukit-2410/source/vivi/vivi-20030929.tar.bz2 $> ls

? vivi ?? ?為$WORKDIR目錄下其他內容

正確解壓后,可以看到多了一個vivi目錄,即vivi源代碼的安裝目錄,后面的vivi配置及編譯都得進入vivi目錄進行。再為EduKit2410實驗系統(tǒng)打入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函數(shù)開始執(zhí)行。lib:一些平臺公共的接口代碼,比如time.c里的udelay()和mdelay()。include:頭文件的公共目錄,其中的s3c2410.h定義了這塊處理器的一些寄存器。Platform/smdk2410.h定義了與開發(fā)板相關的資源配置參數(shù),我們往往只需要修改這個文件就可以配置目標板的參數(shù),如波特率、引導參數(shù)、物理內存映射等。

3.3 Vivi編譯與下載

1)Vivi源代碼的編譯

然后執(zhí)行以下命令進行編譯:

$> source /tmp/edukit-2410/set_env_linux.sh? Linux編譯環(huán)境變量設置

$> 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映像文件生成

如果編過程中沒有出現(xiàn)錯誤,則編譯后的執(zhí)行文件存放于 vivi 目錄下。2)下載:

在下載模式下,vivi為用戶提供一個命令行人機接口,通過人機接口可使用vivi提供的一些命令。如嵌入式系統(tǒng)沒有鍵盤和顯示,可以利用vivi中的串口,將其和宿主機連接起來,利用宿主機中的串口軟件(如Windows中的超級終端或Linux中的minicom)來控制。第四章 Linux內核移植與下載

4.1 Linux內核源代碼安裝

linux源代碼安裝

運行cygwin,執(zhí)行以下命令完成cygwin 環(huán)境下的Linux源代碼的安裝: $> source /tmp/edukit-2410/set_env_linux.sh Linux編譯環(huán)境變量設置

$> 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內核已經(jīng)包含了Linux源代碼的補丁文件、I2C和網(wǎng)絡驅動模塊

4.2 Linux內核源代碼分析與移植

4.2.1 Linux源代碼分析

Linux內核由5個主要的子系統(tǒng)組成。這5個子系統(tǒng)分別是進程調度(SCHED)、內存管理(MM)、虛擬文件系統(tǒng)(Virtual File System,VFS)、網(wǎng)絡接口(NET)和進程間通信(IPC)。

進程調度控制著進程對CPU的訪問。當需要選擇下一個進程運行時,由調度 程序選擇最值得運行的進程。可運行進程實際是僅等待CPU資源的進程,如果某個進程在等待其它資源,則該進程是不可運行進程。Linux使用了比較簡單的基于優(yōu)先級的進程調度算法選擇新的進程。

內存管理允許多個進程安全地共享主內存區(qū)域。Linux的內存管理支持虛擬內存,即在計算機中運行的程序,其代碼、數(shù)據(jù)和堆棧的總量可以超過實際內存的大小,操作系統(tǒng)只將當前使用的程序塊保留在內存中,其余的程序塊則保留在磁盤上。必要時,操作系統(tǒng)負責在磁盤和內存之間交換程序塊。內存管理從邏輯上可以分為硬件無關的部分和硬件相關的部分。硬件無關的部分提供了進程的映射和虛擬內存的對換;硬件相關的部分為內存管理硬件提供了虛擬接口。

虛擬文件系統(tǒng)隱藏了各種不同硬件的具體細節(jié),為所有設備提供了統(tǒng)一的接口,虛擬文件系統(tǒng)還支持多達數(shù)十種不同的文件系統(tǒng),這也是Linux較有特色的部分。虛擬文件系統(tǒng)可分為邏輯文件系統(tǒng)和設備驅動程序。邏輯文件系統(tǒng)指Linux所支持的文件系統(tǒng),如ext2、fat等,設備驅動程序指為每一種硬件控制器所編寫的設備驅動程序模塊。

網(wǎng)絡接口提供了對各種網(wǎng)絡標準的存取和各種網(wǎng)絡硬件的支持。網(wǎng)絡接口可分為網(wǎng)絡協(xié)議和網(wǎng)絡驅動程序兩部分。網(wǎng)絡協(xié)議部分負責實現(xiàn)每一種可能的網(wǎng)絡傳輸協(xié)議,網(wǎng)絡設備驅動程序負責與硬件設備進行通信,每一種可能的硬件設備都有相應的設備驅動程序

4.2.2 Linux內核及硬件模塊驅動移植

內核和文件系統(tǒng)、圖形用戶系統(tǒng)(GUI窗口系統(tǒng))可以分開,它們的開發(fā)、移植、下載甚至運行都是可以分開的。內核移植是一個比較復雜的任務,也是嵌入式系統(tǒng)開發(fā)中非常重要的一個過程。內核移植一般包括內核配置、內核編譯和內核下載3大步驟。

4.3 Linux內核編譯與下載

4.3.1 Linux內核源代碼安裝

運行cygwin,執(zhí)行以下命令完成cygwin環(huán)境下的Linux內核源代碼的安裝: $> source /tmp/edukit-2410/set_env_linux.sh //Linux 編譯環(huán)境變量設置 $> 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內核已經(jīng)包含了Linux源代碼的補丁文件、IIC和網(wǎng)絡驅動模塊。4.3.2 Linux內核的編譯 $> cd kernel

圖4.2 $> make mrproper 清除所有的舊的配置和舊的編譯目標文件等 $> make xconfig 在圖形界面下對內核進行配置(配置方法之一)執(zhí)行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:

根據(jù)提示加載配置文件后,點擊按鈕”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”,此文件是最后要燒寫到開發(fā)板的內核映像文件。

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;開發(fā)板重新加電,程序運行后,在超級終端上可以看到串口輸出類似以下信息:

圖4.10 超級終端界面

看到以上信息后,表示正在等待用戶從超級終端下載文件。這時,請點擊超 級終端菜單“傳送”選擇 Xmodem 方式下載 vivi.nand 文件,點擊 OK 后等待下載燒寫結束即可。

圖4.11 添加傳送文件

圖4.12 下載vivi nada 2)在vivi啟動等待中,敲入空格鍵進入vivi界面環(huán)境,并輸入以下命令: vivi> load flash kernel x <回車> ?燒寫更新內核約4分鐘即可燒寫完畢,如圖4.13

圖4.13 等待下載

3)立即選擇要發(fā)送的文件,比如zImage文件,這里Linux環(huán)境下源代碼arch/arm/boot目錄下的zImage內核映像文件已轉移到 windows某目錄下。要選擇合適的xmodem協(xié)議。以上操作完成 后,單擊“發(fā)送,幾分鐘后即可發(fā)送完畢。

圖4.14 發(fā)送zImage

圖4.15 下載成功 第五章 課程設計功能模塊程序設計與交叉編譯

5.1 課程設計模塊功能

5.1.1 三個模塊:

I2S音頻總線接口電路 ;音頻編解碼器芯片udal41; DMA控制器; 5.1.2工作過程:

麥克風輸入的模擬音頻信號在音頻編解碼器中經(jīng)過A/D轉換和編碼將模擬信號轉換成數(shù)字信號,將這些數(shù)字信號先傳給I2S音頻總線接口電路中的FIFO,再由DMA控制器送入DSP中做相應的處理,這是錄音的過程;DMA控制器將DSP中存儲的信號傳送給I2S音頻總線接口電路中的FIFO,再發(fā)送給音頻編解碼芯片進行D/A轉換,通過耳機輸出模擬信號。

5.2 功能模塊驅動程序設計

5.2.1 關于驅動結構體

由于目前許多硬件廠商在出售各種產(chǎn)品時,一般都不帶Linux下的設備驅動程序,而且編寫驅動程序的工作量占整個系統(tǒng)工作量的很大的一部分,這使得Linux下設備驅動程序的開發(fā)變得越來越重要。

本課程設計不要求自己編寫驅動程序,但要求分析UDAl341TS驅動程序,以便編寫出語音采集與播放的應用測試程序,同時為以后編寫驅動程序打好基礎。嵌入式Linux系統(tǒng)下的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 */(音頻緩沖區(qū)片大小)

u_int nbfrags;/* nbr of fragments */(音頻緩沖區(qū)片數(shù)量)dmach_t dma_ch;/* DMA channel(channel2 for audio)*/ } audio_stream_t;audio_stream_t是一個管理多緩沖區(qū)的結構體,為音頻流數(shù)據(jù)組成了一個環(huán)形緩沖區(qū)。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數(shù)據(jù)結構體提供文件系統(tǒng)的入口點函數(shù),也就是訪問設備驅動程序里的函數(shù)。file_operations結構體原型是在 中定義的函數(shù)指針表。5.2.2關于函數(shù):

read()、write()、open()和ioctl()是struct file_operations結構體中的接口函數(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指針所指的內存中;若參數(shù)count為0,則read()不會有作用并返回0;(3)返回值:返回值為實際讀取到的字節(jié)數(shù),如果返回0,表示已到達文件尾或是無可讀取的數(shù)據(jù),此外文件讀寫位置會隨讀取到的字節(jié)移動。如果正確會返回實際讀到的字節(jié)數(shù),最好能將返回值與參數(shù)count作比較,若返回的字節(jié)數(shù)比要求讀取的字節(jié)數(shù)少,則有可能讀到了文件尾、從管道(pipe)或終端機讀取,或者是read()被信號中斷了讀取動作。當有錯誤發(fā)生時則返回-1,錯誤代碼存入errno中,而文件讀寫位置則無法預期;2)write()函數(shù):將數(shù)據(jù)寫入已打開的文件內,即錄音。

(1)函數(shù)定義:ssize_t write(struct file *file, const char *buffer, size_t count, loff_t * ppos);(2)函數(shù)說明:把參數(shù)buffer所指的內存寫入count個字節(jié)到參數(shù)file所指的文件內。當然,文件讀寫位置也會隨之移動;(3)返回值:若正確會返回實際寫入的字節(jié)數(shù);當有錯誤發(fā)生時則返回-1,錯誤代碼存入errno中。

3)open()函數(shù):打開音頻設備。

(1)函數(shù)定義:int(*open)(struct inode *inode, struct file *file);(2)函數(shù)說明:參數(shù)inode為設備特殊文件的incode(索引結點)結構的指針,參數(shù)file是指向這一設備的文件結構的指針。open()的主要任務是確定硬件是否處在就緒狀態(tài),驗證次設備號的合法性,控制使用設備的進程數(shù);

(3)返回值:如果打開文件成功,open會返回一個文件描述符,以后對文件的所有操作就可以對這個文件描述符進行操作。比如程序中open()函數(shù)的返回值賦給了應用程序中的devfd,后面則可以對其進行操作;若打開失敗返回負數(shù)。

4)ioctl()函數(shù):用于設置編碼比特、采樣頻率和選擇聲道。(1)函數(shù)定義:int ioctl(struct inode *inode, struct file *file,unsigned int cmd, unsigned long arg);(2)函數(shù)說明:設備驅動程序中對設備的I/O通道進行管理的特殊控制函數(shù),可以通過它向設備傳遞控制信息或從設備取得狀態(tài)信息,實現(xiàn)用戶程序命令和驅動命令的相互聯(lián)系;

(3)返回值:執(zhí)行成功返回正數(shù),失敗返回-1。

5)s3c2410_uda1341_init()函數(shù):動態(tài)加載驅動模塊時的初始化函數(shù)。(1)函數(shù)定義:int __init s3c2410_uda1341_init(void);

(2)函數(shù)說明:該函數(shù)首先會初始化I/O和UDA1341 芯片,然后申請2個DMA 通道用于音頻傳輸。將輸出音頻緩沖區(qū)的DMA通道設為通道2,輸入音頻緩沖區(qū)的DMA 通道設為通道1。最后調用register_sound_dsp()和register_sound_mixer()兩個函數(shù)來分別注冊驅動設備;

(3)返回值:初始化成功,返回0;DMA 通道初始化設置失敗,返回負數(shù)。6)void __exit s3c2410_uda1341_exit()函數(shù):動態(tài)卸載驅動模塊時調用的函數(shù)。

(1)函數(shù)定義:void __exit s3c2410_uda1341_exit(void);

(2)函數(shù)說明:注銷音頻設備,分兩次調用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 目錄結構

一個完整的根文件系統(tǒng)通常包含以下幾個目錄: /bin 應用程序存放目錄。

/sbin 系統(tǒng)管理員服務程序,其中最重要的就是供內核初始化之后執(zhí)行的/sbin/init 進程。

/lib 存放程序運行所需要的動態(tài)庫。/proc 系統(tǒng)狀態(tài)文件目錄。/dev 驅動程序存放目錄。

/etc 系統(tǒng)配置文件及用戶數(shù)據(jù)存放目錄。

/mnt 用于設備安裝的目錄,通常包含etc 子目錄和為塊設備安裝保留目錄。/usr 用于存放用戶程序和配置文件的目錄,可以根據(jù)需要進行設置。一般情況下都要把已經(jīng)規(guī)劃好的目錄結構轉換成一個映象文件,即使用命令工具mkcramfs(cygwin下為mkcramfs.exe),把相應的cramfs 目錄樹壓縮為單一的映象文件。其命令格式為:

mkcramfs [-h] [-e edition] [-i file] [-n name] dirname outfile 使用mkcramfs.exe 在cygwin 下編譯生成文件系統(tǒng)映象文件root.cramfs,再固化到開發(fā)系統(tǒng)FLASH 上運行。6.1.2 構建cramfs 文件系統(tǒng)

按照本節(jié)實驗原理中自行構建一個cramfs 文件系統(tǒng)。運行cygwin,執(zhí)行以下命令解壓安裝:

$> source /tmp/edukit-2410/set_env_linux.sh //Linux 編譯環(huán)境變量設置

$> cd $WORKDIR/

圖6.1 構建文件系統(tǒng)

$> tar-xvjf /tmp/edukit-2410/root.cramfs.tar.bz2 $> ls ? root ? root 文件夾中就是我們想要的cramfs 文件系統(tǒng)

6.2 文件系統(tǒng)映像文件生成

6.2.1 編譯一個應用測試程序test.c 按設計原理要求編寫一個應用程序test.c,存放在/home/app/audio目錄下,進入該目錄后執(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 設為短接(從Nand Flash 啟動),確定已經(jīng)成功燒寫vivi 和linux kernel,加電運行可以看到vivi 啟動信息,輸入空格進入命令狀態(tài);

(2)雙擊運行Download.pjf 工程文件(將啟動Embest IDE 環(huán)境),點擊連接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 下載文件系統(tǒng)映象 約1-2 分鐘

圖6.5 下載成功

其次下載完畢后,點擊Start(F5)然后在超級終端里輸入:load flash root j(燒寫更新文件系統(tǒng))

圖6.6 燒寫

注意:只能在“vivi的燒寫”和linux內核操作完成后,才可以按以上方法正確燒寫root映象到NandFlash。重起實驗板,觀測超級終端窗口提示信息,引導整個系統(tǒng)啟動到linux行命令輸入狀態(tài)。在超級終端輸入一些linux命令查看執(zhí)行結果是否正確。

6.4 功能模塊運行與調試

重新加電,在超級終端根據(jù)提示啟動Linux,按提示輸入cd bin、./test指令。

圖6.7 輸入指令

圖6.8 在控制臺下運行測試程序

程序執(zhí)行完后。如圖6.9。

圖6.9 程序運行時超級終端的輸出

第七章 課程設計總結與體會

7.1 得出的結論

通過按上述步驟執(zhí)行相關應用程序,可以實現(xiàn)對語音的實時采集和播放。需改進的地方:通過錄制一段語音信息,錄制完成后再播放

7.2課程設計過程中遇到的問題及解決方法

1.在給vivi打補丁時,$> patch-p1

2.在圖形界面下進行內核配置時按實驗指導書配置導致少了sound這一步導致出錯。

3.重新在圖形界面下配置后,發(fā)現(xiàn)無法生成壓縮映像文件。請教研究生后解決了。原來之前配置錯誤生成了boot文件夾,要把之前boot刪掉后重新編譯。4.在調試時輸入cd bin,./test指令后超級終端無反應。查找后發(fā)現(xiàn),原來在根文件系統(tǒng)編譯時沒把生成的test文件復制到文件系統(tǒng)所在的工作目錄root/bin目錄下。重新編譯后把生成的test文件復制后在調試后可以進行錄放測試。

7.3 心得體會

課程設計剛開始的時候,思緒全無,我真的感到 “書到用時方恨少”,所以又重新把書和實驗指導看了幾遍,對知識系統(tǒng)而全面進行了梳理,對許多不理解的地方通過上網(wǎng)搜索翻閱圖書弄懂,終于熟練掌握了基本理論知識,而且領悟諸多平時學習沒有注意到的細節(jié)步驟,學會了如何思考的思維方式,找到了設計的靈感。

雖然每天要頂著30多度的高溫在宿舍跟實驗室之間往返,流了不少汗水,感覺確實不舒服,可最后看到自己的成果后心里很充實很高興。

在課程設計過程中遇到了這樣那樣的困難。有時候是電腦出問題了,有時候

是實驗箱出毛病,有時候是自己在操作過程中操作錯誤無法繼續(xù),可在研究生學長和其他同學的幫忙下都一一解決。使我深深感覺到團隊力量的強大。

最后再次感謝陳老師這學期兢兢業(yè)業(yè)地給我們傳授知識,感謝三位研究生犧牲自己的時間在炎熱的夏天幫助我們解決遇到的問題!

參考文獻

[1]徐英慧,等.ARM9嵌入式系統(tǒng)設計——基于S3C2410與Linux[M].北京:北京航空航天大學出版社,2007.[2]于明,等.ARM9嵌入式系統(tǒng)設計與開發(fā)教程[M].北京:電子工業(yè)出版社,2006.[3]田澤.ARM9嵌入式開發(fā)實驗與實踐[M].北京:北京航空航天大學出版社,2006.[4]孫天澤,等.嵌入式設計及Linux驅動開發(fā)指南——基于ARM9處理器[M].2版.北京:電子工業(yè)出版社,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]魏洪興.嵌入式系統(tǒng)設計師教程[M].北京:清華大學出版社,2006.[8]張紀坤,等.嵌入式Linux系統(tǒng)開發(fā)技術詳解——基于ARM[M].北京:人民郵電出版社,2006.[9]吳明輝,等.基于ARM的嵌入式系統(tǒng)開發(fā)與應用[M].北京:人民郵電出版社,2004.[10]王田苗.嵌入式系統(tǒng)設計與實例開發(fā)[M].2版.北京:清華大學出版社,2003.[11]俞建新,等.嵌入式應用程序開發(fā)綜合實驗9例[M].北京:清華大學出版社,2004.[12]許海雁,等.嵌入式系統(tǒng)技術與應用[M].北京:機械工業(yè)出版社,2002.36

下載嵌入式遠程視頻采集系統(tǒng)的設計與實現(xiàn)(基于S3C2410)word格式文檔
下載嵌入式遠程視頻采集系統(tǒng)的設計與實現(xiàn)(基于S3C2410).doc
將本文檔下載到自己電腦,方便修改和收藏,請勿使用迅雷等下載。
點此處下載文檔

文檔為doc格式


聲明:本文內容由互聯(lián)網(wǎng)用戶自發(fā)貢獻自行上傳,本網(wǎng)站不擁有所有權,未作人工編輯處理,也不承擔相關法律責任。如果您發(fā)現(xiàn)有涉嫌版權的內容,歡迎發(fā)送郵件至:645879355@qq.com 進行舉報,并提供相關證據(jù),工作人員會在5個工作日內聯(lián)系你,一經(jīng)查實,本站將立刻刪除涉嫌侵權內容。

相關范文推薦

主站蜘蛛池模板: 国产极品视觉盛宴| 日本jizz| 波多野结衣av一区二区三区中文| 无遮挡又黄又刺激又爽的视频| 亚洲欭美日韩颜射在线| 偷窥日本少妇撒尿chinese| 人妻少妇被猛烈进入中文字幕| 欧美午夜片欧美片在线观看| 99久久99久久久精品齐齐综合色圆| 中文字幕人妻偷伦在线视频| 亚洲人成网站在线播放小说| 国产美女做爰免费视频| 国产麻豆精品一区| 正在播放强揉爆乳女教师| 啪啪无码人妻丰满熟妇| 欧美孕妇变态重口另类| 无码毛片内射白浆视频| 少妇高潮流白浆在线观看| 麻豆一区二区三区精品视频| 国产无遮挡又黄又爽高潮| 色婷婷综合久久久久中文一区二区| 亚洲久久中文字幕www网站| 国产精品xxx在线| 一边添奶一边添p好爽视频| 亚洲欧美日韩国产精品专区| 少妇内射视频播放舔大片| 国产成人a在线观看视频| 国产自偷自偷免费一区| 亚洲精品成人无码中文毛片| 国产在线精品一区二区不卡| 亚洲精品字幕在线观看| 99精品热在线在线观看视频| 亚洲乱亚洲乱妇24p| 人妻激情文学| 国产午夜激无码av毛片| 上司人妻互换hd无码中文| 亚洲小说区图片区另类春色| 无码av免费一区二区三区试看| 欧洲人免费视频网站在线| 夜夜澡天天碰人人爱av| 又色又爽又黄的视频软件app|