内容目录:
- v4l2 async框架介绍
- v4l2 async框架实现
- v4l2 async框架定义接口
- v4l2 async框架访问接口
- v4l2 async框架处理流程
- v4l2 async框架应用-omap3isp
开始本次v4l2 async框架分析前先提个问题:使用库和使用框架有什么却别?
库和框架主要有两个区别:
- 从函数实现来说,库不但定义函数还负责实现函数,自定义模块是功能函数的使用者; 框架不但定义函数还使用功能函数,自定义模块负责实现函数。
- 从函数调用时机来说,自定义模块决定什么时候调用库定义的函数;框架实现决定什么时候调用框架定义的函数-自定义模块实现的函数。
- 从使用姿势来说,库定义的函数直接调用返回即结束;自定义模块实现框架定义的函数,首先需要注册到框架,然后函数可以被多次调用(具体调用多少次由框架实现决定)。
注释:这里说的函数特指功能函数。
1.v4l2 async框架介绍
v4l2 async框架是Linux V4L2框架中的一个子框架,用于实现v4l2 device的异步注册。我们都知道Linux V4L2框架中对设备定义分为:v4l2_device和v4l2_subdev, 设备是有从属概念的,v4l2 device之间是可以存在依赖关系的。v4l2 async框架主要就是为了解决这种乱序异步注册问题,保证一个v4l2 device的上一层的被依赖设备注册后注册这个v4l2 device。按依赖链自上而下完成注册。
v4l2 async框架定义两个角色,3个概念:
- v4l2_async_subdev //async的桥。是异步通知到对端的桥。kernel 6.x版本中中v4l2_async_connection数据结构替代。notifier通过这个桥知道异步操作的对端是谁。notifier持有桥(其实是怎么match)。
- v4l2_async_notifier //v4l2 async框架中的重要角色,是绑定动作的发起者(该角色需要实现v4l2_async框架定义接口:bound, complete, unbind)。
- v4l2_subdev //async通知给谁。是通知桥连接的对端。
如上图构成的v4l2_async系统有两个notifier(v4l2_async_notifier和v4l2_subdev3)。v4l2_async_notifier是root notifier, 通过桥 v4l2_async_subdev3连接对端v4l2_subdev3。v4l2_subdev3有两重身份,对于v4l2_async_notifier来说,v4l2_subdev3是通过桥v4l2_async_subdev3连接的对端;对于v4l2_subdev4来说,v4l2_subdev3是notifier,通过桥v4l2_async_subdev3.1通知v4l2_subdev4。v4l2_subdev1、v4l2_subdev2、v4l2_subdev4身份单一,是通过桥连接的对端。
注意:通过v4l2 async框架实现的异步通知注册系统中不存在相同的"桥"。
v4l2 async框架是围绕两个链表来实现异步处理的: