2.2.13.17 v4l2_ctrl functions and data structures

union v4l2_ctrl_ptr
指向控制值的指针。
定义:

union v4l2_ctrl_ptr {
s32 *p_s32;
s64 *p_s64;
u8 *p_u8;
u16 *p_u16;
u32 *p_u32;
char *p_char;
struct v4l2_ctrl_mpeg2_sequence *p_mpeg2_sequence;
struct v4l2_ctrl_mpeg2_picture *p_mpeg2_picture;
struct v4l2_ctrl_mpeg2_quantisation *p_mpeg2_quantisation;
struct v4l2_ctrl_fwht_params *p_fwht_params;
struct v4l2_ctrl_h264_sps *p_h264_sps;
struct v4l2_ctrl_h264_pps *p_h264_pps;
struct v4l2_ctrl_h264_scaling_matrix *p_h264_scaling_matrix;
struct v4l2_ctrl_h264_slice_params *p_h264_slice_params;
struct v4l2_ctrl_h264_decode_params *p_h264_decode_params;
struct v4l2_ctrl_h264_pred_weights *p_h264_pred_weights;
struct v4l2_ctrl_vp8_frame *p_vp8_frame;
struct v4l2_ctrl_hevc_sps *p_hevc_sps;
struct v4l2_ctrl_hevc_pps *p_hevc_pps;
struct v4l2_ctrl_hevc_slice_params *p_hevc_slice_params;
struct v4l2_ctrl_vp9_compressed_hdr *p_vp9_compressed_hdr_probs;
struct v4l2_ctrl_vp9_frame *p_vp9_frame;
struct v4l2_ctrl_hdr10_cll_info *p_hdr10_cll;
struct v4l2_ctrl_hdr10_mastering_display *p_hdr10_mastering;
struct v4l2_area *p_area;
void *p;
const void *p_const;
};

成员:
- p_s32:指向 32 位有符号值的指针。
- p_s64:指向 64 位有符号值的指针。
- p_u8:指向 8 位无符号值的指针。
- p_u16:指向 16 位无符号值的指针。
- p_u32:指向 32 位无符号值的指针。
- p_char:指向字符串的指针。
- p_mpeg2_sequence:指向 MPEG2 序列结构的指针。
- p_mpeg2_picture:指向 MPEG2 图像结构的指针。
- p_mpeg2_quantisation:指向 MPEG2 量化数据结构的指针。
- p_fwht_params:指向 FWHT 无状态参数结构的指针。
- p_h264_sps:指向结构体 v4l2_ctrl_h264_sps 的指针。
- p_h264_pps:指向结构体 v4l2_ctrl_h264_pps 的指针。
- p_h264_scaling_matrix:指向结构体 v4l2_ctrl_h264_scaling_matrix 的指针。
- p_h264_slice_params:指向结构体 v4l2_ctrl_h264_slice_params 的指针。
- p_h264_decode_params:指向结构体 v4l2_ctrl_h264_decode_params 的指针。
- p_h264_pred_weights:指向结构体 v4l2_ctrl_h264_pred_weights 的指针。
- p_vp8_frame:指向 VP8 帧参数结构的指针。
- p_hevc_sps:指向 HEVC 序列参数集结构的指针。
- p_hevc_pps:指向 HEVC 图像参数集结构的指针。
- p_hevc_slice_params:指向 HEVC 切片参数结构的指针。
- p_vp9_compressed_hdr_probs:指向 VP9 帧压缩头概率结构的指针。
- p_vp9_frame:指向 VP9 帧参数结构的指针。
- p_hdr10_cll:指向 HDR10 内容亮度级别结构的指针。
- p_hdr10_mastering:指向 HDR10 主控制显示结构的指针。
- p_area:指向区域的指针。
- p:指向复合值的指针。
- p_const:指向常量复合值的指针。
union v4l2_ctrl_ptr_create(void *ptr) 
是一个辅助函数,用于从 void 指针返回一个 v4l2_ctrl_ptr。
参数:
- void *ptr:void 指针。
struct v4l2_ctrl_ops
驱动程序需要提供的控制操作。
定义:

struct v4l2_ctrl_ops {
int (*g_volatile_ctrl)(struct v4l2_ctrl *ctrl);
int (*try_ctrl)(struct v4l2_ctrl *ctrl);
int (*s_ctrl)(struct v4l2_ctrl *ctrl);
};

成员:
- g_volatile_ctrl:获取此控件的新值。通常只适用于易变(通常为只读)控件,例如返回当前信号强度的控件,其值会不断变化。如果未设置,则将返回当前缓存的值。
- try_ctrl:测试控件的值是否有效。仅在通常的 min/max/step 检查不足时有效。
- s_ctrl:实际设置新控件值。s_ctrl 是必需的。这些操作被调用时,ctrl->handler->lock 被持有,因此没有其他人可以访问由该处理程序拥有的控件。
struct v4l2_ctrl_type_ops
驱动程序需要提供的控制类型操作。
定义:

struct v4l2_ctrl_type_ops {
bool (*equal)(const struct v4l2_ctrl *ctrl, u32 idx,union v4l2_ctrl_ptr ptr1, union v4l2_ctrl_ptr ptr2);
void (*init)(const struct v4l2_ctrl *ctrl, u32 idx, union v4l2_ctrl_ptr ptr);
void (*log)(const struct v4l2_ctrl *ctrl);
int (*validate)(const struct v4l2_ctrl *ctrl, u32 idx, union v4l2_ctrl_ptr ptr);
};

成员:
- equal:如果两个值相等,则返回 true。
- init:初始化值。
- log:对数值进行日志记录。
- validate:验证值。成功返回 0,否则返回负值。
- v4l2_ctrl_notify_fnc:typedef,表示当控制值发生更改时应调用的函数的通知参数。
void v4l2_ctrl_notify_fnc(struct v4l2_ctrl *ctrl, void *priv) 
是一个通知参数,用于传递控制数据和私有数据给 v4l2_ctrl_notify() 和 struct v4l2_ctrl_handler。
参数:
- struct v4l2_ctrl *ctrl:指向 struct v4l2_ctrl 的指针。
- void *priv:控制的私有数据。
struct v4l2_ctrl
这是一个描述视频控制器中控制属性的结构体v4l2_ctrl。
定义:

struct v4l2_ctrl {
struct list_head node;
struct list_head ev_subs;
struct v4l2_ctrl_handler *handler;
struct v4l2_ctrl **cluster;
unsigned int ncontrols;
unsigned int done:1;
unsigned int is_new:1;
unsigned int has_changed:1;
unsigned int is_private:1;
unsigned int is_auto:1;
unsigned int is_int:1;
unsigned int is_string:1;
unsigned int is_ptr:1;
unsigned int is_array:1;
unsigned int has_volatiles:1;
unsigned int call_notify:1;
unsigned int manual_mode_value:8;
const struct v4l2_ctrl_ops *ops;
const struct v4l2_ctrl_type_ops *type_ops;
u32 id;
const char *name;
enum v4l2_ctrl_type type;
s64 minimum, maximum, default_value;
u32 elems;
u32 elem_size;
u32 dims[V4L2_CTRL_MAX_DIMS];
u32 nr_of_dims;
union {
u64 step;
u64 menu_skip_mask;
};
union {
const char * const *qmenu;
const s64 *qmenu_int;
};
unsigned long flags;
void *priv;
s32 val;
struct {
s32 val;
} cur;
union v4l2_ctrl_ptr p_def;
union v4l2_ctrl_ptr p_new;
union v4l2_ctrl_ptr p_cur;
};

具体包括以下成员:
1. node:链表节点。
2. ev_subs:控制事件订阅列表。
3. handler:拥有该控制的处理器。
4. cluster:指向簇数组的起始位置。
5. ncontrols:簇数组中的控件数量。
6. done:内部标志,对于每个已处理的控件都会设置该标志。
7. is_new:当用户为该控件指定新值时设置该标志。从v4l2_ctrl_handler_setup()中调用时也会设置它。驱动程序不应该设置此标志。
8. has_changed:当前值与新值不同时设置该标志。驱动程序不应该使用此标志。
9. is_private:如果设置,则此控件是其处理器私有的,不会添加到任何其他处理器中。驱动程序可以设置此标志。
10. is_auto:如果设置,则此控件选择其他簇成员是“自动”模式还是“手动”模式。这用于自动增益/增益类型簇。驱动程序不应直接设置此标志。
11. is_int:如果设置,则该控件具有简单的整数值(即它使用ctrl->val)。
12. is_string:如果设置,则该控件具有类型V4L2_CTRL_TYPE_STRING。
13. is_ptr:如果设置,则该控件是一个数组和/或具有类型>=V4L2_CTRL_COMPOUND_TYPES和/或类型V4L2_CTRL_TYPE_STRING。换句话说,struct v4l2_ext_control使用字段p来指向数据。
14. is_array:如果设置,则该控件包含一个N维数组。
15. has_volatiles:如果设置,则簇的一个或多个成员是易失性的。驱动程序不应触碰此标志。
16. call_notify:如果设置,则每当控件的值更改时调用处理器的notify函数。
17. manual_mode_value:如果设置了is_auto标志,则这是确定该控件是否处于手动模式的自动控件的值。因此,如果自动控件的值等于此值,则整个簇处于手动模式。驱动程序不应直接设置此标志。
18. ops:控件操作。
19. type_ops:控件类型操作。
20. id:控件ID。
21. name:控件名称。
22. type:控件类型。
23. minimum:控件的最小值。
24. maximum:控件的最大值。
25. default_value:控件的默认值。
26. elems:N维数组中的元素数量。
27. elem_size:控件的大小(以字节为单位)。
28. dims:每个维度的大小。
29. nr_of_dims:维度中的数量。
30. 匿名联合体:包含以下成员:
- step:非菜单控件的步长值。
- menu_skip_mask:菜单控件的跳过掩码。这使得可以轻松跳过无效的菜单项。如果设置了位X,则跳过菜单项X。当然,这仅适用于具有<=32个菜单项的菜单。没有任何菜单接近这个数字,所以这是可以接受的。如果我们需要更多,则必须将其扩展为u64或位阵列。
31. 匿名联合体:包含以下成员:
- qmenu:所有菜单项的const char *数组。空字符串(“”)对应于不存在的菜单项(这是除了上述菜单跳过掩码之外的内容)。最后一个条目必须为NULL。仅在类型为V4L2_CTRL_TYPE_MENU时使用。
- qmenu_int:带有整数菜单项的64位整数数组。数组的大小必须等于菜单大小,例如:ceil(maximum-minimum/step)+1。仅在类型为V4L2_CTRL_TYPE_INTEGER_MENU时使用。
32. flags:控件的标志。
33. priv:控件的私有指针,供驱动程序使用。控制框架不会触碰该指针。请注意,删除控件时不会释放该指针。如果需要,则可以添加一个新的内部位字段以告诉框架释放此指针。
34. val:控件的新s32值。
35. cur:用于存储当前值的结构。
- cur.val:如果该类型通过u32整数表示(请参阅枚举v4l2_ctrl_type),则为控件的当前值。
36. p_def:该控件的默认值,通过提供一个标准方式通过指针访问控制类型的联合体表示(仅针对复合控件)。
37. p_new:该控件的新值,通过提供一个标准方式通过指针访问控制类型的联合体表示。
38. p_cur:该控件的当前值,通过提供一个标准方式通过指针访问控制类型的联合体表示。
struct v4l2_ctrl_ref
struct v4l2_ctrl_ref是一个控制引用结构体
定义:

struct v4l2_ctrl_ref {
struct list_head node;
struct v4l2_ctrl_ref *next;
struct v4l2_ctrl *ctrl;
struct v4l2_ctrl_helper *helper;
bool from_other_dev;
bool req_done;
bool valid_p_req;
union v4l2_ctrl_ptr p_req;
};

具体包括以下成员:
1. node:用于控制ID排序的链表节点。
2. next:哈希桶中的单链表节点。
3. ctrl:控制信息本身。
4. helper:指向辅助结构体的指针。在v4l2-ctrl的prepare_ext_ctrls函数中内部使用。
5. from_other_dev:如果为true,则ctrl是在另一个设备中定义的,而不是在struct v4l2_ctrl_handler中定义的。
6. req_done:内部标志,如果包含此控制引用的控制处理程序已绑定到媒体请求,则在应用控制后设置该标志。这样可以防止重复应用具有多个控件的簇(当簇的第一个控件被应用时,它们都被应用)。
7. valid_p_req:如果设置,则p_req包含请求的控制值。
8. p_req:如果包含此控制引用的控制处理程序已绑定到媒体请求,则该指针指向执行请求时必须应用的控制的值,或者指向请求完成时控件的值。如果valid_p_req为false,则对于此请求未设置此控件,当应用此请求时,也不会更新此控件。
描述:
每个控制处理程序都有一个这些引用的列表。list_head用于保持所有控件按控件ID排序的列表,而next指针用于将控件链接到哈希的桶中。
struct v4l2_ctrl_handler
struct v4l2_ctrl_handler是控制处理程序结构体,用于跟踪所有控制:包括控制处理程序拥有的控制和从其他处理程序继承的控制。
定义:

struct v4l2_ctrl_handler {
struct mutex _lock;
struct mutex *lock;
struct list_head ctrls;
struct list_head ctrl_refs;
struct v4l2_ctrl_ref *cached;
struct v4l2_ctrl_ref **buckets;
v4l2_ctrl_notify_fnc notify;
void *notify_priv;
u16 nr_of_buckets;
int error;
bool request_is_queued;
struct list_head requests;
struct list_head requests_queued;
struct media_request_object req_obj;
};

具体成员包括:
1. _lock:默认的锁。
2. lock:用于控制访问此处理程序及其控件的锁。在初始化后可以由用户替换。
3. ctrls:此处理程序拥有的控件的列表。
4. ctrl_refs:控制引用的列表。
5. cached:最后找到的控制引用。通常需要多次使用相同的控制,因此这是一个简单的优化。
6. buckets:哈希桶,允许快速查找控制。
7. notify:控制更改值时调用的通知回调。请注意,在调用notify函数时,处理程序的锁已被持有!
8. notify_priv:传递给v4l2_ctrl通知回调的参数。
9. nr_of_buckets:数组中桶的总数。
10. error:第一个失败的控制添加的错误代码。
11. request_is_queued:如果请求已排队,则为True。
12. requests:用于跟踪打开的控制处理程序请求对象的列表。对于父控制处理程序(req_obj.ops == NULL),这是列表头。当移除父控件处理程序时,它必须取消绑定并放置所有这些请求,因为它们是指向父项的。
13. requests_queued:排队请求的列表。这决定了这些控件应用的顺序。一旦请求完成,它就会从此列表中删除。
14. req_obj:用于链接到struct media_request的struct media_request_object。此请求对象具有refcount。
struct v4l2_ctrl_config
是控制配置结构体。
定义:

struct v4l2_ctrl_config {
const struct v4l2_ctrl_ops *ops;
const struct v4l2_ctrl_type_ops *type_ops;
u32 id;
const char *name;
enum v4l2_ctrl_type type;
s64 min;
s64 max;
u64 step;
s64 def;
union v4l2_ctrl_ptr p_def;
u32 dims[V4L2_CTRL_MAX_DIMS];
u32 elem_size;
u32 flags;
u64 menu_skip_mask;
const char * const *qmenu;
const s64 *qmenu_int;
unsigned int is_private:1;
};

具体成员包括:
1. ops:控制操作。
2. type_ops:控制类型操作。仅对复合控件需要。
3. id:控制ID。
4. name:控制名称。
5. type:控制类型。
6. min:控制的最小值。
7. max:控制的最大值。
8. step:非菜单控件的控制步长。
9. def:控制的默认值。
10. p_def:复合控件的默认值。
11. dims:每个维度的大小。
12. elem_size:控制的字节大小。
13. flags:控制的标志。
14. menu_skip_mask:适用于菜单控件的跳过掩码,使得跳过无效的菜单项非常容易。如果设置了位X,则跳过菜单项X。当然,这仅适用于具有<= 64个菜单项的菜单。没有接近该数字的菜单,所以这是可以的。如果我们需要更多,那么它将需要扩展为位阵列。
15. qmenu:const char *数组,用于存储所有菜单项。如果数组条目为空字符串(“”),则对应于不存在的菜单项(除上述menu_skip_mask之外)。最后一项必须为NULL。
16. qmenu_int:const s64整数数组,用于存储V4L2_CTRL_TYPE_INTEGER_MENU类型的所有菜单项。
17. is_private:如果设置,则此控件是其处理程序的私有控件,并且不会添加到任何其他处理程序中。
void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type, s64 *min, s64 *max, u64 *step, s64 *def, u32 *flags)
void v4l2_ctrl_fill根据控制ID填充控制字段。
参数包括:
1. id:控制ID。
2. name:指向控制名称字符串的指针。
3. type:用于存储控制类型的指针。
4. min:用于存储控制的最小值的指针。
5. max:用于存储控制的最大值的指针。
6. step:用于存储控制步进的指针。
7. def:用于存储控制默认值的指针。
8. flags:用于存储要在控件上使用的标志的指针。
这适用于所有标准V4L2控件。对于非标准控件,它将仅填充给定的参数,并将名称内容设置为NULL。
此函数将覆盖名称、类型和标志的内容。根据类型,min、max、step和def的内容可能会被修改。
注意:不要在驱动程序中使用!它仅用于向后兼容的控制处理。一旦所有驱动程序都转换为使用新的控制框架,此函数将不再被导出。
int v4l2_ctrl_handler_init_class(struct v4l2_ctrl_handler *hdl, unsigned int nr_of_controls_hint, struct lock_class_key *key, const char *name)
int v4l2_ctrl_handler_init_class函数用于初始化控制处理器。
参数包括:
1. hdl:控制处理器。
2. nr_of_controls_hint:此处理器预计引用的控件数量的提示,包括任何继承的控件。它不必精确,但如果偏差太大,那么就会浪费内存(分配了太多的桶)或者控制查找变慢(分配不足的桶,因此需要更多的慢速列表查找)。但是它总是可以工作的。
3. key:如果设置了CONFIG_LOCKDEP,由锁验证器使用的锁类键。
4. name:如果设置了CONFIG_LOCKDEP,由锁验证器使用的名称。
注意:永远不要直接使用此调用,始终使用隐藏键和名称参数的v4l2_ctrl_handler_init()宏。
返回值:如果无法分配桶,则返回错误。此错误也将存储在hdl->error中。
v4l2_ctrl_handler_init(hdl, nr_of_controls_hint)
v4l2_ctrl_handler_init(hdl, nr_of_controls_hint)是一个辅助函数,用于创建一个静态的struct lock_class_key并调用v4l2_ctrl_handler_init_class()。
参数包括:
1. hdl:控制处理器。
2. nr_of_controls_hint:此处理器预计引用的控件数量的提示,包括任何继承的控件。它不必精确,但如果偏差太大,那么就会浪费内存(分配了太多的桶)或者控制查找变慢(分配不足的桶,因此需要更多的慢速列表查找)。但是它总是可以工作的。
描述:这个辅助函数创建一个静态的struct lock_class_key并调用v4l2_ctrl_handler_init_class(),为锁验证器提供一个合适的名称。使用这个辅助函数初始化一个控制处理器。
注意:这个函数将创建一个静态变量,可能会对内存产生影响。
void v4l2_ctrl_handler_free(struct v4l2_ctrl_handler *hdl)
v4l2_ctrl_handler_free函数用于释放控制处理器拥有的所有控件并释放控件列表。
参数包括:
1. hdl:控制处理器。
描述:如果hdl == NULL,那么什么也不做。
void v4l2_ctrl_lock(struct v4l2_ctrl *ctrl)
v4l2_ctrl_lock是一个辅助函数,用于锁定与控制相关的控制处理器。
参数包括:
1. ctrl:要锁定的控制。
描述:v4l2_ctrl_lock是一个辅助函数,用于在访问控制时锁定控制处理器,以避免并发修改问题。
void v4l2_ctrl_unlock(struct v4l2_ctrl *ctrl)
v4l2_ctrl_unlock是一个辅助函数,用于解锁与控制相关的控制处理器。
参数包括:
1. ctrl:要解锁的控制。
描述:v4l2_ctrl_unlock是一个辅助函数,用于在访问控制后解锁控制处理器,以避免并发修改问题。
int __v4l2_ctrl_handler_setup(struct v4l2_ctrl_handler *hdl)
__v4l2_ctrl_handler_setup是一个辅助函数,用于调用处理器中所有控制的s_ctrl操作,以将硬件初始化为当前控制值。调用者需要代表__v4l2_ctrl_handler_setup()获取控制处理器互斥锁。
参数包括:
1. hdl:控制处理器。
描述:这个函数将跳过按钮控件和只读控件。如果hdl == NULL,则返回0。
注意:由于该函数是内部使用的,因此不应直接调用它。
int v4l2_ctrl_handler_setup(struct v4l2_ctrl_handler *hdl)
v4l2_ctrl_handler_setup函数用于调用处理器中所有控制的s_ctrl操作,以将硬件初始化为当前控制值。
参数包括:
1. hdl:控制处理器。
描述:此函数将跳过按钮控件和只读控件。如果hdl == NULL,则返回0。
void v4l2_ctrl_handler_log_status(struct v4l2_ctrl_handler *hdl, const char *prefix)
v4l2_ctrl_handler_log_status函数用于记录处理器所拥有的所有控制。
参数包括:
1. hdl:控制处理器。
2. prefix:在记录控制值时要使用的前缀。如果前缀不以空格结尾,则会在前缀后添加“: ”。如果prefix == NULL,则不使用前缀。
描述:该函数可用于VIDIOC_LOG_STATUS操作。如果hdl == NULL,则此函数不执行任何操作。
struct v4l2_ctrl * v4l2_ctrl_new_custom(struct v4l2_ctrl_handler *hdl, const struct v4l2_ctrl_confifig *cfg, void *priv)
v4l2_ctrl_new_custom函数用于分配和初始化一个新的自定义V4L2控制器。
参数包括:
1. hdl:控制处理器。
2. cfg:控制的配置数据。
3. priv:控制的驱动程序特定私有数据。
描述:如果无法分配v4l2_ctrl结构,则返回NULL,并将hdl->error设置为错误代码(如果尚未设置)。
struct v4l2_ctrl * v4l2_ctrl_new_std(struct v4l2_ctrl_handler *hdl, const struct v4l2_ctrl_ops *ops, u32 id, s64 min, s64 max, u64 step, s64 def)
v4l2_ctrl_new_std函数用于分配和初始化一个新的标准V4L2非菜单控制器。
参数包括:
1. hdl:控制处理器。
2. ops:控制器操作集。
3. id:控制器ID。
4. min:控制器的最小值。
5. max:控制器的最大值。
6. step:控制器的步长。
7. def:控制器的默认值。
描述:如果无法分配v4l2_ctrl结构,或者控制器ID不可识别,则返回NULL,并将hdl->error设置为相应的错误代码(如果尚未设置)。如果id是菜单控件,则该函数将返回NULL。在添加菜单控件时请使用v4l2_ctrl_new_std_menu()。
struct v4l2_ctrl * v4l2_ctrl_new_std_menu(struct v4l2_ctrl_handler *hdl, const struct v4l2_ctrl_ops *ops, u32 id, u8 max, u64 mask, u8 def)
v4l2_ctrl_new_std_menu函数用于分配和初始化一个新的标准V4L2菜单控件。
参数包括:
1. hdl:控制处理器。
2. ops:控制器操作集。
3. id:控制器ID。
4. max:控制器的最大值。
5. mask:菜单控件的跳过掩码。这使得跳过无效的菜单项目变得容易。如果设置了第 X 位,则跳过菜单项 X。当然,这仅适用于具有 <= 64 个菜单项的菜单。没有菜单接近这个数字,所以这是可以接受的。如果我们需要更多,那么这将必须扩展为位数组。
6. def:控制器的默认值。
描述:与v4l2_ctrl_new_std()相同,但min设置为0,mask值确定应跳过哪些菜单项。如果id是非菜单控件,则该函数将返回NULL。
struct v4l2_ctrl * v4l2_ctrl_new_std_menu_items(struct v4l2_ctrl_handler *hdl, const struct v4l2_ctrl_ops *ops, u32 id, u8 max, u64 mask, u8 def, const char * const *qmenu)
v4l2_ctrl_new_std_menu_items函数用于创建一个新的标准V4L2菜单控件,并加入具有驱动程序特定菜单项的菜单。
参数包括:
1. hdl:控制处理器。
2. ops:控制器操作集。
3. id:控制器ID。
4. max:控制器的最大值。
5. mask:菜单控件的跳过掩码。这使得跳过无效的菜单项目变得容易。如果设置了第 X 位,则跳过菜单项 X。当然,这仅适用于具有 <= 64 个菜单项的菜单。没有菜单接近这个数字,所以这是可以接受的。如果我们需要更多,那么这将必须扩展为位数组。
6. def:控制器的默认值。
7. qmenu:新的菜单。
描述:与v4l2_ctrl_new_std_menu()相同,但qmenu将是此控件的驱动程序特定菜单。
struct v4l2_ctrl * v4l2_ctrl_new_std_compound(struct v4l2_ctrl_handler *hdl, const struct v4l2_ctrl_ops *ops, u32 id, const union v4l2_ctrl_ptr p_def)
v4l2_ctrl_new_std_compound函数用于分配并初始化一个新的标准V4L2复合控件。
参数包括:
1. hdl:控制处理器。
2. ops:控制器操作集。
3. id:控制器ID。
4. p_def:控制器的默认值。
描述:与v4l2_ctrl_new_std()相同,但由于p_def字段的支持,支持复合控件。使用v4l2_ctrl_ptr_create()从指针创建p_def。如果复合控制的默认值应为所有零,请使用v4l2_ctrl_ptr_create(NULL)。
struct v4l2_ctrl * v4l2_ctrl_new_int_menu(struct v4l2_ctrl_handler *hdl, const struct v4l2_ctrl_ops *ops, u32 id, u8 max, u8 def, const s64 *qmenu_int)
v4l2_ctrl_new_int_menu函数用于创建一个新的标准V4L2整数菜单控制器。
参数包括:
1. hdl:控制器处理器。
2. ops:控制器操作集。
3. id:控制器ID。
4. max:控制器的最大值。
5. def:控制器的默认值。
6. qmenu_int:控制器的菜单项。
描述:与v4l2_ctrl_new_std_menu()相同,但掩码被设置为0,并且它还需要一个由整数确定菜单项的数组作为参数。如果id引用非整数菜单控件,则此函数将返回NULL。
bool v4l2_ctrl_filter (const struct v4l2_ctrl *ctrl)
v4l2_ctrl_filter函数用于过滤V4L2控制器,确定它是否应该被使用。
参数包括:
1. ctrl:指向struct v4l2_ctrl的指针。
描述:该函数返回一个布尔值,表示控制器是否应该被使用。通常情况下,如果控制器是已选择的、为用户空间可见的或用户空间不能更改的,则可以使用该控制器。
int v4l2_ctrl_add_handler(struct v4l2_ctrl_handler *hdl, struct v4l2_ctrl_handler *add, v4l2_ctrl_fifilter fifilter, bool from_other_dev)
v4l2_ctrl_add_handler函数用于将另一个控制器处理器add中的所有控制器添加到hdl控制器处理器中。
参数包括:
1. hdl:控制器处理器。
2. add:要将其控制器添加到hdl控制器处理器的控制器处理器。
3. filter:此函数将筛选应添加哪些控件。
4. from_other_dev:如果为true,则add中的控件是在与hdl不同的设备中定义的。
描述:如果两个处理程序中有一个是NULL指针,则此函数不执行任何操作。如果filter为NULL,则添加所有控制器。否则,仅添加filter返回true的控制器。如果出现错误,hdl->error将设置为错误代码(如果尚未设置)。
bool v4l2_ctrl_radio_filter(const struct v4l2_ctrl *ctrl)
v4l2_ctrl_radio_filter函数是无线电控制器的标准过滤器。
参数包括:
1. ctrl:要进行筛选的控件。
描述:对于无线电设备节点有效的所有控件,此函数将返回true。这些是所有V4L2_CID_AUDIO_*用户控制和所有FM发射机类控制。
此函数通常与v4l2_ctrl_add_handler()一起使用。
void v4l2_ctrl_cluster(unsigned int ncontrols, struct v4l2_ctrl **controls)
v4l2_ctrl_cluster函数用于将控制器群集中的所有控制器标记为属于该群集。
参数包括:
1. ncontrols:此群集中的控制器数。
2. controls:大小为ncontrols的群集控制器数组。
描述:此函数将在控制器对象中设置群集标志。群集中的控制器可以具有相同的值(例如:Video Standard),并且它们通常在UI中共享单个控件的自由度,因此这些控件应该被组合为一个群集。
void v4l2_ctrl_auto_cluster(unsigned int ncontrols, struct v4l2_ctrl **controls, u8 manual_val, bool set_volatile)
v4l2_ctrl_auto_cluster函数用于将控制器群集中的所有控制器标记为属于该群集,并设置为自动/手动模式处理。
参数包括:
1. ncontrols:此群集中的控制器数。
2. controls:大小为ncontrols的群集控制器数组。第一个控制器必须是“auto”控制器(例如:autogain、autoexposure等)。
3. manual_val:在群集中与手动设置相等的第一个控制器的值。
4. set_volatile:如果为true,则除第一个自动控制器外的所有控制器都将是易失性的。
描述:这个函数通常用于控制组,其中一个控制器选择某个自动功能,而其他控制器只有在关闭自动功能(手动模式)时才处于活动状态。典型的例子:自动增益(autogain)和增益(gain),自动白平衡(auto-whitebalance)和红色和蓝色平衡等等。
这种控件的行为如下:
当自动控制器设置为自动时,所有手动控制器都设置为非活动状态,并且所有读取将调用g_volatile_ctrl(如果标记为易失性控制器)。
当自动控制器设置为手动模式时,所有手动控制器将被标记为活动状态,并且所有读取将直接返回当前值而无需通过g_volatile_ctrl。
此外,此函数会在自动控制器上设置V4L2_CTRL_FLAG_UPDATE标志,并在autofoo处于自动模式时,在foo控制器上设置V4L2_CTRL_FLAG_INACTIVE标志。
struct v4l2_ctrl * v4l2_ctrl_find(struct v4l2_ctrl_handler *hdl, u32 id)
v4l2_ctrl_find函数用于查找具有给定ID的控制器。
参数包括:
1. hdl:控制器处理程序。
2. id:要查找的控制器ID。
描述:如果hdl == NULL,则此函数也将返回NULL。该函数会锁定处理程序,因此不要从v4l2_ctrl_ops内部使用它。
void v4l2_ctrl_activate(struct v4l2_ctrl *ctrl, bool active)
v4l2_ctrl_activate函数用于激活或非激活控制器。
参数包括:
1. ctrl:要(取消)激活的控制器。
2. active:如果控制器应变为活动状态,则为true。
描述:此函数以原子方式设置或清除V4L2_CTRL_FLAG_INACTIVE标志。如果ctrl==NULL,则不执行任何操作。通常会从s_ctrl操作中调用该函数。然后将生成V4L2_EVENT_CTRL事件。该函数假定控制器处理程序已被锁定。
void __v4l2_ctrl_grab(struct v4l2_ctrl *ctrl, bool grabbed)
__v4l2_ctrl_grab函数是v4l2_ctrl_grab的未锁定变体。
参数包括:
1. ctrl:要(取消)激活的控制器。
2. grabbed:如果控制器应变为抓取状态,则为true。
描述:此函数以原子方式设置或清除V4L2_CTRL_FLAG_GRABBED标志。如果ctrl==NULL,则不执行任何操作。然后将生成V4L2_EVENT_CTRL事件。这通常在驱动程序中启动或停止流时调用。该函数假定调用者已锁定控制器处理程序。
void v4l2_ctrl_grab(struct v4l2_ctrl *ctrl, bool grabbed)
v4l2_ctrl_grab函数用于标记控制器是否被抓取。
参数包括:
1. ctrl:要(取消)激活的控制器。
2. grabbed:如果控制器应变为抓取状态,则为true。
描述:此函数以原子方式设置或清除V4L2_CTRL_FLAG_GRABBED标志。如果ctrl==NULL,则不执行任何操作。然后将生成V4L2_EVENT_CTRL事件。这通常在驱动程序中启动或停止流时调用。该函数假定控制器处理程序未被锁定,并将自己获取锁。
int __v4l2_ctrl_modify_range(struct v4l2_ctrl *ctrl, s64 min, s64 max, u64 step, s64 def)
__v4l2_ctrl_modify_range函数是v4l2_ctrl_modify_range的未锁定变体。
参数包括:
1. ctrl:要更新的控制器。
2. min:控制器的最小值。
3. max:控制器的最大值。
4. step:控制器的步长值。
5. def:控制器的默认值。
描述:在运行时更新控件的范围。这适用于控件类型为INTEGER、BOOLEAN、MENU、INTEGER MENU和BITMASK的情况。对于菜单控件,步进值被解释为菜单跳过掩码。如果一个范围参数对于该控制器类型无效,则返回错误。调用者负责代表 __v4l2_ctrl_modify_range() 获取控制器处理程序互斥锁。
int v4l2_ctrl_modify_range(struct v4l2_ctrl *ctrl, s64 min, s64 max, u64 step, s64 def)
v4l2_ctrl_modify_range函数用于更新控制器的范围。
参数包括:
1. ctrl:要更新的控制器。
2. min:控制器的最小值。
3. max:控制器的最大值。
4. step:控制器的步长值。
5. def:控制器的默认值。
描述:在运行时更新控件的范围。这适用于控件类型为INTEGER、BOOLEAN、MENU、INTEGER MENU和BITMASK的情况。对于菜单控件,步进值被解释为菜单跳过掩码。如果一个范围参数对于该控制器类型无效,则返回错误。该函数假定控制器处理程序未被锁定,并将自己获取锁。
void v4l2_ctrl_notify(struct v4l2_ctrl *ctrl, v4l2_ctrl_notify_fnc notify, void *priv)
v4l2_ctrl_notify函数用于为控制器设置通知回调函数。
参数包括:
1. ctrl:控制器。
2. notify:回调函数。
3. priv:传递给回调函数的回调私有句柄参数。
描述:该函数为控制器设置一个回调函数。如果ctrl为NULL,则不执行任何操作。如果notify为NULL,则通知回调将被删除。
只能有一个通知回调函数。如果已经存在另一个通知回调函数,则会发出WARN_ON警告并且该函数将不执行任何操作。
const char * v4l2_ctrl_get_name(u32 id)
v4l2_ctrl_get_name函数用于获取控制器名称。
参数包括:
1. id:控制器ID。
描述:该函数返回给定控制器ID的名称,如果它不是已知控制器,则返回NULL。
const char * const * v4l2_ctrl_get_menu(u32 id)
v4l2_ctrl_get_menu函数用于获取控制器菜单字符串数组。
参数包括:
1. id:控制器ID。
描述:该函数返回给定控制器ID的空终止菜单字符串数组名称,如果它不是已知的菜单控件,则返回NULL。
const s64 * v4l2_ctrl_get_int_menu(u32 id, u32 *len)
v4l2_ctrl_get_int_menu函数用于获取控制器整数菜单数组。
参数包括:
1. id:控制器ID。
2. len:整数数组的大小。
描述:该函数返回给定控制器ID的整数数组,如果它不是已知的整数菜单控件,则返回NULL。
s32 v4l2_ctrl_g_ctrl(struct v4l2_ctrl *ctrl)
v4l2_ctrl_g_ctrl函数用于从驱动程序内部获取控制器的值的帮助函数。
参数包括:
1. ctrl:控制器。
描述:该函数通过控制框架安全地返回控制器的值。此函数将锁定控制器的处理程序,因此无法从v4l2_ctrl_ops函数中使用该函数。
此函数仅适用于整数类型控件。
int __v4l2_ctrl_s_ctrl(struct v4l2_ctrl *ctrl, s32 val)
__v4l2_ctrl_s_ctrl函数是v4l2_ctrl_s_ctrl的未锁定版本。
参数包括:
1. ctrl:控制器。
2. val:新值。
描述:该函数通过控制框架安全地设置控制器的新值。此函数假定控制器的处理程序已经被锁定,允许从v4l2_ctrl_ops函数中使用它。
此函数仅适用于整数类型控件。
int v4l2_ctrl_s_ctrl(struct v4l2_ctrl *ctrl, s32 val)
v4l2_ctrl_s_ctrl函数用于从驱动程序内部设置控制器的值的帮助函数。
参数包括:
1. ctrl:控制器。
2. val:新值。
描述:该函数通过控制框架安全地设置控制器的新值。此函数将锁定控制器的处理程序,因此无法从v4l2_ctrl_ops函数中使用该函数。
此函数仅适用于整数类型控件。
s64 v4l2_ctrl_g_ctrl_int64(struct v4l2_ctrl *ctrl)
v4l2_ctrl_g_ctrl_int64函数用于从驱动程序内部获取控制器整数值的帮助函数。
参数包括:
1. ctrl:控制器。
描述:该函数通过控制框架安全地返回控制器的整数值(64位)。此函数将锁定控制器的处理程序,因此无法从v4l2_ctrl_ops函数中使用该函数。
该函数仅适用于整数类型控件(64位)。
int __v4l2_ctrl_s_ctrl_int64(struct v4l2_ctrl *ctrl, s64 val)
__v4l2_ctrl_s_ctrl_int64函数是v4l2_ctrl_s_ctrl_int64的未锁定版本。
参数包括:
1. ctrl:控制器。
2. val:新值。
描述:该函数通过控制框架安全地设置控制器的新值。此函数假定控制器的处理程序已经被锁定,允许从v4l2_ctrl_ops函数中使用它。
此函数仅适用于64位整数类型控件。
int v4l2_ctrl_s_ctrl_int64(struct v4l2_ctrl *ctrl, s64 val)
v4l2_ctrl_s_ctrl_int64函数用于从驱动程序内部设置64位控制器的值的帮助函数。
参数包括:
1. ctrl:控制器。
2. val:新值。
描述:该函数通过控制框架安全地设置控制器的新值。此函数将锁定控制器的处理程序,因此无法从v4l2_ctrl_ops函数中使用该函数。
此函数仅适用于64位整数类型控件。
int __v4l2_ctrl_s_ctrl_string(struct v4l2_ctrl *ctrl, const char *s)
__v4l2_ctrl_s_ctrl_string函数是v4l2_ctrl_s_ctrl_string的未锁定版本。
参数包括:
1. ctrl:控制器。
2. s:新字符串。
描述:该函数通过控制框架安全地设置控制器的新字符串。此函数假定控制器的处理程序已经被锁定,允许从v4l2_ctrl_ops函数中使用它。
此函数仅适用于字符串类型控件。
int v4l2_ctrl_s_ctrl_string(struct v4l2_ctrl *ctrl, const char *s)
v4l2_ctrl_s_ctrl_string函数用于从驱动程序内部设置控制器的字符串值的帮助函数。
参数包括:
1. ctrl:控制器。
2. s:新字符串。
描述:该函数通过控制框架安全地设置控制器的新字符串。此函数将锁定控制器的处理程序,因此无法从v4l2_ctrl_ops函数中使用该函数。
此函数仅适用于字符串类型控件。
int __v4l2_ctrl_s_ctrl_compound(struct v4l2_ctrl *ctrl, enum v4l2_ctrl_type type, const void *p)
__v4l2_ctrl_s_ctrl_compound函数是v4l2_ctrl_s_ctrl_compound的未锁定版本,用于设置复合控制器。
参数包括:
1. ctrl:控制器。
2. type:数据类型。
3. p:新的复合负载。
描述:该函数通过控制框架安全地设置控制器的新复合负载。此函数假定控制器的处理程序已经被锁定,允许从v4l2_ctrl_ops函数中使用它。
此函数仅适用于复合类型控件。
int v4l2_ctrl_s_ctrl_compound(struct v4l2_ctrl *ctrl, enum v4l2_ctrl_type type, const void *p)
v4l2_ctrl_s_ctrl_compound函数用于从驱动程序内部设置复合控制器的帮助函数。
参数包括:
1. ctrl:控制器。
2. type:数据类型。
3. p:新的复合负载。
描述:该函数通过控制框架安全地设置控制器的新复合负载。此函数将锁定控制器的处理程序,因此无法从v4l2_ctrl_ops函数中使用该函数。
此函数仅适用于复合类型控件。
void v4l2_ctrl_replace(struct v4l2_event *old, const struct v4l2_event *new)
v4l2_ctrl_replace函数是用作struct v4l2_subscribed_event_ops replace()回调的函数。
参数包括:
1. old:指向报告的事件的struct v4l2_event指针;
2. new:指向修改后的事件的struct v4l2_event指针。
描述:该函数被用作回调,用于在事件订阅中替换旧的报告事件。该函数将新的事件结构体复制到旧的事件结构体中,以便更新事件信息。
void v4l2_ctrl_merge(const struct v4l2_event *old, struct v4l2_event *new)
v4l2_ctrl_merge函数是用作struct v4l2_subscribed_event_ops merge()回调的函数。
参数包括:
1. old:指向报告的事件的struct v4l2_event指针;
2. new:指向合并后的事件的struct v4l2_event指针。
描述:该函数被用作回调,用于在事件订阅中合并旧的报告事件和新的事件。该函数将旧的事件结构体复制到新的事件结构体中,以保留旧的事件信息。然后,它将新的事件结构体中的任何更改应用于旧的事件结构体中的字段。
int v4l2_ctrl_log_status(struct file *fifile, void *fh)
v4l2_ctrl_log_status函数是用于实现VIDIOC_LOG_STATUS ioctl的帮助函数。
参数包括:
1. file:指向struct file的指针;
2. fh:未使用。仅为与struct v4l2_ioctl_ops.vidioc_log_status期望的参数兼容而保留。
描述:该函数可以作为一个vidioc_log_status函数,只需要转储与文件句柄关联的所有控件即可。它通过遍历与文件句柄关联的控件列表,并打印每个控件的名称、ID、值和范围等信息来实现此操作。
int v4l2_ctrl_subscribe_event(struct v4l2_fh *fh, const struct v4l2_event_subscription *sub)
v4l2_ctrl_subscribe_event函数用于订阅事件。
参数包括:
1. fh:指向struct v4l2_fh的指针;
2. sub:指向struct v4l2_event_subscription的指针。
描述:该函数可以作为vidioc_subscribe_event函数使用,仅订阅控件事件。它将sub指定的事件订阅添加到fh指向的文件句柄的事件订阅列表中。在添加订阅后,包括v4l2_ctrl_request、v4l2_ctrl_notify和v4l2_ctrl_subscribe等函数将向订阅列表中的所有事件发送通知。
__poll_t v4l2_ctrl_poll(struct file *file, struct poll_table_struct *wait)
v4l2_ctrl_poll函数是用作poll()回调的函数,仅用于轮询控件事件。
参数包括:
1. file:指向struct file的指针;
2. wait:指向struct poll_table_struct的指针。
描述:该函数被用作回调,在应用程序使用poll()函数时轮询与文件句柄关联的控件事件。如果存在未处理的事件,则该函数将返回POLLIN标志。否则,该函数将wait添加到事件订阅列表中,并挂起进程,直到事件通知唤醒它。
int v4l2_ctrl_request_setup(struct media_request *req, struct v4l2_ctrl_handler *parent)
v4l2_ctrl_request_setup函数是用于在请求中应用控件值的帮助函数。
参数包括:
1. req:指向struct media_request的指针;
2. parent:指向父控件处理程序struct v4l2_ctrl_handler的指针(“priv”在media_request_object_find()中)。
描述:这是一个帮助函数,用于使用请求中包含的控件值调用控件处理程序的s_ctrl回调函数。需要注意的是,这种在请求中应用控件值的方法仅适用于内存到内存的设备。函数会首先获取请求中的控件操作,并通过标识符在父控件处理程序中找到对应的控件链表,然后通过调用s_ctrl回调来为控件设置值。
void v4l2_ctrl_request_complete(struct media_request *req, struct v4l2_ctrl_handler *parent)
v4l2_ctrl_request_complete函数用于完成控件处理程序请求对象。
参数包括:
1. req:指向struct media_request的指针;
2. parent:指向父控件处理程序struct v4l2_ctrl_handler的指针(“priv”在media_request_object_find()中)。
描述:该函数用于每个控件处理程序的请求对象,即支持请求的驱动程序的控件处理程序。首先,函数获取控件处理程序中任何易失性控件的值,并将其附加到请求中。然后,该函数完成请求对象。函数完成请求后,请求将进入V4L2驱动程序的请求队列,并等待上下文完成该请求。
struct v4l2_ctrl_handler * v4l2_ctrl_request_hdl_find(struct media_request *req, struct v4l2_ctrl_handler *parent)
v4l2_ctrl_request_hdl_find函数用于在请求中查找控件处理程序。
参数包括:
1. req:指向struct media_request的指针;
2. parent:指向父控件处理程序struct v4l2_ctrl_handler的指针(“priv”在media_request_object_find()中)。
描述:该函数用于查找请求中的控件处理程序,如果未找到则可能返回空指针。完成后,必须使用返回的处理程序指针调用v4l2_ctrl_request_put_hdl()函数。
注意:如果请求不处于VALIDATING或QUEUED状态,则此函数将始终返回NULL。在VALIDATING状态下,req_queue_mutex被持有,因此无法添加或删除对象。在QUEUED状态下,需要驱动程序来确保此点。
void v4l2_ctrl_request_hdl_put(struct v4l2_ctrl_handler *hdl)
v4l2_ctrl_request_hdl_put函数用于释放先前从v4l2_ctrl_request_hdl_find()函数获取的控件处理程序。
参数包括:
1. hdl:要释放的控件处理程序指针。
描述:该函数将释放先前从v4l2_ctrl_request_hdl_find()函数获取的控件处理程序。一旦不再使用,必须调用此函数以避免内存泄漏。
struct v4l2_ctrl * v4l2_ctrl_request_hdl_ctrl_find(struct v4l2_ctrl_handler *hdl, u32 id)
v4l2_ctrl_request_hdl_ctrl_find函数用于查找具有给定ID的控件。
参数包括:
1. hdl:请求中的控件处理程序指针;
2. id:要查找的控件ID。
描述:该函数返回指向控件的指针,如果该控件是请求的一部分,则返回该指针;否则返回空指针。
int v4l2_queryctrl(struct v4l2_ctrl_handler *hdl, struct v4l2_queryctrl *qc)
v4l2_queryctrl函数是用于实现VIDIOC_QUERYCTRL ioctl的辅助函数。
参数包括:
1. hdl:指向struct v4l2_ctrl_handler的指针;
2. qc:指向struct v4l2_queryctrl的指针。
描述:该函数用于查询控件ID,并将其属性存储在struct v4l2_queryctrl中。如果hdl为空指针,则函数返回-EINVAL。
int v4l2_query_ext_ctrl(struct v4l2_ctrl_handler *hdl, struct v4l2_query_ext_ctrl *qc)
v4l2_query_ext_ctrl函数是用于实现VIDIOC_QUERY_EXT_CTRL ioctl的辅助函数。
参数包括:
1. hdl:指向struct v4l2_ctrl_handler的指针;
2. qc:指向struct v4l2_query_ext_ctrl的指针。
描述:该函数用于查询扩展控件ID,并将其属性存储在struct v4l2_query_ext_ctrl中。如果hdl为空指针,则函数返回-EINVAL。
int v4l2_querymenu(struct v4l2_ctrl_handler *hdl, struct v4l2_querymenu *qm)
v4l2_querymenu函数是用于实现VIDIOC_QUERYMENU ioctl的辅助函数。
参数包括:
1. hdl:指向struct v4l2_ctrl_handler的指针;
2. qm:指向struct v4l2_querymenu的指针。
描述:该函数用于查询控件的菜单,并将其属性存储在struct v4l2_querymenu中。如果hdl为空指针,则函数返回-EINVAL。
int v4l2_g_ctrl(struct v4l2_ctrl_handler *hdl, struct v4l2_control *ctrl)
v4l2_g_ctrl函数是用于实现VIDIOC_G_CTRL ioctl的辅助函数。
参数包括:
1. hdl:指向struct v4l2_ctrl_handler的指针;
2. ctrl:指向struct v4l2_control的指针。
描述:该函数用于获取控件的当前值,并将其存储在struct v4l2_control中。如果hdl为空指针,则函数返回-EINVAL。
int v4l2_s_ctrl(struct v4l2_fh *fh, struct v4l2_ctrl_handler *hdl, struct v4l2_control *ctrl)
v4l2_s_ctrl函数是用于实现VIDIOC_S_CTRL ioctl的辅助函数。
参数包括:
1. fh:指向struct v4l2_fh的指针;
2. hdl:指向struct v4l2_ctrl_handler的指针;
3. ctrl:指向struct v4l2_control的指针。
描述:该函数用于设置控件的值,并将其存储在struct v4l2_control中。如果hdl为空指针,则函数返回-EINVAL。
int v4l2_g_ext_ctrls(struct v4l2_ctrl_handler *hdl, struct video_device *vdev, struct media_device *mdev, struct v4l2_ext_controls *c)
v4l2_g_ext_ctrls函数是用于实现VIDIOC_G_EXT_CTRLS ioctl的辅助函数。
参数包括:
1. hdl:指向struct v4l2_ctrl_handler的指针;
2. vdev:指向struct video_device的指针;
3. mdev:指向struct media_device的指针;
4. c:指向struct v4l2_ext_controls的指针。
描述:该函数用于获取扩展控件组的值,并将控件组属性存储在struct v4l2_ext_controls中。如果hdl为空指针,则函数返回-EINVAL。
int v4l2_try_ext_ctrls(struct v4l2_ctrl_handler *hdl, struct video_device *vdev, struct media_device *mdev, struct v4l2_ext_controls *c)
v4l2_try_ext_ctrls函数是用于实现VIDIOC_TRY_EXT_CTRLS ioctl的辅助函数。
参数包括:
1. hdl:指向struct v4l2_ctrl_handler的指针;
2. vdev:指向struct video_device的指针;
3. mdev:指向struct media_device的指针;
4. c:指向struct v4l2_ext_controls的指针。
描述:该函数用于尝试设置扩展控件组的值,并将控件组属性存储在struct v4l2_ext_controls中。如果hdl为空指针,则函数返回-EINVAL。
int v4l2_s_ext_ctrls(struct v4l2_fh *fh, struct v4l2_ctrl_handler *hdl, struct video_device *vdev, struct media_device *mdev, struct v4l2_ext_controls *c)
v4l2_s_ext_ctrls函数是用于实现VIDIOC_S_EXT_CTRLS ioctl的辅助函数。
参数包括:
1. fh:指向struct v4l2_fh的指针;
2. hdl:指向struct v4l2_ctrl_handler的指针;
3. vdev:指向struct video_device的指针;
4. mdev:指向struct media_device的指针;
5. c:指向struct v4l2_ext_controls的指针。
描述:该函数用于设置扩展控件组的值,并将控件组属性存储在struct v4l2_ext_controls中。如果hdl为空指针,则函数返回-EINVAL。
int v4l2_ctrl_subdev_subscribe_event(struct v4l2_subdev *sd, struct v4l2_fh *fh, struct v4l2_event_subscription *sub)
v4l2_ctrl_subdev_subscribe_event函数是用于实现作为struct v4l2_subdev_core_ops的subscribe_event函数的辅助函数,它仅订阅控制事件。
参数包括:
1. sd:指向struct v4l2_subdev的指针;
2. fh:指向struct v4l2_fh的指针;
3. sub:指向struct v4l2_event_subscription的指针。
描述:该函数用于将控制事件订阅到sd所代表的子设备上。它是一个辅助函数,可以实现为struct v4l2_subdev_core_ops的subscribe_event函数。
int v4l2_ctrl_subdev_log_status(struct v4l2_subdev *sd)
v4l2_ctrl_subdev_log_status函数用于记录由子设备的控制处理程序拥有的所有控件的状态。
参数包括:
1. sd:指向struct v4l2_subdev的指针。
描述:该函数用于记录由sd所代表的子设备中的控制处理程序拥有的所有控件的状态信息。它将打印控件的名称、当前值和范围,以及其他相关信息。
int v4l2_ctrl_new_fwnode_properties(struct v4l2_ctrl_handler *hdl, const struct v4l2_ctrl_ops *ctrl_ops, const struct v4l2_fwnode_device_properties *p)
v4l2_ctrl_new_fwnode_properties函数用于注册与设备属性相关的控件,使用包含在参数p中的属性值(如果属性已设置为某个值)。
参数包括:
1. hdl:指向要在其上注册控制的struct v4l2_ctrl_handler的指针;
2. ctrl_ops:指向要注册控制的struct v4l2_ctrl_ops的指针;
3. p:指向struct v4l2_fwnode_device_properties的指针。
描述:该函数用于解析和注册与设备属性相关联的控件。目前,函数支持解析和注册的v4l2控件是:
- V4L2_CID_CAMERA_ORIENTATION - V4L2_CID_CAMERA_SENSOR_ROTATION。
如果调用者已经通过hdl控制处理程序注册了控件,则不会被覆盖。在调用此函数之前,调用者应该先注册自己要处理的控件。
返回值:成功时返回0,失败时返回负数错误代码。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值