函数基于流接口驱动模型设计USB设备的驱动程序

usb接口驱动  时间:2021-03-14  阅读:()

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系统分为两层[ 12] :较高的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

易探云服务器怎么过户/转让?云服务器PUSH实操步骤

易探云服务器怎么过户/转让?易探云支持云服务器PUSH功能,该功能可将云服务器过户给指定用户。可带价PUSH,收到PUSH请求的用户在接收云服务器的同时,系统会扣除接收方的款项,同时扣除相关手续费,然后将款项打到发送方的账户下。易探云“PUSH服务器”的这一功能,可以让用户将闲置云服务器转让给更多需要购买的用户!易探云服务器怎么过户/PUSH?1.PUSH双方必须为认证用户:2.买家未接收前,卖家...

简单测评v5.net的美国cn2云服务器:电信双程cn2+联通AS9929+移动直连

v5.net一直做独立服务器这块儿的,自从推出云服务器(VPS)以来站长一直还没有关注过,在网友的提醒下弄了个6G内存、2核、100G SSD的美国云服务器来写测评,主机测评给大家趟雷,让你知道v5.net的美国云服务器效果怎么样。本次测评数据仅供参考,有兴趣的还是亲自测试吧! 官方网站:https://v5.net/cloud.html 从显示来看CPU是e5-2660(2.2GHz主频),...

Hostodo:$34.99/年KVM-2.5GB/25G NVMe/8TB/3个数据中心

Hostodo在九月份又发布了两款特别套餐,开设在美国拉斯维加斯、迈阿密和斯波坎机房,基于KVM架构,采用NVMe SSD高性能磁盘,最低1.5GB内存8TB月流量套餐年付34.99美元起。Hostodo是一家成立于2014年的国外VPS主机商,主打低价VPS套餐且年付为主,基于OpenVZ和KVM架构,美国三个地区机房,支持支付宝或者PayPal、加密货币等付款。下面列出这两款主机配置信息。CP...

usb接口驱动为你推荐
网罗设计网络设计是什么专业公司网络被攻击网络遭受攻击分为哪几类百度商城百度知道一般一天能挣多少钱?kaixin.com人人网和开心网互通,可我用的是kaixin001的开心,和kaixin*com不是一个呀!同ip网站查询同ip地址站点查询 我本地怎么查询不了关键字编程中,什么是关键字www.gegeshe.comSHE个人资料ww.66bobo.com这个WWW ̄7222hh ̄com是不是真的不太易开了,换了吗?javlibrary.comImage Library Sell Photos Digital Photos Photo Sharing Photo Restoration Digital Photos Photo Albumswww.javlibrary.com跪求一个JAVHD.com的帐号
谷歌香港 服务器cpu性能排行 镇江联通宽带 牛人与腾讯客服对话 100m免费空间 52测评网 共享主机 tna官网 搜索引擎提交入口 优酷黄金会员账号共享 宏讯 网站加速软件 中国联通宽带测速 阿里云邮箱申请 免费获得q币 512内存 学生机 websitepanel 中美互联网论坛 globalsign 更多