函数基于流接口驱动模型设计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

百星数据(60元/月,600元/年)日本/韩国/香港cn2 gia云服务器,2核2G/40G/5M带宽

百星数据(baixidc),2012年开始运作至今,主要提供境外自营云服务器和独立服务器出租业务,根据网络线路的不同划分为:美国cera 9929、美国cn2 gia、香港cn2 gia、韩国cn2 gia、日本cn2 gia等云服务器及物理服务器业务。目前,百星数据 推出的日本、韩国、香港cn2 gia云服务器,2核2G/40G/5M带宽低至60元/月,600元/年。百星数据优惠码:优惠码:30...

HostYun全场9折,韩国VPS月付13.5元起,日本东京IIJ线路月付22.5元起

HostYun是一家成立于2008年的VPS主机品牌,原主机分享组织(hostshare.cn),商家以提供低端廉价VPS产品而广为人知,是小成本投入学习练手首选,主要提供基于XEN和KVM架构VPS主机,数据中心包括中国香港、日本、德国、韩国和美国的多个地区,大部分机房为国内直连或者CN2等优质线路。本月商家全场9折优惠码仍然有效,以KVM架构产品为例,优惠后韩国VPS月付13.5元起,日本东京...

CloudCone(12.95美元/月CN2 GT线路,KVM架构1 Gbps带宽

整理一下CloudCone商家之前推送的闪购VPS云服务器产品,数量有限,活动推出可能很快机器就售罄了,有需要美国便宜VPS云服务器的朋友可以关注一下。CloudCone怎么样?CloudCone服务器好不好?CloudCone值不值得购买?CloudCone是一家成立于2017年的美国服务器提供商,国外实力大厂,自己开发的主机系统面板,CloudCone主要销售美国洛杉矶云服务器产品,优势特点是...

usb接口驱动为你推荐
比肩工场比肩夺财,行官杀制比是什么意思?百度关键词工具常见的关键词挖掘工具有哪些郭泊雄郭佰雄最后一次出现是什么时候?javmoo.comjavbus上不去.怎么办抓站工具一起来捉妖神行抓妖辅助工具都有哪些?杨丽晓博客明星的最新博文www.123qqxx.com我的首页http://www.hao123.com被改成了http://www.669dh.cn/?yhc66smsm.com【回家的欲望(回家的诱惑)大结局】 回家的诱惑全集66 67 68 69 70集QOVD快播观看地址??www.97yes.comwww.moyigui88.com是不是一个好网站呢www4399com4399小游戏 请记住本站网站 4399.url
香港主机租用 香港vps主机 linuxvps 中国万网域名 域名抢注工具 主机优惠码 hkbn simcentric winhost 阿里云代金券 免费个人网站申请 华为4核 java虚拟主机 网通ip 合肥鹏博士 789电视网 免费活动 广州服务器 美国在线代理服务器 美国免费空间 更多