




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
编写WindowsCE.net的usb驱动程序教程WindowsCE.NET是微软推出的功能强大的嵌入式操作系统,国内采用此操作系统的厂商已经很多了,本文就以为例,简单介绍一下如何开发下的USB驱动程序。WindowsCE.NET的USB系统软件分为两层:USBClient设备驱动程序和底层的WindowsCE实现的函数层。USB设备驱动程序主要负责利用系统提供的底层接旦配置设备,和设备进行通讯。底层的函数提本身又由两部分组成,通用串行总线驱动程序(USBD)模块和较低的主控制器驱动程序(HCD)模块。HCD负责最最底层的处理,USBD模块实现较高的USBD函数接口。USB设备驱动主要利用USBD接口函数和他们的外围设备打交道。USB设备驱动程序主要和USBD打交道,所以我们必须详细的了解USBD提供的函数。主要的传输函数有:abourttransferissuecontroltransferclosetransferissueinterruptransfergetisochresultissueisochtransfergettransferstatusistransfercompleteissuebulktransferissuevendortransfer主要的用于打开和关闭usbd和usb设备之间的通信通道的函数有:abortpipetransfers closepipeisdefaultpipehalted ispipehaltedopenpiperesetdefaultpiperesetpipe相应的打包函数接口有:getframelengthgetframenumberreleaseframelengthcontrolsetframelengthtakeframelengthcontrol取得设置设备配置函数:clearfeaturesetdescriptorgetdescriptorsetfeaturegetstatussyncframegetstatussyncframe与usb进行交互的实现方法相关的多任务函数:findinterfaceregisterclientdeviceidfindinterfaceregisterclientdeviceidgetdeviceinforegisterclientsettingsgetusbdversionregisternotificationroutinegetusbdversiontranslatestringdescrloadgenericinterfacedrivertranslatestringdescropenclientregisterkeyunregisternotificationroutineopenclientregisterkey常见的WindowsCE.NET下USB的设备驱动程序的编写有以下几种方法:•流式接口函数这种驱动程序主要呈现流式函数接口,主要输出XXX_Init,XXX_Deinit,XXX_Open,XXX_Close,XXX_Open,XXX_Close,XXX_Read,XXX_Write,XXX_Seek,XXX_IOControl,XXX_PowerUp,XXX_PowerDown等流式接口,注意上述的几个接口一定都要输出,另外XXX必须为三个字符,否则会出错。但是此类的驱动程序不是通过设备管理接口来加载的,所以必须手工的调用RegisterDevice()和DeregisterDevice()函数来加载和卸载驱动程序。用户可以将此类的设备作为标准的文件来操作,只要调用相应的文件操作就可以和驱动程序打交道。•使用现有的WindowCE.NET的应用程序接口此类设备主要是利用WindowsCE.NET中已经有了现成的函数接口,例如USBMassStorageDisk,它主要利用现有的WindowsCE.Net中已经有的可安装文件系统接口,呈现给系统可用的文件系统,对于用户来讲,它是透明的,用户仅仅感觉在操作一个文件夹。•创建指定到特定的USBD的用户指定的API这种方法在USBD呈现设备时不需要任何限制,主要是特制的提供API给用户,一般不太常见。USB设备驱动程序必须输出的函数有:USBDeviecAttach当USB设备连接到计算机上时,USBD模块就会调用此函数,这个函数主要用于初始化USB设备,取得USB设备信息,配置USB设备,并且申请必需的资源。USBInstallDriver主要用于创建一个驱动程序加载所需的注册表信息,例如读写超时,设备名称等。USBUninstallDriver主要用于释放驱动程序所占用的资源,以及删除USBInstallDriver函数创建的注册表等。上述的三个函数接口是所有的USB驱动程序必须提供的,缺一不可。另外比较重要的是USB设备驱动程序的注册表配置,一般的USB设备驱动程序的注册表配置HKEY_LOCAL_MACHINE\Drivers\USB\LoadClients下,每个驱动程序的子键都有GrouplID\Group2ID\Group3ID\Drivername格式,如果注册表信息与USB设备信息符合,USBD就会加载此驱动程序。否则设备的子键应该由供应商,设备类和协议信息通过下划线组成。例如你有个PDA设备,它具有一个USB接口,它的供应厂商ID假设为0x0888,设备ID为0x0999,没有使用特殊的协议,那么它的加载注册表应该写为:[HKEY_LOCAL_MACHINE\Drivers\USB\LoadClients\2184_2457\Default\Default\PDA]〃DLL〃=〃pdausb.dll〃需要注意的是注册表构成都是十进制数值来标识的,注意一下十进制和十六进制的转换。有了这些基本信息,就可以编写USB设备了。首先,必须输出USBD要求调用的三个函数,首先到设备插入到USB端口时,USBD会调用USBDeviceAttach()函数,相应的代码如下:externcboolusbdeviceattach(usb_handlehdevice,//usb设备句柄lpcusb_funcslpusbfuncs,//usbdi的函数集合lpcusb_interfacelpinterface,//设备接口描述信息lpcwstrszuniquedriverid,//设备id描述字符串。lpboolfacceptcontrol,//返回true,标识我们可以控制此设备,反之表示不能控制dworddwunused){*facceptcontrol=false;//我们的鼠标设备有特定的描述信息,要检测是否是我们的设备。if(lpinterface==null)returnfalse;//打印相关的usb设备接口描述信息。debugmsg(zone_init,(text(usbmouse:deviceattach,if%u,#ep:%u,class:%u,sub:%u,prot:%urn),lpinterface->descriptor.binterfacenumber,lpinterface->descriptor.bnumendpoints,lpinterface->descriptor.binterfaceclass,lpinterface->descriptor.binterfacesubclass,lpinterface->descriptor.binterfaceprotocol));//初试数据usb鼠标类,产生一个接受usb鼠标数据的线程cmouse*pmouse=newcmouse(hdevice,lpusbfuncs,lpinterface);if(pmouse==null)returnfalse;if(!pmouse->initialize()){deletepmouse;returnfalse;}//注册一个监控usb设备事件的回调函数,用于监控usb设备是否已经拔掉。(*lpusbfuncs->lpregisternotificationroutine)(hdevice,usbdevicenotifications,pmouse);*facceptcontrol=true;returntrue;}第二个函数是usbinstalldriver()函数,一些基本定义如下:constwchargcszregisterclientdriverid[]=lregisterclientdriverid;constwchargcszregisterclientsettings[]=lregisterclientsettings;constwchargcszunregisterclientdriverid[]=lunregisterclientdriverid;constwchargcszunregisterclientsettings[]=lunregisterclientsettings;constwchargcszmousedriverid[]=lgeneric_sample_mouse_driver;函数接口如下:externcboolusbinstalldriver(lpcwstrszdriverlibfile)//@parm[in]-containsclientdriverdllname{boolfret=false;hinstancehinst=loadlibrary(lusbd.dll);//注册usb设备信息if(hinst){lpregister_client_driver_idpregisterid=(lpregister_client_driver_id)getprocaddress(hinst,gcszregisterclientdriverid);lpregister_client_settingspregistersettings=(lpregister_client_settings)getprocaddress(hinst,gcszregisterclientsettings);if(pregisterid&&pregistersettings){usb_driver_settingsdriversettings;driversettings.dwcount=sizeof(driversettings);//设置我们的特定的信息。driversettings.dwvendorid=usb_no_info;driversettings.dwproductid=usb_no_info;driversettings.dwreleasenumber=usb_no_info;driversettings.dwdeviceclass=usb_no_info;driversettings.dwdevicesubclass=usb_no_info;driversettings.dwdeviceprotocol=usb_no_info;driversettings.dwinterfaceclass=0x03;//hiddriversettings.dwinterfacesubclass=0x01;//bootdevicedriversettings.dwinterfaceprotocol=0x02;//mousefret=(*pregisterid)(gcszmousedriverid);if(fret){fret=(*pregistersettings)(szdriverlibfile,gcszmousedriverid,null,&driversettings);if(!fret){//bugbugunregistertheclientdriversid}}}else{retailmsg(1,(text(!usbmouse:errorgettingusbdfunctionpointersrn)));}freelibrary(hinst);}returnfret;}上述代码主要用于产生USB设备驱动程序需要的注册表信息,要注意的是:USB设备驱动程序不使用标准的注册表函数,而是使用RegisterClientDriverID()与RegisterClientSettings来注册相应的设备信息。另外一个函数是usbuninstalldriver()函数,具体代码如下:externcboolusbuninstalldriver(){boolfret=false;hinstancehinst=loadlibrary(lusbd.dll);if(hinst){lpun_register_client_driver_idpunregisterid=(lpun_register_client_driver_id)getprocaddress(hinst,gcszunregisterclientdriverid);lpun_register_client_settingspunregistersettings=(lpun_register_client_settings)getprocaddress(hinst,gcszunregisterclientsettings);if(punregistersettings){usb_driver_settingsdriversettings;driversettings.dwcount=sizeof(driversettings);//必须填入与注册时相同的信息。driversettings.dwvendorid=usb_no_info;driversettings.dwproductid=usb_no_info;driversettings.dwreleasenumber=usb_no_info;driversettings.dwdeviceclass=usb_no_info;driversettings.dwdevicesubclass=usb_no_info;driversettings.dwdeviceprotocol=usb_no_info;driversettings.dwinterfaceclass=0x03;//hiddriversettings.dwinterfacesubclass=0x01;//bootdevicedriversettings.dwinterfaceprotocol=0x02;//mousefret=(*punregistersettings)(gcszmousedriverid,null,&driversettings);}if(punregisterid){boolfrettemp=(*punregisterid)(gcszmousedriverid);fret=fret?frettemp:fret;}freelibrary(hinst);}returnfret;}此函数主要用于删除USBInstallDriver()时创建的注册表信息,同样的它使用自己的函数接口UnRegisterClientDriverID()和UnRegisterClientSettings()来做相应的处理。另外一个需要处理的注册的监控通知函数usbdevicenotifications():externcboolusbdevicenotifications(lpvoidlpvnotifyparameter,dworddwcode,lpdword*dwinfo1,lpdword*dwinfo2,lpdword*dwinfo3,lpdword*dwinfo4){cmouse*pmouse=(cmouse*)Ipvnotifyparameter;cmouse*pmouse=switch(dwcode){caseusb_close_device:〃删除相关的资源。deletepmouse;returntrue;}returnfalse;}usb鼠标的类的定义如下:classcmouse{public:cmouse::cmouse(usb_handlehdevice,lpcusb_funcslpusbfuncs,lpcusb_interfacelpinterface);~cmouse();boolinitialize();private://传输完毕调用的回调函数staticdwordcallbackmousetransfercompletestub(lpvoidlpvnotifyparameter);//中断处理函数staticulongcallbackcmouse::mousethreadstub(pvoidcontext);dwordmousetransfercomplete();dwordmousethread();boolsubmitinterrupt();boolhandleinterrupt();boolm_fclosing;boolm_freadyformouseevents;handlem_hevent;handlem_hthread;usb_handlem_hdevice;usb_pipem_hinterruptpipe;usb_transferm_hinterrupttransfer;lpcusb_funcsm_lpusbfuncs;lpcusb_interfacem_pinterface;boolm_fprevbutton1;boolm_fprevbutton2;boolm_fprevbutton3;//数据接受缓冲区。bytem_pbdatabuffer[8];};具体实现如下://构造函数,初始化时调用cmouse::cmouse(usb_handlehdevice,lpcusb_funcslpusbfuncs,lpcusb_interfacelpinterface){m_fclosing=false;m_freadyformouseevents=false;m_hevent=null;m_hthread=null;m_hdevice=hdevice;m_hinterruptpipe=null;m_hinterrupttransfer=null;m_lpusbfuncs=lpusbfuncs;m_pinterface=lpinterface;m_fprevbutton1=false;m_fprevbutton2=false;m_fprevbutton3=false;memset(m_pbdatabuffer,0,sizeof(m_pbdatabuffer));}//析构函数,用于清除申请的资源。cmouse::~cmouse(){//通知系统去关闭相关的函数接口。m_fclosing=true;//wakeuptheconnectionthreadagainandgiveittimetodie.if(m_hevent!=null){//通知关闭数据接受线程。setevent(m_hevent);if(m_hthread!=null){dworddwwaitreturn;dwwaitreturn=waitforsingleobject(m_hthread,1000);if(dwwaitreturn!=wait_object_0){terminatethread(m_hthread,dword(-1));}closehandle(m_hthread);m_hthread=null;}closehandle(m_hevent);m_hevent=null;}if(m_hinterrupttransfer)(*m_lpusbfuncs->lpclosetransfer)(m_hinterrupttransfer);if(m_hinterruptpipe)(*m_lpusbfuncs->lpclosepipe)(m_hinterruptpipe);}//初始化usb鼠标驱动程序boolcmouse::initialize(){lpcusb_devicelpdeviceinfo=(*m_lpusbfuncs->lpgetdeviceinfo)(m_hdevice);//检测配置:usb鼠标应该只有一个中断管道if((m_pinterface->lpendpoints[0].descriptor.bmattributes&usb_endpoint_type_mask)!=usb_endpoint_type_interrupt){retailmsg(1,(text(!usbmouse:ep0wrongtype(%u)!rn),m_pinterface->lpendpoints[0].descriptor.bmattributes));returnfalse;}debugmsg(zone_init,(text(usbmouse:ep0:maxpacket:%u,interval:%urn),m_pinterface->lpendpoints[0].descriptor.wmaxpacketsize,m_pinterface->lpendpoints[0].descriptor.binterval));m_hinterruptpipe=(*m_lpusbfuncs->lpopenpipe)(m_hdevice,&m_pinterface->lpendpoints[0].descriptor);if(m_hinterruptpipe==null) {retailmsg(1,(text(mouse:erroropeninginterruptpipern)));return(false);}m_hevent=createevent(null,false,false,null);if(m_hevent==null){retailmsg(1,(text(usbmouse:erroroncreateeventforconnecteventrn)));return(false);}//创建数据接受线程m_hthread=createthread(0,0,mousethreadstub,this,0,null);if(m_hthread==null){retailmsg(1,(text(usbmouse:erroroncreatethreadrn)));return(false);}return(true);}//从usb鼠标设备中读出数据,产生相应的鼠标事件。boolcmouse::submitinterrupt(){if(m_hinterrupttransfer)(*m_lpusbfuncs->lpclosetransfer)(m_hinterrupttransfer);//从usb鼠标pipe中读数据m_hinterrupttransfer=(*m_lpusbfuncs->lpissueinterrupttransfer)(m_hinterruptpipe,mousetransfercompletestub,this,usb_in_transfer|usb_short_transfer_ok,//表示读数据min(m_pinterface->lpendpoints[0].descriptor.wmaxpacketsize,sizeof(m_pbdatabuffer)),m_pbdatabuffer,null);if(m_hinterrupttransfer==null){debugmsg(zone_error,(l!usbmouse:errorinissueinterrupttransferrn));returnfalse;}else{debugmsg(zone_transfer,(lusbmouse::submitinterrupt,transfer:0x%xrn,m_hinterrupttransfer));}returntrue;}//处理鼠标中断传输的数据boolcmouse::handleinterrupt(){dworddwerror;dworddwbytes;dworddwflags=0;intdx=(signedchar)m_pbdatabuffer[1];intdy=(signedchar)m_pbdatabuffer[2];bool fbutton1 = m_pbdatabuffer[0] & 0x01 ? true : false;bool fbutton2 = m_pbdatabuffer[0] & 0x02 ? true : false;bool fbutton3 = m_pbdatabuffer[0] & 0x04 ? true : false;if(!(*m_lpusbfuncs->lpgettransferstatus)(m_hinterrupttransfer,&dwbytes,&dwerror)){debugmsg(zone_error,(text(!usbmouse:erroringettransferstatus(0x%x)rn),m_hinterrupttransfer));returnfalse;}else{debugmsg(zone_transfer,(text(usbmouse::handleinterrupt,htransfer0x%xcomplete(%ubytes,error:%x)rn),m_hinterrupttransfer,dwbytes,dwerror));}if(!submitinterrupt())returnfalse;if(dwerror!=usb_no_error){debugmsg(zone_error,(text(!usbmouse:error0x%xininterrupttransferrn),dwerror));returntrue;}if(dwbytes<3){debugmsg(zone_error,(text(!usbmouse:invalidbytecnt%ufrominterrupttransferrn),dwbytes));returntrue;}if(dx||dy)dwflags|=mouseeventf_move;if(fbutton1!=m_fprevbutton1){if(fbutton1)dwflags|=mouseeventf_leftdown;elsedwflags|=mouseeventf_leftup;}if(fbutton2!=m_fprevbutton2){if(fbutton2)dwflags|=mouseeventf_rightdown;elsedwflags|=mouseeventf_rightup;}if(fbutton3!=m_fprevbutton3){if(fbutton3)dwflags|=mouseeventf_middledown;elsedwflags|=mouseeventf_middleup;}m_fprevbutton1=fbutton1;m_fprevbutton2=fbutton2;m_fprevbutton3=fbutton3;debugmsg(zone_events,(text(usbmouseevent:dx:%d,dy:%d,dwflags:0x%x(b1:%u,b2:%u,b3:%u)rn),dx,dy,dwflags,fbutton1,fbutton2,fbutton3));//通知系统产生鼠标事件if(m_freadyformouseevents)mouse_event(dwflags,dx,dy,0,0);elsem_fready
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 酶基生物催化研究-洞察及研究
- 2025年中医药国际市场拓展中的中医药服务市场拓展效果评估报告
- 深海矿产资源勘探技术2025年深海矿产资源勘探技术市场分析预测报告
- 医院智能肿瘤管理系统创新创业项目商业计划书
- 珍稀鱼类的人工繁育和养殖技术创新创业项目商业计划书
- 安全麻醉技术改进创新创业项目商业计划书
- 玫瑰养护书籍出版创新创业项目商业计划书
- 蛋品智能温控展示柜设计创新创业项目商业计划书
- 产权保护机制-洞察及研究
- 白念珠菌对鲍曼不动杆菌生物膜形成促进作用的研究
- GB/T 45920-2025铁铝酸盐水泥
- 大健康行业发展趋势
- 北京海淀2025年物理高二下期末达标测试试题含解析
- 陕西省2025年中考语文真题试卷及答案
- 心肌梗死的心电图定位诊断
- 2024-2025学年北师大版七年级数学下册期末阶段复习综合练习题
- 光伏电站台风预警与应急措施
- 2025年广州数学中考试题及答案
- 电力技能培训课件开发
- 湖北省省直辖县级行政区划潜江市2024-2025学年七年级下学期期末考试生物试卷(含答案)
- 学霸提优第四单元《我们讲文明》重难点梳理 课件
评论
0/150
提交评论