本文主要是介绍UVC 设备框架在 Linux 4.15 内核的演变,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1. 概述
发现之前的uvc框架和现在的还是有一些差别的(比如从videobuf 过渡到videobuf2),写个blog记录一下,方便以后查询,我适用的内核版本:Linux 4.15
- UVC(USB Video Class)设备框架是建立在V4L2(Video4Linux version 2)子系统之上的。UVC框架主要负责管理通过USB接口连接的视频捕获设备,如网络摄像头。
2. 流程分析
- 打开设备文件 : 应用程序通过文件I/O打开设备时,内核创建一个uvc_fh 文件句柄实例,将其关联到特定的视频流
- 缓冲区队列操作:uvc_fh通过它的视频流uvc_streaming 结构体间接操作vb2_queue ,以执行如缓冲区排队(qbuf),和缓冲区准备(reqbufs)等操作
- 数据流传输: 视频数据通过 vb2_buffer 结构体在用户空间和UVC硬件之间传输
3. 主要的内核结构体
4. UVC_Driver 驱动入口函数
static int __init uvc_init(void)
{
...ret = usb_register(&uvc_driver.driver);return 0;
...
}static void __exit uvc_cleanup(void)
{usb_deregister(&uvc_driver.driver);
}
module_init(uvc_init);
module_exit(uvc_cleanup);
接下里就是关于uvc_driver 结构体
struct uvc_driver uvc_driver = {.driver = {.name = "uvcvideo",.probe = uvc_probe,.disconnect = uvc_disconnect,.suspend = uvc_suspend,.resume = uvc_resume,.reset_resume = uvc_reset_resume,.id_table = uvc_ids,.supports_autosuspend = 1,},
};
在uvc_probe 函数内部:
- 分配 uvc_device
if ((dev = kzalloc(sizeof *dev, GFP_KERNEL)) == NULL)
- 注册 video 设备节点
uvc_register_chains(dev) uvc_register_terms(dev, chain);uvc_register_video(dev, stream);
这篇关于UVC 设备框架在 Linux 4.15 内核的演变的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!