随着嵌入式技术的不断发展,各种嵌入式微处理器和控制器不断出现,并广泛应用于工控、通信、 PDA、安保等领域。基于ARM920t内核的嵌入式微处理器S3C2440,以其良好的数据处理能力、低功耗、小体积、支持多种嵌入式操作系统(如 WinCE、Linux)、集成多种外设(如I2C控制器、LCD控制器等)等优点,广泛应用于手持设备等。WinCE操作系统具有内核可剪裁、实时性好、支持多种通信、模块化设计、具有丰富的API等特点,广泛用于嵌入式实时操作系统。这里提出的嵌入式图像数据采集系统是某“纳米技术与微系统”实验室开发的“嵌入式传感测控系统”中实现图像采集功能的子系统,该系统是以S3C2440为硬件核心,以WinCE为软件平台,能实时、连续地采集清晰的视频数据。
1 系统结构框图及视频数据采集原理
视频数据采集系统结构如图1所示。
从图1中可以看出。系统由嵌入式微处理器S3C2440、存储器(包括Nand Flash和SDRAM)、以太网接口、CMOS图像传感器0V9650、USB主/从口、SD卡、JTAG接口、电源与复位电路、LCD与触摸屏组成。其中,S3C2440为整个系统的硬件核心,负责采集来自图像传感器的数据,控制给各种外设等。Nand Flash存储器与SDRAM构成了系统的存储器,其中SDRAM具有掉电数据不保存的特点,只用作系统内存,用于运行主程序等,而Nand Flash则具有掉电保存数据的特点,用于存储操作系统内核,引导加载程序(Bootloader)、用户应用程序等。
CMOS图像传感器及其接口电路用于采集视频数据。LCD与触摸屏构成人机交互模块,起到数据交互的作用,相当于PC机的键盘和液晶。J- TAG接口用于系统硬件调试和下载Bootloader程序。USB主口不但可以用于外接U盘和移动硬盘等,还可外接带USB接口的鼠标。在触摸屏校正出现大的偏差无法校正时,用鼠标辅助校正。USB从口用于下载WinCE内核文件NK.bin。电源电路包括为微处理器与相关外设提供电压(如微处理器的 1.3 V内核电压、LCD的3.3 V背光电压),以及为摄像头供电。复位电路用于出现故障时系统重启。以太网接口用于扩展系统功能,在视频数据采集的基础上,通过以太网,可以编程实现视频数据的网络传输。
2 摄像头接口及其电源电路
摄像头接口电路如图2所示。本系统选用130万像素的CMOS摄像头0V9650,通过串行摄像头控制总线(Serial Camera Control Bus,SCCB)接口实现对其控制。OV9650支持SXGA、VGA、QVGA、CIF等格式,8位数据输出格式,可以是 YUV/YCbCr(4:2:2)、GRB(4:2:2)和Raw RGB 3种。
OV9650内部主要包括1 300xl 028的图像传感器阵列、模拟信号处理器、ADC、DSP、数字视频端口、SCCB接口、定时信号发生器和输出格式器。数据输出位YO只在RAW RGB数据时用作LSB,而Y1只在RGB数据时用作MS,这里都不使用,而用到的主要引脚有:RESET为重置位,用于清空所有的寄存器并重置为默认的值,高电平有效:HREF为内部参考电压引脚,为器件提供参考电压:PWDN为关闭电源模式选择位,高电平有效,为0时是正常模式,为1时电源关闭模式;SIO_D为SCCB串行接口数据I/O,SIO_C为串行接口时钟输入引脚;Y[2:9]为数据输出位,共8位;VSYNC为垂直同步输出引脚:PCLK为像素时钟输出引脚,XCLKl为系统时钟输入引脚。
OV9650的核心供电电压为1.8 V.模拟输入的供电电压为2.45~2.8 V,I/O口的供电电压可以为2.5~3.3 V。本系统设计中,摄像头供电电路如图3所示。采用电源转换器ASlll7为摄像头提供1.8 V和2.8 V电压,其中2.8 V电压是通过可调压器件分压得到。
3 系统软件设计
系统的软件设计应当包括两部分:BSP的开发与应用程序的开发。本文分别从这两个方面简单论述,BSP的开发主要介绍Bootloader程序设计及OV9650驱动程序开发。
3.1 Bootloader的开发
BSP的开发一般包括3个方面的内容:Bootloader程序设计、OAL层及驱动程序开发。Bootloader是操作系统内核运行之前运行的一段小程序,用于初始化系统的硬件设备,如初始化MMU、屏蔽所有中断、初始化NandFlash等,建立系统的内存空间映射。从而将系统的软硬件环境带到一个已知的状态,为操作系统内核的最终调用准备正确的环境。最后Bootloader把操作系统内核映像加载到RAM中,并将系统的控制权传递于它,其作用类似于基于X86的PC中的BIOS。
本系统设计的Bootloader,采用Eboot+Nboot的形式,支持USB从机下载通信手段和Nand flash存储介质。NandFlash不支持xip,故必须有一个可执行的程序将烧写在其中的Eboot搬到SDRAM中。Nboot一般配合 Eboot一起使用。Eboot与Nboot同样为启动代码,但是Eboot的大小远超过4 KB,故不能直接将Eboot存放在block0中。Nboot的作用是初始化Flash等硬件,将Eboot搬到SDRAM运行。而Eboot则负责内存地址的映射以及其余设备的初始化、加载NK.bin内核文件等。Nboot与Eboot在其中的位置如图4所示。
3.2 0V9650驱动程序的开发
WinCE的驱动程序按不同的分类方式分为:本机驱动和流驱动。而OV9650驱动程序则属于流驱动程序。流接口驱动程序由Device.exe统一加载和管理;用户编写的应用程序通过使用WinCE操作系统的文件API函数如 CloseHandler()函数、CreateFile()函数等与流接口进行通信,达到应用程序访问驱动程序最终操作硬件的目的。流接口驱动程序具有固定的入口点函数,WinCE的文件系统通过这些入口点函数与流接口驱动进行通信。OV9650流接口驱动程序的入口点函数包括:CIS_Init,CIS_Deinit,CIS_Open,CIS_Close,CIS_IOControl,CIS_Read,CIS_Write,CIS_PowerUp,CIS_PowerDown 等,CIS前缀表示设备的名称。
驱动程序首先调用Virtual_Alloc()函数来完成将物理地址映射到虚拟空间内,以申请摄像头I2C寄存器地址对应的虚拟地址,随后初始化I2C,通过下列语句打开I2C,并设定其访问权限。
接着调用Cam_Init()函数,该函数主要负责摄像头的一些硬件初始化工作,包括:摄像头与S3C2440连接的GPI0的初始化、时钟的初始化等。随后调用IniTInterruptThread()函数,初始化中断线程,通知系统注册中断;调用CreateEven()函数创建一个CameraEvent事件,在CameraCapturerTbread()函数中,调用 WaitForSingle()biect()函数来等待CameraEvent事件的发生。
这里重点说明CIS_IOControl()函数。该函数主要用于向设备发送一个命令。应用程序使用DeviceIOControl()函数来通知WinCE调用这个函数,通过参数dwCode通知驱动程序要执行的操作。该函数通过switch()语句为用户提供能操作的语义,以下给出实现播放采集的MPEG4视频数据和退出驱动、停止采集功能的关键代码,“……”表示省略部分代码。
驱动程序编写完成后,通过DEF与Sources文件的编写、流驱动的编译以及加载该驱动进入WinCE内核,则直接可以通过应用程序调用该驱动。
3.3 应用程序开发
应用程序开发在可视化集成开发环境Embedded VisualC++++中完成,主要基于MFC编程用C++语言实现。通过给“打开”按钮添加单击事件代码,实现对驱动程序的打开操作。打开驱动程序通过以下语句实现。if语句用于判断m_hFile的初始值是否为1,为1则关闭摄像头驱动,重新赋值为1。CreateFile()函数用于打开驱动,并将结果返回给操作句柄。
给“返回”按钮添加单击时间响应函数代码。通过调用CIS_IOControl()函数中的CAM_IOCTL_MOVIE_STOP,实现对驱动程序的关闭。其实现方式跟“打开”按钮基本一样,这里不再赘述。当然,返回按钮还应添加CDialog∷OnCancel()语句来返回到系统主界面。
4 视频数据采集实验结果
应用程序开发完成后,单击“打开”按钮,弹出“打开CISl成功”对话框,如图5所示,表明摄像头驱动打开成功。单击“显示”按钮,在右边的视频显示区,能实时显示动态的视频数据,如图6所示。实验证明,摄像头驱动工作良好。实时数据采集的“纳米技术与微系统”墙面上的展板画面比较清晰,达到了预期效果。单击“返回”按钮,视频显示画面顺利关闭,返回主界面成功。
5 结束语
以嵌入式微处理器S3C2440为硬件核心,以WinCE嵌入式实时操作系统为软件开发平台,以EVC为集成开发环境,完成系统的硬件设计,B-SP的开发和应用程序设计。在开发平台上能顺利打开驱动程序,顺利采集到实验室的展板图像并实时连续播放视频数据,表明OV9650驱动程序工作正常,软硬件设计合理。下一步工作主要是采取合适的视频编码算法如H.264、M-JPEG等,通过以太网实现视频数据的网络传输,实现视频远程监控功能。