




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、USB HID学习笔记PC程序部分:USB开发者论坛发布了一系列 USB设备的类型定义,并配以相应的使用说明。下面表格显示出 USB的设备类 型(DEVEICE CLASS):设备粪型(device class)设备举例真型常量 7C lass corit sort)I音频 C audio)ITSB DLVICE CL AS S.AUDIO|通I-MODEfflJSB_DECICE_CL ASAT ION SHIDUSB DEVICE.CL ASINTERFACEITSB DEVICE CL ASTOR物理回应谀务励力回馈式游戏擬纵杆JSB DEVICE CLASS FHrSICALINIEE
2、FACE电漁不间晰电滴供应|IISB DEVICE CL AS S.PClR打印机USB DEVICE CLASS PKINTER大量的存储器ITSB DEVICE CLASS STORMEflUBIT5B DEVICE CL AS 5 HUBHID类型概述第一个被wi ndows支持的usb外围设备类是人机接口设备。hid是human in terface device人机接口设备的英文缩写。是指直接和人进行互动的设备。如鼠标、键盘等。运行在 WINDOWS98或其他更高的版本的操作系统的PC机,系统除了提供通用的 USB设备的底层驱动以外,还单独提供了一些 HID设备的完整驱动,应用程序可
3、以很容易的与操作系统内部的hid通讯。这样使得符合 hid类的USB设备很容易开发与运行。也就是说,我们如果想实现一个 USB的HID类设备,是不需要在 Windows下开发自己的驱动程序。HID不一定要是标准的外设类型,唯一的要求是交换的数据存储在报文的结构内,设备固件必须支持报文的格式。任何工作在该限制 之内的设备都可以成为一个hid,例如温度计,电压计,读卡机等。hid类设备只能使用控制传输与中断传输两种方式。HID的交换的数据格式称为报文。报文形式灵活,能处理任何类型的数据。HID特有的请求,Set_Report和Get_Report为主机和设备之间的任何类型数据块传输提供了 一种方法
4、。主机发出 Get_Report请求,设备响应向主机传送数据块;主机发出Set_Report请求,设备响应准备接收主机发出的数据块。对于一个全速设备,中断传输方式下每笔事务能够传送的最大数据量是64字节,全速设备每毫秒不能有超过一笔事务,所以每秒最多传送64000字节。高速设备,每笔事务能够传送的最大数据量是1024字节。对于不能一次传输完毕的数据,接收和发送报文可以采用多笔事务。下表列举出了与 HID类设备通信过程中使用到的大量函数,这些函数的用法在DDK的帮助文档中均有详细地解释。这些函数包含在 Hid.dll、Setupapi.dll、Kernel32.dll三个动态链接库中,分别起到与
5、 HID设备通讯, 寻找与识别设备,交换数据的作用。API函數巩口?件功能HidP GetHidGui<l五孔dll脚謎别的Set upIiGet Clillf专回一不接备信息群.包含牯定粪前所有 股备|S et up!) iEnuiiD evdce Int erf acesSetupapi. dll陆回詹息辟丙二不惑的奩息ISetupDiGetDevicelnt erf aceDet iilSetupapi* d.11H专忖设备路隹Hi dD G etAtt r itut e effid.dll叩审回厂商与产品,及版本号码HiiP-CetValiueCapsHid. dll陆回描述设备
6、能顽s构dll开启设备通信WritsFileKernels?, dll送二不輸出振文给设备KeajdFileKernel32. dll伙谟备谋取报文|CloseEaridleKemel32. dllBStCreateFil &使用的资源|Set upDiDest r oyDevicfilnf cListSetupapi. dll释戒Set upD iGetCl assD svs腹用的费源|ITiiD CetPrepar£edDat a.Flid. dll返回一个旬嗣馮¥设盈总万蓿息的盪新HidIi FreePreparse(iDatHid. dll釋放HiiD Ge
7、tPreparsedDat ai用的茨源HidTi SetFeat ureHid. dll传送一牛特征报文绪设备HidD CetP&atiireHi± dll丄氏总/* - 在 win2000DDK : C:NTDDKinc hidsdi.h 头文件中。什么是 GUID ?*/第一步:需要获得 GUID”(global _ unique Sr),需要调用函数HidD_GetHidGuid.uidHID;HidD_GetHidGuid( &guidHID);通过调用它可以得到 HID类设备的GUID, 应用程序在与 HID设备通讯之前,必须获取 HID类的独特标志符 G
8、UID,它是一个128 位值,每一位唯一表示了一个对象。通过这 个API函数就可以从系统中读取该值,得到 HID设备句柄全球唯一标识符 (GUID)是一个字母数字标识符,用于指示产品的 唯一性安装。在许多流行软件应用程序(例如Web浏览器和媒体播放器)中,都使用 GUID。GUID 的格式为“ XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX ”,其中 每个x是0-9或a-f范围内的一个十六进制的数字。例如:I6F9619FF-8B86-D011-B42D-00C04FC964FF 即为有效的 GUID 值。 为什么要使用 GUID ?世界上的任何两台计算机都不会生成重
9、复的GUID值。GUID主要用于在拥有多个节点、多台计算机的网络或系统中,分配必须具有 唯一性的标识符。在Windows平台上,GUID应用非常广泛:注册表、类及接口标识、数据库、甚至自动生成的机器名、目录名等。第二步:应检测符合设定参数的HID,使用函数 SetupDiGetCiaSSDeVS。二二二二二二二二二二二:二HDEVINFO hUevinfO;二二二二二二二广 typedef void *PVOID;/(winnt.h)hDevInfo = SetupDiGetClassDevs (" i typedef PVOID HDEVINFO;/(setupapi.h)&
10、;guidHID,:跟 HANDLE 是一样的:INULL, typedef void *HANDLE; /(winnt.h) 0,DIGCF_PRESENT|DIGCF_DEVICEINTERFACE );当调用该函数成功,他返回一个包含所有的与设定参数匹配如:已连接和列举,的设备信息的结构体数组 地址,该值在下一个将要调用的函数SetupDiEnumDevicelnterfaces中将使用到。第三步:SetupDiE nu mDevicel nterfacesBOOLbSuccessbSuccess= SetupDiE nu mDevicel nterfaces(hDevl nfo,NUL
11、L,& guidHID,i ndex, & strtI nterfaceData);第四步:通过上面函数 SetupDiGetClassDevs (二)给出的设备信息得到的设备的一个接口的地址,每一次调用必需传递一个数组的索引来指定一个接口。例中SP_DEVICE_INTERFACE_DATA 包含的结构用来识别每一个 HID的接口。要与设备通信还需要一些更详细的信息,其中最重要的是设备路径,它可以通过 函数 SetupDiGetDeviceInterfaceDetail 得到。SP_DEVICE_INTERFACE_DATAstrtI nterfaceData;#defi n
12、e SPINT_ACTIVE 0x00000001strtI nterfaceData.cbSize=sizeof(SP_DEVICE_INTERFACE_DATA);strtI nterfaceData.Flags=SPINT_ACTIVE if(strtI nterfaceData.Flags=SPINT_ACTIVE )/ 如果活动ShowMore(hDevI nfo,strtI nterfaceData);BOOL SetupDiGetDeviceI nterfaceDetail(HDEVINFO DeviceI nfoSet,PSP_DEVICE_INTERFACE_DATA Dev
13、iceI nterfaceData,PSP_DEVICE_INTERFACE_DETAIL_DATA DeviceI nterfaceDetailData, /是自定义类型:DWORD DeviceI nterfaceDetailDataSize,PDWORD RequiredSize,PSP_DEVINFO_DATA DeviceI nfoData);第五步:if (!SetupDiGetDevicel nterfaceDetail(hDevI nfo,& strtl nterfaceData,strtDetailData,strSzie, &requiesize,NULL)
14、SetupDiGetDevicelnterfaceDetail函数可传回与前一函数所识别的接口有关的结构体,其中DevicePath是一个设备路径,应用通过上面函数 SetupDiEnumDevicelnterfaces给出的设备接口数据设定设备接口的详细信息。第一次调用该函数时,其中的 DeviceInterfaceDetailDataSize无法预知,故可以两次调用该函数,第一次调用出错,但可以返回正确的DeviceI nterfaceDetailDataSize ,第二次调用传递返回值,调用即可成功。通过以上步骤基本可以建立与设备的连接了。如想获得更多关于设备能力的信息,还可以使用Hid
15、D_GetAttributes函数,HidP_Get-PreparsedData函数,HidP_GetPreparsedData函数,他们都是包含在 hid.dll文件中的。分别可以实现获得厂商ID,产品ID,Usage,Usage Page报文长度等,不再一一赘述。二、MCU FW 部分:这里着重介绍一下报告描述符。其他的描述符参考USB标准规范就可以理解。报告描述符是USB中最复杂的描述符,报告描述符是一个用来说明或叙述设备功能的结构,在报告描述符中包含许多的项目(item)。所谓项目(item),即是报告描述符中所包含的一连串信息。因此项目是一连串关于此设备的信息。所有的项目具有一字节的
16、前导值,其中包含了项目类型,项目卷标,项目大小与项目数据。此外,项目又分为短项目格式与长项目格式,分别如下图:位8n. .876543210内容databTagbTypebSize字节1-n0短项目格式位8n .2423 22 21 20 19 18 17 1615 14 13 12 11 10 9 87 6 5 43 21 0内容databLon g/temTagbDataSize11111110字节3-n210长项目格式项目中包含了可选择数据的大小,短项目可以选择的数据大小(bSize)可以是0、1、2或4字节。而长项目格式的数据大小则需永远设置为2。由于长项目格式较少使用。以下只介绍短项
17、目格式。短项目格式中还包含了一个4位的卷标(bTag)、一个2位的类型(bType)以及用来表示数据大小的2位(bSize)。利用项目的基础延伸,则在一个报告描述符就含有下列的项目类型: 输入、输出、特性、集合(这四个为主要的项目)用途(usage)”一用途页(usage page)数据大小:1逻辑的最大值(logical maximum)0:10字节逻辑的最小值(logical minimum)1:11字节报告的长度(report size)2:12字节报告的数值(report count)3:.j -4字节F面来看一下前导值的取值:tr*76543210 / ”bTagbType .二二网
18、萸,r项目类型:00:主要项目卷标* -11(ma in)!1:整体项目卷标(global)i 2:区域项目卷标(local)对于bTag的取值,请参考下列表::3 :保留i1、主要项目卷标(main)bTag(卷标位)名称数据大小数据1000In put14bit00数据1常数bit10数组1变量bit20绝对值1相对值bit30无覆盖1覆盖bit40线性1非线性bit50优先选择的1无优先选择bit60无空状态1空的状态bit7保留bit8:0:位字段1 :缓冲的字节bit31-9 :保留1001Output14同上,(bit7不一样,0:不易更动的,1:易更动的)1011Feature1
19、4同 Output1010Collectio n10x00实体(physical)工具组0x01集合(application)鼠标、键盘0x02逻辑(logical)相关联的数据0x03报告(report)0x04命名的数组(Named Array)0x05用途切换(usage switch)0x06用途修改(usage modifier)0x07-0x7f保留0x80-0xff用户定义1100End Collectio n0其他保留2、整体项目卷标(global)bTag(卷标位)名称数据大小0000用途页,usage page10001逻辑取小值1-40010逻辑取大值1-40011实际最
20、小值1-40100实际最大值1-40101单位模型1-40110单位1-40111报告长度1 +1000报告ID11001报告计数值1 +1010推入01011取出0其他保留3、区域项目卷标(local)bTag(卷标位)名称数据大小数据0000用途10001用途最小值10010用途最大值10011指定者的索引值10100指疋者的最小值10101指定者的最大值10111字符串索引值11000字符串最小值11001字符串最大值11010设置界线器11 =打开设置,0=关闭设置其他保留规格的东西很枯燥,我们来看看实际的例子,加深理解,以我使用的acer鼠标来做例子,插上鼠标时,从bus hound
21、 软件上抓取的数据如下:冋BusHound口回(X|Capture關1 紳議?S-PertsoftSayeDevices SeflinqsHelpExit+t*GET WESCRIPTRPhaseData| InfoTime 1 M.PInase.Ofs1313CTLD'l80朋12 01 6d 040000000102cfl-00-00-400(!It0001ID.LCTTLcDISO093?80093?IIcIIcCTM0102Ot02OSCO002?04Ous5.3ht£UjO1.2.101.2.C1.2.1602 - 00汕-0102 - 00DO - 0100 -
22、00OD010001IHQ30022(JOOSO'JDI02 00 03- 10 Cl QO 01E2 34 00 07 - 05 SI 08 0400闊00 09 01 00 - 00 OD 0DJ>21 0«i 00 OOOWDOIJeo oe od v>15o o(i ” oo05 01 09 02 lai 00 05 08 U6 00 25 01 '81 股 76 OG 105 01 朋 SO H5 81 25 7f 'SI 朋 cO eflLO91 _£3 on-Qu2rnu8-M- rD8 3coGET PESCRIPTR2GET DESCRIPTR26 us4.9ms90 us7-9ihs2.1.02.2.02.2,88.1.03.2.05.2.83.2.16笈T CONFIGCLASSGET DESCRIPTR27. Osc247hOrS28 us 24ms 2.8ihsIOihe-H-34.1.05.1.06.1.06,2,06.2.86.2J66.2,146*2.82e.2.40G.2.407. UO e. i.oUsage Page (Ge neric Desktop),Usage (M
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新能源商用车型号2025年市场需求与电动货车充电设施应用场景研究报告
- 2025年新能源汽车废旧电池回收处理技术与市场前景研究报告
- 垃圾分类政策的公众参与和效果研究试题及答案
- 项目管理知识更新的重要性试题及答案
- 项目绩效评估标准与实施试题及答案
- 新能源汽车分时租赁与智能交通系统融合创新研究评估报告
- 软件设计师与行业趋势试题及答案
- 网络工程师考试复习要点及试题及答案
- 掌握2025年软件设计师考试的最佳实践及试题及答案
- 2025年生物制药绿色生产流程优化与推广路径研究
- 2025年《安全生产月》活动实施方案 (2份)-61
- 小升初谚语试题及答案
- 福建百校联考2025届高三5月高考押题卷-英语试卷(含答案)
- 项目一 动力电池课件 任务4 动力电池性能检测
- 装修陪跑服务合同协议
- 2025年浙江宁波市余姚市粮食收储有限公司招聘笔试参考题库附带答案详解
- 2025年高考语文作文预测52篇(含范文)
- 2025届高考政治一轮复习:统编版选择性必修3《逻辑与思维》知识点考点复习提纲
- 销售流程管理制度细则
- 心肾综合征诊疗实践指南解读
- 服务机器人应用开发-全面剖析
评论
0/150
提交评论