【V4L2概述与I2C驱动概述】

V4L2概述与I2C驱动概述

  • 1 V4L2概述
    • 1.1 用户态与内核态
    • 1.2 V4L2子模块
    • 1.3 V4L2 API使用流程
  • 3. I2C驱动简述
    • 3.1 驱动编写流程:
    • 3.2 adapter驱动
    • 3.3 从设备驱动
    • 3.4从设备匹配过程
  • 附录

1 V4L2概述

1.1 用户态与内核态

【V4L2概述与I2C驱动概述】_第1张图片

1.2 V4L2子模块

名称 描述 备注
Video device 子设备通过video_device在用户空间生成设备节点,进行操作;数据的交互亦是通过该节点进行
子设备系统(subdev) 视频设备抽象层下的子设备,比如:mipi,isp,video等子设备。
Media framework 将各种子设备抽象为entiry,pad,link。使得设备易于管理、抽象清晰
videobuf2 负责buffer的管理工作,包括申请、释放、内核到用户空间的传递; /* 物理地址分散 /
/ vmalloc() 分配的 buffer /
/ 物理地址连续 */
link
事件(fh) 1.负责内核事件的管理,事件类型多样
2.v4l2_event提供一种将事件传递到用户空间的通用方式
1.驱动v4l2_event_queue 填充event.
2.驱动通过v4l2_event_subscribe 实现subdev_ioctl
3.调用路径video_device-> ioctl_ops-> vidioc_subscribe_event订阅到驱动。
4.用户通过poll和ioctl使用VIDIOC_DQEVENT获取event
ctrl控制 (自定义&系统提供) 用于用户空间对视频的效果调节,比如曝光、色调、饱和度、亮度等等。内核提供了大部分的CID,也可以自己新增。

【V4L2概述与I2C驱动概述】_第2张图片

【V4L2概述与I2C驱动概述】_第3张图片
【V4L2概述与I2C驱动概述】_第4张图片
【V4L2概述与I2C驱动概述】_第5张图片

1.3 V4L2 API使用流程

【V4L2概述与I2C驱动概述】_第6张图片
【V4L2概述与I2C驱动概述】_第7张图片

3. I2C驱动简述

【V4L2概述与I2C驱动概述】_第8张图片

名称 描述 其他
i2c_adapter 1. 对应物理上的一个i2c适配器(I2c控制器)
2. 板子上几个i2c口,就需要几个i2c_adapter。
1. i2c_add_numbered_adapter,向i2c核心添加适配器,自己指定总线号
2. i2c_add_adapter,向i2c核心添加适配器,系统指定总线号
i2c_algorithm 1. 对应一套通讯方法
2. 提供给i2c_adapter需要的访问控制函数。
i2c_driver 1. 对应一套驱动方法
2. 可以支持多个同等类型的i2c_client
i2c_client 1. 对应真实的物理设备,每个i2c设备都需要一个i2c_client来描述
2. i2c_adapter与i2c_client关系与硬件体系相同,i2c_client依附于i2c_adapter上。
3. 有几个从设备,就需要几个i2c_client。

3.1 驱动编写流程:

I2C驱动分为:adapter驱动,从设备驱动。
从设备注册i2c_new_device(动态)/i2c_register_board_info(静态);从设备驱动注册i2c_add_driver
1、i2c_add_adapter
2、i2c_new_device/i2c_register_board_info
3、i2c_add_driver
4、调用i2c bus中注册的match函数进行匹配
5、调用platform bus中注册的match函数进行匹配
6、i2cdev_attach_adapter

3.2 adapter驱动

(控制器驱动、i2c总线驱动)

  1. module_init/exit挂载驱动struct platform_driver到系统中。
  2. (of_device_id或者borad_info提供足够信息,匹配)
  3. probe中定义和初始化adapter/algorithm
  4. platform_device定义device资源。
  5. 也可以通过i2c_board_info,创建i2c_client(特别是从设备和控制器一起工作的厂家)。

3.3 从设备驱动

(i2c_client驱动)

  1. module_i2c_driver挂载驱动struct i2c_driver到系统中
  2. struct i2c_device_id、struct of_device_id用来定义device和驱动的匹配。
  3. probe中定义注册v4l2子设备的操作。

3.4从设备匹配过程

支持三种匹配:drv内部of_match_table匹配

名称 描述
of_match_table 使用drv内部的of_match_table列表匹配,一般设备树注册时才会使用这种匹配
acpi match ACPI专用,较少
i2c match I2c常用匹配
name match 平台总线常用,i2c不使用,i2c驱动中名字不重要

【V4L2概述与I2C驱动概述】_第9张图片

附录

[Camera]v4l2框架内核空间解析–知乎
v4l2框架浅析
v4l2学习总结文档
linux v4l2框架分析

你可能感兴趣的:(linux,linux)