高通CRM的v4l2驱动模型
概述下crm中v4l2框架的初始化创建流程:
对于CRM主设备的v4l2框架创建过程:
1、分配和初始化v4l2 device对象
2、分配和初始化media device对象,然后将v4l2 device中mdev绑定到media device上
3、分配和初始化video device对象,将其中v4l2 device指向前面创建的v4l2 device对象;
将其中entity对象添加到media device中entities的链表中。创建video device时会创建设备结点/dev/video0,用于用户空间对内核空间的访问。
对于子设备的的v4l2 框架创建流程:
子设备有很多,cam-caps、cam-isp、cam-ope等等,他们依次进行初始化创建。
以cam-caps为例:
1、分配和初始化v4l2 subdev对象,其中包括四个主要成员:
list、v4l2_dev、entity、devnode。
(1)struct media_entity entity; //用于挂到media_device的entities链表上
(2)struct list_head list; //用于挂在v4l2_device的subdevs链表上
(3)struct v4l2_device *v4l2_dev; //指向一个v4l2_device对象,跟主设备指向的是同一个v4l2_device对象
(4)struct video_device *devnode; //创建设备节点/dev/v4l2-subdevX时创建的video_device
其中v4l2_dev指向主设备创建的v4l2 device对象。
list是链表头,它将挂载v4l2_device的subdevs链表上。
entity会挂到主设备创建的edia device的entities链表上。
在创建v4l2 subdev对象时,会创建一个video device,而devnode会执行创建设备video_device,结点名称为/dev/v4l2-subdev0。用户空间通过这个结点和内核空间交互。
其他的子设备和cam-caps按照相同的方式进行分配的创建初始化,并完成挂载。