基于ARM11与OV7675的CMOS相机设计

2017-02-09 03:12李云刘德庆
单片机与嵌入式系统应用 2017年1期
关键词:内核调用时钟

李云,刘德庆

(重庆邮电大学,重庆 400065)



基于ARM11与OV7675的CMOS相机设计

李云,刘德庆

(重庆邮电大学,重庆 400065)

工业上对于摄像头模块的大小需求各不相同。本文以ARM11为核心自行设计了核心板,基于CMOS摄像头OV7675进行启动开发工作,进而设计出和实现了多种通信接口和可扩展性强的相机。设计采用了S3C6410XH-66的CPU,移植了内核版本为linux-2.6.38的操作系统,同时为了提高性能改进了缓存区的机制。

ARM11;Linux操作系统;CMOS摄像头;驱动

引 言

随着社会的发展,摄像头模块越来越多地在工业上得到应用,如摄影测量、物体跟踪、零件分拣、远程监控等领域。本文设计是针对商家在工业上二维码的扫描使用,在已给定的模具大小下,充分考虑了需求、成本以及功耗等因素,采用OV7675摄像头模块和S3C6410XH-66的CPU,移植了Linux内核版本为Linux-2.6.38的操作系统,同时为了提高性能,改进了缓存区的机制。

1 硬件结构

如图1所示,相机主要由CPU、系统电源、通信接口、CMOS传感器以及I/O接口等硬件组成。由于面向的是低端市场,为了控制成本,采用了S3C6410XH-66的CPU。这款CPU内部集成了强大的多媒体资源,具有较强的视频处理能力,同时主时钟可以稳定运行在533 MHz。

CMOS传感器采用的是OmniVision公司的OV7675摄像头,该传感器镜头尺寸为1/9″,感光阵列大小为640×480,帧率达到30 fps,封装尺寸为2 797 μm×2 800 μm。支持YCbCr422、Raw RGB、RGB565、ITU656等多种图像输出格式,包含自动曝光控制、自动增益控制、自动白平衡、自动黑级校准等功能。在tiny6410的开发板上设计的是10×2的软排插槽摄像头接口,接口模块电路如图2所示,除了CAMERA信号外,还有I2C信号用于对摄像头寄存器的读写,从而能够配置摄像头相关参数,另外增加了GPIO信号,用于协助摄像头实现电源管理[1]。CPU通过I2C接口来初始化OV7675内部寄存器,OV7675内部有8位A/D转换器,对应8为数据输出CAMDATA[7:0],而设计中输出的图像格式是经过内部的DSP转化的YCbCr。同时为了满足尺寸的大小需求,SDRAM采用的是256 MB的三星K4X2G323PD,NAND FLASH采用的为256 MB的三星K9F2G08U0C。

图1 系统硬件结构图

图2 摄像头接口模块电路图

2 软件程序设计

2.1 V4L2驱动

V4L2全称为video for linux two,是V4L的改进版,是linux内核中用于图片采集、视频和音频数据的API接口[2]。如图3所示,字符设备驱动核心、V4L2驱动核心、平台V4L2设备驱动和具体的sensor驱动构成了V4L2驱动框架[3]。V4L2是两层驱动系统组成的,上层驱动是平台V4L2驱动,即video_dev模块驱动,当video_dev初始化时会被注册为字符设备驱动,主设备号为81,同时会注册相关的功能函数[4]。下层驱动为V4L2驱动,video_dev通过V4L2来访问设备。当V4L2驱动初始化时,V4L2将会传递一个包含V4L2的驱动方式、子设备号等数据的数据结构给video_dev[4]。

图3 V4L2驱动框架

在初始化程序cmos_ov7675_drv_init()中,通过i2c_add_driver(& cmos_ov7675_drv),向i2c-core注册驱动,通过cmos_ov7675_drv调用cmos_ov7675_probe函数,在cmos_ov7675_probe里,将GPIO-F设置成对应的摄像头模式,使用request_mem_region(),为摄像头申请内存空间。接着初始化摄像头时钟,设置时钟,将时钟设置为24 MHz,并通过list_add_tail将摄像头结构添加到设备链表中,并通过video_register_device(&cmos_ov7675_vdev, VFL_TYPE_GRABBER, -1) 进行设备注册。在cmos_ov7675_vdev中,cmos_ov7675_fops()提供了应用层使用的,包括cmos_ov7675_open、cmos_ov7675_read、cmos_ov7675_close、video_ioctl2,video_ioctl2由V4L2提供框架,涉及到的关键处理程序在驱动中具体实现。在cmos_ov7675_vdev结构中还需要实现的函数包括cmos_ov7675_vidioc_enum_fmt_vid_cap(列举支持那些格式)、cmos_ov7675_vidioc_g_fmt_vid_cap(返回当前格式)、cmos_ ov7675_vidioc_try_fmt_vid_cap(测试驱动程序是否支持某种格式)、cmos_ov7675_vidioc_s_fmt_vid_cap(设置图像输出格式)等。

本文采集图片的像素大小为640×480,图片格式为YUV,本阶段系统只需要采集4帧图片。将采集的图片映射到内存中,并把对应的地址传送给应用层,进行读取和处理后,循环采集实现图像的更新,形成动态图。

2.2 应用程序

Liunx-2.6.38内核提供了用于编写视频的V4L2核心API文件操作结构: v4l2_file_operations,用此函数进行设备操作。通过定义cmos_ov7675_fops为v4l2_file_operations编写用于上层驱动调用的函数:

static const struct v4l2_file_operations cmos_ov7675_fops ={

.owner=THIS_MODULE,

.open=cmos_ov7675_open,

.read=cmos_ov7675_read,

.release=cmos_ov7675_close,

.unlocked_ioctl=video_ioctl2,

};

如图4所示,应用程序首先通过dev_fd=open(cam_name, O_RDWR)、fb_fd=open("/dev/fb0",O_RDWR)来打开video和FB设备,然后通过ioctl(cam_fp, VIDIOC_S_FBUF,&fb)设置摄像头格式,通过应用程序调用read,将会调用内核层驱动提供的函数cmos_ov7675_read,该函数将会注册一个名为cmos_ov7675_camif_irq_p的内核中断函数,当完成一帧图像的数据缓冲后,将会进行唤醒,然后会映射到用户空间里。本文通过fb_show(dev_fd,fbmem,preview_frame)实现预览功能,将采集到的数据传送到framebu ffer缓存区。在结束预览后,调用set_capture()更改格式,最后捕捉图片并保存。由于无法直接预览和处理YUYV的格式图片,需通过算法将YUYV格式转化为RGB彩色格式图片,随后对其进行相应的处理[6]。

图4 图片采集流程图

2.3 缓存机制的改进

在所做的项目中,我们对于传统的环形缓存区进行了改进,设缓存区的个数为N,在视频数据需要填充的情况下,只要空的缓存区个数不小于(N-1),就能唤醒任务使其能够填充数据到缓存区中。

假设需要传输M倍于单个缓存区的个数,缓存区的个数为N(2

假设在环形缓存区的设计中,环形缓存区由若干个单缓存区组成,每个缓存区的大小为2 KB,即若环形缓存区由N个单缓存区构成,则环形缓存区的大小为2N KB。设CPU的工作频率为fc,摄像头的时钟采样频率为fm,位时钟信号速率最大为:

式中,fbclk为位时钟速率;Bn为采样位数;fm为采样频率。

CPU处理一个字节的时间关系满足下式[7]:

式中,t为处理一个字节的时间;fc为CPU主频;Bwidth为总线宽度。

若环形缓存区有M个单缓存区,在进行视频数据传输时不会影响其他任务的正常执行,即CPU填充(M-1)个缓存区的时间要少于视频接口传输一个缓存区的时间。

式中,K为字节单位系数,即常量1024;T为处理一个字节的时间;fbclk为位时钟速率。由式(1)~(3)可得出M必须满足式(3),才能满足设计要求。

ARM11的CPU频率为533 MHz,地址总线的带宽为32位,采样位数最大为12位,采样频率最大为24 MHz,由式(4)可得M最大可为6。由于存储的照片是4张,因此本论文中将M的值设置为4。

3 测试结果

图5 相机的硬件实物图

相机的核心板与摄像头的转接板是分开的,方便以后摄像头硬件进行升级。由于使用的场景限制,对于模块的大小有着严格的要求,导致整个板子并不能用USB、SD卡来烧写,只能通过J-LINK来烧写程序。将SDRAM初始化程序ddr.bin烧写进去,然后运行程序,在确定SDRAM能够被正常的初始化后,再次通过J-LINK将u-boot.bin文件烧写到DDR中,并运行u-boot。由于,J-LINK只能烧写二进制文件,所以内核和根文件是无法通过J-LINK烧写的。串口在u-boot界面中,将u-boot、内核以及根文件烧写进FLASH中,这样掉电后不会丢失内容。由于整个模块并没有网口,使得板子无法与PC进行挂载,只能将驱动程序以及测试程序编译进根文件系统中,由于根文件是jffs2格式的,所以在进入到系统前,需要通过u-boot界面改动系统的启动参数。当进入到系统后,在mnt文件夹下通过insmod命令加载摄像头驱动模块,运行测试程序,保存拍摄的照片。然后,将保存的照片通过串口从板子的FLASH下载到PC上,如图5所示。

结 语

[1] 杨东琼,云利军,王坤.Linux和 OK6410 环境下视频图像的采集与显示[J].云南师范大学学报,2016(2):48-53.

[2] 徐家,陈奇.基于V4L2的视频设备驱动开发[J].计算机工程与设计,2007,19(5):539-542.

[3] 宋宝华.Linux设备驱动开发详解[M].北京:人民邮电出版社,2012.

[4] 曹占中.基于 s3c2440 的 Linux 摄像头驱动开发[J].电子测量技术,2009,32(2):108-111.

[5] 樊国栋, 石红瑞.嵌入式 Linux下CMOS摄像头驱动的设计与实现[J].工业仪表与自动化装置,2010(3):68-94.

[6] 段东波, 靳天玉. 基于 ARM11 的视频采集系统及二维码识别[J]. 电子测试,2013(20):81-82.

[7] Lei Rao, Jian Huazhao, Zhan Xizhao,et al. Marco and Micro structure Evolution of 5CrNiMo Steel Ingots during Electroslag Remelting Process[J]. Journal of Iron and Steel Re search, 2014,21(7):644-652.

李云(教授),主要研究方向为无线网络;刘德庆(硕士),主要研究方向为嵌入式驱动。

CMOS Camera Design Based on ARM11 and OV7675

Li Yun,Liu Deqing

(Chongqing University of Posts and Telecommunications,Chongqing 400065,China)

In order to meet the needs of different size module of camera.In this paper,the core board is designed using ARM11.The system starts the development work based on CMOS camera OV7675.The variety of communication interfaces and scalable camera are designed.The design uses the S3C6410XH-66 CPU,and transplants the linux-2.6.38 operating system.While in order to the performance,the cache mechanism is improved.

ARM11;Linux operating system;CMOS camera;driver

TN949.6

A

�迪娜

2016-09-01)

猜你喜欢
内核调用时钟
别样的“时钟”
强化『高新』内核 打造农业『硅谷』
古代的时钟
核电项目物项调用管理的应用研究
基于嵌入式Linux内核的自恢复设计
Linux内核mmap保护机制研究
LabWindows/CVI下基于ActiveX技术的Excel调用
有趣的时钟
基于系统调用的恶意软件检测技术研究
微生物内核 生态型农资