王一,朱景福
(黑龙江八一农垦大学信息技术学院,大庆 163319)
随着数字图像处理技术和电子技术的不断发展,以及现代化农业生产进程的不断推进,图像采集和处理[1]系统已经在民用、商用、军用等不同领域得到非常广泛的应用。其主要特点是供电方便,耗能少,并且可以实际应用到国民生产的各个行业中去。通过对嵌入式系统智能控制以及数字图像实时采集的研究,基于Win CE 系统下对USB 摄像头[2]的驱动来完成对图像的只能采集,对现代化农业和其他领域的图像信息采集具有重要意义。
以Windows CE 为操作系统的嵌入式三维信息采集系统的开发工作包含了移植基于特定硬件平台的BSP 包,定制Windows CE 操作系统,定制Windows CE 应用程序和接口开发等工作。这些内容要在硬件系统设计完成并且与PC 机建立交叉编译环境后进行。主要介绍操作系统的建立以及应用软件的开发。
BSP(Board Support Package)安装包又称为主板级支持包,主要包括了启动程序BootLoader、OEM 适配层程序、设备驱动程序Drivers 和相关配置文件。它是对所设计的目标设备电路板的功能抽象。由于硬件配置是较为普遍的配置方式,所以设计中使用了基于Intel Xscale PXA270 处理器[3]的BSP 包样本,并且在此样本上进行BSP 的移植与开发。具体定制过程如下:
(1)在PC 机上打开VS2005 交叉开发环境。
(2)在VS2005 主菜单中选择“File”->“New”->“Project”,启动操作系统定制的第一步。选择Platform Builder for CE 6.0 工作类型,默认选择OS Design,并且给定制的操作系统命名并选择存放路径后,编译环境会在Windows CE6.0 的安装路径下生成一个OSDesigns 文件夹来存放操作系统工程。在生成操作系统工程的时候要注意硬盘上必须有2G 以上的存储空间。
(3)在接下的定制中没有选择功能时,直接按next 按钮进行下一步操作,需要人工选择BSP,即选择操作系统工程所基于的硬件平台。对于基于Intel Xscale PXA270 处理器的系统,可以选择“MINI270-IV:ARMV4I”,然后进行下一步的操作。 接下来在特征视图中定制USB 接口支持。并且选择实现SD卡设备支持,针对于我们所使用的图像信息的采集,应该选择支持MP3、WMA 格式以及MPEG-4 等格式的播放即可。
经过上述步骤的处理,就可以完成关于系统的定制工作,但是该系统只是在设计是完成了对应的功能,还需要进行编泽,最终生成可以在嵌入式硬件平台上运行的可执行系统。
对于USB 的驱动有本机驱动程序模型和流接口驱动程序模型两种。本机驱动模型主要用于集成到平台上的设备驱动,流接口驱动程序模型则为一般类型的驱动程序。在Win CE 系统下的USB 总线流式驱动程序没有固定格式,要依据所控制的设备具体功能实现驱动。项目要实现的是利用USB 接口实现图像的采集,所以采用流式接口驱动模型较为适合。流式接口驱动程序在形式上表现为动态链接库DDL。由于动态链接所调用的函数代码并没有随应用程序拷贝到可执行文件中,而仅是加入了调用函数的重定位信息,所以只有当应用程序装入内存并开始运行时,才在操作系统的管理下与相应DLL 建立链接关系。本项目采用这种方法实现USB 驱动程序的设计,可以有效地节省嵌入式应用环境下的内存空间。
USB 总线作为串行总线,在产生流式数据的设备方面应用较多,且以流式接口的驱动模式开发更加广泛和成熟。该驱动程序位于USB 硬件接口上,属于控制具体设备功能的客户端驱动程序。在流式接口驱动程序中,把驱动函数作为DLL 的导出函数,而驱动程序把外设抽象为一个文件[4],应用程序则使用操作系统提供的API 对外设进行访问。驱动程序的体系结构如图1 所示。
图1 流接口驱动体系结构Fig.1 Stream interface of driver architecture
从图中可以看到对于硬件设备的访问分为五个模块,分别为硬件层、接口驱动程序层、设备管理器层、FileSys.exe 层以及应用程序层。应用程序与流式接口驱动程序可由用户编程实现,而FileSys.exe 与设备管理器是由操作系统自带组件。在Win CE 系统中有相当多的驱动程序都是通过流式接口实现的,流式接口只定义了抽象的接口,不需要和任何硬件的工作原理和结构相关。
对摄像头的USB 接口驱动采用流接口形式,并且采用动态链接的方式进行开发。使用软件Platform Builder 5.0 作为开发环境对USB 接口程序进行设计。EVC 驱动开发环境开发速度快,只需要将调用的USB 函数需要的头文件以及Lib 文件的路径设置好即可。
具体开发首先选择“Build”菜单下的“Set Active Platform…”,并选择ARMSYS2410 作为激活的Platform,新建一个Win CE 系统下的动态链接库DLL。添加相应的USB 驱动相关的函数,便可完成USB 驱动程序的软件设计,当然,设计完成后的驱动程序要经过测试才能确保正确的运行。其具体各个函数的设计如下:
(1)协议入口函数实现
USB 协议的入口函数为USBInstallDriver(),其函数原型为:
BOOL USBInstallDriver(LPCWSTR szDriverLibFile)
该函数向系统注册USB 总线设备驱动的标志符,同时向系统提供设备驱动程序对象结构内容,以此作为系统匹配驱动的依据。实现向系统注册设备相关信息。设备的驱动程序只把USB 总线设备当作一种专有的结构体对待,该结构体中含有关于设备厂商、制造商等信息。当设备插入后,系统在取得VIP/PID 后自动在注册表中寻找是否有这一项,如果没有根据注册表或者输入名称找到驱动程序的dll文件后,调用USBInstallDriver 函数注册设备[5],依据VIP/PID 设置注册表项。当下次再插入设备时,能够自动相应驱动程序,如果函数的VIP/PID 和实际设备不符,则返回失败。具体流程图如2 所示。
图2 入口函数流程图Fig.2 Flow chart of Entry function
(2)硬件连接函数实现
当USBInstallDriver 完成初始化以后,需要调用USBDeviceAttach 函数,实现与硬件函数的连接。其函数原型为:
BOOL USBDeviceAttach(USB_HANDLE hDevice,//总线设备的句柄
LPCUSB_FUNCS lpUsbFuncs, //协议栈函数功能表的首指针
LPCUSB_INTERFACE lpInterface, //底层函数传递的设备接口
LPCWSTR szUniqueDriverId, //驱动程序标志
LPBOOL fAcceptControl, //布尔值变量,接口
LPCUSB_DRIVER_SETTINGS lpDriverSettings,//驱动程序结构体指针
DWORD dwUnused) //扩展用
在完成接口连接以后,本课题的图像采集设备产生的数据以中断类型完成到主机的传输。设备将数据存放于设备端点,主机通过论询方式获得设备数据。主机通过USBDeviceAttach 创建的中断线程中实现了三个动作函数:CAM_Init(),CAM_Open(),CAM_Close()。设备管理器将含有设备对象指针的注册表路径传递给CAM_Init(),就可以从设备储存的内容找到驱动的上下文,进行数据交换。
为便于展示,本系统将图像采集与显示模块一起调试,并将摄像头的设备信息输出到程序所在目录下的shipintu 文件中。摄像头采集到的单帧320×240 的图像为8kbyte 左右,效果如图3 所示:
图3 系统采集到的一帧图像Fig.3 System of frame image
图4 不同角度的图像Fig.4 Image of the different view
经测试系统从三个不同角度,三个摄像头呈三角形排列,每个摄像头都在植株的斜上方60 度左右进行每隔5 秒一次图像采集,下面的四幅图就是三个摄像头从60 度方向采集的图片,如图6 所示:
通过BSP 安装包在VS2005 中对Win CE 系统的定制固化与运行,同时利用USB 驱动函数对DLL 数据的链接及其对硬件连接函数的实现完成设备接口连接。设备接口连接后可直接通过USB 摄像头对图像的信息采集,设备同时将数据存储在设备端点,主机通过USBDeviceAttach 对图像进行处理[6],能够方便、实时和定时采集图像,为后续的研究提供基础数据。
[1]王永清,何波.Linux下基于ARM920T的USB摄像头图像采集[J].微计算机信息,2007.
[2]王日宏.基于WinCE的串行外设接口驱动程序设计实现[J].微电子学与计算机,2004(10):22-25.
[3]范文庆,周彬彬,安靖.精通WindowsAPI:函数、接口、编程实例[M].北京:人民邮电出版社,2009.
[4]边海龙,贾少华.USB2.0设备的设计与开发[M].北京:人民邮电出版社,2004.
[5]周立功.USB2.0与OTG规范及开发指南[M].北京:航空航天大学出版社,2004.
[6]张柏毅,朱景福.基于LXF模型水平集的玉米叶部病斑图像分割[J].黑龙江八一农垦大学学报,2012,24(3):71-72.