v4l2_device
里有一个v4l2_subdev
链表,可以选择v4l2_device
去控制哪一个v4l2_subdev。
video_device是一个字符设备,从图中可以看出,video_device内含一个cdev
v4l2_device是一个v4l2实例,嵌入到video_device中
v4l2_device维护者一个链表管理v4l2_subdev,v4l2_subdev表示摄像头的I2C控制模块。
核心层负责注册字符设备,然后提供video_device对象和相应的注册接口给硬件相关层使用
硬件相关层需要分配一个video_device并设置它,然后向核心层注册,核心层会为其注册字符设备
并且创建设备节点(/dev/videox)。同时硬件相关层还需要分配和设置相应的v4l2_device和
v4l2_subdev,其中v4l2_device的一个比较重要的意义就是管理v4l2_subdev,当然有一些驱动并
不需要实现v4l2_subdev,此时v4l2_device的意义就不是很大了。
当应用层通过/dev/video来操作设备的时候,首先会来到V4L2的核心层,核心层通过注册进的
video_device的回调函数调用相应的操作函数,video_device可以直接操作硬件或者是通过
v4l2_subdev来操作硬件。
2.
V4L2提供的注册接口
video_device
注册:
int video_register_device(struct video_device *vdev, int type, int nr);
注销:
void video_unregister_device(struct video_device *vdev);
v4l2_device
注册:
int v4l2_device_register(struct device *dev, struct v4l2_device *v4l2_dev);
注销:
void v4l2_device_unregister(struct v4l2_device *v4l2_dev);
v4l2_subd