如何查看UVC设备的功能单元组成

前言
    UVC的Spec在制定时考虑到了诸多不同UVC设备可能存在的特性,为保证Spec具有最大范围的适用性和兼容性,将UVC设备内可能存在的每个功能模块划分为逻辑意义上的功能单元(Entity),并要求具体UVC设备的开发者必须为每个Entity指定ID号,且该ID号能唯一标识某一指定的功能单元,以便Host端的UVC驱动能依此对设备内不同的功能单元进行操作和配置。
    根据以上依据,我们可以通过EntityID来将各个功能单元链接起来组成一个完整的UVC设备功能,而Entity ID与各个Entity的数据源在各单元描述符和终端描述符中有记录,下面我通过USBlyer来查看各Entity描述符,来将其进行组合。记录在此,以免自己以后忘记了。
   备注:关于UVC协议拓扑图可参考UVC标准协议,或如下博客:

===========================================================================

1、找到VC控制描述符下的各功能单元描述符。
    一般情况下通过USBlyzer软件获取设备描述符时,大致结构如下:
如何查看UVC设备的功能单元组成
    一般情况下功能单元结构组成以IT(Input Terminal)开始,以OT(Output Terminal)结束,中间为各处理单元。
    以我的UVC设备为例USBlyzer设备描述符结构如图,红框内为各功能单元的描述符。
如何查看UVC设备的功能单元组成

2、根据单个的功能单元描述符分析出Entity ID和Source ID
    每个功能单元的描述符都会有Entity ID字段和Source ID字段,一般情况下依靠Entity ID几个看出整个功能单元的构成,下面根据我得UVC设备描述符进行分析:
Video Control Input Terminal Descriptor
    首先来看Video Control Input Terminal Descriptor描述符的组成格式:
如何查看UVC设备的功能单元组成
    其中bTermina ID即Entity ID,由于Video Control Input Terminal Descriptor为功能单元结构的第一组成部分,所以无Source ID。
    那么对照上面USBlyzer分析出来该描述符的结构如下:
如何查看UVC设备的功能单元组成
    可以得知Input Terminal的Entity ID = 0x01(1)。

Video Control Processing Unit Descriptor
    Video Control Processing Unit Descriptor描述符的组成格式如下:
如何查看UVC设备的功能单元组成
如何查看UVC设备的功能单元组成
    其中bUnit ID即Entity ID,bSourceID则是与该单元输入PIN连接的功能单元Entity ID。
    那么对照上面USBlyzer分析出来该描述符的结构如下:
如何查看UVC设备的功能单元组成
由上图可以得知Input Terminal的Entity ID = 0x02(2),SourceID = 0x01(1)。显然IT输出端则作为PU的输入端。

Video Control Extension Unit Descriptor
    Video Control ExtensionUnit Descriptor描述符的组成格式如下:
如何查看UVC设备的功能单元组成
如何查看UVC设备的功能单元组成
    其中bUnit ID即Entity ID,bSourceID则是与该单元输入PIN连接的功能单元Entity ID。
    那么对照上面USBlyzer分析出来该描述符的结构如下:
如何查看UVC设备的功能单元组成
由上图可以得知Input Terminal的Entity ID = 0x03(3),SourceID = 0x02(2)。显然PU输出端则作为XU的输入端。


Video Control Output Terminal Descriptor
    最后Video Control Output Terminal Descriptor描述符的组成格式如下:
如何查看UVC设备的功能单元组成
    其中bTermina ID即Entity ID,bSourceID则是与该单元输入PIN连接的功能单元Entity ID。
    那么对照上面USBlyzer分析出来该描述符的结构如下:
如何查看UVC设备的功能单元组成
    由上图可以得知Input Terminal的Entity ID = 0x04(4),SourceID = 0x03(3)。显然XU输出端则作为OT的唯一输入端。
    
3、组合各功能单元
    综合上面各功能单元的EntityID以及SourceID如下:
IN Terminal--->【Entity ID:0x01(1)

Processing Unit--->【Entity ID:0x02(2) | Source ID:0x01(IN)

Extend Unit--->【Entity ID:0x03(3) | Source ID:0x02(PU)

Output Terminal--->【Entity ID: | Source ID:0x03(XU)
    则可以得出下面设备的功能单元拓扑图(不一定符合正规拓扑图画法,但顺序应该是正确的):
如何查看UVC设备的功能单元组成