硬件上怎么设置属性?
1. UVC规范里定义了哪些属性 : uvc_ctrl.c里数组: static struct uvc_control_info uvc_ctrls[],这个数组里每一项都对应一个属性,这个数组里就定义了UVC规范所支持的所有属性。
以设置亮度为例讲述设置过程:我们要设置亮度,就需要发一个数据给硬件,就要把数据发给VC下的PU模块,发给PU里面的selector。
{
.entity = UVC_GUID_UVC_PROCESSING, // 属于哪个entity(比如PU),比如我们要设置亮度,需要把数据发给硬件,那发给哪个接口呢?VC。那发给VC接口的那哪一个entity呢,这个成员就是指定entity。
.selector = PU_BRIGHTNESS_CONTROL, // 用于亮度。PU中有许多属性,我们把数据发给PU,那我们怎么知道这个数据是用来设置亮度的呢,这个成员就是用来分辨的。
.index = 0, // 对应Processing Unit Descriptor的bmControls[0],表示是PU中的第几个属性
.size = 2, // 数据长度为2字节
.flags = UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_RANGE
| UVC_CONTROL_RESTORE, //UVC_CONTROL_SET_CUR 表示我们可以设置当前的亮度等
},
2. 我们的设备支持哪些属性
这需要去看描述符, 比如 Processing Unit Descriptor的bmControls的值为7f 14
可知BIT0为1,表示支持BRIGHTNESS
在代码里:
uvc_drvier.c
uvc_ctrl_init_device
// 对于每一个entity(IT,PU,SU,OT等)
list_for_each_entry(entity, &dev->entities, list) {
// 读出bmControls
bmControls = ....
// 计算bmControls里位值为1的个数,就是支持的属性个数
ncontrols += hweight8(bmControls[i]);
// 为每一个属性分配一个struct uvc_control
entity->controls = kzalloc..
</
1. UVC规范里定义了哪些属性 : uvc_ctrl.c里数组: static struct uvc_control_info uvc_ctrls[],这个数组里每一项都对应一个属性,这个数组里就定义了UVC规范所支持的所有属性。
以设置亮度为例讲述设置过程:我们要设置亮度,就需要发一个数据给硬件,就要把数据发给VC下的PU模块,发给PU里面的selector。
{
.entity = UVC_GUID_UVC_PROCESSING, // 属于哪个entity(比如PU),比如我们要设置亮度,需要把数据发给硬件,那发给哪个接口呢?VC。那发给VC接口的那哪一个entity呢,这个成员就是指定entity。
.selector = PU_BRIGHTNESS_CONTROL, // 用于亮度。PU中有许多属性,我们把数据发给PU,那我们怎么知道这个数据是用来设置亮度的呢,这个成员就是用来分辨的。
.index = 0, // 对应Processing Unit Descriptor的bmControls[0],表示是PU中的第几个属性
.size = 2, // 数据长度为2字节
.flags = UVC_CONTROL_SET_CUR | UVC_CONTROL_GET_RANGE
| UVC_CONTROL_RESTORE, //UVC_CONTROL_SET_CUR 表示我们可以设置当前的亮度等
},
2. 我们的设备支持哪些属性
这需要去看描述符, 比如 Processing Unit Descriptor的bmControls的值为7f 14
可知BIT0为1,表示支持BRIGHTNESS
在代码里:
uvc_drvier.c
uvc_ctrl_init_device
// 对于每一个entity(IT,PU,SU,OT等)
list_for_each_entry(entity, &dev->entities, list) {
// 读出bmControls
bmControls = ....
// 计算bmControls里位值为1的个数,就是支持的属性个数
ncontrols += hweight8(bmControls[i]);
// 为每一个属性分配一个struct uvc_control
entity->controls = kzalloc..
</