1 编写ov5642测试例程
在编写好ov5642驱动之后,需要编写程序对其进行测试,这就是V4L2应用层程序。要编写V4L2应用层程序,首先需要理解V4L2提供的各种ioctl函数,要知道如何配置视频设备的初始化参数,特别注意的是配置是有一定顺序的,如果顺序错了那肯定会有错误。在初始化视频设备之后,需要建立缓冲区来接收视频设备传过来的帧,V4L2提供了两种模式来获取视频帧:MMAP和UserPtr。由于在vpif驱动程序中只提供了对MMAP的支持,所以我们在编写测试例程时也是使用该模式。对于V4L2的MMAP和UserPtr两种模式的理解其实有点困难,现在我也还没有完全弄清,但是这两种方法的使用却比较简单。
ov5642测试例程的编写主要包括以下几个部分,必须严格按照该顺序来编写程序。
(1) 打开视频设备。
视频设备在linux的/dev目录中,我们这里只有一个视频设备,所以是/dev/video0,使用open函数打开。
static int ov5642 = -1; ov5642 = open ("/dev/video0", O_RDWR, 0); |
(2)设置vpif channel 0的输入。
由于vpif的channel 0可以有三个输入:tvp5150、tvp7002和ov5642,所以需要选通对应的输入模式。
unsigned int input = 1; // 0: tvp5150; 1: 0v5642. defined in board-dm646x-evm.c ioctl (ov5642, VIDIOC_S_INPUT, &input); |
(3)设置视频采集格式。
现在ov5642只支持VGA格式。
vid_std_id = 0x10000000; // V4L2_STD_CAMERA_VGA ioctl (ov5642, VIDIOC_S_STD, &vid_std_id); |
(4)设置视频的像素点格式。
现在ov5642驱动程序只支持YUYV格式的像素点格式,分辨率为VGA,即640 X 480,逐行扫描,每行640 X2 X 2个字节(因为ov5642输出10-bit视频数据)。
memset(&fmt, 0, sizeof(fmt)); fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; fmt.fmt.pix.width = 640; fmt.fmt.pix.height = 480; fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV; fmt.fmt.pix.field = V4L2_FIELD_NONE; fmt.fm |