Linux v4l2架构学习总链接

上一篇文章中忽略了ctrl class,这里补上

static int handler_new_ref(struct v4l2_ctrl_handler *hdl,struct v4l2_ctrl *ctrl)
{struct v4l2_ctrl_ref *ref;struct v4l2_ctrl_ref *new_ref;u32 id = ctrl->id;u32 class_ctrl = V4L2_CTRL_ID2WHICH(id) | 1;.../** Automatically add the control class if it is not yet present and* the new control is not a compound control.*/if (ctrl->type < V4L2_CTRL_COMPOUND_TYPES &&id != class_ctrl && find_ref_lock(hdl, class_ctrl) == NULL)if (!v4l2_ctrl_new_std(hdl, NULL, class_ctrl, 0, 0, 0, 0))return hdl->error;...}
}

对于id为V4L2_CID_LINK_FREQ

#define V4L2_CID_IMAGE_PROC_CLASS        (V4L2_CTRL_CLASS_IMAGE_PROC | 1)
#define V4L2_CTRL_CLASS_IMAGE_PROC  0x009f0000  /* Image processing controls */
#define V4L2_CID_IMAGE_PROC_CLASS_BASE      (V4L2_CTRL_CLASS_IMAGE_PROC | 0x900)
#define V4L2_CID_LINK_FREQ          (V4L2_CID_IMAGE_PROC_CLASS_BASE + 1)

其ctrl class值为 V4L2_CID_IMAGE_PROC_CLASS

这里看一下代码中的 find_ref_lock函数

static struct v4l2_ctrl_ref *find_ref_lock(struct v4l2_ctrl_handler *hdl, u32 id)
{struct v4l2_ctrl_ref *ref = NULL;if (hdl) {mutex_lock(hdl->lock);ref = find_ref(hdl, id);mutex_unlock(hdl->lock);}return ref;
}static struct v4l2_ctrl_ref *find_ref(struct v4l2_ctrl_handler *hdl, u32 id)
{struct v4l2_ctrl_ref *ref;int bucket;id &= V4L2_CTRL_ID_MASK;/* Old-style private controls need special handling */if (id >= V4L2_CID_PRIVATE_BASE)return find_private_ref(hdl, id);/** 根据id判断所在的bucket编号*/bucket = id % hdl->nr_of_buckets;/* Simple optimization: cache the last control found *//** hdl->cached保存上一次查找到的ref* 如果本次查找和上次保存到一样,这里可以直接返回* 节省时间*/if (hdl->cached && hdl->cached->ctrl->id == id)return hdl->cached;/* Not in cache, search the hash *//** cache中没有找到,现在找hash* 根据bucket编号,找到buckets*/ref = hdl->buckets ? hdl->buckets[bucket] : NULL;/** 通过ref->next依次遍历当前buckets中的ref*/while (ref && ref->ctrl->id != id)ref = ref->next;/** 成功找到ref* 将这个ref保存到cached*/if (ref)hdl->cached = ref; /* cache it! */return ref;
}

对于我们的分析来说,这里是不会找到ref,因为现在还没有ctrl class

对于ctl class来说,依然是通过v4l2_ctl_new_std这个函数来注册,这里就不分析了

使用v4l2-ctrl可以看到具体的ctrl

[root@RV1126_RV1109:/]# v4l2-ctl -d /dev/v4l-subdev3 -lUser Controlsexposure 0x00980911 (int)    : min=2 max=647 step=1 default=284 value=284horizontal_flip 0x00980914 (bool)   : default=0 value=0vertical_flip 0x00980915 (bool)   : default=0 value=0Image Source Controlsvertical_blanking 0x009e0901 (int)    : min=459 max=65343 step=1 default=459 value=459horizontal_blanking 0x009e0902 (int)    : min=30 max=30 step=1 default=30 value=30 flags=read-onlyanalogue_gain 0x009e0903 (int)    : min=16 max=3964 step=1 default=16 value=16Image Processing Controlslink_frequency 0x009f0901 (intmenu): min=0 max=0 default=0 value=0pixel_rate 0x009f0902 (int64)  : min=0 max=4410525 step=1 default=4410525 value=4410525 flags=read-onlytest_pattern 0x009f0903 (menu)   : min=0 max=4 default=0 value=0

可以看到Image Process Controls类下面有link_frequency

v4l2架构专题模块handler分析 -- handler ctrl的注册2相关推荐

  1. v4l2架构专题模块handler分析 --- handler的初始化及handler ctrl注册

    Linux v4l2架构学习总链接 handler初始化代码调用如下: v4l2_ctrl_handler_init(handler, 9); 对应源码: #define v4l2_ctrl_hand ...

  2. v4l2架构专题模块handler分析 -- handler使能(1)cluster

    在驱动代码中,一般都是在probe中初始化handler及创建ctrl,在stream_on的时候会去使能handler,对应的函数是 __v4l2_ctrl_handler_setup int __ ...

  3. Linux v4l2架构学习

    写在开始之前. 网上有很多文章讲v4l2架构,讲的都很好,但是很多都是讲讲主要的结构体已经注册接口这些,个人觉得入门还是要深入的去看代码,至少把整个流程粗略的看一遍,才能真正的了解架构是什么样的,调用 ...

  4. Android开发:图文分析 Handler通信机制 的工作原理

    前言 在Android开发的多线程应用场景中,Handler机制十分常用 下面,将图文详解 Handler机制 的工作原理 目录 1. 定义 一套 Android 消息传递机制 2. 作用 在多线程的 ...

  5. java bs架构书_基于BS架构的图书借阅管理模块的分析与设计(JSP+MySQL)(新品)

    基于BS架构的图书借阅管理模块的分析与设计(JSP+MySQL)(新品) 来源:2BYSJ.cn 资料编号:2SJ295500 资料等级:★★★★★ %D7%CA%C1%CF%B1%E0%BA%C5% ...

  6. 基于Ti Omap3x 分析v4l2架构

    1 概述 本文将基于Ti Omap3x这个典型的实例来分析v4l2在具体media场景中的应用.通过分析app层的行为以及driver层的实现来对整个多媒体框架有一个大概的认识.内容主要包括主要包括v ...

  7. Camera V4L2 架构分析

    转自:点击打开链接 V4L2相关代码位于linux-3.4/drivers/media/video目录中. v4l2-dev.c文件提供设备节点实现与用户层数据交流,设备节点在/dev/目录下以vid ...

  8. EDUSOHO踩坑笔记之六:edusoho架构及模块分析

    EDUSOHO踩坑笔记之六:edusoho架构及模块分析 从目录结构.入口文件.配置.控制器.服务层.模型.模块组成等几个角度,进行架构的描述.本文档是以8.0的版本为基准的说明,与其他版本会有些区别 ...

  9. 二十四、V4L2框架主要结构体分析和虚拟摄像头驱动编写

    一.V4L2框架主要结构体分析 V4L2(video for linux version 2),是内核中视频设备的驱动框架,为上层访问视频设备提供统一接口. V4L2整体框架如下图: 图中主要包括两层 ...

最新文章

  1. ICML2020 | Retro*: 通过神经引导的A*搜索学习逆合成设计
  2. 用浏览器测试Get与Post Webservice,Post一直报405错误,而Get能够成功的原因与解决方法
  3. oracle hint push_pred,hints的push_pred应用-Oracle
  4. 硬币 假硬币 天平_小东西叫硬币
  5. 用MATLAB结合四种方法搜寻罗马尼亚度假问题
  6. 用vue开发一个app(1,基础环境配置)
  7. pychar 设置字体随鼠标滚轮调整大小
  8. 如何清除BIOS密码
  9. python logging 模块之TimedRotatingFileHandler 实现每天一个日志文件
  10. 七十三、分发系统介绍、expect脚本远程登录、expect脚本远程执行命令、expect传递参数...
  11. java中实例化代码块_Java面向对象--代码块(初始化块)和内部类
  12. C语言谭浩强试题,c语言试题谭浩强Word版
  13. 研发人员如何提高工作效率
  14. R语言数据的排序、转换、汇总
  15. STM32之TIM1高级定时器
  16. CPU被挖矿,Redis竟是内鬼,
  17. 结构体类型struct
  18. PHPWIND得到管理员密码的方法
  19. [推荐系统]基于个性化推荐系统研究与实现(1)
  20. icp备案和域名备案两者之间有什么区别?

热门文章

  1. ACTF2020 writeup
  2. 文件管理系统(文件版)
  3. 2. 监督学习之分类
  4. 1-系统C盘迁移到新买的固态硬盘SSD中有影响但不主要,但有必要将系统盘C盘迁移到新安装的 固态硬盘SSD中吗?
  5. 【奇葩问题】每次打开excel文件都会出现两个窗口,一个是空白的sheet1,另一个是自己的文档
  6. Nokia计划在2009年推出多款OLED屏幕手机
  7. 银行从业如何备考,有什么刷题的APP?
  8. 在Android上修改读取IMEI码的方法
  9. 【网络通信 -- 直播】OBS -- 基于 Visual Studio 2019 + Qt 5.15.2 编译调试 OBS studio 源码
  10. 浙江大学计算机学院 金小刚,金小刚(浙江大学CADCG国家重点实验室教授)_百度百科...