Linux 下基于ARM920T 的USB 摄像头图像采集
图(1) 硬件结构原理图
图(1)中各个主要模块基本组成描述如下:
① 微处理器(MPU):针对开发多媒体视频终端的需要,并考虑到系统外围设备的需求情况,本系统采用SAMSUNG公司内嵌ATM920T内核的三星S3C2410处理器。最高主频可达203MHz [1]。
② SDRAM存储部分采用两颗Hynix公司的HY57V561620CT内存,大小为32M。
③ FLASH存储器采用SAMSUNG公司的K9F1208UOM Nand Flash,大小为64M。
④ USB集线器芯片:采用ALCOR MICRO公司的AU9254A21,可扩展为4个USB外围接口,分别连接图(1)中所示的四个外围设备。
⑤ LCD:采用Sharp公司的3.5寸LCD,分辨率为240×320。
由于嵌入式Linux具有成本低、代码开放、移植性好的特点,其用于嵌入式系统的优势和发展潜力是不容置疑的。软件部分的搭建主要依赖于以下三个部分:
① Boatloader:可以从SAMSUNG公司的官方网站获取,经过交叉编译生成映像文件,然后通过JTAG接口将映像烧写到目标板,实现引导程序的装载[2]。
② Kernel:本系统采用Linux-2.4.18.tar.gz版本的内核。
③ 文件系统:由于本系统要进行动态的擦写FLASH,所以采用了支持此功能的YAFFS文件系统[3]。
Linux平台的驱动一般分为字符设备、块设备和网络设备三种类型。而在Linux下要使系统所挂接的外部设备正常工作,必须加载相应的驱动程序。 Linux下对于一个硬件的驱动,可以有两种方式:一种是直接加载到系统的内核当中去,另一种是以模块方式进行加载,就是在编译内核的时候,同时生成可重定位的目标文件(.o文件)[4]。项目中所用的SBC2410X的实验板的USB主控器驱动程序模块为USB-OHCI- S3C2410.o。在Linux下要采集视频类数据,需要加载Video4Linux驱动模块Videodev.o。然后再加相应的摄像头驱动程序。在项目开发中,我们所使用的摄像头采用的USB控制器为ov511+,所对应的驱动程序模块为ov511.o。所以在系统启动时必须要通过如下命令:
>>insmod usb-ohci-s3c2410.o
>>insmod ov511.o
来加载所需要的模块。通过开源项目spca5xx可以得到上边所需模块的全部源代码。上层软件部分我们参考了 vidcat,vgrabber,w3cam,gqcam这几种软件的操作过程,重点参照了vidcat进行了V4L编程,使用了v4l.c和 vidcat.c 中的函数,经过交叉编译,在实验板上实现了实时图像采集的目的。
在图(2)中显示了各个模块之间的关系,其中从上到下的箭头流向表示通过各个模块启动和配置摄像头,从下到上的箭头流向表示由摄像头所采集的图像数据经各个模块采集到用户指定的位置。
3、在Linux下采集并显示USB摄像头数据
Linux下摄像头的驱动程序是以81为主设备号,在编写应用程序的时候,要通过打开一个具有该主设备号的设备文件来建立与设备驱动程序的通信,我们所使用的Linux没有该文件,所以需要手工创建,并建立其软连接,因为要对文件进行操作,所以要改变其访问权限为666。我们用到的 videodev.o模块即为视频部分的标准Video for Linux (简称V4L)。这个标准定义了一套接口,内核、驱动、应用程序以这个接口为标准进行通信。
linux操作系统文章专题:linux操作系统详解(linux不再难懂)
评论