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

Vultr VPS韩国首尔机房速度和综合性能参数测试

Vultr 商家有新增韩国首尔机房,这个是继日本、新加坡之后的第三个亚洲机房。不过可以大概率知道肯定不是直连中国机房的,因为早期的日本机房有过直连后来取消的。今天准备体验看看VULTR VPS主机商的韩国首尔机房的云服务器的速度和性能。1、全球节点PING速度测试这里先通过PING测试工具看看全球几十个节点的PING速度。看到好像移动速度还不错。2、路由去程测试测试看看VULTR韩国首尔机房的节点...

SoftShellWeb:台湾(台北)VPS年付49美元起,荷兰VPS年付24美元起

SoftShellWeb是一家2019年成立的国外主机商,商家在英格兰注册,提供的产品包括虚拟主机和VPS,其中VPS基于KVM架构,采用SSD硬盘,提供IPv4+IPv6,可选美国(圣何塞)、荷兰(阿姆斯特丹)和台湾(台北)等机房。商家近期推出台湾和荷兰年付特价VPS主机,其中台湾VPS最低年付49美元,荷兰VPS年付24美元起。台湾VPSCPU:1core内存:2GB硬盘:20GB SSD流量...

Hostodo:$19.99/年KVM-1GB/12GB/4TB/拉斯维加斯

Hostodo发布了几款采用NVMe磁盘的促销套餐,从512MB内存起,最低年付14.99美元,基于KVM架构,开设在拉斯维加斯机房。这是一家成立于2014年的国外VPS主机商,主打低价VPS套餐且年付为主,基于OpenVZ和KVM架构,产品性能一般,数据中心目前在拉斯维加斯和迈阿密,支持使用PayPal或者支付宝等付款方式。下面列出几款NVMe硬盘套餐配置信息。CPU:1core内存:512MB...

usb接口驱动为你推荐
h连锁酒店世界知名的连锁酒店有哪些?丑福晋爱新觉罗.允禄真正的福晋是谁?他真的是一个残酷,噬血但很专情的一个人吗?seo优化工具SEO优化神器有什么比较好的?www.kk4kk.com猪猪影院www.mlzz.com 最新电影收费吗?ip在线查询通过对方的IP地址怎么样找到他的详细地址?www.299pp.com免费PP电影哪个网站可以看啊125xx.comwww.free.com 是官方网站吗?杨丽晓博客明星的最新博文kb123.netwww.zhmmjyw.net百度收录慢?haole012.com说在:012qq.com这个网站能免费挂QQ,是真的吗?
info域名注册 com域名空间 广西虚拟主机 yaokan永久域名经常更换 重庆vps租用 t楼 美国主机评论 2014年感恩节 合肥鹏博士 100x100头像 数字域名 帽子云 怎样建立邮箱 hkg 免费申请网站 能外链的相册 镇江高防 沈阳idc 湖南铁通 美国十大啦 更多