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