前言
暫且將枚舉過程分爲兩個階段。
第一個階段我稱其爲通性階段,就是只要是USB設備都會經歷這個階段,該階段USB主機完成了對從設備的設備、配置、接
口、端點描述符的獲取。主機會根據描述符中的信息,決定是否發起或如何發起第二階段枚舉。
第二階段,我稱其爲個性階段,因爲大多數USB設備在完成上一步驟,枚舉過程就已經結束了,嚴格來說,該階段已不屬於
枚舉階段了,因爲不管什麼類型的USB設備在主機已經獲取到其相關描述符後,就能在設備管理器中找到該設備了。但是有些類
類型USB設備會在其接口描述符中描述一些該設備的屬性信息,主機在完成“第一階段”枚舉之後,會繼續向USB設備發起詢問,
獲取這些存在的屬性值。
UVC枚舉成功與Process Unit描述符
下圖爲UVC設備的抓包數據,當其被PC枚舉成功後,主機又接連對其發送了若干request請求,如GET_INFO、GET_MIN
等,這是PC在獲取更加詳細的UVC視頻處理單元屬性。
且看第一行:a1 86 00 02 00 03 01 00 ,在UVC官方文檔“USB_Video_Example 1.1.pdf”裏找到如下描述:
該信息是PC在詢問UVC設備對其“亮度”屬性的操作權限,返回值爲“03”,那麼PC端對其“亮度”值屬性具有設置和獲取的權
限。緊接着GET_MIN、GET_MAX、GET_DEF分別獲取到“亮度”可調節的最小、最大值以及默認亮度值。
接下來仍然是按照順序,對UVC處理單元的其他屬性進行最大、最小、默認值設置,一直到把所有的屬性查詢完成,“第二
階段”枚舉結束。
打開PC攝像頭軟件,打開屬性對話框,如下圖所示,即爲UVC處理單元的所有屬性設置,黑色字體屬性爲該UVC設備存在
的屬性,灰色字體屬性是該UVC設備不具備的屬性。
不信你可以使用“UVCView.x86.exe”軟件找到對Process Unit 描述符的解析,看看與上圖各個屬性是否一一對應?
那我們就可以得出結論了,UVC枚舉的“第二階段”與其Process Unit描述符中的bmControls值有關,若我們在USB固件中對
此描述符賦值爲全0,則PC就不會發起“第二階段”枚舉!