v4l2 设备操作(1)
2011-7-1 18:02:10
1 打开设备
用户层操作
fd_camera = open(CAMERA_DEV, O_RDONLY);
内核层
使用struct camera_context_s 来描述摄像头的上下文
struct pxa_camera_driver_status_t 来描述状态
static int pxa_camera_minor = 0;
static p_camera_context_t g_camera_context;
static struct pxa_camera_driver_status_t g_camdrv_status;
如果状态处于suspended,返回失败
初试化状态的wait_outd0cs等待队列
通知ipmc一个事件
将自己加入到d0cs的等待队列中
直到d0cs好了或超时。
接着初试化各种参数。
为摄像头设置电压,时钟
设置中断掩码
清空报告链表,buf队列
2 枚举支持的视频输入
ret = ioctl(fd_camera, VIDIOC_ENUMINPUT, &vinput);
输入的ID不能超过SENSOR_NUMBER
将支持的sensor的ID 返回
3 选择一个视频输入
ioctl(fd_camera, VIDIOC_S_INPUT, &desiredcamera)
首先判断输入的sensor ID是否有效
然后deinit
设置上下文的相应的camera_functions方法
然后init
4 设置参数
ioctl(fd_camera, VIDIOC_S_PARM, &parm)
设置 struct v4l2_streamparm 流参数
5 设置采集格式
ioctl(fd_camera, VIDIOC_S_FMT, &format)
设置 struct v4l2_format,验证后存放在camera的状态中
6 申请n个buffer,逐一进行映射,
ioctl(fd_camera, VIDIOC_REQBUFS, &requestbuffers)
ioctl (fd_camera, VIDIOC_QUERYBUF, &buffer)
mmap
注意映射出来是4K上取整的
ioctl (fd_camera, VIDIOC_QBUF, &buffer)
7 开始采集
ioctl (fd_camera, VIDIOC_STREAMON, &buftype)
9 释放
ioctl (fd_camera, VIDIOC_STREAMOFF, &buftype)
munmap
close
以上就是整体的调用框架.
查看v4l2-common.c 可以看出通过的ioctl命令,以及v4l2 v4l 之间的区别
1162

被折叠的 条评论
为什么被折叠?



