第1篇 V2L2框架
参考:韦东山Linux教程
参考:https://blog.csdn.net/weixin_42462202/article/details/99680969
参考:https://blog.csdn.net/u013836909/article/details/125359789
- V4L2 框架图
v4l2驱动框架主要的对象有video_device、v4l2_device、v4l2_subdev、videobuf
video_device
一个字符设备,为用户空间提供设备节点(/dev/videox),提供系统调用的相关操作(open、ioctl…)
v4l2_device
嵌入到video_device中,表示一个v4l2设备的实例
v4l2_subdev
依附在v4l2_device之下,并表示一个v4l2设备的子设备,一个v4l2_devide下可以有多个sub_device
subdev的设计目的是为了多路复用,就是用一个v4l2_device可以服务多个v4l2_subdev
videobuf
v4l2驱动的缓存管理
- V4L2 架构层级与重要数据说明
V4l2 框架:
APP: open, read, write
==================================================
kernel:
核心层:(v4l2-dev.c 可理解为中间层, //注意 v4l2 层的原理还不太懂
提供接口函数 : video_register_device)
|
|分配/设置(v4l2_fops)/注册 cdev //设备节点为 "/dev/videoX"
----------------------------------------------
硬件相关(uvc_driver.c)
分配 video_device
设置 video_device
.struct cdev *cdev;
.struct v4l2_device *v4l2_dev;
.struct list_head subdevs; //v4l2_subdev 的链表,v4l2_device的主要目的时用来管理 v4l2_subdev
.struct v4l2_subdev_ops *ops; //v4l2_subdev_ops ,实现了一系列的操作,供 v4l2_device 调用
.fops //struct v4l2_file_operations , cdev->fops 会调用该结构体
.ioctl_ops //struct v4l2_ioctl_ops
注册: video_register_device(video_device)(会调用核心层的代码,实现分配/设置(v4l2_fops)/注册 cdev)
==================================================
硬件
struct v4l2_file_operations {
read
write
poll
unlocked_ioctl
mmap
open
release
};
struct v4l2_ioctl_ops { //必需的11个ioctl
// 表示它是一个摄像头设备
.vidioc_querycap = vidioc_querycap,
/* 用于列举、获得、测试、设置摄像头的数据的格式 */
.vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap,
.vidioc_g_fmt_vid_cap = vidioc_g_fmt_vid_cap,
.vidioc_try_fmt_vid_cap = vidioc_try_fmt_vid_cap,
.vidioc_s_fmt_vid_cap = vidioc_s_fmt_vid_cap,
/* 缓冲区操作: 申请/查询/放入队列/取出队列 */
.vidioc_reqbufs = vidioc_reqbufs,
.vidioc_querybuf = vidioc_querybuf, //配合 mmap , 实现分配映射缓存
.vidioc_qbuf = vidioc_qbuf, //把缓冲区放入队列
.vidioc_dqbuf = vidioc_dqbuf, //当有数据时,得到缓冲区状态,哪个缓冲区有数据,再读取
// 启动/停止
.vidioc_streamon = vidioc_streamon,
.vidioc_streamoff = vidioc_streamoff,
//非必需:用于设置属性
vidioc_queryctrl : 发起USB控制传输获得亮度的最小值、最大值、默认值、步进值。 根据设备描述符可知支持的属性
vidioc_s_ctrl : 把APP传入的亮度值通过USB传输发给硬件
vidioc_g_ctrl : 发起USB传输获得当前亮度值
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)