简述基于V4L2驱动框架的UVC摄像头驱动(只用于获取数据,不具备控制功能)

分析的详细代码是韦东山第三期视频中的从零编写USB摄像头驱动里的代码1)入口函数:注册一个usb_driver结构体:usb_register里面有什么内容?根据id_table进行匹配 :表示它能支持哪些设备当接上能够支持的设备的时候,会调用probe函数2)在probe函数里注册video_device结构体:       分配video_device结构体
摘要由CSDN通过智能技术生成

分析的是韦东山第三期视频中的从零编写USB摄像头驱动里的代码

1)入口函数:

注册一个usb_driver结构体:usb_register
里面有什么内容?
根据id_table进行匹配 :表示它能支持哪些设备
当接上能够支持的设备的时候,会调用probe函数


2)在probe函数里注册video_device结构体:
       分配video_device结构体:video_device_alloc


设置这个结构体
   将v4l2_file_operation结构体的内容赋给video_device的fops
使用.open打开对应的设备节点    
使用.ioctl传递相应的参数和命令
使用.mmap把缓存映射到应用空间,让应用可以直接操作这块缓存
使用.poll确定缓存是否有数据
使用.close关闭对应的设备节点


   将v4l2_ioctl_ops结构体的内容赋给video_device的ioctl_ops
v4l2_ioctl_ops包含了我们需要操作的ioctl函数


注册这个结构体到内核:video_register_device


3)在disconnect函数里卸载video_device结构体:
卸载video_device结构体:video_unregister_device

释放为video_device申请的内存:video_device_release


4)ioctl填充:
(1)获取这是一个什么设备:
   myuvc_vidioc_querycap(struct file *file, void  *priv,
   struct v4l2_capability *cap)
表示这是一个摄像头设备
具有的性能是图像捕获和流传输


(2)列举这个摄像头设备所能够支持的格式:
   myuvc_vidioc_enum_fmt_vid_cap(struct file *file, void  *priv,
struct v4l2_fmtdesc *f)
这里只支持一种格式:"YUV 4:2:2 (YUYV)"


   视频格式包含在drivers/media/video/uvc/uvc_driver.c的uvc_format_desc结构体里面

(3)返回当前所使用的格式:
   myuvc_vidioc_g_fmt_vid_cap(struct file *file, void *priv,
struct v4l2_format *f)
一开始当前所使用的格式是我们初始化时设置在myuvc_format的格式
所以我们直接将我们初始化好的格式赋给v4l2_format结构体即可:memcpy


(4)测试驱动程序是否支持某种格式,如果支持,强制设置为这种格式:
   myuvc_vidioc_try_fmt_vid_cap(struct file *file, void *priv,
struct v4l2_format *f)
判断性能格式类型是否图像捕获类型:V4L2_BUF_TYPE_VIDEO_CAPTURE
判断图像格式是否是YUYV:V4L2_PIX_FMT_YUYV
查看支持的分辨率frame是哪几种,强制设置为我们需要的分辨率frame
   设置的参数:
f->fmt.pix.width 帧宽
f->fmt.pix.height
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值