V4L2源代码之旅三:I2C sub-device drivers

v4l2-common.h

  对一个I2C驱动添加v4l2_subdev支持的建议方式是将v4l2_subdev嵌入到每一个I2C设备实例的state struct。如果设备非常简单,可以直接创建v4l2_subdev。

典型的state struct类似如下:

struct chipname_state {
    struct v4l2_subdev sd;
    ...  /* additional state fields */
};

v4l2_subdev结构体的初始化:

 v4l2_i2c_subdev_init(&state->sd, client, subdev_ops);

  该函数可以填充v4l2_subdev的所有成员,并且确保v4l2_subdev和i2c_client互指。

  所以应该有一个内联函数可以从v4l2_subdev指向chipname_state struct:

static inline struct chipname_state *to_state(struct v4l2_subdev *sd)
{
    return container_of(sd, struct chipname_state, sd);
}

从v4l2_subdev获取i2c_client:

struct i2c_client *client = v4l2_get_subdevdata(sd);

从i2c_client获取v4l2_subdev:

 struct v4l2_subdev *sd = i2c_get_clientdata(client);

  确保当remove()回调时,调用v4l2_device_unregister_subdev(sd)。这是从bridge driver中注销sub-device。即使sub-devices从没有被注册过,该方法被调用也是安全的。

struct v4l2_subdev *sd = v4l2_i2c_new_subdev(v4l2_dev, adapter,
           "module_foo", "chipid", 0x36, NULL);

  加载给定module(如果没有module需要加载,可以为NULL)并且根据给定i2c_adapter调用i2c_new_device()并且chip/address arguments。如果一切顺利,它将会完成subdev和v4l2_device的同时注册。

  你也可以使用v4l2_i2c_new_subdev()的最后一个参数来传递一个可能应该被probe的I2C地址数组。这些probe addresses只有当之前的参数为0才会被使用。一个非零的说法意味着你知道确切的I2C地址,在这种情况下没有探测将发生。

  你传递给v4l2_i2c_new_subdev()的参数chipid通常和module name一致。允许指定一个chip变量:saa7114或saa7115。通常会通过i2c驱动自动探测。

  
v4l2_i2c_new_subdev_cfg:添加新irq和platform_data参数并且同时有"addr"和“probed_addrs”参数:如果add不为0将被使用,否则probed_addrs将被probed。

例如:this will probe for address 0x10:

struct v4l2_subdev *sd = v4l2_i2c_new_subdev_cfg(v4l2_dev, adapter,
           "module_foo", "chipid", 0, NULL, 0, I2C_ADDRS(0x10));

  v4l2_i2c_new_subdev_board使用一个传递到i2c drvieri2c_board_info结构体并且替代irq,platform_data和addr参数。

  如果subdev支持s_config在core ops中,在subdev被安装后,这个op会被调用,并且传递irq和platform_data参数。同时v4l2_i2c_new_(probed_)subdev将会调用s_config,但是irq为0并且platform_data设置为NULL。

时间: 2024-07-30 08:24:48

V4L2源代码之旅三:I2C sub-device drivers的相关文章

V4L2源代码之旅三:V4L2 sub-device userspace API

除了通过v4l2_subdev_ops结构体暴露kernel API,V4L2 sub-devices也可以被用户空间应用直接控制. v4l-subdevX的设备节点可以在/dev下被创建来直接访问sub-devices.如果一个sub-device支持用户空间直接配置,必须在注册前设置V4L2_SUBDEV_FL_HAS_DEVNODE标志.注册sub-devices之后,v4l2_device驱动会为所有标记了V4L2_SUBDEV_FL_HAS_DEVNODE标志的sub-devices创

V4L2源代码之旅一:struct v4l2_device

一. 文档位置:linux-3.08/Documentation/video4linux/v4l2-framework.txt 二.翻译总结: V4L2驱动程序往往是很复杂的,其原因是硬件的复杂性:大多数设备有多个IC,从而导出多个设备节点/dev,并且创建了non-V4L2设备如DVB.ALSA,FB,I2C和输入(IR)设备. 特别的是,V4L2驱动必须组织IC支持完成音/视频的混流/编码/解码,这就导致V4L2驱动更加复杂.通常,这些IC是由一个或多个I2C总线连接到主桥驱动,其他总线也可

V4L2源代码之旅十:videobuf

关于videobuf,即V4L2如何实现高性能的和用户空间的Buffer交互,这部分内容应该是V4L2中最难以理解的部分了. 看文档:kernel/Documentation/video4linux/videobuf. videobuf的功能是V4L2 driver和user space之间的粘合层.为存储video frames分配和管理buffer.这是一组许多基于标准POSIX I/O系统调用都可以使用和实现的函数集,包括read(), poll(), and mmap().另外一组函数集

V4L2源代码之旅七:源码追踪

1. v4l2_device_register /* kernel/drivers/media/video/v4l2-device.c */ int v4l2_device_register(struct device *dev, struct v4l2_device *v4l2_dev) { if (v4l2_dev == NULL) return -EINVAL; INIT_LIST_HEAD(&v4l2_dev->subdevs); // 初始化一个将要挂在v4l2_device上的子

V4L2源代码之旅十一:videobuf主要结构体

1. vb2_mem_ops /** * struct vb2_mem_ops - memory handling/memory allocator operations * @alloc: allocate video memory and, optionally, allocator private data,() * return NULL on failure or a pointer to allocator private, * per-buffer data on success;

Ajax之旅(三)-- 异步更新

上篇博文中,已经为大家在理论上讲述了什么是XMLHttpRequest对象,它是Ajax实现异步更新的核心对象.下面,我们就通过一个实例,来了解XMLHTTPRequest对象的使用或者说异步更新的实现. 实例:判断用户代码是否重复        方案一:同步更新.原理如下图所示: 从上图中可以看到,当我们在浏览器用户代码输入框中输入"用户代码"后,只能等待服务器的响应,当服务器将结果反馈给浏览器后,我们才可以进行下一个操作,也就是继续输入"用户名称". 这就是同步

Hbase0.96源代码之HMaster(三)Hmaster主要循环

1,Master初始化 1.1 if (!this.stopped) { finishInitialization(startupStatus, false); loop(); } 1.2 finishInitialization(),这里主要完成master组件components:filesystem manager,servermanager,assignmentmanager,regionservertracker, catalogtracker等 1.2.1 设置为active mas

[中英对照]User-Space Device Drivers in Linux: A First Look

如对Linux用户态驱动程序开发有兴趣,请阅读本文,否则请飘过. User-Space Device Drivers in Linux: A First Look | 初识Linux用户态设备驱动程序 User-Space Device Drivers in Linux: A First Look Mats Liljegren Senior Software Architect Device drivers in Linux are traditionally run in kernel spa

Device Drivers

Types of Device Drivers Windows可能会有User-mode的驱动,但是我们只关注Kernel-Mode的驱动. WDM Drivers WDM是一种驱动模型,是比较常用的驱动模型. WDM可以分为以下几类: Bus Drivers 负责检测到连接到该总线的设备的与PnP/Power相关的事件,并且通知IO Manager, PnP Manager, Power Manager. Function Drivers 负责某一具体设备的driver,是狭义上的driver