嵌入式視頻圖像壓縮模塊的USB接口設(shè)計(jì)
摘要:本文介紹了一種嵌入式視頻圖像壓縮模塊的USB接口設(shè)計(jì)方案,給出了該系統(tǒng)的硬件實(shí)現(xiàn)方案以及USB控制芯片CY7C68013在系統(tǒng)中的應(yīng)用,并編寫了USB固件程序、嵌入式操作系統(tǒng)Windows CE.net下的USB驅(qū)動(dòng)程序和應(yīng)用程序。
關(guān)鍵詞:視頻壓縮;固件程序;驅(qū)動(dòng);USB總線
視頻圖像監(jiān)控技術(shù)已經(jīng)得到了廣泛應(yīng)用。但是在一些特殊場合,雖然并不需要實(shí)時(shí)圖像監(jiān)控,對(duì)圖像的質(zhì)量卻有很高的要求。例如需要以圖像畫面作為證據(jù)的遠(yuǎn)程視頻監(jiān)視系統(tǒng),H.261和H.263圖像的質(zhì)量已無法勝任,而是需要高質(zhì)量的JPEG圖像。所以研究和設(shè)計(jì)滿足工業(yè)級(jí)要求的靜態(tài)圖像壓縮模塊對(duì)于特殊場合的視頻圖像監(jiān)控有非常重要的意義。
在遠(yuǎn)程視頻監(jiān)控系統(tǒng)中,視頻采集及壓縮傳送是不可或缺的重要組成。本文介紹了一種基于CY7C68013的JPEG視頻壓縮模塊設(shè)計(jì)方案,它具有130萬像素圖像分辨率、壓縮率大、接口簡單等特點(diǎn),可以方便地和USB主控設(shè)備結(jié)合在一起,由上位機(jī)通過軟件指令控制拍攝、視頻壓縮和上傳壓縮圖像數(shù)據(jù),從而組成靜態(tài)視頻監(jiān)控系統(tǒng)。
硬件結(jié)構(gòu)
本文所開發(fā)的這套嵌入式視頻圖像壓縮模塊,其硬件框圖見圖1。上位機(jī)是嵌人式智能工業(yè)控制器。它是以S3C4510B為核心處理器, 采用ARM7TDMI RISC內(nèi)核,在其上運(yùn)行WinCE.Net 5.0操作系統(tǒng)。下位機(jī)由三個(gè)主芯片構(gòu)成:CY7C68013、S1D13718和K9650FB模塊。CY7C68013是一款集成USB2.0的微處理器,在單片機(jī)上集成了USB2.0收發(fā)器、串行接口引擎(SIE)、增強(qiáng)的8051微控制器和可編程的外圍接口,支持USB1.1和USB2.0協(xié)議。S1D13718是圖像引擎芯片,負(fù)責(zé)JPEG編解碼。視頻采集模塊采用K9650FB模塊,它內(nèi)部包含CMOS攝像頭和圖像處理芯片OV9650,輸出圖像最大可為130萬像素,并具有標(biāo)準(zhǔn)的視頻接口和OmniVision公司自定義的SCCB配置總線。系統(tǒng)上位機(jī)與遠(yuǎn)程監(jiān)控系統(tǒng)組成局域網(wǎng),以接收遠(yuǎn)程監(jiān)控系統(tǒng)的命令和上傳圖片數(shù)據(jù)。上位機(jī)通過USB總線將各種與拍攝相關(guān)的命令發(fā)送給CY7C68013,最后在CY7C68013的固件程序里具體實(shí)現(xiàn)SID13718和K9650FB的初始化,并從S1D13718片內(nèi)RAM中取出壓縮好的JPEG圖片上傳。
圖1 硬件結(jié)構(gòu)框圖
軟件設(shè)計(jì)
本設(shè)計(jì)中USB軟件設(shè)計(jì)包括3部分:固件程序、USB設(shè)備驅(qū)動(dòng)程序和應(yīng)用程序。
固件程序
在外部EEPROM中存放有CY7C68013固件程序,該程序在上電后加載到8051內(nèi)核,主要完成兩項(xiàng)功能:對(duì)USB設(shè)備進(jìn)行配置及實(shí)現(xiàn)USB數(shù)據(jù)傳輸;實(shí)現(xiàn)對(duì)S1D13718和K9650FB的初始化。
USB傳輸方式分為4種:控制傳輸、批量傳輸、同步傳輸和中斷傳輸??紤]到實(shí)際應(yīng)用環(huán)境和復(fù)雜度,在開發(fā)中使用了控制傳輸和批量傳輸??刂苽鬏斨饕脕硗瓿芍鳈C(jī)對(duì)設(shè)備的配置和各種控制操作。批量傳輸主要用來完成上位機(jī)和CY7C68013之間的圖像數(shù)據(jù)傳輸。固件程序流程如圖2所示。
圖2 固件程序流程
在這里,步驟①~⑤主要是完成USB接口的初始化工作,而步驟⑥~⑩可以看作是任務(wù)派發(fā)階段,完成USB事務(wù)及用戶特定的任務(wù)。
驅(qū)動(dòng)程序
WinCE.Net的USB系統(tǒng)軟件由兩層組成:上層為USB設(shè)備驅(qū)動(dòng)程序?qū)?即本文所研究的內(nèi)容;底層為USB功能的實(shí)現(xiàn)層,包括主機(jī)控制器驅(qū)動(dòng)HCD以及USB協(xié)議棧USBD兩部分,這一層次由WinCE.Net操作系統(tǒng)本身提供。
WinCE.Net系統(tǒng)提供的兩種驅(qū)動(dòng)模型是本機(jī)驅(qū)動(dòng)程序和流接口驅(qū)動(dòng)程序。前者通常適用于集成到平臺(tái)上的設(shè)備,后者為一般類型的驅(qū)動(dòng)程序,適用于大部分平臺(tái)外部連接的設(shè)備。流接口驅(qū)動(dòng)程序表現(xiàn)為在用戶一級(jí)的動(dòng)態(tài)鏈接庫DLL,用來實(shí)現(xiàn)一組固定的函數(shù)——流接口函數(shù),這些流接口函數(shù)使得應(yīng)用程序可以通過文件系統(tǒng)訪問這些驅(qū)動(dòng)程序。本文采用了流接口驅(qū)動(dòng)程序。圖3說明了流接口驅(qū)動(dòng)程序的工作結(jié)構(gòu)。應(yīng)用程序通過文件系統(tǒng)的API函數(shù)調(diào)用流接口函數(shù),然后由流接口驅(qū)動(dòng)程序調(diào)用本機(jī)驅(qū)動(dòng),或者通過設(shè)備管理器與系統(tǒng)內(nèi)核或外圍設(shè)備打交道?!?/P>
圖3 流接口驅(qū)動(dòng)程序的工作結(jié)構(gòu)
編寫Wi nCE.Net系統(tǒng)下USB總線設(shè)備的驅(qū)動(dòng)程序必須實(shí)現(xiàn)的三個(gè)入口函數(shù)USBDeviceAttach()、 USBInstallDriver()、USBUninstallDriver(),這是WinCE.Net系統(tǒng)編寫的USB協(xié)議棧的要求,這三個(gè)函數(shù)本身也體現(xiàn)了USB總線設(shè)備與其他設(shè)備驅(qū)動(dòng)程序不同的編寫特征。在設(shè)備接到主機(jī)上后,系統(tǒng)底層的USB總線功能實(shí)現(xiàn)層會(huì)將檢測到的設(shè)備基本信息及設(shè)備某功能接口的有關(guān)信息提供給上層,USBDeviceAttach()等函數(shù)會(huì)接受該信息,從而為客戶端驅(qū)動(dòng)的下一步工作打下基礎(chǔ);另外,也能更好地進(jìn)行必要的注冊(cè)表項(xiàng)設(shè)置。在WinCE.Net系統(tǒng)中,設(shè)備的配置信息都是存儲(chǔ)在系統(tǒng)注冊(cè)表中,因此,有關(guān)具體設(shè)備的必要信息和一些附加信息可以在USBInstallDriver()中實(shí)現(xiàn)注冊(cè),而USBUninstallDriver()函數(shù)負(fù)責(zé)卸載這些注冊(cè)的設(shè)備信息。
一個(gè)具體的流接口驅(qū)動(dòng)程序跟注冊(cè)表部分肯定是分不開的。這里,我們將自己寫的一個(gè)注冊(cè)表文件通過添加組件的方式添加到內(nèi)核中。下面是這個(gè)注冊(cè)表文件的內(nèi)容。
[HKEY_LOCAL_MACHINE DriversUSBLoadClientsJPEG]
“Index”=dword:1
“Prefix”=“JPEG”
//設(shè)備名稱為JPEG
“DLL”=“MyDriver.dll”
//驅(qū)動(dòng)名稱,其中包括上文提到的三個(gè)入口函數(shù)和DLL接口函數(shù)
“Order”=dword:0
當(dāng)有外設(shè)插入后,系統(tǒng)在取得VID/PID后將自動(dòng)在注冊(cè)表中尋找是否有這一項(xiàng),依據(jù)注冊(cè)表找到驅(qū)動(dòng)程序dll文件后,將首先調(diào)用USBInstallDriver函數(shù),該函數(shù)使用USBD.dll中的函數(shù)注冊(cè)設(shè)備,并依據(jù)VID/PID設(shè)置注冊(cè)表項(xiàng),這樣在這個(gè)項(xiàng)不丟失的時(shí)候,下次插入將能夠自動(dòng)找到;如果這個(gè)函數(shù)的VID/PID和實(shí)際設(shè)備不符,將返回失敗;USBInstallDriver成功之后,系統(tǒng)調(diào)用USBDeviceAttach函數(shù);該函數(shù)的主要實(shí)現(xiàn)內(nèi)容有三個(gè):
(1) 分配設(shè)備對(duì)象結(jié)構(gòu),利用系統(tǒng)傳遞上來的設(shè)備接口數(shù)據(jù)填寫該設(shè)備對(duì)象結(jié)構(gòu)成員變量值,從而在流驅(qū)動(dòng)函數(shù)中作為參數(shù)傳遞設(shè)備信息;
(2) 創(chuàng)建獲取中斷設(shè)備數(shù)據(jù)的線程,注冊(cè)線程處理回調(diào)函數(shù);
(3) 在設(shè)備對(duì)象結(jié)構(gòu)填寫完畢后調(diào)用ActivateDevice()系統(tǒng)函數(shù),并向系統(tǒng)注冊(cè)該驅(qū)動(dòng)程序,激活該設(shè)備驅(qū)動(dòng)程序。最后調(diào)用RegisterNotificationRoutine()函數(shù)登記注冊(cè)DeviceNotify函數(shù)——這個(gè)函數(shù)是必須的,在設(shè)備被移走后調(diào)用這個(gè)函數(shù)完成善后工作。
驅(qū)動(dòng)加載完成后,用戶程序再用CreateFile打開設(shè)備的時(shí)候,將返回驅(qū)動(dòng)程序上下文給用戶程序,這樣用戶程序和驅(qū)動(dòng)就可以交互了。在本驅(qū)動(dòng)中,所有對(duì)S1D13718和K9650FB模塊的操作都是通過DeviceIoControl()函數(shù)映射到JPEG_Iocontrol來完成。下面是部分驅(qū)動(dòng)程序。
BOOL JPEG_IOControl( DWORD hOpenConext, DWORD dwCode,DWORD* pBufin,DWORD dwLenIn,PBYTE pBufOut,DWORD dwLenOut,PDWORD pdwActualOut)
{ switch(dwCode)
{
case Cameral_INITIAL:
//初始化數(shù)字Camera接口
Break;
case Enable_JPEG:
//使能JPEG模塊
Break;
case Initial_JPEG:
//初始化JPEG模塊并啟動(dòng)JPEG編碼
Break;
case READ_JPEG
//讀取一幅圖片
Break;
Else:
Break;
}
}
應(yīng)用程序
本文上位機(jī)的應(yīng)用程序是在Embedded Visual C++開發(fā)環(huán)境下使用WIN32 API開發(fā)的。由于在Win32系統(tǒng)中,每一外部設(shè)備都可以抽象為文件,USB設(shè)備同樣可以作為系統(tǒng)文件來進(jìn)行操作,所以在應(yīng)用程序調(diào)用文件操作API函數(shù),就可以實(shí)現(xiàn)與驅(qū)動(dòng)程序中的USB設(shè)備通信。在本系統(tǒng)中,利用CreateFile()、CloseFile()函數(shù)取得或關(guān)閉USB設(shè)備句柄,用DeviceloControl()函數(shù)來進(jìn)行系統(tǒng)控制,ReadFile()函數(shù)進(jìn)行讀取圖像。
結(jié)語
本文介紹了嵌入式視頻圖像壓縮模塊的USB接口設(shè)計(jì)方案,可以成功地進(jìn)行每秒一幀1300
pid控制相關(guān)文章:pid控制原理
c++相關(guān)文章:c++教程
評(píng)論