UVC設備生產廠家爲留出設備的調試接口,或擴展一些UVC以外的特殊功能,會在其USB固件中添加一些私有命令,比如我
要點亮一個led,如何利用UVC控制接口完成命令傳輸?UVC設備固件如何解析這是一條點亮led的命令?
在回答上述兩個問題之前,我要先介紹下UVC擴展單元(Extension Unit),UVC擴展單元是專門爲了給設備廠家提供私有命
令的Unit,若想添加點亮led命令,就必須要通過此單元來配置。
在上一篇學習筆記中,我們將UVC枚舉分爲了兩個階段,其中“第二階段”是否發起由UVC設備的Process Unit描述符決定,如
果在Process Unit描述符中將可見光屬性全部關閉,則PC不會發起“第二階段”枚舉。
擴展單元也是一樣,如果我們在Extension Unit描述符中打開私有命令屬性,則在UVC設備枚舉過程中,PC也會發起對
Extension Unit的詢問。
還是以手中的UVC攝像頭爲例, UVC攝像頭擴展單元bNumControls值爲0X18,bmControls值爲0x9F 0x00 0x07,可以分析
出該攝像頭廠家留了24條私有命令通道,其中只用到了9條,bit置1的位即爲打開的私有命令通道號。
還是要結合抓包數據分析才比較具體,可以看到PC枚舉UVC“第一階段”完成以後,緊接着開始獲取Extension Unit私有命令通
道的屬性信息,在獲取完成後,繼續獲取Process Unit屬性,然後完成枚舉。
a1 85 00 01 00 03 02 00,GET_LEN命令,第六字節“03”,是因爲Extension Unit Id爲03,第四字節爲“01”,表示這是第一
通道,PC分別枚舉了通道序號“1-5”、7等等九個通道,這就和bmControls值Bit位對應起來了,可以發現bit0對應的私有通道序號
爲1,即私有通道號是從1開始計數的。
可以看出PC分別按GET_LEN、GET_INFO、GET_MIN、GET_MAX、GET_RES、GET_DEF的順序獲取通道屬性。
以通道1爲例,GET_LEN獲得的反饋爲0004,則PC像該通道一次只能寫入4Byte數據。