理解V4L2子系统

Android驱动权威开发指南 第17章 读书笔记

 

V4L2是V4L的升级版本,是为Linux视频设备提供的一些接口。     //vedio for linux 2

    v4l2的主设备号是81,次设备号是0~255,也就是是一个字符设备驱动,通过ioctl向应用提供接口。提供的节点是/dev/videoX,
 /dev/vbiX, /dev/radioX,对应的是音视频节点,远程传送文字,收发声音的设备。

对于设备来说,有5类接口:
    1.视频采集接口
    2.视频接收接口
    3.视频直接采集输出接口                   //类似camera预览
    4.VBI接口
    4.radio接口

视频采集流程:打开设备--->设定属性--->设定采集模式--->不断采集数据--->关闭设备
                                      //对应open, iotcl, read/write/iomap, close
v4l2的作用就是:
        怎么打开video设备,并操作设备。
        具体的就是怎么样实现iotcl里面幻数码命令对应的底层硬件功能。

-------------------------------------------------------------------------------------
camera视频采集的一个例子:
    1.打开设备文件
        int cameraFd = open("/dev/video0", O_RDWR|NON_BLOCK);
   
     2.取得设备需要的功能        //针对应用来说的,把设备的功能信息从驱动通过结构体传到应用层
                                //应用层对底层设备的一个查询,得到返回值
        int ret = ioctl(cameraFd, VIDEOC_QUERYCAP, &cap)

    3.设定设备的视频输出格式     //针对应用逻辑来说,我要输出什么格式,我设置填充一个结构体
                               //然后通过ioctl通知kernel这么设置功能
                               //这里应用层填充fmt结构体,然后调用ioctl
        ioctl(cameraFd, VIDEOC_S_FMT, &fmt)

    4.向驱动申请存储空间(帧缓存),用于存放采集到的视频信息
        ioctl(cameraFd, VIDEOC_REQBUFS, &req)

    5.将每个缓存信息映射到用户空间     //查询驱动中的每个缓存位置,然后用mmap映射到应用层绝对地址
                                    //把每个缓存放入队列,然后在上层形成缓存队列
    6.上层应用启动视频采集

------------------
三种采集方式:
    a.read/wirte接口读写             //copy_from_user,copy_to_user不断读写
    b.mmap映射地址                   //底层地址到用户层的映射
    c.用户指针userptr                //应用层传指针到驱动,在驱动里填充结构体

//第一种占用大量内存效率不高,第二种和第三种差不多,分别站在应用角度和驱动角度操作

------------------
    7.不断采集FIFO中数据
        ioctl(cameraFd, VIDEOC_DQBUF, &buf)
        /*应用视频数据处理*/
        ioctl(cameraFd, VIDEOC_QBUF, &buf)        //buf放入缓存队列
    
    8.停止视频采集
        ioctl(cameraFd, VIDEO_STREAM_OFF, &buf_type)

    9.关闭设备
        close(cameraFd)
-----------------------------------应用操作流程完----------------------------------

然后书上说的是,v4l2设备驱动vivi注册过程,略过,就是一个字符设备驱动,形成与实现fops的过程。

然后是具体的camera ov5642的例子,camera驱动probe就不说了,这里我们想的是v4l2怎么跟camera联系起来的呢?

---------
camera模组/驱动采集数据,在应用层实现了预览,拍照,录像的功能。而应用是调用了libcamera.so,这个库里存放了调用v4l2
的接口,以及jepg图像编码的程序。

camera架构:
                                   camera.java
                                        |
                               Android.hardware.camera
                                        |
                       libui.so  <-----------> libcameraservice.so
                                                       |
                                     libmmcamera.so <------libcamera.so
                      --------------------------------------------------|
                      |                  camera驱动
                      --------------------------------------------------|
                      |                  camera硬件
                      --------------------------------------------------|


----------

        
其他博客:
    

 https://www.cnblogs.com/soc-linux-driver/p/3733796.html           v4l2中的多流机制

 

摘取这个作者一段话:


先来考虑一个camera设备的构成

  1  一个camera 用一个v4l2 设备来代表,然后导出一个vidoe节点来访问这个设备。

  2  一个camera 有很多相关的模块组成,把这些模块组织成subdev,并导出video节点访问这些subdev

  3  一个camera 应有若干流供用户空间访问,于是抽象出流,然后导出video 节点访问流,这些流是动态

创建的,节点也是动态生成的

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值