接着上一篇分析
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37int __v4l2_ctrl_handler_setup(struct v4l2_ctrl_handler *hdl) { struct v4l2_ctrl *ctrl; int ret = 0; if (hdl == NULL) return 0; lockdep_assert_held(hdl->lock); list_for_each_entry(ctrl, &hdl->ctrls, node) ctrl->done = false; list_for_each_entry(ctrl, &hdl->ctrls, node) { struct v4l2_ctrl *master = ctrl->cluster[0]; int i; /* Skip if this control was already handled by a cluster. */ /* Skip button controls and read-only controls. */ if (ctrl->done || ctrl->type == V4L2_CTRL_TYPE_BUTTON || (ctrl->flags & V4L2_CTRL_FLAG_READ_ONLY)) continue; for (i = 0; i < master->ncontrols; i++) { if (master->cluster[i]) { cur_to_new(master->cluster[i]); master->cluster[i]->is_new = 1; master->cluster[i]->done = true; } } ret = call_op(master, s_ctrl); if (ret) break; } return ret; }
对于每个ctrl都会调用s_ctrl,而s_ctrl则是来源于注册ctrl时候的ops,以下面这个ctrl为例
复制代码
1
2
3
4
5
6
7static const struct v4l2_ctrl_ops os04a10_ctrl_ops = { .s_ctrl = os04a10_set_ctrl, }; v4l2_ctrl_new_std(handler, &os04a10_ctrl_ops, V4L2_CID_VBLANK, vblank_def, OS04A10_VTS_MAX - mode->height, 1, vblank_def);
则s_ctrl就是os04a10_set_ctrl
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19static int os04a10_set_ctrl(struct v4l2_ctrl *ctrl) { ... switch (ctrl->id) { ... case V4L2_CID_VBLANK: ret = os04a10_write_reg(os04a10->client, OS04A10_REG_VTS, OS04A10_REG_VALUE_16BIT, ctrl->val + os04a10->cur_mode->height); dev_dbg(&client->dev, "set vblank 0x%xn", ctrl->val); break; ... } return ret; }
最后对应的就是操作寄存器
最后
以上就是积极柠檬最近收集整理的关于v4l2架构专题模块handler分析 -- handler使能(2)s_ctrl的全部内容,更多相关v4l2架构专题模块handler分析内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复