嵌入式爱好者

查看: 11964|回复: 0

[Linux] vb2_buffer结构探究

[复制链接]

1

主题

1

帖子

3

积分

扫一扫,手机访问本帖
发表于 2015-5-7 18:33:53 | 显示全部楼层 |阅读模式
        看韦东山视频第三期摄像头驱动中构造了自己的vivi驱动,但是使用的videoBuf结构体,新的版本用的是vb2_buffer结构,我机器上(ubuntu12.04)使用的内核是linux3.2,看了看改动还是挺大的,自己看代码自己理解了下:
        首先是韦东山老师总结的摄像头驱动的架构如下

摄像头驱动程序必需的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,
.vidioc_qbuf          = vidioc_qbuf,
.vidioc_dqbuf         = vidioc_dqbuf,
// 启动/停止
.vidioc_streamon      = vidioc_streamon,
.vidioc_streamoff     = vidioc_streamoff,
     
分析数据的获取过程:
1. 请求分配缓冲区: ioctl(4, VIDIOC_REQBUFS          // 请求系统分配缓冲区
2. 查询映射缓冲区:  ioctl(4, VIDIOC_QUERYBUF         // 查询所分配的缓冲区
3. 把缓冲区放入队列: ioctl(4, VIDIOC_QBUF             // 把缓冲区放入队列         
4. 启动摄像头  ioctl(4, VIDIOC_STREAMON
5. 用select查询是否有数据  
6. 有数据后从队列里取出缓冲区  ioctl(4, VIDIOC_DQBUF
7. 应用程序根据VIDIOC_DQBUF所得到缓冲区状态,知道是哪一个缓冲区有数据    就去读对应的地址(该地址来自前面的mmap)

对于架构都是一样的,有关于VB2_buffer 的主要是数据的获取过程,根据韦东山老师的视频中分析步骤分析如下:
1,首先是创建并初始化一个vb2_queue结构体 ,
        static   struct vb2_queue    Myvivi_vb2_queue;

        struct vb2_queue  *q = &Myvivi_vb2_queue;
         q->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;  // 类型
         q->io_modes = VB2_MMAP | VB2_USERPTR | VB2_READ;  // 该队列支持的模式
         q->drv_priv = dev;  // 自定义模式
         q->buf_struct_size = sizeof(struct vivi_buffer);  // 将vb2_buffer结构体封装到我们自己的buffer中,此为我们自己的buffer的size
         q->ops = &vivi_video_qops;   
         q->mem_ops = &vb2_vmalloc_memops;     //
        vb2_queue_init(q);
    其中vivi_video_qops 是 队列的操作函数,以后的REQBUFS 等请求会调用到此中的函数,其结构如下
static struct vb2_ops vivi_video_qops = {
.queue_setup
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋| 飞凌嵌入式 ( 冀ICP备12004394号-1 )

GMT+8, 2025-3-14 13:45

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表