本文轉自公眾號,歡迎關注
基于DWC2的USB驅動開發-UVC的處理單元詳解 (qq.com)
一.前言
本篇來詳細分析下UVC的處理單元相關的內容,同樣的我們理論結合實踐來進行。
二.處理單元簡介
處理單元(PU)控制通過它傳輸的視頻的圖像屬性。有一個單一的輸入和輸出引腳,注意是單一的,也就是一個處理單元只能處理一個輸入只有一個輸出。
支持以下功能:
用戶控制:
- Brightness亮度·
- Hue色調·
- Saturation飽和度·
- Sharpness清晰度·
- Gamma伽馬·
- Digital Multiplier (Zoom) 數字乘法器(縮放)
自動控制
- White Balance Temperature 白平衡溫度控制
- White Balance Component 白平衡成分控制
- Backlight Compensation 背光補償
- Contrast 對比度
其他
對上述功能的支持都是可選的,但是,如果設備支持白平衡功能,則應實現白平衡溫度控制或白平衡成分控制,但不能同時實現。
用戶控制表示由用戶偏好設置的屬性,不受設備的自動控制的影響。
自動控制支持是否使能的設置(具有打開/關閉狀態)。如果使能則設備自動調整,對相關屬性的讀請求則反映自動設置的值。
如果打開自動模式,嘗試以手動方式設置將導致STALL,錯誤代碼為bRequestErrorCode=“錯誤狀態”。當退出自動模式時,相關控制屬性應保持在轉換前有效的值。
后面可以看到基本所有的屬性都對應有一個自動控制,使能自動控制就不能再手動配置了。
處理單元的符號如下圖所示。
注意這里的但輸入單輸出
三.拓撲結構
以下從描述符來看處理單元的拓撲結構,如下圖是一個實際的UVC產品的描述符,只截取了和UVC相關的IAD下的描述符。
可以看到處理單元的ID是bUnitID=2,其源頭是bSourceID=1即前面的bTerminaIID=1的視頻控制輸入終端;而其后面是bUnitID=3的視頻控制擴展單元,該單元的baSourceID[1]=2表示其源頭是本處理單元。
其拓撲如下
四.處理單元描述符
處理單元的描述符應該位于UVC的控制接口描述符VideoControl Interface Descriptors的Class-specific VC Interface Header Descriptor的后面
如下所示紅色線所指示
本實例處理單元描述符對應的具體內容如下
處理單元的描述詳細內容見規格書P69
3.7.2.5 Processing Unit Descriptor
偏移 | 區域 | 大小 | 值 | 說明 |
---|---|---|---|---|
0 | bLength | 1 | 數字值,13 | 本描述符的字節數 |
1 | bDescriptorType | 1 | 常數CS_INTERFACE=0x24 | 描述符類型 |
2 | bDescriptorSubtype | 1 | 常數VC_PROCESSING_UNIT =0x05 | 描述符子類 |
3 | bUnitID | 1 | 數字 | 單元ID |
4 | bSourceID | 1 | 常數 | 該單元前面所連接的單元或終端的ID。 |
5 | wMaxMultiplier | 2 | 數字 | 數字放大 |
7 | bControlSize | 1 | 數字,3 | 后面 bmControls域 的字節數 |
8 | bmControls | 3 | Bitmap | 支持的處理類型 |
11 | iProcessing | 1 | Index | 描述本處理單元的字符串描述索引,填0則沒有字符串描述符。 |
12 | bmVideoStandards | 1 | Bitmap | 支持的標準 |
l其中bDescriptorType的定義參考規格書的P171 A.5. Video Class-Specific VC Interface Descriptor Subtypes
l其中bDescriptorSubtype的定義參考規格書的P172 A.4. Video Class-Specific Descriptor Types
l其中bUnitID
處理單元由處理單元描述符(PUD)的bUnitID字段的值唯一標識。 非零常數 ,用于唯一標識本功能接口中的單元。類相關請求時Index的高位即該值。
這里為什么要是非零常數呢?為什么從0開始編號呢,因為在請求中wIndex的高8位為0用于區分是接口請求,其他非0值為對應了終端和單元ID,所以不能從0開始編號了。
在本功能對應的接口內單該值和其他單元和終端的ID不能重復。
lbSourceID
該單元前面所連接的單元或終端的ID。
處理單元肯定是要處理一個東西的,即需要輸入的,處理什么呢,肯定是處理攝像頭的輸入,所以前面一般就是Input Terminal,該值就是前面的Input Terminal的ID。
如下所示,這里bSourceID=1即前面連接的是bTerminalID=1的輸入終端
l其中wMaxMultiplier
如果支持數字放大Digital Multiplier控制,則該值除以100表示放大倍數,比如設置值450則表示1-4.5X,即4.5倍數字放大,如果不支持則設置為0.
l其中bmControls,表示支持的處理類型
某一位置位則對應的處理支持,小端模式
D0: Brightness
D1: Contrast
D2: Hue
D3: Saturation
D4: Sharpness
D5: Gamma
D6: White Balance Temperature
D7: White Balance Component
D8: Backlight Compensation
D9: Gain
D10: Power Line Frequency
D11: Hue, Auto
D12: White Balance Temperature, Auto
D13: White Balance Component, Auto
D14: Digital Multiplier
D15: Digital Multiplier Limit
D16: Analog Video Standard
D17: Analog Video Lock Status
D18: Contrast, Auto
D19 – D23: Reserved. Set to zero
l其中bmVideoStandards表示支持的標準
0表示忽略該字段.
某位置1則表示支持該標準
D0: None
D1: NTSC – 525/60
D2: PAL – 625/50
D3: SECAM – 625/50
D4: NTSC – 625/50
D5: PAL – 525/60
D6-D7: Reserved. Set to zero.
以下是對應一個實例,注意其bmControls域只有兩個字節,且沒有bmVideoStandards,所以只有11個字節。
-------- Video Control Processing Unit Descriptor -----
bLength : 0x0B (11 bytes)
bDescriptorType : 0x24 (Video Control Interface)
bDescriptorSubtype : 0x05 (Processing Unit)
bUnitID : 0x02 (2)
bSourceID : 0x01 (1)
wMaxMultiplier : 0x0000
bControlSize : 0x02 (2 bytes)
bmControls : 0x7B, 0x07
D0 : 1 yes - Brightness
D1 : 1 yes - Contrast
D2 : 0 no - Hue
D3 : 1 yes - Saturation
D4 : 1 yes - Sharpness
D5 : 1 yes - Gamma
D6 : 1 yes - White Balance Temperature
D7 : 0 no - White Balance Component
D8 : 1 yes - Backlight Compensation
D9 : 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 : 0x00 (No String Descriptor)
Data (HexDump) : 0B 24 05 02 01 00 00 02 7B 07 00 .$......{..
五. 處理單元相關的請求
參考規格書P109 4.2.2.3 Processing Unit Control Requests
處理單元控制請求用于讀或者設置處理單元的屬性,所以包括SET_xx 和GET_xx。
一共支持如下19種屬性的請求
對應的CS編碼見P175 A.9.5. Processing Unit Control Selectors
以下做了一個總結,所以值都是無符號值。
類型 | CS | 大小B | 支持的操作[]表示可選 | 最少支持操作 | 說明 |
---|---|---|---|---|---|
背光補償控制 | PU_BACKLIGHT_COMPENSATION_CONTROL | 2 | SET_CURGET_CURGET_MINGET_MAXGET_RESGET_INFOGET_DEF | GET_DEF | 設置0說明不支持背光補償,可以支持范圍值或者僅僅是開關。小端模式,無符號16位值。 |
亮度控制 | PU_BRIGHTNESS_CONTROL | 2 | SET_CUR,GET_CUR GET_MIN GET_MAXGET_RESGET_INFOGET_DEF | GET_DEF | 該值是相對值配置的是增量,RES值必須是1小端模式,有符號16位值。 |
對比度控制 | PU_CONTRAST_CONTROL | 2 | SET_CUR GET_CUR GET_MIN GET_MAXGET_RESGET_INFOGET_DEF | GET_DEF | 該值是相對值配置的是增量,RES值必須是1小端模式,有符號16位值。 |
對比度自動控制 | PU_CONTRAST_AUTO_CONTROL | 1 | SET_CURGET_CUR GET_INFOGET_DEF | GET_DEF | 值為1表示使能自動控制,此時嘗試設置相關對比度控制將導致STALL和bRequestErrorCode=“錯誤狀態”的錯誤代碼。 |
增益控制 | PU_GAIN_CONTROL | 2 | SET_CURGET_CURGET_MIN GET_MAXGET_RESGET_INFOGET_DEF | GET_DEF | 該值是相對值配置的是增量,RES值必須是1小端模式,有符號16位值。 |
電力線頻率控制 | PU_POWER_LINE_FREQUENCY_CONTROL | 1 | SET_CURGET_CURGET_INFOGET_DEF | GET_DEF | 值對應如下0: Disabled1: 50 Hz2: 60 Hz3: Auto |
色度控制 | PU_HUE_CONTROL | 2 | GET_CUR GET_MIN GET_MAXGET_RESGET_INFOGET_DEF[SET_CUR] | GET_DEF | 默認值必須是0,設置值是實際值乘以100,實際值范圍是(-180 到+180degrees). 則設置值發呢欸是-18000 ~18000 有符號16位,小端 |
色度自動控制 | PU_HUE_AUTO_CONTROL | 1 | SET_CUR,GET_CUR,GET_INFO GET_DEF | GET_DEF | 值為1表示使能自動控制,此時嘗試設置相關色度控制將導致STALL和bRequestErrorCode=“錯誤狀態”的錯誤代碼 |
飽和度控制 | PU_SATURATION_CONTROL | 2 | SET_CURGET_CURGET_MINGET_MAXGET_RESGET_INFOGET_DEF | GET_DEF | 0表示灰度值為相對值,RES必須為1 |
清晰度設置 | PU_SHARPNESS_CONTROL | 2 | SET_CURGET_CURGET_MINGET_MAXGET_RESGET_INFOGET_DEF | GET_DEF | 相對值,MIN意味著“無清晰度處理”RES必須為1 |
伽馬設置 | PU_GAMMA_CONTROL | 2 | SET_CURGET_CURGET_MINGET_MAXGET_RES,GET_INFOGET_DEF | GET_DEF | 設置值是實際值乘以100,設置值范圍1 |
白平衡溫度控制 | PU_WHITE_BALANCE_TEMPERATURE_CONTROL | 2 | GET_CURGET_MINGET_MAXGET_RESGET_INFOGET_DEF | GET_DEF | 這用于將白平衡設置指定為以開爾文度為單位的色溫。這是作為白平衡組件控制的替代方案提供的。網絡攝像頭和雙模攝像頭的最小范圍應為2800(白熾)至6500(日光)。 |
白平衡溫度自動控制 | PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL | 1 | SET_CURGET_CURGET_INFOGET_DEF | GET_DEF | 值為1表示使能自動控制,此時嘗試設置相關白平衡溫度控制將導致STALL和bRequestErrorCode=“錯誤狀態”的錯誤代碼 |
白平衡成分控制 | PU_WHITE_BALANCE_COMPONENT_CONTROL | 4 | GET_CURGET_MIN GET_MAXGET_RESGET_INFOGET_DEF[SET_CUR] | GET_DEF | 前面2字節是藍色成分設置后面2字節是紅色成分設置 |
白平衡成分自動控制 | PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL | 1 | SET_CURGET_CURGET_INFOGET_DEF | GET_DEF | 值為1表示使能自動控制,此時嘗試設置相關白平衡成分控制將導致STALL和bRequestErrorCode=“錯誤狀態”的錯誤代碼 |
數字乘法器控制 | PU_DIGITAL_MULTIPLIER_CONTROL | 2 | SET_CURGET_CURGET_MINGET_MAX GET_RESGET_INFOGET_DEF | 已棄用,下一版將刪除值為 Z’cur這用于指定應用于光學圖像的數字縮放量。這是乘法器m的可能值范圍內的位置,允許通過設備實現來描述乘法器分辨率。RES 必須為1如果支持數字乘法器限制控制,則最小值和最大值應與數字乘法器控制的最小值和最高值相匹配。數字乘法器限制控制允許設備或主機為Z¢cur 值建立臨時上限,從而動態減小數字乘法器控制的范圍。如果使用數字乘法器限制將限制降低到當前Z¢cur ,Z¢cur 值將進行調整以匹配新的限制,數字乘法器控制應發送控制更改事件以通知主機調整。 | |
數字乘法器限制控制 | PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL | 2 | SET_CURGET_CURGET_MINGET_MAX GET_RESGET_INFOGET_DEF | RES 為1上述Z’cur的上限 | |
模擬視頻標準控制 | PU_ANALOG_VIDEO_STANDARD_CONTROL | 1 | GET_CURGET_INFO | 0: None1: NTSC – 525/602: PAL – 625/503: SECAM – 625/504: NTSC – 625/505: PAL – 525/606-255: Reserved. Do not use. | |
模擬視頻鎖定狀態控制 | PU_ANALOG_LOCK_STATUS_CONTROL | 1 | GET_CURGET_INFO | 這用于報告視頻解碼器是否已經實現模擬輸入信號的水平鎖定。如果解碼器被鎖定,則假定正在生成有效的視頻流。此控制僅支持模擬視頻解碼器功能。 |
六. 處理單元請求驅動代碼
處理單元類相關請求的解析,需要注意兩個關鍵參數,一個是處理單元所在的接口號,上面實例接口是0,處理單元本身的ID,上面實例是2。
1.通過接口號和單元ID即可定位到是哪一個ID,接口號和單元號都是從wIndex字段解析,低位是接口號高位是單元ID號
2.然后再通過wValue確定對應的是什么操作,比如是亮度控制還是增益控制等。
即A.9.5. Processing Unit Control Selectors的CS
3.然后再通過bRequest確定是做什么類型的操作比如是獲取當前值GET_CUR還是設置當前值SET_CUR
見規格書P173A.8. Video Class-Specific Request Codes
參考規格書4.2.2 Unit and Terminal Control Requests,終端和單元的請求的layout
請求分為SET和GET兩大類
bmRequestType | bRequest | wValue | wIndex | wLength | Data |
---|---|---|---|---|---|
00100001 | SET_CUR | CS(高字節) | 單元或終端ID(高位)+接口(低位) | 數據長度 | |
10100001 | GET_CURGET_MINGET_MAXGET_RESGET_INFOGET_DEF | ||||
00100001 | SET_CUR_ALL | 0 | 單元或終端ID | ||
10100001 | GET_CUR_ALLGET_MIN_ALLGET_MAX_ALLGET_RES_ALLGET_DEF_ALL |
下面對解析過程進行詳細分析
bmRequest指定是什么操作,其中MIN,MAX和RES不能SET因為其是設備實現決定的,不能修改。
wValue字段在高位字節中對應CS,即表示對什么屬性進行操作,低字節為0.設備收到不支持的CS則需要STALL
wIndex高8位為0則表示是接口請求,不是0則表示單元和終端的ID,第8位表示對應的接口。所以這里終端和單元的ID不能為0,因為要和接口區分。
注意*(MAX-MIN)/RES* 和*(CURMIN)/RES *都需要是整數。如果SET_CUR操作中提供了無效的CUR值,設備應STALL,并用0x04“超出范圍”更新請求錯誤代碼。
收到setup后檢查如果是類相關請求,即bmRequestType的bit6:6為1則進入類相關處理接口
usb_function_request
然后再看如果bmRequestType的bit4:0為1,則對應接口相關處理
然后調用注冊的類回調,usb_uvc_class_set
再根據wIndex的高8位如果是0則對應的接口請求uvc_class_itf_req,
否則是終端單元相關請求uvc_class_ut_req
進入uvc_class_ut_req后
再根據wIndex的低8位確認接口,高8位定位終端和單元,然后根據wValue低8位確認CS即對應操作什么屬性,然后根據bRequest確定是什么操作,比如GET_CUR
比如如下的一個實例的解析
a1表示類相關接口請求
86表示GET_INFO
0002 高8位02表示PU_BRIGHTNESS_CONTROL 處理單元的CS
0002 高8位表示單元ID2,低8位表示接口0,如下圖接口0的ID2的單元就是處理單元
0100表示數據長度,GET_INFO即數據只有1個字節
后面的0x82 0x83 0x84 0x87也是類似
分別是GET_IN GET_MAX GET_RES GET_DEF
一般主機請求顯示GET_INFO看你支持啥,然后再進行后續操作。
驅動的優化
上述層層switch解析的方式,比較好理解,但是代碼冗余太大,且這部分代碼應該是屬于類實現層,不應該暴漏給用戶,而且實際所有的端點和處理單元都是類似的,我們可以根據bRequest等參數進行查表跳轉到對應的處理函數,用戶只需要注冊表格和回調即可,借用反射的設計范式。
GET_MIN GET_MAX GET_RES GET_CUR等只需要提供對應的存儲區域的地址,可以建議一個二維表格,分別是哪個端點對應的哪個CS有哪些值操作。這個后面再單獨一篇介紹。
七. 總結
以上詳細介紹了處理單元,包括描述符和其拓撲結構,請求等。可以先了解其拓撲結構,在描述符中如何描述這有利于從整體把握,然后了解其請求的過程。
審核編輯:湯梓紅
-
usb
+關注
關注
60文章
7945瀏覽量
264639 -
驅動開發
+關注
關注
0文章
130瀏覽量
12077 -
處理單元
+關注
關注
0文章
9瀏覽量
6921 -
uvc
+關注
關注
1文章
127瀏覽量
14531 -
DWC2
+關注
關注
0文章
35瀏覽量
131
發布評論請先 登錄
相關推薦
評論