基于DWC2的USB驱动开发-UVC的相机终端详解

本文转自公众号,欢迎关注
基于dwc2的usb驱动开发-uvc的相机终端详解 (qq.com)
一.前言本篇来详细分析下uvc的相机终端相关的内容,同样的我们理论结合实践来进行。
二.相机单元简介摄像机终端(ct)控制传输视频流的设备组件的机械(或等效数字)功能。因此,它仅适用于具有可控镜头或传感器特性的视频捕获设备。相机端子始终表示为具有单个输出引脚的输入端子。简单理解就是相机终端是是一个输入终端,他的前面没有其他单元和终端了,它只有一个输出引脚,后面一般接到处理单元。
它提供了对以下功能的支持:
scanning mode (progressive or interlaced)扫描模式(逐行扫描或交错扫描)auto-exposure mode 自动曝光模式auto-exposure priority自动曝光优先级exposure time曝光时间focus对焦auto-focus自动对焦simple focus简单对焦iris光圈zoom缩放pan水平左右移动镜头 x轴旋转 横摇roll滚角tilt垂直上下移动镜头 y轴旋转 竖摇digital windowing数字窗口region of interest 感兴趣区域对上述功能的支持都是可选的。对焦控制等有些是支持自动控制开关的,如果支持自动控制的属性其为打开状态,则设备将自动调整,并且读取请求将反映自动调整的值。此时手动方式设置对应属性将导致stall,即设备要返回stall,错误代码为brequesterrorcode=“错误状态”。
当退出自动模式时,相应属性保持在转换前的有效值。
相机终端是特殊的输入终端,符号和输入终端一致,注意其左边没有引脚,即他就是输入前面不再有输入了,右边输出只接一个引脚。
三.拓扑结构以下从描述符来看处理单元的拓扑结构,如下图是一个实际的uvc产品的描述符,只截取了和uvc相关的iad下的描述符。
可以看到处理单元的id是 bterminalid=1 ,它没有bsourceid了,他就是输入最源头了。其后面是bunitid=2的处理单元,该单元的bsourceid=1表示其源头是本相机终端。
相机终端采集到数据,到后面进行处理,所以相机终端后面接处理单元,这也是好理解的。
其拓扑如下
顺便提一下:
这里为什么有些叫终端terminal ,有些叫单元unit呢,从名字就可以看出,终端就是首末,要么就是前面没有前导,要么就是后面没有后继所以叫终端,而单元是位于中间的前后都有。
四.相机终端描述符处理终端的描述符应该位于uvc的控制接口描述符videocontrol interface descriptors的class-specific vc interface header descriptor的后面
如下所示红色线所指示
本实例终端描述符对应的具体内容如下
相机单元的描述详细内容见规格书p66
3.7.2.3 camera terminal descriptor
偏移区域大小值说明
0 blength 1 数字值,18 本描述符的字节数
1 bdescriptortype 1 常数cs_interface=0x24 描述符类型
2 bdescriptorsubtype 1 常数vc_input_terminal=0x02 描述符子类
3 bterminalid 1 数字 终端id
4 wterminaltype 2 常数itt_camera 终端类型
6 bassocterminal 1 常数 与此输入终端关联的输出终端id
7 iterminal 1 index 描述本终端的字符串描述索引,填0则没有字符串描述符。
8 wobjectivefocallengthmin 2 数字 如果不支持光学变焦,则lmin的值;该字段应设置为0
10 wobjectivefocallengthmax 2 数字 不支持光学变焦时的lmax值;该字段应设置为0。
12 wocularfocallength 2 数字 如果不支持“光学缩放”locular该字段应设置为0。
14 bcontrolsize 1 数字 3 bmcontrols域的字节数
15 bmcontrols 3 bitmap
l其中bdescriptortype的定义参考规格书的p171 a.5. video class-specific vc interface descriptor subtypes
l其中bdescriptorsubtype的定义参考规格书的p172 a.4. video class-specific descriptor types
l其中bterminalid
摄像头终端由bterminalid字段中的值唯一标识。 非零常数 ,同一功能接口内的任何其他单元或终端都不能具有相同的id。
这里为什么要是非零常数呢?为什么从0开始编号呢,因为在请求中windex的高8位为0用于区分是接口请求,其他非0值为对应终端和单元id,所以不能从0开始编号了。
在本功能对应的接口内该值和其他单元和终端的id不能重复。
lwterminaltype字段用于说明是什么类型的终端。对于摄像机终端,该字段应设置为itt_camera,见规格书p177 table b- 2 input terminal types
lbassociateterminal字段用于将输出端子与该输入端子相关联,从而有效地实现双向端子对。
为0则是单向端子。
l其中bmcontrols,表示支持的处理类型
某一位置位则对应的处理支持,小端模式
d0: scanning mode
d1: auto-exposure mode
d2: auto-exposure priority
d3: exposure time (absolute)
d4: exposure time (relative)
d5: focus (absolute)
d6 : focus (relative)
d7: iris (absolute)
d8 : iris (relative)
d9: zoom (absolute)
d10: zoom (relative)
d11: pantilt (absolute)
d12: pantilt (relative)
d13: roll (absolute)
d14: roll (relative)
d15: reserved
d16: reserved
d17: focus, auto
d18: privacy
d19: focus, simple
d20: window
d21: region of interest
d22 – d23: reserved, set to zero
以下是对应一个实例,
-------- video control input terminal descriptor ------
blength : 0x12 (18 bytes)
bdescriptortype : 0x24 (video control interface)
bdescriptorsubtype : 0x02 (input terminal)
bterminalid : 0x01 (1)
wterminaltype : 0x0201 (itt_camera)
bassocterminal : 0x00 (not associated with an output terminal)
iterminal : 0x00 (no string descriptor)
camera input terminal data:
wobjectivefocallengthmin : 0x0000
wobjectivefocallengthmax : 0x0000
wocularfocallength : 0x0000
bcontrolsize : 0x03 (3 bytes)
bmcontrols : 0xff, 0xff, 0x1f
d0 : 1 yes - scanning mode
d1 : 1 yes - auto-exposure mode
d2 : 1 yes - auto-exposure priority
d3 : 1 yes - exposure time (absolute)
d4 : 1 yes - exposure time (relative)
d5 : 1 yes - focus (absolute)
d6 : 1 yes - focus (relative)
d7 : 1 yes - iris (absolute)
d8 : 1 yes - iris (relative)
d9 : 1 yes - zoom (absolute)
d10 : 1 yes - zoom (relative)
d11 : 1 yes - pan (absolute)
d12 : 1 yes - pan (relative)
d13 : 1 yes - roll (absolute)
d14 : 1 yes - roll (relative)
d15 : 1 yes - tilt (absolute)
d16 : 1 yes - tilt (relative)
d17 : 1 yes - focus auto
d18 : 1 yes - reserved
d19 : 1 yes - reserved
d20 : 1 yes - reserved
d21 : 0 no - reserved
d22 : 0 no - reserved
d23 : 0 no - reserved
data (hexdump) : 12 24 02 01 01 02 00 00 00 00 00 00 00 00 03 ff .$..............
ff 1f ..
五. 相机终端相关的请求参考规格书p97 4.2.2.1 camera terminal control requests
相机终端控制请求用于读或者设置相关属性,所以包括set_xx 和get_xx。
一共支持如下20种属性的请求
对应的cs编码见p174 a.9.4. camera terminal control selectors
以下做了一个总结
除非另有规定,否则所有值都被解释为绝对值(固定原点),而不是相对值。除非另有规定,否则它们也被认为是无符号的。
类型cs大小b支持的操作[]表示可选最少支持操作说明
扫描模式 ct_scanning_mode_control 1 set_curget_curget_info 0:交错扫描1:非交错模式
自动曝光模式 ct_ae_mode_control 1 set_curget_curget_resget_infoget_def get_def d0: 手动改模式d1: 自动模式d2: 快门优先模式-手动曝光时间,自动光圈d3: 光圈优先模式-自动曝光时间,手动光圈d4..d7: 保留设置为0.使能自动模式时再配置相关属性将导致stall和brequesterrorcode=“错误状态”的错误代码。向该控件发出的get_res请求将返回该控件支持的模式的bitmap。对该控件的有效请求将仅设置一个位(选择单个模式)。
自动曝光优先级控制 ct_ae_priority_control 1 set_curget_curget_info 0表示帧率固定,默认值1表示帧率可动态变化用于快门优先模式和自动模式时约束曝光时间控制。
曝光绝对时间控制 ct_exposure_time_absolute_control 4 get_cur get_min get_maxget_resget_infoget_def[set_cur] get_def 指定曝光时间,单位为100µs,值设置为0未定义。手动曝光控制受到帧间隔的进一步限制,帧间隔总是具有更高的优先级,如果帧间隔更改为低于“曝光控制”当前值的值,“曝光控制值”将自动更改,默认的“曝光控制”值将是当前帧间隔,直到选择了明确的曝光值为止。当处于自动模式或光圈优先模式时,设置该值导致stall和brequesterrorcode=“错误状态”的错误代码。
曝光相对时间控制 ct_exposure_time_relative_control 1 set_curget_curget_info 有符号数带包步进数0表示设置曝光时间为默认值,当处于自动模式或光圈优先模式时,设置该值导致stall和brequesterrorcode=“错误状态”的错误代码。如果同时支持相对控制和绝对控制,则具有0x00以外值的相对控制的set_cur应导致绝对控制的控制更改中断
对焦绝对值控制 ct_focus_absolute_control 2 get_cur get_min get_maxget_resget_infoget_def[set_cur] get_def 单位毫米,启用自动对焦模式时,设置此值将导致stall和brequesterrorcode=“错误状态”的错误代码。
对焦相对值控制 ct_focus_relative_control 2 set_curget_curget_infoget_defget_minget_maxget_res get_def 第一个字节bfocusrelative1表示聚焦透镜组向近方向移动为0表示聚焦透镜组停止0xff表示透镜组向无穷远方向移动。get_min、get_max、get_res和get_def请求时此字段段返回零。第二个字节bspeed表示移动速度,不支持则设置为1,如果同时支持相对控制和绝对控制,则具有0x00以外值的相对控制的set_cur将导致绝对控制在移动结束时的控制更改中断启用自动对焦时,设置此值导致stall和brequesterrorcode=“错误状态”的错误代码。
对焦简单范围 ct_focus_simple_control 1 set_curget_curget_info get_def get_def 只能在相机处于手动或自动对焦模式时使用。启用自动对焦时,设置此值导致stall和brequesterrorcode=“错误状态”的错误代码。0x00 – full range0x01 – macro. less than 0.3meters.0x02 – people. 0.3m to 3m0x03 – scene. 3m to infinity0x04 to 0xff - reserved
自动对焦控制 ct_focus_auto_control 1 set_cur get_cur get_infget_def get_def 1使能自动对焦
光圈绝对控制 pu_sharpness_control 2 get_curget_min get_maxget_res get_infoget_def[set_cur] get_def 单位为fstop * 100 当“自动曝光模式”控件处于“自动”模式或“快门优先级”模式时,不接受set请求,设备返回stall。
光圈相对控制 ct_iris_relative_control 1 set_cur get_curget_info 有符号数当“自动曝光模式”控件处于“自动”模式或“快门优先级”模式时,不接受set请求,设备返回stall。0: default1: iris is opened by 1 step.0xff: iris is closed by 1 step
缩放绝对控制 ct_zoom_absolute_control 2 get_curget_min get_maxget_resget_infoget_def[set_cur] get_def res必须为1zcur的值用于指定或确定物镜焦距。与相机终端描述符中的wobjectivefocallengthmin和wobjectiveforcallengthmax字段结合使用,以描述和控制设备的物镜焦距。
缩放相对控制 ct_zoom_relative_control 3 set_cur get_cur get_infoget_defget_minget_maxget_res 第一个字节bzoom字段1表示变焦镜头向远摄方向移动。0表示变焦镜头停止,0xff表示变焦镜头向广角方向移动。get_min、get_max、get_res和get_def请求将为此字段返回零第二个字节bdigitalzoom指定是启用还是禁用数字缩放。如果设备仅支持数字变焦,则此字段将被忽略。get_def请求将返回此字段的默认值。get_min、get_max和get_res请求将为此字段返回零。第三个字节bspeedget_min、get_max和get_res请求用于检索此字段的范围和分辨率。get_def请求用于检索此字段的默认值。如果控件不支持速度控制,它将针对所有这些请求在该字段中返回值1如果同时支持相对控制和绝对控制,则具有0x00以外值的相对控制的set_cur应在移动结束时导致绝对控制的控制更改中断,如果移动结束是由于物理设备限制(如移动范围限制),则应为该相对控制生成控制更改中断。
全景倾斜(绝对)控制 ct_pantilt_absolute_control 8 get_cur get_min get_maxget_res get_infoget_def[set_cur] get_def 低4字节,有符号 32位小端pan绝对值高4字节,有符号 32位小端tilt绝对值单位arc 弧秒范围–1803600 arc second ~+1803600 arc second 默认值为0
全景倾斜(相对)控制 ct_pantilt_relative_control 4 set_curget_curget_infoget_def get_minget_maxget_res get_def 第一个字节bpanrelative有符号 pan控制0: stop1: moving to clockwise direction0xff: moving to counter clockwise direction第二个字节 bpanspeed pan移动速度第三个字节btiltrelative 有符号0: stop1: point the imaging plane up0xff: point the imaging plane down第四个字节 btiltspeed tilt速度
滚转(绝对)控制 ct_roll_absolute_control 2 get_curget_min get_max get_resget_infoget_def[set_cur] 有符号16位小端范围–180~+180
滚转(相对)控制 ct_roll_relative_control 2 set_curget_curget_minget_max get_resget_infoget_def 第一个字节0: stop1: moving clockwise rotation0xff: moving counter clockwise rotation第二个字节速度
隐私控制 ct_privacy_control 1 get_cur get_info[set_cur] 隐私控制设置用于防止摄像机传感器获取视频。值0表示摄像机传感器能够捕获视频图像,值1表示摄像机传感器被阻止捕获视频图像。该控件应报告为自动更新控件。0: open1: close
数字窗口控制 ct_digital_window_control 12 set_curget_curget_min get_maxget_def 坐标从0开始wwindow_top:2 字节 上坐标wwindow_left:2字节 左坐标wwindow_bottom:2 字节 下坐标wwindow_right:2 字节 右坐标wnumsteps:2字节 从本窗口移动到指定矩形的步数bmnumstepsunits:2字节 上述步数的单位d0: video framesd1: millisecondsd2-d15: reserved
数字感兴趣区域(roi)控制 ct_region_of_interest_control 10 set_cur get_curget_min, get_maxget_def roi必须在ct_window控件指定的当前数字窗口内。wroi_top 2字节 上坐标wroi_left 2字节 左坐标wroi_bottom2字节 下坐标wroi_right2字节 右坐标bmautocontrols2字节d0: auto exposured1: auto irisd2: auto white balanced3: auto focusd4: auto face detectd5: auto detect and trackd6: image stabilizationd7: higher qualityd8 – d15: reserved, set to zero
六. 相机终端请求驱动代码和其他终端和单元请求处理一样
参考https://mp.weixin.qq.com/s/4ctr1yjumbshqzplec7bha
七. 总结以上详细介绍了相机终端,包括描述符和其拓扑结构,请求等。


华为如何延续辉煌 高通骁龙65X继任者将与海思麒麟960竞争
2023广州建博会:鸿雁总裁王米成详解全屋智能的发展脉络
【虹科案例】用于超高磁场的虹科 digitizerNETBOX——高采样率和完全同步采样
全球电视市场低开高走,全年销量实现正增长
联想将推出两款最新笔记本电脑,Thinkpad P1为史上最薄、最轻
基于DWC2的USB驱动开发-UVC的相机终端详解
在时间上连续的信号就一定是模拟信号吗
Nand Flash的VIVI装载器的解析及改进
不会被ai取代的职业
基于BlueCore01b芯片和API实现嵌入式音频网关的设计
如何使用fpga做数字磁通传感器系统
小家电升维攻坚战, IoT领域成美的最大手牌
有机阳离子和金属掺杂效应对二维无铅基钙钛矿光伏性能影响
HS1101LF湿度传感器在存酒中的应用
初步认识FreeRTOS
当AIoT遇上tinyML是否会成为MCU供应链下一个新商机
基于无线数据传输的水下爆炸压力遥测系统
猎鹰9发射一箭十星,今年已经成功发射20颗卫星
通过应用程序性能监控保护关键基础设施
谷歌发布全新AI SDK,简化安卓应用集成