需要思考的问题:
(1) cimutils应用程序维护了哪些结构体,v4l2驱动框架维护了哪些结构体
(2)/dev/video0 这个节点怎么创建的
(3)应用层open 设备节点/dev/video0 的时候,内核中的调用关系和具体干的工作
(4)应用层ioctl 操作后,内核中的调用关系流程
(5) VIDIOC_QBUF / VIDIOC_STREAMON / VIDIOC_DQBUF 视频缓存队列是如何管理的?驱动中在哪里申请分配内存?怎么入列出列?
(6)I/O操作方式:V4L2_MEMORY_MMAP 和V4L2_MEMORY_USERPTR的区别
整个v4l2的框架分为三层:
在应用层,我们可以在 /dev 目录发现 video0 类似的设备节点,上层的摄像头程序打开设备节点进行数据捕获,显示视频画面。设备节点的名字很统一,video0 video1 video2...这些设备节点在是核心层注册。struct video_device video_register_device /dev/vedio0
核心层 v4l2-dev.c,承上启下,对于每一个硬件相关层注册进来的设备,设置一个统一的接口 v4l2_fops ,既然是统一的接口必然不是具体的视频设备的操作函数,应用层调用 v4l2_fops 中的函数最终将调用到硬件相关层的 video