關於USB Class
將設備歸爲既定的類別,並對相應類別的設備的在USB協議的應用級協議和接口做出規範,這樣只要按照類設備的標準實現驅動程序和設備,則一套驅動能夠驅動這一類的全部設備,而這一類設備能夠在已經包含這一類設備驅動程序的操做系統中實現「免驅」。比較常見的類設備是移動存儲設備Massstorageclass,常見的移動硬盤和U盤都是這類設備,應用層協議種類有CBI(應用層使用UFI)和更加常見Bulk-Only(使用SCSIProtocl Specification - 2)等,而Webcam等視頻設備也正是這樣一類設備歸爲Video Class。
更多Device Class參見:
備註:
1.Video Class描述符衆多,各描述之間的層次複雜,AVEO Webcam其GetConfiguration返回359字節的數據- -!。
2.術語不譯做中文,是爲了不閱讀驅動代碼(位於內核樹drivers/media/video/uvc)時中英文概念對照理解錯誤。
3.不一樣設備其傳輸的視頻數據類型不一樣,Specification中下設幾個文檔。筆記以此 AVEO Webcam(市面售價50元)爲例:
Webcam參數(描述符中獲得):
? 不具備視頻壓縮功能,圖像格式爲YUV422
? 支持640x480 320x240 160x120三檔分辨率
? 幀率只支持30 fps一檔
? 1個Interrupt IN端點,1個Isochronous IN端點,其中Isochronous端點具備524 7801020 2040 3060 5檔可調。2040 3060爲High-Bandwidth Isochronous傳輸方式Multi分別爲2和3。
? Still Image -> 支持從視頻流中抓取圖像方式拍照,無獨立Bulk端點傳輸拍照圖像。
? Payload類型爲 based
USB Video Class Specification
概述
VideoClass設備描述位於USB協議的Interface級,每一個設備的Interface分爲兩類VideoControlInterface(僅僅只用一個)和VideoStreamingInterface(能夠具備多個),而與設備的一個相關的全部的USB Interface被稱做爲一個VideoInterface Collection使用IAD(Interface Association Deor)描述符來描述。
USB協議級解釋:爲設備的一種功能好比一個USB設備又是優盤又是藍牙發射器,這就是一個設備的兩個。
Video Class位於USB協議的Interface級,Interface 描述符中Class code爲0xE,其下面分爲4個Subclass:
Undefined:0x0
VC Interface Subclass:0x1(VC的USB Interface Deor中Subclass標記爲此值)。
VS Interface Subclass:0x2(VS的USB Interface Deor中Subclass標記爲此值)。
Video Interface Collection Subclass:0x3(IAD的USB Interface Deor中Subclass標記此值)。
複合設備擁有多個->Video Interface Collenction,也會擁有多個IAD。
的拓撲結構(基本概念,對象化理解)
被劃分爲一系列可尋址的Entity,而Entity被分爲兩類:Unit和Terminal。每一個Entity都有其輸入和輸出,從1開始計數。
Unit:(使用Unit Deor描述)
的基本組成模塊劃分。每一個Unit Entity能夠有多個輸入,但只能有一個輸出。一個輸出能夠與多個其餘Unit的輸入相連,而一個輸入只能與一個輸出相連。
Terminal:(使用 Terminal Deor描述)
分爲Input Terminal和Output Terminal,InputTerminal爲數據流的起點,數據流的提供者(好比說一個CCD,一個視頻輸入端子,一個USB的OUT端點),而OutputTerminal爲數據流的終點,數據流的消費者(好比USB的IN端點,設備上的LCD顯示屏等)。每一個TerminalEntity只有一個輸入或輸出。
基本上目前的都是由下面的Entity組成:
? Input Terminal
? Output Terminal
? Selector Unit
? Processing Unit
? Extension Unit
另外還有另外兩種Terminal,他們擴展了Specification中Terminal Deor的域:
? Media Transport Terminal
? Camera Terminal
隨着設備功能的豐富,會出現更多的類型的Unit和Terminal。
Video Control:
Entity的每一個特性(能夠理解爲可控參數)的描述被稱爲一個Control(好比Webcam的Processing Unit中的亮度),而每一個特性(Control)又有一系列的屬性(Attribute):
? Current setting
? Minimum setting
? Maximum setting
? Resolution
? Size
? Default
相似寫VB程序,首先看看程序()須要哪些控件/積木(Entity),而後把控件拖過來,肯定一下控件之間的關係(Input/Output),而後配配控件的屬性(Control),而每一個控件有不一樣的屬性,每一個屬性又有不一樣的限制,好比最大值最小值,能輸入多少個字(Attribute)。
因而可知Video Class Specification的概念設計是徹底面向對象的,這種協議設計/設備設計方式爲整個軟硬件系統的構建和擴充提供了極大的方便和靈活,固然同時也所以使得描述變得複雜。
Selector Unit:
擁有多個輸入和輸出,能夠經過Control選擇將多個輸入中的一個與其輸出鏈接。
Processing Unit:
擁有一個輸入和輸出,提供下面一系列Control控制流過本Unit的視頻流圖像的屬性:
User Control(供用戶設置)
? Brightness
? Contrast
? Hue
? Saturation
? Sharpness
? Gamma
? Digital Multiplier (Zoom)
Auto Controls(提供用戶開關選項->好比是否啓用自動白平衡)
? White Balance Temperature
? White Balance Component
? Backlight Compensation
與Auto模式的相關的Control在Auto模式被打開時,配置無效,在Auto模式關閉後全部Control爲用戶原先設置的值。
Other
? Gain
? Power Line Frequency
? Analog Video Standard
? Analog Video Lock Status
Extension Unit
擁有多個輸入和一個輸出。用於設備廠商自行擴展。
操做模型(USB協議級視角)
Video Interface Collection
在USB協議級表現爲IAD,做爲GetDeor(Configuration)請求的返回的一部分。IAD必須位於VCInterface和VS Interface描述符以前(一般是ConfigurationDeor後面緊接着就是IAD),全部相關聯的Interface號必須連續。
VideoControl Interface
一個Control Endpoint用來控制Uniti和Terminal的設置和收取狀態信息,默認使用Endpoint 0。
一個Interrupt Endpoint用來返回狀態,可選。在設備具備下面的特性時使用:
? 設備支持硬件觸發Still Image(好比這個AVEO攝像頭,具備拍照按鍵,按下一次按鍵,在協議分析儀上能夠看到一個Interrupt IN Transaction)。
? 設備實現AutoUpdate Control(這個攝像頭沒有,應該是其Control被設備更新了之後,經過Interrupt端點通知Host)。
? 設備實現異步Control(有些Control的配置到生效的時間>10ms,則使用異步方式,在生效之後設備經過Interrupt端點通知Host,則Host再過來查詢參數)。
Still Image Capture(抓取靜止圖像,Linux中的uvc彷佛還沒有支持,屬於VideoStream Interface,可是放在這裏介紹了)
模式1 - 收到硬件按鍵中斷之後,Host端軟件直接從視頻流中保存一幀,設備沒必要中止和改變視頻流。可是抓取圖像的各項參數老是和視頻流中的相同。
模式2 - 若是設備支持高質量靜止圖像抓取,設備會在視頻流的Payload Header中標記有StillImage正在Pending,Host端軟件應當掛起視頻流,選擇合適的帶寬和Inferface的AltSetting,發送VS_STILL_IMAGE_TRIGGER_CONTROL請求而且標記Transmit Still Image,則設備開始傳輸StillImage,傳輸完畢,Host端軟件恢復先前的設置並繼續視頻流。此模式缺點是會打斷視頻流。
模式3 - 設備支持高質量靜止圖像抓取,經過一個獨立的Bulk端點來傳輸靜止圖像。分爲Host端主動發起和設備端按鍵發起兩種方式。
VideoStream Interface
用來在Host和端交互數據,使用一個Isochronous或是Bulk端點傳輸視頻流。