USB HID学习手册.doc_第1页
USB HID学习手册.doc_第2页
USB HID学习手册.doc_第3页
USB HID学习手册.doc_第4页
USB HID学习手册.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

USB HID 学习笔记一、 PC程序部分:USB开发者论坛发布了一系列USB设备的类型定义,并配以相应的使用说明。下面表格显示出 USB的设备类型(DEVEICE CLASS):HID类型概述 第一个被windows支持的usb外围设备类是人机接口设备。hid是human interface device人机接口设备的英文缩写。是指直接和人进行互动的设备。如鼠标、键盘等。运行在WINDOWS98或其他更高的版本的操作系统的PC机,系统除了提供通用的USB设备的底层驱动以外,还单独提供了一些HID设备的完整驱动,应用程序可以很容易的与操作系统内部的hid通讯。这样使得符合hid类的USB设备很容易开发与运行。也就是说,我们如果想实现一个USB的HID类设备,是不需要在Windows下开发自己的驱动程序。HID不一定要是标准的外设类型,唯一的要求是交换的数据存储在报文的结构内,设备固件必须支持报文的格式。任何工作在该限制之内的设备都可以成为一个hid,例如温度计,电压计,读卡机等。hid类设备只能使用控制传输与中断传输两种方式。HID的交换的数据格式称为报文。报文形式灵活,能处理任何类型的数据。HID特有的请求,Set_Report和Get_Report为主机和设备之间的任何类型数据块传输提供了一种方法。主机发出Get_Report请求,设备响应向主机传送数据块;主机发出Set_Report请求,设备响应准备接收主机发出的数据块。对于一个全速设备,中断传输方式下每笔事务能够传送的最大数据量是64字节,全速设备每毫秒不能有超过一笔事务,所以每秒最多传送64000字节。高速设备,每笔事务能够传送的最大数据量是1024字节。对于不能一次传输完毕的数据,接收和发送报文可以采用多笔事务。 下表列举出了与HID类设备通信过程中使用到的大量函数,这些函数的用法在DDK的帮助文档中均有详细地解释。这些函数包含在Hid.dll、Setupapi.dll、Kernel32.dll三个动态链接库中,分别起到与HID设备通讯,寻找与识别设备,交换数据的作用。什么是 GUID ? 全球唯一标识符 (GUID) 是一个字母数字标识符,用于指示产品的唯一性安装。在许多流行软件应用程序(例如 Web 浏览器和媒体播放器)中,都使用 GUID。 GUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字。例如:6F9619FF-8B86-D011-B42D-00C04FC964FF 即为有效的 GUID 值。 为什么要使用 GUID ? 世界上的任何两台计算机都不会生成重复的 GUID 值。GUID 主要用于在拥有多个节点、多台计算机的网络或系统中,分配必须具有唯一性的标识符。在 Windows 平台上,GUID 应用非常广泛:注册表、类及接口标识、数据库、甚至自动生成的机器名、目录名等。/*在win2000DDK:C:NTDDKinc hidsdi.h头文件中。*/第一步:需要获得GUID(global unique identifier),需要调用函数 HidD_GetHidGuid.GUID guidHID;HidD_GetHidGuid(&guidHID);通过调用它可以得到HID 类设备的 GUID,应用程序在与HID设备通讯之前,必须获取HID类的独特标志符GUID,它是一个128位值,每一位唯一表示了一个对象。通过这个API函数就可以从系统中读取该值,得到 HID 设备句柄.第二步:应检测符合设定参数的HID,使用函数 SetupDiGetClassDevs。HDEVINFO hDevInfo;hDevInfo = SetupDiGetClassDevs (&guidHID,NULL,0,DIGCF_PRESENT|DIGCF_DEVICEINTERFACE );当调用该函数成功,他返回一个包含所有的与设定参数匹配如:已连接和列举,的设备信息的结构体数组地址,该值在下一个将要调用的函数SetupDiEnumDeviceInterfaces中将使用到。typedef void *PVOID;/(winnt.h)typedef PVOID HDEVINFO;/(setupapi.h)跟HANDLE是一样的:typedef void *HANDLE; /(winnt.h)第三步:SetupDiEnumDeviceInterfacesBOOL bSuccessbSuccess= SetupDiEnumDeviceInterfaces(hDevInfo,NULL,&guidHID,index, &strtInterfaceData);第四步:通过上面函数SetupDiGetClassDevs(二)给出的设备信息得到的设备的一个接口的地址,每一次调用必需传递一个数组的索引来指定一个接口。例中SP_DEVICE_INTERFACE_DATA包含的结构用来识别每一个HID的接口。要与设备通信还需要一些更详细的信息,其中最重要的是设备路径,它可以通过函数SetupDiGetDeviceInterfaceDetail得到。SP_DEVICE_INTERFACE_DATA strtInterfaceData;#define SPINT_ACTIVE 0x00000001strtInterfaceData.cbSize=sizeof(SP_DEVICE_INTERFACE_DATA);strtInterfaceData.Flags=SPINT_ACTIVEif(strtInterfaceData.Flags=SPINT_ACTIVE )/如果活动 ShowMore(hDevInfo,strtInterfaceData);BOOL SetupDiGetDeviceInterfaceDetail( HDEVINFO DeviceInfoSet, PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, PSP_DEVICE_INTERFACE_DETAIL_DATA DeviceInterfaceDetailData, /是自定义类型: DWORD DeviceInterfaceDetailDataSize, PDWORD RequiredSize, PSP_DEVINFO_DATA DeviceInfoData );第五步:if (!SetupDiGetDeviceInterfaceDetail(hDevInfo,&strtInterfaceData,strtDetailData,strSzie,&requiesize,NULL)SetupDiGetDeviceInterfaceDetail函数可传回与前一函数所识别的接口有关的结构体,其中DevicePath是一个设备路径,应用通过上面函数SetupDiEnumDeviceInterfaces给出的设备接口数据设定设备接口的详细信息。第一次调用该函数时,其中的DeviceInterfaceDetailDataSize无法预知,故可以两次调用该函数,第一次调用出错,但可以返回正确的DeviceInterfaceDetailDataSize ,第二次调用传递返回值,调用即可成功。通过以上步骤基本可以建立与设备的连接了。如想获得更多关于设备能力的信息,还可以使用HidD_GetAttributes函数,HidP_Get-PreparsedData函数,HidP_GetPreparsedData函数,他们都是包含在hid.dll文件中的。分别可以实现获得厂商ID,产品ID,Usage, Usage Page,报文长度等,不再一一赘述。二、 MCU FW部分:这里着重介绍一下报告描述符。其他的描述符参考USB标准规范就可以理解。报告描述符是USB中最复杂的描述符,报告描述符是一个用来说明或叙述设备功能的结构,在报告描述符中包含许多的项目(item)。所谓项目(item),即是报告描述符中所包含的一连串信息。因此项目是一连串关于此设备的信息。所有的项目具有一字节的前导值,其中包含了项目类型,项目卷标,项目大小与项目数据。此外,项目又分为短项目格式与长项目格式,分别如下图:databTagbTypebSize内容位字节1-n8n.8765432100databLong/temTagbDataSize1111内容位字节3-n8n.2423 22 21 20 19 18 17 1615 14 13 12 11 10 9 87 6 5 41211103 21 00短项目格式长项目格式项目中包含了可选择数据的大小,短项目可以选择的数据大小(bSize)可以是0、1、2或4字节。而长项目格式的数据大小则需永远设置为2。由于长项目格式较少使用。以下只介绍短项目格式。短项目格式中还包含了一个4位的卷标(bTag)、一个2位的类型(bType)以及用来表示数据大小的2位(bSize)。利用项目的基础延伸,则在一个报告描述符就含有下列的项目类型:l 输入、输出、特性、集合(这四个为主要的项目)数据大小:0:0字节1:1字节2:2字节3:4字节l 用途(usage)l 用途页(usage page)l 逻辑的最大值(logical maximum)l 逻辑的最小值(logical minimum)l 报告的长度(report size)l 报告的数值(report count)下面来看一下前导值的取值:bTagbTypebSize765432100项目类型:0:主要项目卷标(main)1:整体项目卷标(global)2:区域项目卷标(local)3:保留对于bTag的取值,请参考下列表:1、 主要项目卷标(main)bTag(卷标位)名称数据大小数据1000Input14bit0:0:数据1:常数bit1:0:数组1:变量bit2:0:绝对值1:相对值bit3:0:无覆盖1:覆盖bit4:0:线性1:非线性bit5:0:优先选择的1:无优先选择bit6:0:无空状态1:空的状态bit7:保留bit8:0:位字段1:缓冲的字节bit31-9:保留1001Output14同上,(bit7不一样,0:不易更动的,1:易更动的)1011Feature14同Output1010Collection10x00实体(physical)工具组0x01集合(application)鼠标、键盘0x02逻辑(logical)相关联的数据0x03报告(report)0x04命名的数组(Named Array)0x05用途切换(usage switch)0x06用途修改(usage modifier)0x07-0x7f保留0x80-0xff用户定义1100End Collection0其他保留2、 整体项目卷标(global)bTag(卷标位)名称数据大小0000用途页,usage page10001逻辑最小值1-40010逻辑最大值1-40011实际最小值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软件上抓取的数据如下:0x22表示抓取的报告描述符抓取的报告描述符Usage Page (Generic Desktop), 05 01Usage (Mouse), 09 02Collection (Application),A1 01Usage (Pointer),09 01Collection (Physical),A1 00每次报告四个字节Usage Page (Buttons),05 09Usage Minimum (01),19 01Usage Maximun (03),29 03Logical Minimum (0),15 00Logical Maximum (1),25 01报告3个位Report Size (1),75 01Report Count (3),95 03Input (Data, Variable, Absolute), ;3 button bits81 02报告5个位Report Size (5),75 05Report Count (1),95 01Input (Constant), ;5 bit padding81 01Usag

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论