2007年6月 南昌航空大学学报(自然科学版) Jun ,2007第21卷 第2期 Journal of Nanchang Hangkong University(Natural Science) Vol 21 No 2
基于流接口驱动模型设计USB设备的驱动程序
赵洪杰,刘琳岚
(南昌航空大学,江西南昌 330063)
[关键词] 流接口驱动模型;WinCE1Net;USB设备驱动;
[摘要]本文介绍了嵌入式操作系统WinCE1Net的USB总线驱动框架,以网眼摄像头驱动程序的设计为例,详细介绍了基于流接口
驱动模型设计USB设备驱动程序的过程。测试表明,该设计方案是可行的。
[中图分类号] TP319 [文献标识码] A [文章编号]1001 -4926(2007)02-0095- 06
Design ofthe client driver ofUSB device based on stream interfacedriver model in the WinCE. Net
ZHAO Hong- jie ,L IU Lin- lan
(Nanchang Hangkong University, Nanchang 330063, China)
Key words :stream interface drive model ;WinCE Net ; the driver of USB device
Abstract :Thispaper analyses the framework ofUSB system software and stream interface driver model based on embedded system WinCENet , and specially introducesthe development of USB Camera driverwith stream interface driver model
嵌入式操作系统Win CE1 Net凭借其实时性强、内存占用少、内核稳定可靠以及结构设计合理、先进等优点在嵌入式领域得到广泛应用。USB摄像头以其良好的性价比、方便易用的特点而广泛应用于视频聊天、远程监控、视频会议等诸多领域。但是由于嵌入式硬件环境多样性以及Win CE1 Net对USB设备驱动开发只提供了一些底层支持的原因,摄像头厂商尚未提供W in CE1 Net下USB摄像头的驱动。因此开发出W in CE1 Net下USB摄像头驱动具有实际的意义和价值。本文正是针对这一情况,对Win CE1 Net下USB设备驱动开发进行研究,并设计出基于流接口驱动模型的USB摄像头驱动程序。
1 WinCE1Net下USB总线驱动框架
在Win CE1 Net平台下,USB系统分为两层[ 12] :较高的USB设备驱动程序和较低的由W in CE1 Net实现的USB函数层。较低的USB函数层又由两部分组成:通用串行总线驱动程序(USBD)模块和较低的主控制器驱动程序(HCD)模块。W in CE1 Net下USB总线驱动框架参见图1[3]所示。
HCD模块向下与USB主控制器通信,向上提供功能函数供USBD模块调用;而USBD模块通过直接调用HCD提供的函数接口,实现更高层的USBD接口函数;USB设备驱动程序则是通过USBD接口函数间接实现与USB外围设备通信;而上层应用程序借助Win CE1 Net系统提供的文件系统A PI函数实现与USB设备驱动程序联系。
2 WinCE1Net下流接口驱动模型
基于Win CE1 Net平台的两种专用的驱动模型为:本机设备驱动程序和流接口驱动程序。本机设备驱动
[收稿日期] 2007- 02- 01
[基金项目] 航空科学基金(2006ZD56005) ;江西省科技攻关重点项目(CB200606130)
[作者简介] 赵洪杰(1980- ),男,河南郑州人,在校研究生。
口驱动程序的加载、卸载等管理工作;流接口驱动程序通过调用USBD模块提供的接口函数实现与底层USB设备通信。
3 WinCE1Net下USB摄像头驱动程序实现过程
在Win CE1 Net下编写USB设备流接口驱动需要实现以下两个模块:⑴实现三个入口点函数,即实现函数US BInst a llDrive r() 、US BUn installDriver()和US BD ev iceAttach() ;⑵实现流接口函数。实现上述三个入口点函数主要有以下两方面作用:首先是使客户端驱动程序能够与CE系统的USBD模块联系;其次进行必要的注册表设置。而流接口函数用来实现对具体外围设备的控制,在具体应用中有差异但形式上是统一的。
开发WinCE1Net下USB设备流接口驱动,可采用Embedded Visual C++(EVC) ,也可以使用PlatformBu ild e r(PB) 。前者侧重应用程序开发,而后者则是侧重内核定制。下面以开发USB摄像头驱动程序为例,从驱动程序入口点函数设计、流接口函数设计两个方面具体说明驱动开发实现过程。实验硬件平台是:研华PCM- 7230,处理器为Intel PXA- 255,USB摄像头型号为网眼V2000,开发工具采用EVC。
311 驱动程序入口点函数设计
USBIns tallDriv er () 、USBUninstallDriver()和USBDev ic eAttach()是USB设备驱动程序必须实现的入口函数。
第2期 赵洪杰、刘琳岚:基于流接口驱动模型设计USB设备的驱动程序 97以下是三个函数各自功能。
USBIns tallDriv er() :系统加载驱动时,被系统调用。主要向注册表写入摄像头驱动注册信息,实现驱动程序注册。需要特别提到的是,注册所使用的不是标准的注册表函数,而是使用Reg isterClientDriv erID() ,Re g is2t e rClie n t Se tt ings ()来注册相应的驱动ID和驱动配置信息,其中包括:驱动名、设备文件名、设备文件名前缀等。
U S BUn ins t a llDrive r() :当U S B设备脱离主机时,被系统调用。主要用于删除注册表中设备的相关信息。所使用的函数是UnReg is terClient S ett in gs () ,UnRe g ist erClientDriverID()从注册表中删除该驱动创建的注册信息。
USBDev iceAtt ach() :系统加载驱动时,被系统调用。主要用于获取的设备信息,配置设备,并申请所需资源等。
当USB设备插入主机时,W inCE1 Net系统加载入口点函数的具体过程如图3;USB设备脱离主机时,系统调用US BUn insta llDriv e r() ,释放相关资源。
下面重点介绍了函数US BInst a llDrive r()的处理流程。它主要实现了摄像头驱动名称等一些信息的注册,其流程图如图4 。该函数部分核心代码如
下:
BOOL USBInstallDriver(LPW STR s zDriverLibFile)
{ //初始化一些变量
WCHARwsUsbDeviceID[ ] = CLASS NAME- SZ;
WCHARwsSubClassRegKey[ ] =CLIENT REGKEY SZ;
USB DRIVER SETTINGS usbDriverSettings = {DRIVER SETTINGS } ;
BOOL bRc= FALSE;
//加载usb d 1dll到进程空间
HINSTANCE hInst =LoadLibrary(L” usbd1dll” ) ;
//获取Re g isterClientDriv erID()和Re g is terClient S ettin gs ()的内存地址,并将其赋值给相应函数指针LPREGIST ER-CLIENT-DRIVER-ID p Reg is terId=(LPREGISTER-CLIENT-DRIVER-ID)
GetProcAddres s (h Ins t ,g cs zReg is terClientDriv erId) ;
LPREGIST ER-CLIENT-SETTINGp RegisterSettings=(LPREGISTER-CLIENT-SETTINGS)
GetProcAddres s (hIns t ,g cs zReg is terClient S ettings) ;
//注册驱动名称,bRc = (3 pRegis terId) (gcs zCameraDriverId) ;
//注册摄像头驱动设备信息bRc = (3 pRegisterSettings) (szDriverLibFile ,gcs zCameraDriverId,NULL,&usb Driv erSettings) ;
//注册额外的一些驱动信息
第2期 赵洪杰、刘琳岚:基于流接口驱动模型设计USB设备的驱动程序 99
bRc = GetSet KeyValues (ws SubClass RegKey,usbCamKeyValues ,SET, TRUE) ;
}
312 驱动程序流接口函数设计
流接口函数是一组标准接口函数,用于完成标准的文件I/O操作和电源管理[4] 。它通过文件系统API和应用程序交互,同时调用USBD模块中的函数实现与设备通信。
流接口函数的实现形式为:XXX Init 、XXX Deinit 、XXX Open 、XXX Close 、XXX Write/XXX Read、XXXIOControl 、XXXSeek 、XXXPowerUp 、XXXPowerDown 。其中,前五个是必不可少的,根据设备具体功能可以有选择使用其它函数。XXX是设备驱动的设备文件名前缀。设备文件名前缀、驱动名以及其它一些信息都是在驱动注册时写入注册表。
以下是本实验使用到的部分函数,设备文件名前缀为CAM。
CAM Init :由设备管理器调用,用于驱动初始化;
CAM Deinit :由设备管理器调用,用于驱动卸载;
CAM Op en:应用层中通过Cre ateFile函数调用,用于打开设备;
CAM Close:应用层中通过CloseHandle函数调用,关闭设备;
CAM Read:应用层中通过ReadFile函数调用,读取设备的数据;
当USB摄像头插入主机时,系统通过调用入口点函数,完成驱动初始化工作。而后,应用程序首先通过执行CreateFile()函数,调用CAM Open()来打开设备;然后通过执行函数ReadFile()来调用CAM Read() 。在函数CAM Read()中,通过USBD模块提供的等时传输函数来实现对摄像头数据的读取。以下是CAMRead函数部分重要代码:
CAM Read(PUSBCAM CONTEXT pUsbCam,//设备句柄,系统填充
PUCHA Rp Bu ffer , //接受数据的缓冲区,应用层传递
DWORD BufferLength //数据缓冲区长度
)
{if (ACCEPT IO(pUsbCam ) ) {try {
//在MyIssueIsochTransfer中调用USBD提供等时函数pUsbFuncs - >lp IssueIsochTrans fer,从摄
像头中读取数据dw=MyIssueIsochTransfer (pUs b Cam- >Us bFuncs ,pUsb Cam- >Is o chIn1hPip e ,
De faultTrans ferComp lete,pUs b Cam- >Is ochIn1hEvent ,
USB-NO-WAIT|USB-IN-TRANSFER|
USB-SHORT-TRANSFER-OK|USB-START-ISOCH-ASAP 0, nNum2
Frames , dwFrameLen,ptr, NULL, &dwBytes ,
1500, dwUsbRc) ;
}e xc ept (EXCEPTION-EXECUTE-HANDLER)
{
}
}
将原始数据读出后,需要在应用层对其进行解码等一些处理后,才可用于显示。由于所用的USB Camera采用的是OV511+控制芯片,在对原始数据处理的过程中需要参考OV511+的Datasheet 。数据的处理和显示过程大致如下:首先,从读取的原始数据包中解析出所需的原始图像数据;其次,将得到的原始图像数据格式(YUV420)转换为RGB格式,其转换步骤为:⑴获取原始图像数据YUV420;⑵将其转换为标准YUV420格式;⑶将标准YUV420格式转换为RGB格式;⑷将RGB数据显示出来。
4 结束语
Win CE1 Net下流驱动模型是一种标准统一但使用灵活的驱动模型,它是USB设备驱动开发的首选。在深入理解Win CE1 Net下USB系统构架,熟悉流接口驱动机制的基础上,可以大大减少USB设备驱动开发时间,从而加快Win CE1 Net下USB设备驱动的开发。
[ 参 考 文 献 ]
[1 ] 傅曦,陈黎等1 Windows CE嵌入式开发入门-基于Xscal构架[M]1北京:人民邮电出版社,200616
[2] (美)微软公司1 Microsoft Windows CE Device Driver Kit1设备驱动程序开发指南[M]1希望图书创作室译1北京:北京希望电子出版社,1999
[3] 那洪洋,李扬,杨文通1 WinCE1Net下USB总线驱动程序的研究[J] ,微计算机应用,200613
[4] 周毓林,宁杨,陆贵强,付林林1 Windows CE1Net内核定制及应用开发[M]1北京:电子工业出版社,200512
(上接第79页)
[4]KwonS J ,GooB C1 A study on the friction and wear characteristics ofbrake pads for Al MMCbrake disc[J ]1 Key Eng Mat , 2000, 183(1) : 1225 -12291
[5]郭继伟,金云学,吕奎龙,等1 TiC颗粒增强铝基复合材料的制备及其微观组织[J]1中国有色金属学报,2003, 13 (2) : 193- 1971GUO Ji -wei ,J IN Yun- xue ,LU Kui - long , et al1 Fabrication and microstructureof Al - based composite reinforced by TiC particles[J]1 The Chinese Journalof Nonferrous Metals,2003, 13 (2) :193 - 1971
[6]尧军平,王薇薇,马新生等1压渗法制备陶瓷网络复合材料研究[J]1机械工程学报,2003 , 39 (1) :46- 501 YAO Jun- ping,WANG Wei -wei ,MAXin- sheng, etal1 The study on ceramics network composites fabricated by die castingmethod[J]1 Chinese Journal of Mechanical Engineering ,
2003 ,39 (1) : 46- 501
[7] 尧军平,王薇薇,杨滨1三维网络陶瓷增强铝基复合材料的干摩擦磨损性能[J]1中国有色金属学报,2004,14(5) :766-7711
Vultr 商家有新增韩国首尔机房,这个是继日本、新加坡之后的第三个亚洲机房。不过可以大概率知道肯定不是直连中国机房的,因为早期的日本机房有过直连后来取消的。今天准备体验看看VULTR VPS主机商的韩国首尔机房的云服务器的速度和性能。1、全球节点PING速度测试这里先通过PING测试工具看看全球几十个节点的PING速度。看到好像移动速度还不错。2、路由去程测试测试看看VULTR韩国首尔机房的节点...
SoftShellWeb是一家2019年成立的国外主机商,商家在英格兰注册,提供的产品包括虚拟主机和VPS,其中VPS基于KVM架构,采用SSD硬盘,提供IPv4+IPv6,可选美国(圣何塞)、荷兰(阿姆斯特丹)和台湾(台北)等机房。商家近期推出台湾和荷兰年付特价VPS主机,其中台湾VPS最低年付49美元,荷兰VPS年付24美元起。台湾VPSCPU:1core内存:2GB硬盘:20GB SSD流量...
Hostodo发布了几款采用NVMe磁盘的促销套餐,从512MB内存起,最低年付14.99美元,基于KVM架构,开设在拉斯维加斯机房。这是一家成立于2014年的国外VPS主机商,主打低价VPS套餐且年付为主,基于OpenVZ和KVM架构,产品性能一般,数据中心目前在拉斯维加斯和迈阿密,支持使用PayPal或者支付宝等付款方式。下面列出几款NVMe硬盘套餐配置信息。CPU:1core内存:512MB...