APP下载

基于Cortex-A53的嵌入式图像采集系统设计

2019-01-11毕远伟

智能计算机与应用 2019年1期
关键词:调用内核嵌入式

许 晓, 毕远伟

(烟台大学 计算机与控制工程学院, 山东 烟台 264005)

0 引 言

计算机技术、嵌入式技术和图像处理技术的日益进步,推动了嵌入式图像采集系统朝着高速化、集成化、高分辨率、智能化[1]的方向发展。 目前,嵌入式图像采集系统正广泛应用于电子及半导体、包装、汽车、交通、印刷等领域[2]。 嵌入式图像采集系统[3]依托于计算机技术和图像处理技术,为机器视觉的研究和应用提供高品质的本地视频图像采集和处理平台。

传统的图像采集系统主要由摄像头模组和上位机组成。 摄像头模组只负责图像采集,后续的图像处理依赖上位机,系统的采集模块和处理模块相分离,给安装和操作造成不便。 随着图像采集系统的广泛应用,介绍嵌入式图像采集系统的资料越来越多,但是相关研究资料中大多采用USB、DVP接口[4]的摄像头,摄像头的成像质量和抗干扰性较差。 在嵌入式平台上, 对MIPI接口摄像头[5]的开发工作缺乏相关论文指导。

本文图像采集系统的处理器选用三星公司的S5P6818。 S5P6818是64位8核Cortex-A53架构的ARM处理器,可稳定的运行在1.4 GHz主频以上,同时具有MIPI和DVP图像数据输入接口。 图像传感器选用OmniVision公司推出的500万像素CMOS感光芯片OV5645[6],支持MIPI接口。作者研究并实现了硬件电路设计,OV5645摄像头驱动编写[7],并在应用程序中成功通过调用V4L2提供的API实现图像采集[8,10],完成了基于MIPI接口的嵌入式的图像采集系统软硬件实现的全过程。

1 系统硬件设计

1.1 系统硬件组成

嵌入式图像采集系统按照功能可以划分为图像采集模块、图像数据处理模块和通信接口模块3个部分。 系统的硬件组成框图如图1所示。

系统正常工作时,由CMOS图像传感器OV5645将光学信号转换成数字信号,然后利用camera接口将采集到的图像数据传至图像处理模块,在嵌入式系统上进行图像处理,如格式转换、压缩、保存。 系统可以进一步利用通信接口模块完成和上位机的数据传输。

图1 系统硬件组成框图

1.2 MIPI摄像头接口设计

MIPI(Mobile Industry Processor Interface)是为移动应用处理器制定的开放标准和一个规范。 其 子协议CSI是针对摄像头的高速串行接口应用。 同DVP接口相比较,MIPI接口需要的信号线很少,且信号成对存在。 MIPI接口采用一对同步的差分时钟和1-4对差分数据线来进行数据传输。OV5645的MIPI接口电路如图2所示。

OV5645支持 (MDP0,MDN0)和(MDP1,MDN1)2对差分数据线。 在传输图像信号时,数据通道工作在高速模式下,此时通道状态为差分的0或1。 (MCP,MCN)为OV5645传输时钟的引脚。 SDA和SCL是OV5645的I2C控制信号,用来设置摄像头的时钟、图像输出格式、分辨率等。 由于MIPI采用差分信号高速传输,因此在进行PCB设计时要严格按照差分对走线要求,并实现阻抗匹配。

图2 MIPI接口电路

2 嵌入式Linux开发环境搭建

由于本文的开发环境是在X86平台上,而嵌入式Linux操作系统和应用程序最终运行在ARM架构处理器平台上。因此需要为开发平台搭建交叉编译环境。 本次设计在虚拟机VMware Workstation上安装了Ubuntu16.04操作系统,所采用编译器版本为arm-linux-gcc-4.5.1,下载对应版本的安装包解压,并添加系统环境变量就完成了基础开发环境搭建。 嵌入式系统所需的Linux内核、根文件系统和应用程序,需要在该环境下编译成功,再烧写到嵌入式系统上。

3 MIPI摄像头驱动设计

OV5645属于视频输入设备,其驱动包括2部分的内容: 一是控制接口驱动。 从OV5645的硬件连接电路可知,摄像头和处理器之间的通信是由I2C总线实现。 OV5645作为I2C从设备,在这一部分主要完成Linux I2C子系统的搭建,为S5P6818与OV5645摄像头之间的数据交互提供管道。二是实现摄像头自身功能的驱动部分。这一部分的工作主要围绕V4L2驱动框架展开,完成video设备驱动,为应用程序提供控制接口。 OV5645摄像头在Linux内核中的驱动框架如图3所示。

3.1 I2C子系统搭建

I2C设备驱动是基于总线-设备-驱动模型。其实现过程可以划分为设备注册和驱动注册2个步骤。 图4为总线设备驱动模型。

I2C设备的注册就是创建和注册一个i2c_client的过程。在BSP文件device.c中对struct i2c_board_info填充从设备所需要的id、name、addr、adapter、driver等数据。 在板级初始化时,内核通过调用i2c_register_board_info函数将填充的I2c从设备OV5645的相关信息加入到设备链表__i2c_board_list中,调用i2c_get_adapter函数和i2c_new_device函数来指定设备相连的适配器和注册一个新的I2C设备。

图3 视频采集驱动框架

图4 总线-设备-驱动模型

I2C设备驱动注册和设备注册步骤类似,先分配、设置一个i2c_driver的数据结构,实现其成员函数probe、remove、id_table,利用i2c_add_driver函数注册i2c_driver,最终把驱动程序添加到驱动列表中。

I2C设备注册和驱动注册完成后,系统调用I2C总线结构i2c_bus_type提供的match函数比较设备结构i2c_client和驱动结构i2c_driver结构的name是否相同,若相同则调用驱动程序中的probe函数。 I2C设备和I2C设备驱动注册不分前后,二者的注册函数都会尝试进行驱动和设备的绑定。 图5为I2C设备和驱动匹配的函数调用关系图。

3.2 V4L2驱动模型

V4L2是Linux下视频类设备处理模型,为访问视频设备提供了通用接口。 V4L2驱动中有3个核心结构体v4l2_device、v4l2_subdev、video_device。 v4l2_device是所有v4l2_subdev的父设备,负责管理注册在其下面的子设备, v4l2_device通常被嵌入到一个特定的结构体中,在S5P6818中被嵌入到nxp_v4l2中。v4l2_subdev代表子设备,描述了子设备的相关属性和操作。 video_device结构体用于生成设备节点。

(a) match过程 (b) probe过程

(a) match process (b) probe process

图5I2C设备和驱动匹配过程

Fig.5I2Cdeviceanddrivermatchingprocess

驱动程序首先分配设置一个video_device结构体,并重点实现2个操作集:v4l2_file_operations和v4l2_ioctl_ops,然后调用video_register_device函数注册video设备,最终OV5645以节点/dev/video1的形式暴露给应用层。

由图3 Linux内核的视频采集驱动框架可知,在实现摄像头OV5645的驱动过程中,其既作为I2C子系统中的从设备i2c_client,又作为V4L2驱动模型中的子设备v4l2_sbudev。二者之间通过初始化函数v4l2_i2c_subdev_init(sd, client, &ov5645_subdev_ops)建立v4l2_subdev和i2c_client联系,使得video通过用户传入的ioctl命令来对设备进行控制。

4 应用程序设计和测试结果

4.1 应用程序设计

在Linux下,摄像头OV5645硬件已经被映射为设备文件”/dev/video1”,直接利用open()打开对应的设备文件,通过ioctl函数来控制摄像头,如设置图像分辨率、视频数据格式、开始/结束视频显示等。调用V4L2接口进行视频采集的流程如图6所示。

在数据采集过程中,驱动程序将采集到的视频数据存放在内核空间中,此时用户无法直接访问。为了获取相机采集到的视频数据,V4L2提供了2种方法: 一种是用直接read和write方式。 虽然这种直接把视频数据从内核空间拷贝到用户空间的方法比较简单,但是视频数据过多,造成了拷贝效率过低以及内核空间的过度占用等问题。 另一种是mmap的方式。 mmap是v4l2_file_operation结构体的成员函数,相机驱动文件通过对v4l2_file_operation数据结构中填充mmap函数,就可以利用mmap函数建立缓冲区和用户空间的映射,直接在用户空间读取到视频数据。 同直接读写方式相比,利用mmap的方式采集视频数据不需要从内核拷贝大量的视频数据,工作效率更高,因此本次设计采用内存映射的方式采集数据。

部分代码如下:

Buffers[i].start=mmap(NULL,buffers[i].length,PROT_READ|PROT_WRITE,MAP_SHARED,fd_v4l,buffers. offset);

图6 视频采集流程图

4.2 实验结果

按照上述视频采集流程,编写应用程序,利用arm-linux-gcc-4.5.1编译器交叉编译后,通过FileZilla下载到飞凌嵌入式提供的开发板上进行实验验证。 最终将采集到的图像数据压缩成jpeg格式的图片并保存为IMGresult. jpg,存放到同级目录下。将实验结果上传到Ubuntu环境下进行查看结果。图7为OV5645抓取的图片效果图。

图7 OV5645采集的图像

5 结束语

本文提出了在Cortex-A53平台上构建嵌入式图像采集系统的设计方案。 完成了MIPI接口摄像头同S5P6818的硬件电路设计,介绍了嵌入式系统开发环境的搭建方法,并且详细介绍基于V4L2驱动框架摄像头驱动设计和相关工作,实现了调用V4L2提供的接口抓取图像过程。 对在Linux下进行摄像头驱动开发以及相关应用研究有一定指导作用。

猜你喜欢

调用内核嵌入式
基于IMX6ULL的嵌入式根文件系统构建
人民情怀:柳青为文为人的内核(评论)
Focal&Naim同框发布1000系列嵌入式扬声器及全新Uniti Atmos流媒体一体机
活化非遗文化 承启设计内核
微软发布新Edge浏览器预览版下载换装Chrome内核
基于Android Broadcast的短信安全监听系统的设计和实现
利用RFC技术实现SAP系统接口通信
高校图书馆开展嵌入式信息素质教育的思考
C++语言中函数参数传递方式剖析
AItera推出Nios II系列软核处理器