USBHID学习手册
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
USB HID学习笔记
PC程序部分:
USB开发者论坛发布了一系列USB设备的类型定义,并配以相应的使用说明。
下面表格显示出USB的设备类型(DEVEICE CLASS):
HID类型概述
第一个被wi ndows支持的usb外围设备类是人机接口设备。
hid是human in terface 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设备通讯, 寻找与识别设备,交换数据的作用。
/* - 在 win2000DDK : C:\NTDDK\inc\ hidsdi.h 头文件中。
什么是 GUID ? 全球唯一标识符 (GUID)是一个字母数字标识符,用于指示产品的 唯一性安装。
在许多流行软件应用程序(例如 Web 浏览器和媒体
播放器)中,都使用 GUID 。
GUID 的格式为“ XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX ”,其中 每个
x 是0-9或a-f 范围内的一个十六进制的数字。
例如:
I
6F9619FF-8B86-D011-B42D-00C04FC964FF 即为有效的 GUID 值。
为什么要
使用 GUID ?
世界上的任何两台计算机都不会生成重复的 GUID 值。
GUID 主要 用于在拥有多个节点、多台计算机的网络或系统中,分配必须具有 唯一性的标识符。
在 Windows 平台上,GUID 应用非常广泛:注
册表、类及接口标识、数据库、甚至自动生成的机器名、目录名等。
第二步:应检测符合设定参数的 HID,使用函数
SetupDiGetCiaSSDeVS 。
二二二二二二二二二二二:二
HDEVINFO hUevinfO;二二二二二二二 -------------- -------- 广 typedef void *PVOID;//(winnt.h) hDevInfo = SetupDiGetClassDevs ( " ■ — i typedef PVOID HDEVINFO;//(setupapi.h)
&guidHID,
:跟 HANDLE 是一样的:
I
NULL, \ typedef void *HANDLE; //(winnt.h)
■ ■ ■■ ■■■■■ ■■■■■ ■■ ■■■■■■■■■
0,
DIGCF_PRESENT|DIGCF_DEVICEINTERFACE );
当调用该函数成功,他返回一个包含所有的与设定参数匹配如:已连接和列举,的设备信息的结构体数组 地址,该值在下一个将要调用的函数
SetupDiEnumDevicelnterfaces 中将使用到。
第三步:SetupDiE nu mDevicel nterfaces
BOOL
bSuccess
bSuccess= SetupDiE nu mDevicel nterfaces(hDevl nfo,NULL ,& guidHID,i ndex, & strtI nterfaceData);
第四步:通过上面函数 SetupDiGetClassDevs (二)给出的设备信息得到的设备的一个接口的地址, 每一次
调用必需传递一个数组的索引来指定一个接口。
例中
SP_DEVICE_INTERFACE_DATA 包含的结构用来识
别每一个 HID 的接口。
要与设备通信还需要一些更详细的信息,其中最重要的是设备路径,它可以通过 函数
SetupDiGetDeviceInterfaceDetail 得到。
SP_DEVICE_INTERFACE_DATA strtI nterfaceData;
#defi ne SPINT_ACTIVE 0X 00000001
strtI 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 DeviceI 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))
SetupDiGetDevicelnterfaceDetail 函数可传回与前一函数所识别的接口有关的结构体,
*/
第一步:需要获得 GUID””(global _ unique S r ),需要调用函数「HidD_GetHidGuid.
uidHID; ...... . ..... .......... ....... HidD_GetHidGuid( &guidHID);
通过调用它可以得到 HID 类设备的GUID , 应用程序在与 HID 设备通讯之前,必须获取 HID 类的独特标志符 GUID ,它是一个128 位值,每一位唯一表示了一个对象。
通过这 个API 函数就可以从系
统中读取该值,得到 HID 设备句柄 ____________
二、MCU FW 部分:
这里着重介绍一下报告描述符。
其他的描述符参考
USB 标准规范就可以理解。
报告描述符是USB 中最复杂的描述符,报告描述符是一个用来说明或叙述设备功能的结构, 在报告描述符中包
含许多的项目(item )。
所谓项目(item ),即是报告描述符中所包含的一连串信息。
因此项目是一连串关于此设备的信息。
所有的项目具
有一字节的前导值,其中包含了项目类型,项目卷标,项目大小与项目数据。
此外,项目又分为短项目格式与长项目格式,分别如下图:
项目中包含了可选择数据的大小,短项目可以选择的数据大小 (bSize )可以是0、1、2或4字节。
而长项目格式
的数据大小则需永远设置为
2。
由于长项目格式较少使用。
以下只介绍短项目格式。
短项目格式中还包含了一
个4位的卷标(bTag )、一个2位的类型(bType )以及用来表示数据大小的
2位(bSize )。
利用项目的基础延伸,则在一个报告描述符就含有下列的项目类型: 输入、输出、特性、集合(这四个为主要的项目)
用途(usage) ”一
用途页(usage page)
・数据大小
: 1
逻辑的最大值(logical maximum) 0
: 0字节
逻辑的最小值(logical minimum ) 1: 1 1字节 报告的长度(report size ) 2
:
2字节
报告的数值(report count)
\3: .j -
4字节
F 面来看一下前导值的取值:
t
r
*
7654 32
10 / ”
规格的东西很枯燥,我们来看看实际的例子,加深理解,以我使用的acer鼠标来做例子,插上鼠标时,从bus hound 软件上抓取的数据如下:
In put (Con sta nt), :5 bit paddi ng
Usage Page(Generic Desktop), 05 01
Usage (X), 09 30
Usage (Y), 09 31 | Usage (Wheel), 09 38
Logical Mini mum (-127), Logical Maximum (127), Report Size (8),
Report Cou nt (2), 15 81
25 7F
"s 75 08
95 03 -二
匚.
报告3个字节
r - i i
■」
冋Hound 口回(X|
Capture
關1 紳議?S- Pertsoft Saye Devices Seflinqs Help Exit +t* Phase Data | Info Time 1 M.PInase.Ofs
13 13
CTL
D'l
80朋
12 01
6d 04
00
00
00
01
02
cfl
-00
-00
-40
0(!
It
00
01ID..
L
C
T
D
SO
09
3?
80
09
3?
I
I
I
I
CTM
01
02
Ot
02
OS
CO
00
2?
04
Ous
5.3ht£
U J O
1.2.10
1.2.C
1.2.16
02 - 00
汕-01
02 - 00
DO - 01
00 - 00
OD
01
00
01
IH
Q3
00
22
(J
O
O'
J
02 00 03 - 10 Cl QO 01
E2 34 00 07 - 05 SI 08 04
00闊
00 09 01 00 - 00 OD 0DJ>
21 0«i 00 OO^OWDOIJ
05 01 09 02 lai
00 05 08 U6 00
25 01 '81 股
76 OG 105 01
朋SO H5 81 25
7f 'SI 朋cO
efl
LO
1
n-
Qu
rn
-M- 8 3
GET PESCRIPTR
2
GET DESCRIPTR
26 us
4.9ms
90 us
7-9ihs
2.1.0
2.2.0
2.2,8
8.1.0
3.2.0
5.2.8
4.1.0
5.1.0
6.1.0
6,2,0
6.2.8
6.2J6
6.2,14
6*2.82
e.2.40
G.2.40
7. UO e.
i.o
Usage Page (Ge neric Desktop),
Usage (Mouse),
Collection (Applicati on),
Usage (Poi nter),
Collectio n (Physical),
Usage Page (Butt on s),
Usage Mi nimum (01).
Usage Maxim un (03).
Logical Mi ni mum (0),
Logical Maximum (1),
Report Size (1),
Report Count (3),
In put (Data, Variable, Absolute), ;3 butt on bits
Report Size (5),
Report Count (1),
05 01
09 02
A1 00
05 09
每次报告四个字
19 01 1 ------------------------- 1
29 03
15 00
___________ 25 01
75 01
片报告3个位鶯95
03 —iiiii■-
__________ 81 02
75 05
95 01
a I m ■; ■ ^asa - a -
报告5个位
81 01
GET WESCRIPTR
3.2.16
笈T CONFIG
CLASS
GET DESCRIPTR
2
7. Osc
247hOrS
28 us
24ms
2.8ihs
IO IHE
-
3
01
01
End Collectio n, CO End Collectio n C0
end。