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