WinCE5.0的USB Camera流接口驅動開發

2020-12-22 電子產品世界

  引 言

本文引用地址:http://www.eepw.com.cn/article/88376.htm

  WinCE5.0是一個32位、多任務、多線程的實時嵌入式作業系統。USB Camera 以其良好的性能和低廉的價格得到廣泛的應用,同時因其靈活、方便的特性,易於集成到嵌入式系統中。通過採用USB Camera可以在WinCE5.0下方便地得到實時圖像。但是由於嵌入式硬體環境的多樣性以及WinCE5.0對USB設備驅動開發只提供了一些底層支持,攝像頭廠商尚未提供WinCE5.0下USB攝像頭的驅動,因此開發出WinCE5.0下USB攝像頭驅動具有實際的意義和價值。本文正是針對這一情況,對WinCE5.0下USB設備驅動開發進行研究,並設計出基於流接口驅動模型的USB攝像頭驅動程序。現在已經開發出來的驅動適用於Zc030x PLUS這一系列的攝像頭。Samstmg 2410為實驗的硬體平臺。

  1 WinCE5.0下USB總線驅動框架

  USB系統由USB主機、一個或多個USB設備和物理總線組成。主機上又分兩層:較高的包含USB設備驅動程序的軟體層和主機控制器硬體層,也稱作「適配層」。主機的主要任務是控制對USB設備的雙向數據傳輸。物理總線是一組USB電纜,用來將控制器和外圍設備連接起來。WinCE5.0的USB系統軟體由兩層組成:USB設備驅動程序層和底層的由WinCE5.0實現的USB函數層。

  USB設備驅動程序使用USB函數來建立與它們所控制設備的連接,並對這些設備進行配置和通信。較低的USB函數層本身又由兩部分組成——較高的通用串行總線驅動程序(USBD)模塊和較低的主控制器驅動程序(HCD)模塊。HCD提供了抽象的主機控制器,且對主機控制器所見到的USB系統的數據傳輸進行抽象。USBD提供一個抽象的設備,且對USBD客戶和USB設備功能部件之間的數據傳輸進行抽象。USB設備驅動程序使用USBD接口函數與外圍設備進行通信。

  IHV和USB設備製造商利用USBD提供的函數來實現USB設備的驅動程序。OEM負責給基於WinCE的平臺提供HCD模塊,這樣相應的硬體才能與USBD模塊進行交互。圖1說明了與主機的USB硬體和外圍設備相對應的軟體的各個層。

  2 WinCE5.0下流驅動模型

  基於WinCE5.0平臺的兩種專用的驅動模型為:本機設備驅動程序和流接口驅動程序。本機設備驅動程序適合於集成到WinCE 5.0 平臺的設備;而後者則是一般類型的設備驅動程序,適用於大部分外圍設備,如數據機、印表機等。對大多數USB外圍設備來說,適用於採用流接口驅動程序模型來開發驅動程序。

  流接口驅動程序是一種可以定製接口的驅動模型,一般由設備管理器負責管理。它把設備管理器和應用程式的命令轉換成所控設備的適當動作所需信息。流接口驅動程序需要實現一組固定的流接口函數,供給WinCE5.0系統內核使用。

  USB設備的流接口驅動程序和WinCE5.0系統其他部件間的關係如圖2所示。流接口驅動程序通過系統提供的文件系統API與應用程式交互;而系統通過設備管理器完成對流接口驅動程序的加載、卸載等管理工作;流接口驅動程序通過調用USBD模塊提供的接口函數實現與底層USB設備通信。

  本文使用的流接口函數方法如表1所列。

  USB設備驅動程序必須輸出的函數有:

  ①USBDeviecAttach()。當USB設備連接到計算機上時,USBD模塊就會調用此函數。這個函數主要用於初始化USB設備,取得USB設備信息,配置USB設備,並且申請必需的資源。
  ②USBInstallDriver ()。主要用於創建一個驅動程序加載所需的註冊表信息,例如讀/寫超時、設備名稱等。
  ③USBUninstallDriver ()。主要用於釋放驅動程序所佔用的資源,以及刪除UsbInstallDriver ()函數創建的註冊表等。

  上述3個函數接口是所有的USB驅動程序必須提供的,缺一不可。

  另外較為重要的是USB設備驅動程序的註冊表配置。一般的USB設備驅動程序的註冊表配置在[HKEY_LOCAL_MACHINE\Drivers\USB\LoadClients\口]下,每個驅動程序的子鍵都有Group 1_ID\Group2_ID\Group3_ID\DriverName 格式,設備的子鍵由供應商、設備類和協議信息通過下劃線組成。表2列出了允許的組合。

  以本實驗所採用的USB Camera為例,該USB Cam-era的供應廠商ID為0X046d,設備ID為0x08a2,那麼它的加載註冊表應該寫為:


  需要注意的是,註冊表的構成都是以十進位數值來標識的,也要注意十進位和十六進位之間數的轉換。

  3 WinCE5.0下USB攝像頭驅動程序

  實驗使用的USB Camera是中星微公司的301晶片組的Zc030x,它的Vid/Pid為0x046d、0x08a2。由於實時圖像數據傳送量比較大,很多USB Camera產品在圖像傳輸之前已進行了數據壓縮處理,如果不知道解碼算法,是沒有辦法在WinCE上獲得圖像的。在開發的時候主要使用SnoopyPro,它是一款可以分析USB通信數據的軟體,輔助進行Zc030x的驅動開發工作,最後成功開發出Zc030x在WinCE5.0下的驅動程序。下面結合USBCamera驅動開發說明驅動中的數據流向和必要的函數使用。首先是具體的註冊表信息:


  其中,hDevice是由系統提供的當前外設的句柄,通過它可以獲取外設的信息,如VID、PID等;UsbFuncs是系統提供的指向USBD函數的函數指針,通過它可以調用USBD函數,如GetlsochResult、IssuelsochTransfer等;AcceptControl指針指向的bool值需要我們確定,如果可控,令其為TRUE,否則為FALSE。

  在這個函數裡面,要做的工作包括確定外設是否可控,分配和填寫設備的上下文內容,調用ActivateDevjce()函數在「Drivers\USB\ClientDrivers\Camera_Class」鍵值中註冊分配到的設備上下文的指針(其中Camera_Class是對USB Camera的命名),同時ActivateDevice在註冊表[HKEY_LOCAL_MACHINE\Drivers\Active\N]中登記設備上下文的指針,其中N為整數,它是系統自動分配給此驅動的數字。系統在調用ActivateDevice()過程中,又會自動調用CAM_Init函數。
  DWORD CAM_Init(LPCTSTR pContext,LPCVOIDIp VBusContext)

  其中,pContext是系統自動傳入的字符串內容,也是上面的鍵名,即[HKEY_LOCAL_MACHINE\Drivers\Active\N];CAM_Init要完成的就是在此鍵下讀出設備上下文的指針,將其作為DWORD返回;IpvBusContext不用考慮。

  在USBDeviceAttach()中,最後要完成的工作是在此函數內調用USBD模塊的RegisterNotificationRoutine函數登記註冊DeviceNotify函數。這個DeviceNotify函數是必需的,在設備被移走後,系統調用這個函數完成相應的善後工作。

  BOOL WINAPI DeviceNotify(LPVOID lpvNotifyPa-rameter DWORD dwCode.LPDWORD dwInf01.LPDW0RDdwlnfo2.LPDWORD dwlnfo3.LPDWORD dwlnfo4)

  其中,IpvNotifyParameter是設備的上下文句柄,在RegisterNoticationRoutine中作為參數傳入;dwCode是系統調用此函數的原因,如設備被移走,dwcode的值就為USB_CLOSE_DEVICE,相應的,用戶進行卸載DLL工作;dwInfol,…,dwInfo4沒有使用。

  自此,系統在USBDeviceAttach中完成對所加USB外設的驅動加載。當有用戶調用CreateFile函數,系統會將用戶填入CreateFile()的參數值,直接傳到CAM_Open()。
  DWORD CAM_Open(DWORD hDeviceContext,DWORDAccessCode,DWORD ShareMode)

  其中,hDeviceContext是驅動上下文句柄,由系統自動填充;AccessCode是訪問模式,ShareMode是共享模式,均由CreateFile()傳遞過來;CAM_Open的工作是將hDe-viceContext以DWORD的形式返回,再作為CreateFile()的句柄值返回給用戶。當用戶調用CloseHandle()時,系統將直接調用CAM_Close(),用於關閉一個驅動程序。
  B00L CAM_Close(DWORD hOpenContext)

  其中,hOpenContext是設備驅動的引用事例句柄,由CAM_Open創建。本驅動中,所有對USB Camera的操作均通過IOControl()映射到CAM_IOControl來完成。下面是CAM_IOControl的部分源碼分析:


  由於本驅動是針對USBCamera的,因此CAM_Write、CAM_Read、CAM_PowerUp、CAM_PowerDown並沒有內容;但是只要用戶調用WriteFile,系統就將映射到CAM_Write。其他函數類似。通常,Camera對圖像的壓縮採用標準是MJPEG算法。在Zc030x上正是採用這一算法完成對數據壓縮的。只要在驅動上增加MJPEG的解碼算法,還原壓縮數據,就可以正確顯示圖像了。至此,整個USB Camera的驅動編寫工作完成。經過實驗驗證,已經實現了最高為25幀/s,大小為320×240的圖片的傳輸。

  結 語

  本文介紹了WinCE5.0下USB設備驅動框架,結合USB Camera的驅動開發實例說明了在USB驅動框架中驅動數據的流動方向,並已在中星微公司的301PLUS和303這兩個系列的攝像頭上得到成功運用和實踐。所採用的程序設計方法及思想,對其他類似嵌入式系統軟體的設計也有較高的參考價值。

相關焦點

  • WinCE平臺USB攝像頭驅動開發流程
    但是由於嵌入式硬體平臺的多樣性,以及WinCE對USB設備驅動開發只提供了底層支持,再加上許多攝像頭廠商尚未提供WinCE下的USB攝像頭驅動,這對初級開發人員在開發WinCE USB攝像頭程序時是一個難點。  前段時間,公司委派我負責一個嵌入式項目,項目要求是在WinCE平臺上集成USB攝像頭驅動和視頻採集程序。
  • USB 接口驅動程序開發
    現在市場上幾乎所有的P C 機器都配備了US B 接口,USB 接口之所以能夠得到廣泛支持和快速普及,是因為它具備以下優點:  正由於上述優點, 開發USB 接口的設備已成為一種發展趨勢。, 而且具有多種速度的周邊設備都可以被連接到USB 2.0 的線路上,而且無需擔心數據傳輸時發生瓶頸效應。
  • 基於USB接口的 OTG應用技術開發
    當otg雙角色設備以主機方式工作時(如圖5),usb主設備軟體包工作,以從機方式工作時,usb設備軟體包工作。otg通過驅動連接器中的id的不同連接,或通過是否有主設備轉換協議spr以確定雙角色設備的工作方式,並確定使用usb主設備軟體包或usb設備軟體包。 usb驅動程序由主機驅動程序,usb子系統,usb設備驅動程序組成。在linux作業系統中,存在一個連接usb設備驅動程序和主控制器驅動程序的子系統usbcore,它通過定義一些數據結構,宏和功能函數來抽象所有的硬體設備。
  • USB3.0驅動
    USb3.0驅動轉上它就可以驅動usb 3.0設備,能夠適應於大部份主板,幫助用戶解決usb3.0和電腦無法正常通訊的問題。
  • WinCE下的串口驅動分析
    下面我們來看具體的驅動程序。 在wince中串口的驅動實現是有固定模型的,ce中的串口模型遵循ISO/OSI網絡通訊模型(7層),就是說串口屬於CE網絡模塊的一個部分。其中rs232界面(或其它的物理介質)實現網絡的物理層,而驅動和serialAPI共同組成數據鏈路層,其它部分都沒有做定義。
  • win10 usb3.0驅動
    驅動簡介 usb3.0驅動win10(32位/64位)通用版就可以驅動USB 3.0的設備,默認系統是不自帶USB3.0的驅動的。
  • USB萬能驅動
    USB萬能驅動 萬能驅動 大小: 25.0 KB
  • USB驅動開發的步驟及方法解析
    隨著USB2.0設備的不斷增加,USB設備驅動開發在嵌入式開發中變的越來越重要。Windows CE支持USB 2.0更是對這一波新技術浪潮產生巨大的推動。近期我負責一個這樣的項目,在WinCE下開發USB接口的外圍設備驅動。當時做這個項目花費了我相當多的時間和精力,錯走許多冤枉路使我精疲力盡。
  • USB設備驅動程序
    USB接口只有4條線: 5V,GND,D-,D+答3.新接入的USB設備的默認編號是0,在未分配新編號前,PC使用0編號和它通信。問5. 為什麼一接入USB設備,PC機就能發現它?答5.找到匹配的設備驅動, 3.
  • USB接口晶片CH375的原理及應用(圖)
    隨著計算機技術的快速發展,usb移動存儲設備的使用已經非常普遍,因此在一些需要轉存數據的設備、儀器上使用usb移動存儲設備接口的晶片便相繼產生了,ch375就是其中之一,它是一個usb總線的通用接口晶片,支持host主機方式和slave設備方式。
  • SEP6200平臺上Linux內核的USB OTG驅動設計
    當核心板作為device與PC進行連接時,軟體檢測到ID信號狀態為浮空後將GPIO_EN引腳置0,切斷電源模塊,使5 V供電電壓與VBUS總線隔絕。相反,當核心板作為Host與U盤等外設進行通信時,軟體檢測到ID信號狀態為接地,然後將GPIO_EN引腳置位,通過電源使能模塊將5 V電壓加載到VBUS總線上,實現核心板作為主機對外設進行供電,從而實現對外部設備的檢測和枚舉等後續操作。
  • USB數據線接口怎麼接 USB數據線接口操作方法介紹【詳解】
    [2]對於大多數工程師來說,開發USB2.0接口產品主要障礙在於:要面對複雜的USB2.0協議、自己編寫USB設備的驅動程序、熟悉單片機的編程。這不僅要求有相當的VC編程經驗、還能夠編寫USB接口的硬體(固件)程序。所以大多數人放棄了自己開發USB產品。為了將複雜的問題簡單化,西安達泰電子特別設計了USB2.0協議轉換模塊。
  • 電腦I/O接口接口庫科普,永遠都要插三次的usb接口
    ,之前網線方面我已經寫過相關的科普了,今天我們就來說說我們日常中使用的最多的usb接口。上面只是日常生活中使用usb接口時我們經常遇到的一個小問題罷了,下面我們就來詳細的說一下usb接口。USB接口又名通用串行總線(英語:Universal Serial Bus,縮寫:USB)是連接計算機系統 與 外部設備的一種串口總線標準,也是一種輸入輸出接口的技術規範,被廣泛地應用於個人電腦和行動裝置等信息通訊產品。
  • USB驅動程序框架搭建
    把USB設備接到開發板上,看輸出信息:usb 1-1: new full speed USB device using s3c2410-ohci and address 2usb 1-1: configuration #1 chosen from 1 choicescsi0 : SCSI
  • WinCE電源管理的實現
    [設備電源]支持電源管理的設備驅動的實現,存在有大量的例子.簡單介紹如下:電源管理模塊並不直接實現對子設備的電源開關控制,子設備的電源控制是由各個設備驅動來控制的.電源管理模塊透過設備驅動的IOCTLs來請求設備控制自身電源.系統電源狀態是靈活自由設定的,而設備電源狀態是固定的,最多有5個:D0,D1,D2,D3,D4代表Full on,Low on, Standby
  • 電腦I/O接口永遠都要插三次的usb接口
    基本上看我的文章的朋友們應該都知道,在我們日常生活和工作中,我們會接觸或使用到各種各樣的數據傳輸接口,如USB,HDMI,3.5毫米耳機接口,RJ-45網線接口等等,之前網線方面我已經寫過相關的科普了,今天我們就來說說我們日常中使用的最多的usb接口。 為什麼標題裡我要說usb永遠都要插三次才能插上呢?我相信大家也都有和我一樣的經歷。
  • Raspberry PI camera ov5647 - AISTARVISION dragonboard 410c
    上周有開發者郵件諮詢AISTARVISION ov5647和imx219兩款camera在DB410c的使用狀況,這兩款camera是樹莓派官方支持的攝像頭模組,通過一個15針的csi2接口連接攝像頭。
  • Linux環境下USB的原理、驅動和配置
    所以我們可以這樣認為:設備通常具有一個或者更多的配置,配置經常具有一個或者更多的接口,接口通常具有一個或者更多的設置,接口沒有或具有一個以上的端點。驅動程序把驅動程序對象註冊到USB子系統中,稍後再使用製造商和設備標識來判斷是否已經安裝了硬體。
  • USB接口誕生20年,談談USB2.0和3.0的那些事!
    那時候,計算機完全依賴串口和並口連接外設,諸如滑鼠、印表機、手柄之類,速度很慢、驅動複雜,還經常不能同時工作。 為了解決這些問題,Bhatt提出了「通用串行總線」(Universal Serial Bus),簡稱USB,單獨一個「通用」接口完全替代串口和並口。
  • 基於OHCI的嵌入式USB主機控制器接口實現
    結合了可重用的嵌入式USB主機系統研究課題,闡述主機控制器驅動程序開發方法,並列舉了驅動程序內建的數據結構及接口函數的實現。完成了獨立於作業系統的HCD 開發,最後在S3C2410平臺下進行了實驗驗證。