当前位置:   article > 正文

Video4Linux框架简介(6) - 控制框架_vidioc_subscribe_event

vidioc_subscribe_event

V4L2 PCI驱动实例控制框架


译注:在图像传输开始后,会有各种各样的控制参数需要下发给硬件,譬如brightness, contrast等。


首先,要增加如下的控制处理回调函数,一些芯片厂商把kernel驱动做小,很多就依赖event机制在userspace侧处理。

  1. #include <media/v4l2-ctrls.h>
  2. #include <media/v4l2-event.h>
  3. struct skeleton {
  4. ...
  5. struct v4l2_ctrl_handler ctrl_handler;
  6. ...
  7. };
  8. static const struct v4l2_ctrl_ops skel_ctrl_ops = {
  9. .s_ctrl = skeleton_s_ctrl,
  10. };
  11. static const struct v4l2_ioctl_ops skel_ioctl_ops = {
  12. ...
  13. .vidioc_log_status = v4l2_ctrl_log_status,
  14. .vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
  15. .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
  16. };

然后在probe函数中增加初始化,设定控制参数的范围:

  1. static int skeleton_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
  2. {
  3. ...
  4. struct v4l2_ctrl_handler *hdl;
  5. ...
  6. hdl = &skel->ctrl_handler;
  7. v4l2_ctrl_handler_init(hdl, 4);
  8. v4l2_ctrl_new_std(hdl, &skel_ctrl_ops,
  9. V4L2_CID_BRIGHTNESS, 0, 255, 1, 127);
  10. v4l2_ctrl_new_std(hdl, &skel_ctrl_ops,
  11. V4L2_CID_CONTRAST, 0, 255, 1, 16);
  12. v4l2_ctrl_new_std(hdl, &skel_ctrl_ops,
  13. V4L2_CID_SATURATION, 0, 255, 1, 127);
  14. v4l2_ctrl_new_std(hdl, &skel_ctrl_ops,
  15. V4L2_CID_HUE, -128, 127, 1, 0);
  16. if (hdl->error) {
  17. ret = hdl->error;
  18. goto free_hdl;
  19. }
  20. skel->v4l2_dev.ctrl_handler = hdl;
  21. ...
  22. free_hdl:
  23. v4l2_ctrl_handler_free(&skel->ctrl_handler);
  24. v4l2_device_unregister(&skel->v4l2_dev);
  25. disable_pci:
  26. pci_disable_device(pdev);
  27. return ret;
  28. }


最后,增加响应的硬件控制处理:

  1. static int skeleton_s_ctrl(struct v4l2_ctrl *ctrl)
  2. {
  3. struct skeleton *skel =
  4. container_of(ctrl->handler, struct skeleton, ctrl_handler);
  5. switch (ctrl->id) {
  6. case V4L2_CID_BRIGHTNESS:
  7. /* TODO: set brightness to ctrl->val */
  8. break;
  9. case V4L2_CID_CONTRAST:
  10. /* TODO: set contrast to ctrl->val */
  11. break;
  12. case V4L2_CID_SATURATION:
  13. /* TODO: set saturation to ctrl->val */
  14. break;
  15. case V4L2_CID_HUE:
  16. /* TODO: set hue to ctrl->val */
  17. break;
  18. default:
  19. return -EINVAL;
  20. }
  21. return 0;
  22. }


控制框架总结

可以继承其他控制处理程序的控件,特别是从子设备v4l2_subdev继承。

如果必须将控件设置在一起,则控件可以组合到集群。

验证和原子性由v4l2框架处理。

与事件处理集成以允许控制事件(即,当控件更改值或状态时获取事件)。

当子设备的控制更改时,可以通知桥接驱动程序。

支持自动群集。例如:AUTOGAINGAIN控件。

可以在v4l2_device级别,在video_device级别或v4l2_fh级别设置控制处理程序。 在子设备中,控制处理程序总是处于v4l2_subdev级别。


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/263104?site
推荐阅读
相关标签
  

闽ICP备14008679号