Android USB Camera(2) : UVC协议分析
1. 前言
本文對USB的功能類協議USB Video Class(UVC)的具體設計進行介紹,但不會介紹USB基礎協議,所以需要對USB基礎協議有一定的了解,包括USB四大描述符以及四種傳輸方式。分析usb協議的重點在于描述符,這里將以實際設備的描述符為線索,貫穿、分析uvc協議。
2. UVC功能概述
UVC設備都是多Interface設備,這點同普通的u盤不同。UVC設備最起碼有兩個Interface,VideoControl(VC)Interface和VideoStream(VS) Interface; 這也是最常見的UVC設備。 Spec明確要求一個具有可用的,具有實際UVC功能的設備要有一個VC Interface,一個或多個VS Interface。
VCInterface用于進行配置,操控,設置UVC設備進入不同的功能狀態,而VSInterface則負責視頻數據流的傳輸;完整的UVC功能需依賴VS,VC Interfaces的配合才能實現。
3. IAD以及Interfaces
UVC功能需要使用一個VC Interface和一個或多個VS Interface的配合。Spec明確要求UVC設備必須使用一個Interface Association Descriptor(IAD)來描述這個包含了VC和VS的Interfaces集合。
此外USB協議中并沒有專門朝設備索取IAD的命令,IAD需作為Configuration描述符的一部分發送給Host端。在該Configuration描述符的排列順序中,IAD要放在它所包含的VC,VS描述符之前,且同一個IAD中所有的VC,VS Interface的Interface number必須連貫。
===>Device Descriptor<=== ...===>Configuration Descriptor<=== ...===>IAD Descriptor<=== bLength: 0x08 bDescriptorType: 0x0B bFirstInterface: 0x00 bInterfaceCount: 0x02 bFunctionClass: 0x0E -> Video Interface Class bFunctionSubClass: 0x03 -> Video Interface Collection bFunctionProtocol: 0x00 -> PC_PROTOCOL_UNDEFINED protocol iFunction: 0x00 ===>Interface Descriptor<=== bLength: 0x09 bDescriptorType: 0x04 bInterfaceNumber: 0x00 bAlternateSetting: 0x00 bNumEndpoints: 0x01 bInterfaceClass: 0x0E -> Video Interface Class bInterfaceSubClass: 0x01 -> Video Control Interface SubClass bInterfaceProtocol: 0x00 iInterface: 0x00 ...===>Interface Descriptor<=== bLength: 0x09 bDescriptorType: 0x04 bInterfaceNumber: 0x01 bAlternateSetting: 0x00 bNumEndpoints: 0x00 bInterfaceClass: 0x0E -> Video Interface Class bInterfaceSubClass: 0x02 -> Video Streaming Interface SubClass bInterfaceProtocol: 0x00 iInterface: 0x00 ...===>IAD Descriptor<=== bLength: 0x08 bDescriptorType: 0x0B bFirstInterface: 0x02 bInterfaceCount: 0x02 bFunctionClass: 0x01 -> Audio Interface Class bFunctionSubClass: 0x01 -> Audio Control Interface SubClass bFunctionProtocol: 0x00 iFunction: 0x04 English (United States) "USB2.0 MIC" ===>Interface Descriptor<=== bLength: 0x09 bDescriptorType: 0x04 bInterfaceNumber: 0x02 bAlternateSetting: 0x00 bNumEndpoints: 0x00 bInterfaceClass: 0x01 -> Audio Interface Class bInterfaceSubClass: 0x01 -> Audio Control Interface SubClass bInterfaceProtocol: 0x00 CAUTION: This may be an invalid bInterfaceProtocol iInterface: 0x04 English (United States) "USB2.0 MIC" ...===>Interface Descriptor<=== bLength: 0x09 bDescriptorType: 0x04 bInterfaceNumber: 0x03 bAlternateSetting: 0x00 bNumEndpoints: 0x00 bInterfaceClass: 0x01 -> Audio Interface Class bInterfaceSubClass: 0x02 -> Audio Streaming Interface SubClass bInterfaceProtocol: 0x00 CAUTION: This may be an invalid bInterfaceProtocol iInterface: 0x04 English (United States) "USB2.0 MIC" ...可以看到我所使用的uvc設備包含兩個IAD,第一個IAD是視頻輸入設備,也就是攝像頭。第二個IAD是音頻輸入設備,也就是麥克風,暫時忽略這個IAD。重點分析第一個IAD,它包含了兩個Interface,一個VC Interface和一個VS Interface
4. VC Interface
VC主要用于控制UVC功能中的Units和Terminals,通過對不同的Units和Terminals發下不同的指令,從而影響UVC設備的當前工作狀態;Host端發下的所有對UVC設備的操縱控制命令都是經由此Interface完成的
===>Interface Descriptor<=== bLength: 0x09 bDescriptorType: 0x04 bInterfaceNumber: 0x00 bAlternateSetting: 0x00 bNumEndpoints: 0x01 bInterfaceClass: 0x0E -> Video Interface Class bInterfaceSubClass: 0x01 -> Video Control Interface SubClass bInterfaceProtocol: 0x00 iInterface: 0x00 ===>Class-Specific Video Control Interface Header Descriptor<=== bLength: 0x0D bDescriptorType: 0x24 bDescriptorSubtype: 0x01 bcdVDC: 0x0100 wTotalLength: 0x0033 -> Validated dwClockFreq: 0x02DC6C00 = (48000000) Hz bInCollection: 0x01 baInterfaceNr[1]: 0x01 USB Video Class device: spec version 1.0===>Video Control Input Terminal Descriptor<=== ...===>Video Control Processing Unit Descriptor<=== ...===>Video Control Output Terminal Descriptor<=== ...===>Endpoint Descriptor<=== bLength: 0x07 bDescriptorType: 0x05 bEndpointAddress: 0x81 -> Direction: IN - EndpointID: 1 bmAttributes: 0x03 -> Interrupt Transfer Type wMaxPacketSize: 0x0010 = 1 transactions per microframe, 0x10 max bytes bInterval: 0x0A ===>Class-specific VC Interrupt Endpoint Descriptor<=== bLength: 0x05 bDescriptorType: 0x25 bDescriptorSubtype: 0x03 wMaxTransferSize: 0x0010 = (16) Bytes這個設備包含了一個Processing Unit、一個Input Terminal和Output Terminal,VC Interface需要對它們下發不同的命令,為此VC Interface需要包含一個控制端點(強制性要求),它使用的就是每個USB設備中默認的端點0。
另外一個Interrupt端點則是可選的,用來返回或通知Host端當前的UVC設備內部狀態有變化。大部分情況下,一個UVC設備的VC Interface不需一定要實現此端點,但一旦UVC設備需要實現某些特定feature時,Spec會強制性要求實現該interrupt端點。
5. UVC設備內的各種Entity
UVC的Spec在制定時考慮到了諸多不同UVC設備可能存在的特性,為保證Spec具有最大范圍的適用性和兼容性,將UVC設備內可能存在的每個功能模塊劃分為邏輯意義上的功能單元(Entity),并要求具體UVC設備的開發者必須為每個Entity指定ID號,且該ID號能唯一標識某一指定的功能單元,以便Host端的UVC驅動能依此對設備內不同的功能單元進行操作和配置。
Entity粗略可劃分為Unit,Terminal兩種。這都是邏輯意義上的劃分,它們對應UVC設備內的某個功能單元。
5.1 Unit
Unit可以理解為構建出UVC設備功能的各功能單元,多個Unit按照一定的規則連接后就是一個完整的UVC功能設備。Spec規定Unit有一個或多個入口,一個出口;也就是說可以有多個Unit或Terminal作為一個Unit的輸入源頭,而數據在流經Unit后僅能作為其他Unit或Terminal的一個輸入源頭。
Spec中定義了三種Unit:Selector Unit (SU),Processing Unit (PU),Extension Unit (EU)。
===>Video Control Processing Unit Descriptor<=== bLength: 0x0B bDescriptorType: 0x24 bDescriptorSubtype: 0x05 bUnitID: 0x02 bSourceID: 0x01 wMaxMultiplier: 0x0000 bControlSize: 0x02 bmControls : 0x3F 0x06 D00 = 1 yes - Brightness D01 = 1 yes - Contrast D02 = 1 yes - Hue D03 = 1 yes - Saturation D04 = 1 yes - Sharpness D05 = 1 yes - Gamma D06 = 0 no - White Balance Temperature D07 = 0 no - White Balance Component D08 = 0 no - Backlight Compensation D09 = 1 yes - Gain D10 = 1 yes - Power Line Frequency D11 = 0 no - Hue, Auto D12 = 0 no - White Balance Temperature, Auto D13 = 0 no - White Balance Component, Auto D14 = 0 no - Digital Multiplier D15 = 0 no - Digital Multiplier Limit iProcessing : 0x00Processing Unit則代表了對采集的數據進行處理的單元,負責對采集到的圖像特性進行調整設置,當Host端要求設定這些Processing Unit負責范圍內的功能特性時,Processing Unit作為指定的命令響應者就需要對之進行響應和調整。
Spec定義中要求PU單元負責響應Host端對如下圖像特性方面的設置調整要求(在該UVC設備確實支持這些特性可變,可供設置的前提下)
Usr Controls
? Brightness
? Contrast
? Hue
? Saturatio
? Sharpness
? Gamma
? Digital Multiplier (Zoom)
Auto Controls
? White Balance Temperature
? White Balance Component
? Blcklight Compensation
Other
? Gain
? Power Line Frequency
? Analog Video Standard
? Analog Video Lock Status
5.2 Terminal
Terminal是指整個UVC功能的入口和出口,邏輯意義上講Terminal只有一個出口或者入口,它要么代表整個UVC功能的數據輸入點,要么代表數據在流經UVC功能內部的各Unit功能單元后的最終流入點。
Spec中定義了兩種Terminal:Input Terminal,Output Terminal。
===>Video Control Input Terminal Descriptor<=== bLength: 0x12 bDescriptorType: 0x24 bDescriptorSubtype: 0x02 bTerminalID: 0x01 wTerminalType: 0x0201 = (ITT_CAMERA) bAssocTerminal: 0x00 iTerminal: 0x00 ===>Camera Input Terminal Data wObjectiveFocalLengthMin: 0x0000 wObjectiveFocalLengthMax: 0x0000 wOcularFocalLength: 0x0000 bControlSize: 0x03 bmControls : 0x00 0x00 0x00 D00 = 0 no - Scanning Mode D01 = 0 no - Auto-Exposure Mode D02 = 0 no - Auto-Exposure Priority D03 = 0 no - Exposure Time (Absolute) D04 = 0 no - Exposure Time (Relative) D05 = 0 no - Focus (Absolute) D06 = 0 no - Focus (Relative) D07 = 0 no - Iris (Absolute) D08 = 0 no - Iris (Relative) D09 = 0 no - Zoom (Absolute) D10 = 0 no - Zoom (Relative) D11 = 0 no - Pan (Absolute) D12 = 0 no - Pan (Relative) D13 = 0 no - Roll (Absolute) D14 = 0 no - Roll (Relative) D15 = 0 no - Tilt (Absolute) D16 = 0 no - Tilt (Relative) D17 = 0 no - Focus Auto D18 = 0 no - Reserved D19 = 0 no - Reserved D20 = 0 no - Reserved D21 = 0 no - Reserved D22 = 0 no - Reserved D23 = 0 no – ReservedInput Terminal可以理解為整個UVC功能的數據源頭,它僅有一個outPin,可以連接到其他Unit的Input Pin作為該Unit的輸入源。
===>Video Control Output Terminal Descriptor<=== bLength: 0x09 bDescriptorType: 0x24 bDescriptorSubtype: 0x03 bTerminalID: 0x03 wTerminalType: 0x0101 = (TT_STREAMING) bAssocTerminal: 0x00 bSourceID: 0x02 iTerminal: 0x00Output Terminal則可以理解為當圖像數據流程UVC設備內部的整個處理流程后的輸出點,它僅有一個Input Pin, 整個UVC處理流程上的最后一個Unit會將它的Output Pin與Output Terminal的Input Pin連接在一起。
通過如上描述符所獲得的信息,我們可以看出該USB Camera大致有三個邏輯功能意義上的Entity:CT(代表硬件上的圖像數據采集源,Sensor),PU(代表Sensor中可對采集所得圖像數據進行加工的功能單元),OT(代表實際中USB模塊的的ISO In端點),并無SU單元來控制圖像數據采集源的切換和選擇(只有一個輸入源),此外也沒有對采集所得的數據進行個性化處理的功能,故也沒有EU單元的存在(無EU描述符)。
6. VS Interface
VS Interface則專注與負責傳輸UVC設備的Video數據到Host端。若一UVC設備支持n種格式的Video數據,則它需要實現n個VS Interface,每個Interface對應一種專門的數據格式;而每個VSInterface則必須包含一個ISO或bulk端點來傳輸Video數據,一個可選的bulk端點專門用于傳輸靜態圖片數據(在實現了第三種靜態圖片拍攝機制的前提下)。
===>Interface Descriptor<=== bLength: 0x09 bDescriptorType: 0x04 bInterfaceNumber: 0x01 bAlternateSetting: 0x00 bNumEndpoints: 0x00 bInterfaceClass: 0x0E -> Video Interface Class bInterfaceSubClass: 0x02 -> Video Streaming Interface SubClass bInterfaceProtocol: 0x00 iInterface: 0x00 ===>Video Class-Specific VS Video Input Header Descriptor<=== bLength: 0x0E bDescriptorType: 0x24 bDescriptorSubtype: 0x01 bNumFormats: 0x01 wTotalLength: 0x010F -> Validated bEndpointAddress: 0x83 -> Direction: IN - EndpointID: 3 bmInfo: 0x00 -> Dynamic Format Change not Supported bTerminalLink: 0x03 bStillCaptureMethod: 0x02 -> Still Capture Method 2 bTriggerSupport: 0x01 -> Hardware Triggering Support bTriggerUsage: 0x00 -> Host will initiate still image capture bControlSize: 0x01 Video Payload Format 1 0x00 D00 = 0 no - Key Frame Rate D01 = 0 no - P Frame Rate D02 = 0 no - Compression Quality D03 = 0 no - Compression Window Size D04 = 0 no - Generate Key Frame D05 = 0 no - Update Frame Segment D06 = 0 no - Reserved D07 = 0 no - Reserved ===>Video Streaming MJPEG Format Type Descriptor<=== bLength: 0x0B bDescriptorType: 0x24 bDescriptorSubtype: 0x06 bFormatIndex: 0x01 bNumFrameDescriptors: 0x05 bmFlags: 0x01 -> Sample Size is Fixed bDefaultFrameIndex: 0x01 bAspectRatioX: 0x00 bAspectRatioY: 0x00 bmInterlaceFlags: 0x00 D00 = 0 non-Interlaced stream or variable D01 = 0 2 fields per frame D02 = 0 Field 1 not first D03 = 0 Reserved D4..5 = 0 Field patterns -> Field 1 only D6..7 = 0 Display Mode -> Bob only bCopyProtect: 0x00 -> Duplication Unrestricted ===>Video Streaming MJPEG Frame Type Descriptor<=== --->This is the Default (optimum) Frame index bLength: 0x2A bDescriptorType: 0x24 bDescriptorSubtype: 0x07 bFrameIndex: 0x01 bmCapabilities: 0x00 wWidth: 0x0280 wHeight: 0x01E0 dwMinBitRate: 0x0001F400 dwMaxBitRate: 0x00A8C000 dwMaxVideoFrameBufferSize: 0x00096000 dwDefaultFrameInterval: 0x00051615 bFrameIntervalType: 0x04 ===>Additional Discrete Frame TypeData dwFrameInterval[1]: 0x00028B0A dwFrameInterval[2]: 0x00051615 dwFrameInterval[3]: 0x000A2C2A dwFrameInterval[4]: 0x001E8480 ===>Video Streaming MJPEG Frame Type Descriptor<=== bLength: 0x2A bDescriptorType: 0x24 bDescriptorSubtype: 0x07 bFrameIndex: 0x02 bmCapabilities: 0x00 wWidth: 0x00A0 wHeight: 0x0078 dwMinBitRate: 0x0001F400 dwMaxBitRate: 0x00A8C000 dwMaxVideoFrameBufferSize: 0x00009600 dwDefaultFrameInterval: 0x00051615 bFrameIntervalType: 0x04 ===>Additional Discrete Frame TypeData dwFrameInterval[1]: 0x00028B0A dwFrameInterval[2]: 0x00051615 dwFrameInterval[3]: 0x000A2C2A dwFrameInterval[4]: 0x001E8480 ===>Video Streaming MJPEG Frame Type Descriptor<=== bLength: 0x2A bDescriptorType: 0x24 bDescriptorSubtype: 0x07 bFrameIndex: 0x03 bmCapabilities: 0x00 wWidth: 0x00B0 wHeight: 0x0090 dwMinBitRate: 0x0001F400 dwMaxBitRate: 0x00A8C000 dwMaxVideoFrameBufferSize: 0x0000C600 dwDefaultFrameInterval: 0x00051615 bFrameIntervalType: 0x04 ===>Additional Discrete Frame TypeData dwFrameInterval[1]: 0x00028B0A dwFrameInterval[2]: 0x00051615 dwFrameInterval[3]: 0x000A2C2A dwFrameInterval[4]: 0x001E8480 ===>Video Streaming MJPEG Frame Type Descriptor<=== bLength: 0x2A bDescriptorType: 0x24 bDescriptorSubtype: 0x07 bFrameIndex: 0x04 bmCapabilities: 0x00 wWidth: 0x0140 wHeight: 0x00F0 dwMinBitRate: 0x0001F400 dwMaxBitRate: 0x00A8C000 dwMaxVideoFrameBufferSize: 0x00025800 dwDefaultFrameInterval: 0x00051615 bFrameIntervalType: 0x04 ===>Additional Discrete Frame TypeData dwFrameInterval[1]: 0x00028B0A dwFrameInterval[2]: 0x00051615 dwFrameInterval[3]: 0x000A2C2A dwFrameInterval[4]: 0x001E8480 ===>Video Streaming MJPEG Frame Type Descriptor<=== bLength: 0x2A bDescriptorType: 0x24 bDescriptorSubtype: 0x07 bFrameIndex: 0x05 bmCapabilities: 0x00 wWidth: 0x0160 wHeight: 0x0120 dwMinBitRate: 0x0001F400 dwMaxBitRate: 0x00A8C000 dwMaxVideoFrameBufferSize: 0x00031800 dwDefaultFrameInterval: 0x00051615 bFrameIntervalType: 0x04 ===>Additional Discrete Frame TypeData dwFrameInterval[1]: 0x00028B0A dwFrameInterval[2]: 0x00051615 dwFrameInterval[3]: 0x000A2C2A dwFrameInterval[4]: 0x001E8480可以看出這個設備只支持一種視頻格式”MJPEG”,所以它只有一個VS Interface,而同一種視頻格式下有很多參數可以調整,比如說圖像分辨率,每秒的幀速率等。其參數組合信息就是緊跟在Format Type Descriptor之后的Frame Type Descriptor。
在采用不同的參數組合時,UVC設備進行數據傳輸時,所需占用的USB數據帶寬顯然有很大的不同;因此一個VS Interface下需要有多個setting,每個settnig對應一個固定的Video參數設置組合,也就對應了一個固定參數值的Video數據,該setting下每秒要傳輸的幀數(幀速率),圖像分辨率等均固定,進而對USB的帶寬要求也固定。
===>Interface Descriptor<=== bLength: 0x09 bDescriptorType: 0x04 bInterfaceNumber: 0x01 bAlternateSetting: 0x01 bNumEndpoints: 0x01 bInterfaceClass: 0x0E -> Video Interface Class bInterfaceSubClass: 0x02 -> Video Streaming Interface SubClass bInterfaceProtocol: 0x00 iInterface: 0x00 ===>Endpoint Descriptor<=== bLength: 0x07 bDescriptorType: 0x05 bEndpointAddress: 0x83 -> Direction: IN - EndpointID: 3 bmAttributes: 0x05 -> Isochronous Transfer Type Synchronization Type = Asynchronous Bulk Transfer Type wMaxPacketSize: 0x00C0 = 1 transactions per microframe, 0xC0 max bytes bInterval: 0x01 ===>Interface Descriptor<=== bLength: 0x09 bDescriptorType: 0x04 bInterfaceNumber: 0x01 bAlternateSetting: 0x02 bNumEndpoints: 0x01 bInterfaceClass: 0x0E -> Video Interface Class bInterfaceSubClass: 0x02 -> Video Streaming Interface SubClass bInterfaceProtocol: 0x00 iInterface: 0x00 ===>Endpoint Descriptor<=== bLength: 0x07 bDescriptorType: 0x05 bEndpointAddress: 0x83 -> Direction: IN - EndpointID: 3 bmAttributes: 0x05 -> Isochronous Transfer Type Synchronization Type = Asynchronous Bulk Transfer Type wMaxPacketSize: 0x0180 = 1 transactions per microframe, 0x180 max bytes bInterval: 0x01 ===>Interface Descriptor<=== bLength: 0x09 bDescriptorType: 0x04 bInterfaceNumber: 0x01 bAlternateSetting: 0x03 bNumEndpoints: 0x01 bInterfaceClass: 0x0E -> Video Interface Class bInterfaceSubClass: 0x02 -> Video Streaming Interface SubClass bInterfaceProtocol: 0x00 iInterface: 0x00 ===>Endpoint Descriptor<=== bLength: 0x07 bDescriptorType: 0x05 bEndpointAddress: 0x83 -> Direction: IN - EndpointID: 3 bmAttributes: 0x05 -> Isochronous Transfer Type Synchronization Type = Asynchronous Bulk Transfer Type wMaxPacketSize: 0x0200 = 1 transactions per microframe, 0x200 max bytes bInterval: 0x01 ===>Interface Descriptor<=== bLength: 0x09 bDescriptorType: 0x04 bInterfaceNumber: 0x01 bAlternateSetting: 0x04 bNumEndpoints: 0x01 bInterfaceClass: 0x0E -> Video Interface Class bInterfaceSubClass: 0x02 -> Video Streaming Interface SubClass bInterfaceProtocol: 0x00 iInterface: 0x00 ===>Endpoint Descriptor<=== bLength: 0x07 bDescriptorType: 0x05 bEndpointAddress: 0x83 -> Direction: IN - EndpointID: 3 bmAttributes: 0x05 -> Isochronous Transfer Type Synchronization Type = Asynchronous Bulk Transfer Type wMaxPacketSize: 0x0280 = 1 transactions per microframe, 0x280 max bytes bInterval: 0x01 ===>Interface Descriptor<=== bLength: 0x09 bDescriptorType: 0x04 bInterfaceNumber: 0x01 bAlternateSetting: 0x05 bNumEndpoints: 0x01 bInterfaceClass: 0x0E -> Video Interface Class bInterfaceSubClass: 0x02 -> Video Streaming Interface SubClass bInterfaceProtocol: 0x00 iInterface: 0x00 ===>Endpoint Descriptor<=== bLength: 0x07 bDescriptorType: 0x05 bEndpointAddress: 0x83 -> Direction: IN - EndpointID: 3 bmAttributes: 0x05 -> Isochronous Transfer Type Synchronization Type = Asynchronous Bulk Transfer Type wMaxPacketSize: 0x0320 = 1 transactions per microframe, 0x320 max bytes bInterval: 0x01 ===>Interface Descriptor<=== bLength: 0x09 bDescriptorType: 0x04 bInterfaceNumber: 0x01 bAlternateSetting: 0x06 bNumEndpoints: 0x01 bInterfaceClass: 0x0E -> Video Interface Class bInterfaceSubClass: 0x02 -> Video Streaming Interface SubClass bInterfaceProtocol: 0x00 iInterface: 0x00 ===>Endpoint Descriptor<=== bLength: 0x07 bDescriptorType: 0x05 bEndpointAddress: 0x83 -> Direction: IN - EndpointID: 3 bmAttributes: 0x05 -> Isochronous Transfer Type Synchronization Type = Asynchronous Bulk Transfer Type wMaxPacketSize: 0x03C0 = 1 transactions per microframe, 0x3C0 max bytes bInterval: 0x01 ===>Interface Descriptor<=== bLength: 0x09 bDescriptorType: 0x04 bInterfaceNumber: 0x01 bAlternateSetting: 0x07 bNumEndpoints: 0x01 bInterfaceClass: 0x0E -> Video Interface Class bInterfaceSubClass: 0x02 -> Video Streaming Interface SubClass bInterfaceProtocol: 0x00 iInterface: 0x00 ===>Endpoint Descriptor<=== bLength: 0x07 bDescriptorType: 0x05 bEndpointAddress: 0x83 -> Direction: IN - EndpointID: 3 bmAttributes: 0x05 -> Isochronous Transfer Type Synchronization Type = Asynchronous Bulk Transfer Type wMaxPacketSize: 0x0A80 = 2 transactions per microframe, 0x280 max bytes bInterval: 0x01 ===>Interface Descriptor<=== bLength: 0x09 bDescriptorType: 0x04 bInterfaceNumber: 0x01 bAlternateSetting: 0x08 bNumEndpoints: 0x01 bInterfaceClass: 0x0E -> Video Interface Class bInterfaceSubClass: 0x02 -> Video Streaming Interface SubClass bInterfaceProtocol: 0x00 iInterface: 0x00 ===>Endpoint Descriptor<=== bLength: 0x07 bDescriptorType: 0x05 bEndpointAddress: 0x83 -> Direction: IN - EndpointID: 3 bmAttributes: 0x05 -> Isochronous Transfer Type Synchronization Type = Asynchronous Bulk Transfer Type wMaxPacketSize: 0x0B20 = 2 transactions per microframe, 0x320 max bytes bInterval: 0x01 ===>Interface Descriptor<=== bLength: 0x09 bDescriptorType: 0x04 bInterfaceNumber: 0x01 bAlternateSetting: 0x09 bNumEndpoints: 0x01 bInterfaceClass: 0x0E -> Video Interface Class bInterfaceSubClass: 0x02 -> Video Streaming Interface SubClass bInterfaceProtocol: 0x00 iInterface: 0x00 ===>Endpoint Descriptor<=== bLength: 0x07 bDescriptorType: 0x05 bEndpointAddress: 0x83 -> Direction: IN - EndpointID: 3 bmAttributes: 0x05 -> Isochronous Transfer Type Synchronization Type = Asynchronous Bulk Transfer Type wMaxPacketSize: 0x0BE0 = 2 transactions per microframe, 0x3E0 max bytes bInterval: 0x01 ===>Interface Descriptor<=== bLength: 0x09 bDescriptorType: 0x04 bInterfaceNumber: 0x01 bAlternateSetting: 0x0A bNumEndpoints: 0x01 bInterfaceClass: 0x0E -> Video Interface Class bInterfaceSubClass: 0x02 -> Video Streaming Interface SubClass bInterfaceProtocol: 0x00 iInterface: 0x00 ===>Endpoint Descriptor<=== bLength: 0x07 bDescriptorType: 0x05 bEndpointAddress: 0x83 -> Direction: IN - EndpointID: 3 bmAttributes: 0x05 -> Isochronous Transfer Type Synchronization Type = Asynchronous Bulk Transfer Type wMaxPacketSize: 0x1380 = 3 transactions per microframe, 0x380 max bytes bInterval: 0x01 ===>Interface Descriptor<=== bLength: 0x09 bDescriptorType: 0x04 bInterfaceNumber: 0x01 bAlternateSetting: 0x0B bNumEndpoints: 0x01 bInterfaceClass: 0x0E -> Video Interface Class bInterfaceSubClass: 0x02 -> Video Streaming Interface SubClass bInterfaceProtocol: 0x00 iInterface: 0x00 ===>Endpoint Descriptor<=== bLength: 0x07 bDescriptorType: 0x05 bEndpointAddress: 0x83 -> Direction: IN - EndpointID: 3 bmAttributes: 0x05 -> Isochronous Transfer Type Synchronization Type = Asynchronous Bulk Transfer Type wMaxPacketSize: 0x13E8 = 3 transactions per microframe, 0x3E8 max bytes bInterval: 0x01此外,對于每個VS Interface來講,必須實現setting0,且setting0不代表任何實際的Video流和參數組合,當指定setting0時就是要求UVC設備暫停數據傳輸,放棄對USB帶寬的占用。
7. 總結
UVC同MSC一樣,系USB框架下的功能類協議,但卻與MSC有著較大差異。MSC功能采用Control+Bulk傳輸完成,其枚舉流程,描述符配置較為清晰,控制傳輸階段簡單,定義的類功能控制命令較少。而BULK傳輸階段則較為復雜繁瑣,出錯機制,續傳機制等要求較為嚴格。
而UVC則剛好相反,它采用Control+ISO傳輸機制實現(BULK和INTR機制為可選特性),其枚舉流程,描述符配置較為復雜,繁瑣,定義了諸多的類控制命令,Entity等;而具體的數據傳輸階段即ISO傳輸較為簡單。
總結
以上是生活随笔為你收集整理的Android USB Camera(2) : UVC协议分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ABB 机器人 IRBP系列转台的
- 下一篇: 后台开发常用mysql语句_v1.0