usb驱动程序教程
编写Windows http://doc.guandang.net的usb驱动程序教程
Windows http://doc.guandang.net 是微软推出的功能强大的嵌入式操作系统,国内采用此操作系统的厂商已经很多了,本文就以windows http://doc.guandang.net为例,简单介绍一下如何开发windows http://doc.guandang.net下的USB驱动程序。
Windows http://doc.guandang.net 的USB系统软件分为两层: USB Client设备驱动程序和底层的Windows CE实现的函数层。USB设备驱动程序主要负责利用系统提供的底层接口配置设备,和设备进行通讯。底层的函数提本身又由两部分组成,通用串行总线驱动程序(USBD)模块和较低的主控制器驱动程序(HCD)模块。HCD负责最最底层的处理,USBD模块实现较高的USBD函数接口。USB设备驱动主要利用 USBD接口函数和他们的外围设备打交道。
USB设备驱动程序主要和USBD打交道,所以我们必须详细的了解USBD提供的函数。 主要的传输函数有:
abourttransferissuecontroltransfer
closetransfer issueinterruptransfer
getisochresultissueisochtransfer
gettransferstatus istransfercomplete
issuebulktransfer issuevendortransfer
主要的用于打开和关闭usbd和usb设备之间的通信通道的函数有: abortpipetransfersclosepipe
isdefaultpipehalted ispipehalted
openpiperesetdefaultpipe
resetpipe
相应的打包函数接口有:
getframelengthgetframenumberreleaseframelengthcontrol setframelengthtakeframelengthcontrol
取得设置设备配置函数:
clearfeature setdescriptor
getdescriptorsetfeature
getinterface setinterface
getstatussyncframe
与usb进行交互的实现方法相关的多任务函数:
findinterfaceregisterclientdeviceid
getdeviceinforegisterclientsettings
getusbdversion registernotificationroutine
loadgenericinterfacedriver translatestringdescr
openclientregisterkeyunregisternotificationroutine
常见的Windows http://doc.guandang.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()函数来加载和卸载驱动程序。用户可以将此类的设备作为标准的文件来操作,只要调用相应的文件操作就可以和驱动程序打交道。
● 使用现有的Window http://doc.guandang.net的应用程序接口此类设备主要是利用Windows http://doc.guandang.net中已经有了现成的函数接口,例如USB Mass Storage Disk,它主要利用现有的Windows http://doc.guandang.net中已经有的可安装文件系统接口,呈现给系统可用的文件系统,对于用户来讲,它是透明的,用户仅仅感觉在操作一个文件夹。
● 创建指定到特定的USBD的用户指定的API这种方法在USBD呈现设备时不需要任何限制,主要是特制的提供API给用户,一般不太常见。
USB设备驱动程序必须输出的函数有:
● USBDeviecAttach当USB设备连接到计算机上时,USBD模块就会调用此函数,这个函数主要用于初始化USB设备,取得USB设备信息,配置USB设备,并且申请必需的资源。 ● USBInstallDriver主要用于创建一个驱动程序加载所需的注册表信息,例如读写超时,设备名称等。
● USBUninstallDriver主要用于释放驱动程序所占用的资源,以及删除
USBInstallDriver函数创建的注册表等。
上述的三个函数接口是所有的USB驱动程序必须提供的,缺一不可。
另外比较重要的是USB设备驱动程序的注册表配置,一般的USB设备驱动程序的注册表配置HKEY_LOCAL_MACHINE\Drivers\USB \LoadClients下,每个驱动程序的子键都有
Group1_ID\Group2_ID\Group3_ID\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()函数,相应的代码如下:
extern c bool
usbdeviceattach(
usb_handlehdevice, // usb设备句柄
lpcusb_funcslpusbfuncs, // usbdi的函数集合
lpcusb_interfacelpinterface, // 设备接口描述信息
lpcwstrszuniquedriverid, // 设备id描述字符串。
lpboolfacceptcontrol, // 返回true,标识我们可以控制此设备, 反之表示不能控制
dworddwunused)
{
*facceptcontrol = false;
// 我们的鼠标设备有特定的描述信息,要检测是否是我们的设备。
if (lpinterface == null)
return false;
// 打印相关的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 = new cmouse(hdevice, lpusbfuncs, lpinterface); if (pmouse == null)
return false;
if (!pmouse->initialize())
{
delete pmouse;
return false;
}
// 注册一个监控usb设备事件的回调函数,用于监控usb设备是否已经拔掉。 (*lpusbfuncs->lpregisternotificationroutine)(hdevice,
usbdevicenotifications, pmouse);
*facceptcontrol = true;
return true;
}
第二个函数是 usbinstalldriver()函数,
一些基本定义如下:
constwchargcszregisterclientdriverid[] = lregisterclientdriverid;
constwchargcszregisterclientsettings[] = lregisterclientsettings;
constwchargcszunregisterclientdriverid[] = lunregisterclientdriverid; constwchargcszunregisterclientsettings[] = lunregisterclientsetti …… 此处隐藏:12170字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [求职职场]加法运算定律的运用练习题
- [求职职场]大型石油化工工业过程节能新技术
- [求职职场]2015-2020年中国箱纸板行业分析与投资
- [求职职场]NADEX-IWC5A点焊机故障代码
- [求职职场]英语阅读 非常有用
- [求职职场]鲁卫疾控发〔2012〕2号(联合,印发山东
- [求职职场]2014年莆田公务员行测技巧:数字推理的
- [求职职场]基于最近发展区理论的高中数学课堂有效
- [求职职场]与贸易有关的知识产权协议
- [求职职场]【王风范】微演说·职场演说三
- [求职职场]新时代国珍健康大课堂
- [求职职场]群论期末考试复习题
- [求职职场]施工现场消防安全专项施工方案(范本)-
- [求职职场]初中物理光学知识点归纳完美版
- [求职职场]毕业设计总结与体会范文
- [求职职场]江南大学2018年上半年展示设计第1阶段
- [求职职场]景尚乡民兵参战支前保障方案
- [求职职场]【优质】2019年工会职工之家建设工作总
- [求职职场]数据库技术与应用—SQL Server 2008(第
- [求职职场]汽车变速箱构造与工作原理
- 首钢工业区工业遗产资源保护与再利用研
- 第4课 《大学》节选
- 2016程序文件——检验检测结果发布程序
- 2011年高考试题文言文阅读全解释__2011
- 化学是一门基础的自然科学
- 海外做市商制度的借鉴意义
- 外国建筑史复习资料(
- 七年级下思想品德期末综合测试(二)
- 思政课部2013年上学期教学工作总结
- 电大国际公法任务3 0004
- 《圆的认识》教学设计
- 中国轨道交通牵引变流器行业市场发展调
- 中泰证券#定期报告:坚守时代硬科技和
- 浅论企业财务管理与企业经营投资风险的
- 大功率半导体激光器光纤耦合技术调研报
- 中国传统家具的现状与发展探讨
- Broadcom数字电视芯片助海尔扩展高清电
- 新HSK4词汇练习 超全(五)
- 2013届高考数学单元考点复习12
- 雨霖铃精品课件




