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 节点访问流,这些流是动态
创建的,节点也是动态生成的