Windows主机端与自定义USB HID设备通信详解
USB的HID通信协议
USB的HID通信协议USB HID(Human Interface Device)通信协议是一种用于实现USB设备与计算机之间人机交互的通信标准。
它定义了如何将输入和输出的信息在USB总线上进行传输并进行解释。
在该协议中,设备被称为USB HID设备,计算机被称为主机。
以下是USB HID通信协议的详细介绍。
1.通信协议层次结构USBHID通信协议定义了四个层次的模型。
最底层是物理层,负责USB总线的电气特性和通信速率。
上一层是USB传输层,负责数据包传输的同步和差错检测。
再上一层是USB配置层,负责设备枚举和配置。
最顶层是HID层,负责定义设备的输入输出报告格式和解析。
2.报告描述符HID通信协议通过报告描述符定义设备的输入和输出报告格式。
输入报告描述设备向主机传输输入数据,输出报告描述主机向设备传输输出数据。
报告描述符包含了报告ID、报告大小和报告类型等信息,主机通过解析报告描述符来理解设备传输的数据。
3.报告传输设备通过中断传输和控制传输与主机进行通信。
中断传输是指设备周期性地传输输入报告给主机,主机可以根据需要设置中断传输的频率。
控制传输是指主机向设备发送控制命令或获取设备属性信息。
4.事件推送和轮询设备可以通过事件推送和轮询两种方式向主机传输数据。
事件推送是指设备主动向主机发送输入报告。
轮询是指主机定期向设备发送轮询请求,设备在收到请求后返回输入报告。
事件推送和轮询可以结合使用,以满足不同的应用需求。
5.输入报告解析主机通过解析输入报告来获取设备传输的数据。
输入报告由报告ID和报告数据组成。
主机可以根据报告描述符的信息来解析报告数据,获取具体的输入信息。
解析后的数据可以用于触发软件事件或更新设备状态。
6.输出报告处理主机通过发送输出报告向设备传输数据。
输出报告也由报告ID和报告数据组成。
设备可以根据报告描述符的信息解析报告数据,并根据需要进行相应的处理。
7.随机访问HID通信协议支持主机以随机方式访问设备的输入输出报告。
USBHID协议详情
USB HID类设备属于人机交互操作的设备,是一个比较大的类,用于控制计算机操作的某些方面,如USB鼠标、USB键盘、USB游戏操作杆、USB触摸板、USB轨迹球、电话拨号设备、VCR遥控等等设备。
另外,使用HID设备的一个好处就是操作系统自带了HID类的驱动程序,用户无需开发很麻烦的驱动程序,只有直接使用API调用即可完成通信,所有很多简单的USB设备喜欢枚举成HID设备,这样就可以不用安装驱动而直接使用。
1、HID设备描述符当插入USB设备后,主机会向设备请求各种描述符来识别设备。
为了把一个设备识别为HID类,设备在定义描述符的时候必须遵守HID规范。
HID设备的描述符除了5个USB的标准描述符(设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符)外,还包括3个HID设备类特定描述符:HID描述符、报告描述符、物理描述符。
HID描述符是关联于接口(而不是端点)的,所以设备不需要为每个端点都提供一个HID描述符。
设备和主机的通信是通过报告的形式来实现的。
而物理描述符不是必需的。
5个标准描述符中与HID设备有关的部分有:设备描述符中bDeviceClass、bDeviceSubClass和bDeviceProtocol三个字段的值必须为0。
接口描述符中bInterfaceClass的值必须为0x03,bInterfaceSubClass的值为0或1,为1表示HID设备是一个启动设备(BootDevice,一般对PC机而言才有意义,意思是BIOS启动时能识别并使用您的HID设备,且只有标准鼠标或键盘类设备才能成为Boot Device。
如果为0则只有在操作系统启动后才能识别并使用您的HID设备)。
HID接口描述符中bInterfaceProtocol的含义bInterfaceProtocol的取值含0 NO1 键2 鼠3~255 保1.1 HID描述符HID描述符关联于接口描述符,因而如果一个设备只有一个接口描述符,则无论它有几个端点描述符,HID设备只有一个HID描述符。
USB_HID协议中文版——USB接口HID设备
USB_HID协议中文版——USB接口HID设备
一、什么是USBHID协议
USB HID(Human Interface Device)协议是一种应用在USB接口上
的应用层通信协议,它不仅定义了用于特定应用的设备的接口规范,而且
可以帮助开发者更快捷、更准确地实现其产品化。
USB HID是USB接口应用层通信协议中最常用的一种协议,它通过主
机和设备之间的endpoints来建立简单的通信框架,从而实现设备连接和
输入输出控制。
最初被设计用于用户界面(如鼠标、键盘等),但它的应
用领域已经不仅限于此,无论是电源管理控制、温度控制器、读卡器、按键、触摸板或其他交互式设备,都可以通过USB HID来实现。
二、USBHID协议框架
USBHID协议规范定义了主机与设备之间的通信机制,其使用形式类
似于USB驱动程序,主要有以下几个部分:
1、Device Definition:描述支持HID协议的设备的特性,包括设备
所具备的功能,如鼠标按键、键盘、触摸板等;
2、Descriptor:定义设备的接口,描述设备与用户界面之间的结构
关系;
3、Report Descriptor:描述报告的格式,定义HID设备的所有输入
和输出数据;
4、Input Report:指从键盘、鼠标、按钮等设备向主机发送的数据;
5、Output Report:指从主机向设备发送的数据,以从设备更改状态
或进行其他操作;
6、Feature Report:当输入输出数据不足以满足需求时。
USB HID协议中文版——USB接口HID设备
第8章USB接口HID设备HID(Human Interface Device,人机接口设备)是USB设备中常用的设备类型,是直接与人交互的USB设备,例如键盘、鼠标与游戏杆等。
在USB设备中,HID设备的成本较低。
另外,HID设备并不一定要有人机交互功能,只要符合HID类别规范的设备都是HID设备。
Wndows操作系统最先支持的HID设备。
在windows 98以及后来的版本中内置有HID 设备的驱动程序,应用程序可以直接使用这些驱动程序来与设备通信。
在设计一个USB接口的计算机外部设备时,如果HID类型的设备可以满足需要,可以将其设计为HID类型设备,这样可以省去比较复杂的USB驱动程序的编写,直接利用Windows操作系统对标准的HID类型USB设备的支持。
8.1 HID设备简介8.1.1 HID设备的特点•交换的数据储存在称为报表(Report)的结构内,设备的固件必须支持HlD报表的格式。
主机通过控制和中断传输中的传送和请求报表来传送和接收数据。
报表的格式非常灵活。
•每一笔事务可以携带小量或中量的数据。
低速设备每一笔事务最大是8B,全速设备每一笔事务最大是64B,高速设备每一笔事务最大是1024B。
一个报表可以使用多笔事务。
•设备可以在未预期的时间传送信息给主机,例如键盘的按键或是鼠标的移动。
所以主机会定时轮询设备,以取得最新的数据。
•HID设备的最大传输速度有限制。
主机可以保证低速的中断端点每10ms内最多1笔事务,每一秒最多是800B。
保证全速端点每lms一笔事务,每一秒最多是64000B。
保证高速端点每125 us三笔事务,每一秒最多是24.576MB。
•HID设备没有保证的传输速率。
如果设备是设置在10ms的时距,事务之间的时间可能等于或小于10ms。
除非设备是设置在全速时在每个帧传输数据,或是在高速时在每个微帧传输数据。
这是最快的轮询速率,所以端点可以保证有正确的带宽可供使用。
windows hid原理
windows hid原理
Windows HID(Human Interface Device)原理涉及操作系统与输入设备之间的交互。
HID是一种通用的设备类别,包括键盘、鼠标、游戏手柄等。
Windows操作系统通过HID协议与这些设备进行通信。
在Windows中,HID设备通过设备驱动程序与操作系统进行通信。
当用户操作键盘或鼠标时,设备会生成相应的信号,通过USB 或蓝牙等接口传输到计算机。
操作系统的HID驱动程序会接收这些信号,并将其转换成操作系统能够理解的输入数据。
HID设备发送的数据通常是一系列的报文,其中包含了设备类型、按键状态、鼠标移动信息等。
Windows操作系统的HID驱动程序会解析这些报文,然后将其转换成对应的输入事件,比如键盘按键按下、鼠标移动等。
一旦操作系统接收到这些输入事件,它会将其传递给相应的应用程序或者系统组件进行处理。
比如,键盘输入会传递给当前获得焦点的应用程序,鼠标移动则会影响鼠标指针在屏幕上的位置等。
总的来说,Windows HID原理涉及操作系统通过HID驱动程序与输入设备进行通信,将设备发送的数据转换成操作系统能够理解的输入事件,最终传递给应用程序或系统组件进行处理。
这种交互过程保证了用户能够通过各种HID设备与计算机进行交互操作。
USB的HID通信协议
USB的HID通信协议USB的HID(Human Interface Device)通信协议是一种用于连接计算机和外部人机交互设备的通信协议。
HID协议定义了计算机和设备之间的数据传输格式、数据解释和通信流程,以实现设备的控制和数据交换。
下面将详细介绍USB的HID通信协议。
B的HID通信协议基本概念:USB的HID通信协议是在USB(Universal Serial Bus)标准之上定义的一种通信协议。
USB是一种高速串行总线标准,提供了与设备进行通信的硬件接口。
而HID通信协议定义了在USB接口上进行人机交互设备通信的规则和格式。
2.HID通信协议的数据传输格式:HID通信协议使用报文的方式进行数据传输。
每个报文由一个报头和一个或多个数据包组成。
报头包含了指示报文类型、报文长度等信息,数据包中存放实际的数据。
通常情况下,报文的数据是按字节进行传输的,但对于特定类型的设备,也可以使用其他格式进行传输。
3.HID通信协议的数据解释:HID通信协议定义了一种标准的数据解释方式,以便计算机能够正确地解释设备发送的数据。
例如,在鼠标设备中,数据包中的前2个字节表示鼠标的横坐标和纵坐标的变化量。
计算机根据这些数据来控制鼠标的移动。
4.HID通信协议的通信流程:HID通信协议规定了在设备和计算机之间进行通信的具体流程。
在通信开始前,设备必须向计算机发送设备描述符以告知其设备的类型和功能。
计算机收到设备描述符后,会根据描述符中的信息来设置相应的数据报文格式和解释方式。
设备在工作过程中,会根据HID协议规定的规则和格式发送数据到计算机,计算机则负责解析这些数据并执行相应的操作。
5.HID通信协议的扩展功能:HID通信协议除了定义了基本的数据传输、数据解释和通信流程外,还提供了一些扩展功能来支持设备的特殊需求。
这些扩展功能包括通信协议的可配置性、事件通知机制、设备状态的上报以及多设备的管理等。
总结:USB的HID通信协议是一种用于连接计算机和外部人机交互设备的通信协议。
USB接口HID设备说明书
第8章USB接口HID设备HID(Human Interface Device,人机接口设备)是USB设备中常用的设备类型,是直接与人交互的USB设备,例如键盘、鼠标与游戏杆等。
在USB设备中,HID设备的成本较低。
另外,HID设备并不一定要有人机交互功能,只要符合HID类别规范的设备都是HID设备。
Wndows操作系统最先支持的HID设备。
在windows 98以及后来的版本中内置有HID 设备的驱动程序,应用程序可以直接使用这些驱动程序来与设备通信。
在设计一个USB接口的计算机外部设备时,如果HID类型的设备可以满足需要,可以将其设计为HID类型设备,这样可以省去比较复杂的USB驱动程序的编写,直接利用Windows操作系统对标准的HID类型USB设备的支持。
8.1 HID设备简介8.1.1 HID设备的特点•交换的数据储存在称为报表(Report)的结构内,设备的固件必须支持HlD报表的格式。
主机通过控制和中断传输中的传送和请求报表来传送和接收数据。
报表的格式非常灵活。
•每一笔事务可以携带小量或中量的数据。
低速设备每一笔事务最大是8B,全速设备每一笔事务最大是64B,高速设备每一笔事务最大是1024B。
一个报表可以使用多笔事务。
•设备可以在未预期的时间传送信息给主机,例如键盘的按键或是鼠标的移动。
所以主机会定时轮询设备,以取得最新的数据。
•HID设备的最大传输速度有限制。
主机可以保证低速的中断端点每10ms内最多1笔事务,每一秒最多是800B。
保证全速端点每lms一笔事务,每一秒最多是64000B。
保证高速端点每125 us一笔事务,每一秒最多是24.576MB。
•HID设备没有保证的传输速率。
如果设备是设置在10ms的时距,事务之间的时间可能等于或小于10ms。
除非设备是设置在全速时在每个帧传输数据,或是在高速时在每个微帧传输数据。
这是最快的轮询速率,所以端点可以保证有正确的带宽可供使用。
上位机编程实现与USB—HID设备通信
上位机编程实现与USB—HID设备通信【摘要】在上位机中,通过人机交互界面,利用Windows提供的API函数,实现应用程序对HID设备的访问。
指出调用API函数的过程和方法,并提供了实现方法的具体实例。
【关键词】上位机;USB_HID;Visual C++;人机接口设备1.引言USB全称为Universal Serial Bus(通用串行总线),是一种快速、灵活的总线接口。
在USB出现之前,计算机接口在传输速度方面都存在速度偏低,容易产生I/O冲突,中断不够用等缺点。
人机接口设备(HID)主要是指一些人与计算机进行交互的设备,如键盘、鼠标、游戏杆等;但是HID设备不一定非要是这些人机交互设备,只要符合HID 设备定义规范要求的都可以认为是HID设备。
HID设备有以下主要特点:(1)交换的数据存储在报告的结构内,设备必须支持HID报告格式。
(2)每笔事务可以携带小量或中量的数据。
低速设备每笔事务最大为8字节,全速设备每笔最大为64字节,高速设备最大为1024字节;(3)有最大传输速度的限制。
低速设备最快10ms一笔事务,最高速度为800B/s;全速设备最快1ms一笔事务,最高速度为64KB/s;高速设备最快125μs 一笔事务,最高速度为24.576MB/s。
如何在应用程序中对HID类设备进行访问呢?在Windows环境下,不允许用户在应用程序中直接访问硬件设备,应用程序必须通过一个中间桥梁才能访问硬件设备,这个中间桥梁就是设备驱动程序。
从Windows98操作系统开始,为HID类设备提供了通用的驱动程序,所以只要按照HID设备类的规范编写设备的固件程序,就能够让Windows系统自动识别设备,省去了复杂的驱动程序编写过程。
2.Visual C++介绍应用基于MFC AppWizard的应用程序。
MFC(Microsoft Foundation Class Library)中的各种类结合起来构成了一个应用程序框架,它的目的就是在此基础上来建立Windows下的应用程序,这是一种相对SDK来说更为简单的方法。
如何编写应用程序与USBHID设备通讯
如何编写应用程序与USBHID设备通讯编写应用程序与USBHID设备通讯的过程可以分为以下几个步骤:设备初始化、数据读取与写入以及释放资源。
下面将详细介绍如何完成每个步骤。
1.设备初始化:首先,需要获取系统中的所有HID设备信息,并找到目标设备的相关信息,如厂商ID、产品ID等。
可以使用操作系统提供的API函数来实现这一步骤,例如,Windows系统可以使用SetupAPI、DeviceIoControl等函数来获取设备信息。
2.打开设备:找到目标设备后,需要使用操作系统提供的API函数打开设备。
在Windows系统下,使用CreateFile函数打开设备句柄。
在Linux系统下,可以通过打开特定的文件来获取设备句柄。
3.读取数据:打开设备后,可以使用ReadFile函数从设备中读取数据。
需要设置好读取的缓冲区大小和读取的超时时间等相关参数。
读取的数据通常以报文形式传输,需要根据设备的通信协议进行解析和处理。
4.写入数据:使用WriteFile函数将数据写入设备。
写入的数据也通常以报文形式进行传输,需要按照设备的通信协议来填充报文的内容。
5.释放资源:通信完成后,需要关闭设备句柄并释放相关资源。
在Windows系统下,使用CloseHandle函数关闭设备句柄;在Linux系统下,使用close函数关闭设备文件描述符。
总结起来,编写应用程序与USBHID设备通讯的过程包括设备初始化、打开设备、读取数据、写入数据以及释放资源等步骤。
具体实现过程需要根据操作系统和编程语言的不同而有所调整,但总体思路相似。
通过调用操作系统提供的API函数来完成和USBHID设备的通信,可以实现读取和写入数据的功能。
Windows主机端与自定义USB_HID设备通信详解
Windows主机端与自定义USBHID设备通信详解说明:-以下结论都是基于WindowsXP系统所得出的,不保证在其他系统的适用性。
-在此讨论的是HID自定义设备,对于标准设备,譬如USB鼠标和键盘,由于操作系统对其独占,许多操作未必能正确执行。
1.所使用的典型WindowsAPICreateFileReadFileWriteFile以下函数是DDK的内容:HidD_SetFeatureHidD_GetFeatureHidD_SetOutput ReportHidD_GetInput Report其中,CreateFile用于打开设备;ReadFile、HidD_GetFeature、HidD_GetInput Report 用于设备到主机方向的数据通信;WriteFile、HidD_SetFeature、HidD_SetOutputReport 用于主机到设备方向的数据通信。
鉴于实际应用,后文主要讨论CreateFile,WriteFile,Rea dFile,HidD_SetFeature四个函数,明白了这四个函数,其它的可以类推之。
2.几个常见错误当使用以上API时,如果操作失败,调用GetLastError()会得到以下常见错误:6:句柄无效23:数据错误(循环冗余码检查)87:参数错误1784:用户提供的buffer无效后文将会详细说明这些错误情况。
3.主机端设备枚举程序流程4.函数使用说明CreateFile(devDetail->DevicePath,//设备路径GENERIC_READ|GENERIC_WRITE,//访问方式FILE_SHARE_READ|FILE_SHARE_WRITE,//共享模式NULL,OPEN_EXISTING,//文件不存在时,返回失败FILE_FLAG_OVERLAPPED,//以重叠(异步)模式打开NULL);在这里,CreateFile用于打开HID设备,其中设备路径通过函数SetupDiGetInterfaceDeviceDetail取得。
usb hid原理
usb hid原理USB HID原理USB HID(Human Interface Device)是一种用于计算机与外部设备之间交互的通信协议。
它定义了计算机与各种输入设备(如键盘、鼠标、游戏控制器等)之间的通信方式,使得这些设备可以直接与计算机进行数据交换。
USB HID的工作原理是通过在设备和主机之间建立一种标准化的通信协议,实现设备与计算机的数据传输。
在USB HID协议中,设备被定义为一个或多个功能,每个功能包含一个或多个控制点。
这些控制点可以是输入(Input)、输出(Output)或特性(Feature)。
在USB HID的通信过程中,设备通过发送报告(Report)与计算机进行数据交换。
报告是设备与主机之间传输数据的基本单位,它可以包含多个字段,每个字段都有自己的含义和长度。
设备会定期向计算机发送报告,或者在某些事件触发时主动发送报告,计算机则根据报告中的数据进行相应的处理。
USB HID的通信流程如下:首先,计算机会向设备发送一个获取报告的请求,设备收到请求后会根据自身的功能和状态来生成一个报告,并将报告发送回计算机。
然后,计算机会根据报告中的数据进行相应的处理,例如更新屏幕上的图像、执行特定的操作等。
设备还可以根据需要发送其他类型的报告,例如输出报告用于控制设备的状态。
USB HID的优势在于其简单、通用和易于使用。
通过使用USB HID 协议,不同类型的输入设备可以通过同一种协议与计算机进行通信,而无需为每种设备都设计独立的驱动程序。
这使得设备的开发和兼容性更加方便,同时也减少了对计算机系统资源的占用。
USB HID协议还支持热插拔功能,即在计算机运行时可以随时插拔设备而无需重新启动系统。
这使得用户可以方便地连接和断开设备,而无需担心系统的稳定性和安全性。
总结起来,USB HID是一种用于计算机与外部设备之间交互的通信协议,通过建立标准化的通信方式,实现设备与计算机之间的数据传输。
USBHID协议
USBHID协议USB HID(Human Interface Device)是一种USB设备类别,用于连接和通信与人机交互相关的输入和输出设备。
HID协议定义了HID设备和主机之间的通信规范,确保设备能够正确地与计算机进行交互。
以下是对USB HID协议的详细说明,以及其在实际应用中的一些重要方面。
USBHID协议具有简单、通用和可扩展的特点。
它适用于各种输入和输出设备,如键盘、鼠标、游戏手柄、触摸屏、数字笔等。
通过HID协议,这些设备可以将用户的输入信息传输给计算机,并接收来自计算机的控制信号和反馈信息。
HID协议使用报告(Report)的概念来进行数据交换。
报告是一组有序的数据项,用于描述设备的状态和事件。
设备根据特定的报告描述(Report Descriptor)来构建和解析报告。
报告描述包含报告的结构、大小、类型和含义等信息。
HID设备通过发送报告给主机,以将用户输入传输到计算机。
主机在接收到报告后,可以根据报告的内容来进行相应的处理,例如模拟按键、鼠标移动,或者执行其他自定义操作。
主机也可以向设备发送报告,以控制设备的行为,例如改变设备的灯光状态、调节设备的参数等。
HID协议支持两种类型的报告:输入报告和输出报告。
输入报告描述了设备的状态和事件,例如按键按下、鼠标移动等。
设备通过发送输入报告来向主机提供这些信息。
输出报告用于设备接收主机的控制信号,例如要求设备执行其中一种操作、改变设备状态等。
HID协议还支持特殊的传输方式,如中断传输和控制传输。
中断传输用于快速地、实时地传输报告。
设备可以配置为定期地发送报告,以实现低延迟的数据传输。
控制传输用于设备与主机之间的配置和管理操作,例如设备的插拔检测、报告描述的请求和更新等。
HID协议还提供了一些高级功能,如力反馈(Force Feedback)和按键重复(Key Repeat)等。
力反馈允许设备通过触感反馈给用户,增强交互体验。
按键重复功能允许设备自动发送多个按键事件,减少用户的按键频率。
如何编写应用程序与USB HID 设备通讯(读写USB HID设备)
如何编写应用程序与USB HID 设备通讯(读写USB HID设备)说明:本实例所使用的上位机程序开发工具为Visual C++6.0。
一、修改下位机固件程序我们如果想实现一个USB的HID类设备,不需要在Windows下开发自己的驱动程序。
HID 不一定要是标准的外设类型,唯一的要求是交换的数据存储在报文的结构内,设备固件必须支持报文的格式。
任何工作在该限制之内的设备都可以成为一个HID,例如温度计、电压计、读卡机等。
报文的格式是由报告描述符决定的,所以只要修改描述符就能实现我们需要的报文格式。
下面我们来实现一个简单的报文格式:上位机发送固定64字节数据给设备,这个数据可以是命令,也可是数据,具体含义并不是由报告描述符来决定的,是由开发人员事先约定好的。
设备返回的数据也是64个字节,同样这个数据流的每个字节(甚至每个位)的具体含义由开发人员事先约定好。
1、修改报告描述符A、在Descriptor.C中找到以MouseReportDescriptor函数,将其内容修改如下:1.code char MouseReportDescriptor[29] = {2. 0x06,0x00,0xFF, //USAGE_PAGE (Vendor Defined Page 1)3. 0x09,0x01, //USAGE (Vendor Usage 1)4. 0xA1,0x01, //COLLECTION (Application)5.6. 0x19,0x01, //(Vendor Usage 1)7. 0x29,0x08, //(Vendor Usage 1)8. 0x15,0x00, //LOGICAL_MINIMUM (0)9. 0x26,0xFF,0x00, //LOGICAL_MAXIMUM (255)10. 0x75,0x08, //REPORT_SIZE (8)11. 0x95,0x40, //REPORT_COUNT (64)12. 0x81,0x02, //INPUT (Data,Var,Abs)13.14. 0x19,0x01, //(Vendor Usage 1)15. 0x29,0x08, //(Vendor Usage 1)16. 0x91,0x02, //OUTPUT (Data,Var,Abs)17.18. 0xC0 // END_COLLECTION19.};此报告描述符定义了64个字节的输入输出数据。
USB HID设备开发简介与实例分析
USB HID设备开发简介与实例分析目录USB简介 (2)USB通信机制与设备介绍 (3)2.1USB通信机制 (3)2.2USB设备及枚举 (4)HID设备 (5)3.1HID设备简介 (5)3.2HID设备报表描述符 (6)3.3HID设备的访问 (7)总线数据分析软件 (8)4.1Bus Hound (8)4.2USBlyzer (10)实例分析 (10)USB简介USB是通用串行总线(Universal Serial Bus)的缩写,已有20多年历史。
主要是为了简化PC与外设的连接,增加易用性。
USB具有即插即用特性,即热插拔。
如下图的标准USB接口,电源与地线会突出,在连接时电源与地先接通,然后中间两根信号线再接通,这样防止烧坏芯片。
常见的USB接口:随着智能手机的兴起,Micro-B型USB接口大量使用,并随之产生了Type-C接口,该接口不分正反面随意插拔,传输速度有明显提升,如下图。
USB协议类型:随着外设的发展,对接口速度要求越来越高,从USB产生到现在已经经历了5个版本,如下表。
USB通信机制与设备介绍2.1USB通信机制USB是主从结构的系统。
主机叫Host,从机叫Device。
通常主机具有一个或多个USB主控制器(host controller)和根集线器(root hub),USB集线器可以对原有的USB接口在数量上进行扩展,但不能扩展出更多的带宽。
USB是主从结构,所有的通信都由主机发起。
在USB设备连接主机时,主机能检测到接口电平的变化,进而识别出插入的是什么速度类型的设备。
USB有四种传输类型:控制传输:USB设备接入主机时,通过控制传输获取设备描述符进行设备识别批量传输:传输大量数据,如打印机和扫描仪中断传输:数据少量但实时性高,如鼠标和键盘等时传输:数据的建立、传送和接收是连续且实时的,对传输延迟非常敏感,如语音传输控制传输:在设备的枚举过程中使用控制传输(Control Transaction),分为三个阶段:建立过程,可选的数据过程及状态过程。
如何使用WinUSB与USB设备(USBDevice)通信
WinUSB 体系结构由内核模式驱动程序 (Winusb.sys) 和用户模式动态链接库 (Winusb.dll) 组成。
Winusb.sys 是一种内核模式驱动程序,可在 USB 设备的内核模式设备堆栈的协议驱动程序之上 作为筛选器驱动程序或功能驱动程序进行安装。 Winusb.dll 是一种公开 WinUSB 功能的用户模式 DLL。 当 Winusb.sys 作为设备的功能驱动程序安装后,应用程序可以使用这些功能与其进行通信。
独立硬件供应商 IHV 必须使用与 USB 设备类型(而不是总线类型)相关的安装程序类。 如果要开发一个 Microsoft 还没有为其提供现有类 GUID 的设备类型,可以定义一个新的设备安装程序类。
Windows 8 中定义了一个名为 USBDevice ( ClassGuid = {88BAE032-5A81-49f0-BC3D-A4FF138216D6} ) 的新安装程序类。 如果您正在开发一个设备类型,请将您的设备与 <USBDevice> 而不是 <安装程序类 USB> 关联。 USBDevice 类支持 Windows Vista 以及更高版本的操作系统。
3. Choose to select the location of the new driver manually and browse to the folder where you downloaded the driver
制造 USB 设备的独立硬件供应商 (IHV) 必须经常为应用程序提供访问设备功能的途径。 在过去,这意味着使用 Windows 驱动程序模型 (WDM) 为设备实现一个功能驱动程序, 并将该驱动程序安装在设备栈中系统提供的协议驱动程序之上。 Windows 驱动程序基础 (WDF) 现在是 USB 驱动程序的首选模型。
USBHID设备类协议入门
USBHID设备类协议入门USB HID(Human Interface Device)设备类协议是一种用于连接人机界面设备(如键盘、鼠标、游戏控制器)到计算机的通信协议。
该协议定义了设备和主机之间的数据传输格式、命令和响应等规则,使得不同厂商的HID设备可以在不同操作系统上正常工作。
1.键盘设备:USBHID键盘设备协议定义了键盘数据的传输格式。
键盘通过发送按键代码和状态信息告知主机用户的输入。
主机则通过向键盘发送命令来控制LED指示灯的状态。
2.鼠标设备:USBHID鼠标设备协议定义了鼠标数据的传输格式。
鼠标传输的数据包括鼠标移动、按键和滚轮信息等。
主机通过解析这些数据来控制光标的移动和与鼠标相关的操作。
3.游戏控制器:USBHID游戏控制器设备协议支持各种类型的游戏控制器,如游戏手柄、方向盘和航空杆等。
该协议规定了游戏控制器的按键、摇杆和轴等输入数据的格式和传输方式。
4.触摸屏设备:USBHID触摸屏设备协议定义了触摸屏的输入数据格式。
触摸屏通过发送坐标和触摸状态信息来告知主机用户的触摸操作。
在USB HID设备类协议中,设备和主机之间的通信基于报告描述器(Report Descriptor)。
报告描述器定义了设备的输入和输出报告格式。
设备将报告描述器发送到主机,以便主机能够正确解析设备发送的数据。
总结来说,USBHID设备类协议是用于连接各种人机界面设备到计算机的协议。
它定义了设备和主机之间的通信规则和数据格式,以确保不同类型的设备在不同的操作系统上能够正常工作。
通过了解和遵守USBHID设备类协议,设备制造商可以确保产品的兼容性,并提供更好的用户体验。
USBHID协议中文版——USB接口HID设备
USBHID协议中文版——USB接口HID设备USB HID(Human Interface Device)协议,即USB人机接口设备协议,是一种用于在计算机和外部设备之间进行通信的协议。
USB HID设备包括各种外部设备,如键盘、鼠标、游戏手柄等。
它将这些设备的输入信息以标准格式传输给计算机,并接收来自计算机的控制命令。
USBHID协议是USB规范的一部分,通过定义报告描述符和相关命令,定义了HID设备和主机之间的通信方式。
HID设备通过USB接口连接到计算机主机,主机通过发送控制命令来获取设备的状态信息或者向设备发送控制命令。
USBHID协议采用面向报告的架构。
报告是HID设备与主机之间通信的基本单位,它包含设备的输入或输出数据。
报告描述符定义了报告的结构和内容。
HID设备可以定义多个报告,每个报告有一个唯一的报告ID,主机通过这个ID来区分不同报告。
报告分为输入报告和输出报告两种类型,输入报告用于向主机提供设备的输入数据,输出报告用于接受来自主机的控制命令。
在USBHID协议中,主机与设备之间的通信是通过控制传输、中断传输和批量传输三种方式实现的。
控制传输用于获取设备的状态信息或者发送控制命令,中断传输用于实时传输设备的输入数据,批量传输用于传输大量的数据。
USBHID协议还定义了一些标准报告类型,如键盘报告、鼠标报告、游戏控制器报告等。
这些报告类型定义了这些设备的输入输出格式,以及设备状态的解析规则。
主机可以根据这些标准报告类型来识别设备以及解析设备的输入输出数据。
USBHID协议还支持设备的热插拔功能,即在计算机运行期间可以动态地插拔设备。
当设备插入计算机时,主机会检测到设备,并为设备分配一个唯一的地址。
当设备被拔出时,主机会释放该地址,从而实现设备的热插拔。
总之,USBHID协议是一种用于在计算机和外部设备之间进行通信的协议。
它定义了HID设备和主机之间的通信方式,以及设备的输入输出格式。
USBHID协议中文版——USB接口HID设备
USBHID协议中文版——USB接口HID设备HID协议是一种设备到计算机的通信协议,它为设备和计算机之间提
供匿名交互功能。
HID使设备能够发送命令给计算机,并以此来控制计算机,示例如屏幕光标的移动、键盘上的按键操作等等。
HID使用USB接口,这个接口允许双向传输,所以HID的连接可以让设备向计算机发送和接收
信息。
HID协议是一个可靠的,支持多种设备的协议,它可以用来连接不同
类型的设备,包括普通的读写硬盘、鼠标、键盘、显示器、外部存储器等等。
HID协议的灵活性使它可以用于实现各种功能,其中包括具有强制性
的政府标准设备、无线设备等。
HID协议的主要目的是为设备提供轻量级的数据交换框架,能够高效
地传递设备数据,高度定制化,从而有效降低传输数据的时间和功耗。
HID协议与其他传输协议相比,具有许多优点,例如:
1.不需要改变协议:HID协议能够提供灵活的连接,不需要改变协议
就可以操作不同的实体设备,减少硬件和软件的发展成本和时间。
2.安全性高:HID协议具有认证,授权和加密功能,能够保护数据不
受未经授权的访问。
3.支持热插拔:HID设备可以在系统运行时插入或拔出,无需重新启
动系统。
USB的HID通信协议
USB事务处理是主机和设备之间数据传输的基本单位,由一系列具有特定格式的信息包组成。
因此,要了解完整的USB通信协议,必须从USB的信息传输单元包及其数据域谈起。
通过由下而上,从简单至复杂的通信协议单位组成各种复杂的通信协议,进而构建出完整的通信协议。
16.4.1 包包(Packet)是USB系统中信息传输的基本单元,所有数据都是经过打包后在总线上传输的。
首先了解一下包的组成。
USB包由五部分组成,即同步(SYNC)字段、包标识符(PID)字段、数据字段、循环冗余校验(CRC)字段和包结尾(EOP)字段,包的基本格式如下:同步字段(SYNC) PID字段数据字段 CRC字段包结尾字段(EOP)在USB的数据传输中,所有的传输包都起始于SYNC,接着是PID,后面是包中所包含的数据信息,接下来是用来检测包中数据错误的循环冗余校验信息,最后以包结尾作为结束标志。
下面我们将一一介绍每个字段。
1.同步(SYNC)字段SYNC字段由8位组成,作为每个数据信息包的前导。
顾名思义,它是用来产生同步作用的,目的是使USB设备与总线的包传输率同步,它的数值固定为00000001。
2.包标识符(PID)字段PID字段是紧随在SYNC字段后面,用来表示数据信息包的类型。
在USB协议中,根据PID的不同,USB包有着不同的类型,分别表示具有特定的意义。
如下所示:PID0 PID1 PID2 PID3包标识符长度为一个字节(8个数据位),由4个位的包类型字段和4个位的校验字段构成。
PID是USB包类型的唯一标志,USB主机和USB设备在接收到包后,必须首先对包标识符解码得到包的类型,并判断其意义从而做出下一个反应。
包标识符中的校验字段是通过对类型字段的每个位求反码产生的,它是用来对包类型字段进行错误检测用的,旨在保证对包的标识符译码的可靠性,如果4个检验位不是它们各自的类型位的反码,则说明标识符中的信息有错误。
表16-2中列出了信息包的类型,包括令牌、数据、握手或特殊四种信息包类型。
Windows环境下HID设备通讯接口的设计
Windows环境下HID设备通讯接口的设计崔阳【期刊名称】《计算机与现代化》【年(卷),期】2013(0)7【摘要】为解决HID设备与主机应用程序的通讯问题,首先对HID设备的性能特点和32位Windows环境下的通讯机制进行了分析,在此基础上设计出一个实用的新型HID设备通讯接口.该接口利用相关Windows API函数实现HID设备的识别、打开和关闭,并以异步模式实现设备与主机应用程序的双向通讯过程.实验编程以Wave Panel为平台,结果证明该通讯接口的通用性较好,能够有效地完成HID设备与主机应用程序的通讯功能.%To solve the communication problem between human interface devices (HID) and the computer applications,performance characteristics and the communication mechanism of HID in 32-bit Windows environment are analyzed first,based on that a new and practical communication interface is designed.Related Windows APIs are utilized by the interface to identify,open and close HID,and the two-way communication between HID and computer applications is achieved in asynchronous mode.Wave Panel is taken as experimental platform,and the results show that the interface is of good generality and communication function,it can be better accomplished with it.【总页数】5页(P172-175,179)【作者】崔阳【作者单位】中国劳动关系学院,北京100048【正文语种】中文【中图分类】TP319【相关文献】1.Windows环境下脑机接口视觉刺激器的设计 [J], 程光辉;石锐;何庆华2.Windows环境下C++语言与Foxpro图形的接口设计 [J], 葛利玲;张英杰3.64位Windows环境下HID设备通讯问题的研究 [J], 崔阳4.基于Wave Panel的HID设备通讯接口设计 [J], 崔阳5.Windows环境下可编程控制器通讯程序的设计 [J], 周治平因版权原因,仅展示原文概要,查看原文内容请购买。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Windows主机端与自定义USB HID设备通信详解 (2009-06-12 23:19)分类:Windows说明:-以下结论都是基于Windows XP系统所得出的,不保证在其他系统的适用性。
-在此讨论的是HID自定义设备,对于标准设备,譬如USB鼠标和键盘,由于操作系统对其独占,许多操作未必能正确执行。
1.所使用的典型Windows APICreateFileReadFileWriteFile以下函数是DDK的内容:HidD_SetFeatureHidD_GetFeatureHidD_SetOutputReportHidD_GetInputReport其中,CreateFile用于打开设备;ReadFile、HidD_GetFeature、HidD_GetInputReport用于设备到主机方向的数据通信;WriteFile、HidD_SetFeature、HidD_SetOutputReport用于主机到设备方向的数据通信。
鉴于实际应用,后文主要讨论CreateFile,WriteFile,ReadFile,HidD_SetFeature四个函数,明白了这四个函数,其它的可以类推之。
2.几个常见错误当使用以上API时,如果操作失败,调用GetLastError()会得到以下常见错误:6:句柄无效23:数据错误(循环冗余码检查)87:参数错误1784:用户提供的buffer无效后文将会详细说明这些错误情况。
3.主机端设备枚举程序流程4.函数使用说明CreateFile(devDetail->DevicePath, //设备路径GENERIC_READ | GENERIC_WRITE, //访问方式FILE_SHARE_READ | FILE_SHARE_WRITE, //共享模式NULL,OPEN_EXISTING, //文件不存在时,返回失败FILE_FLAG_OVERLAPPED, //以重叠(异步)模式打开NULL);在这里,CreateFile用于打开HID设备,其中设备路径通过函数SetupDiGetInterfaceDeviceDetail取得。
CreateFile有以下几点需要注意:- 访问方式:如果是系统独占设备,例如鼠标、键盘等等,应将此参数设置为0,否则后续函数操作将失败(譬如HidD_GetAttributes);也就是说,不能对独占设备进行除了查询以外的任何操作,所以能够使用的函数也是很有限的,下文的一些函数并不一定适合这些设备。
在此顺便列出MSDN上关于此参数的说明:If this parameter is zero, the application can query file anddevice attributes without accessing the device. This isuseful if an application wants to determine the size of afloppy disk drive and the formats it supports withoutrequiring a floppy in the drive. It can also be used to test forthe file's or directory's existence without opening it for reador write access。
-重叠(异步)模式:此参数并不会在此处表现出明显的意义,它主要是对后续的WriteFile,ReadFile有影响。
如果这里设置为重叠(异步)模式,那么在使用WriteFile,ReadFile时也应该使用重叠(异步)模式,反之亦然。
这首先要求WriteFile,ReadFile的最后一个参数不能为空(NULL)。
否则,便会返回87(参数错误)错误号。
当然,87号错误并不代表就是此参数不正确,更多的信息将在具体讲述这两个函数时指出。
此参数为0时,代表同步模式,即WriteFile,ReadFile操作会在数据处理完成之后才返回,否则阻塞在函数内部。
ReadFile(hDev, //设备句柄,即CreateFile的返回值recvBuffer, //用于接收数据的bufferIN_REPORT_LEN, //要读取数据的长度&recvBytes, //实际收到的数据的字节数&ol); //异步模式在这里,ReadFile用于读取HID设备通过中断IN传输发来的输入报告。
有以下几点要注意:1、ReadFile的调用不会引起设备的任何反应,即HID设备与主机之间的中断IN传输不与ReadFile打交道。
实际上主机会在最大间隔时间(由设备的端点描述符来指定)内轮询设备,发出中断IN传输的请求。
“读取”即意味着从某个buffer里面取回数据,实际上这个buffer就是HID设备驱动中的buffer。
这个buffer的大小可以通过HidD_SetNumInputBuffers来改变。
在XP上缺省值是32(个报告)。
2、读取的数据对象是输入报告,也即通过中断输入管道传入的数据。
所以,如果设备不支持中断IN传输,那么是无法使用此函数来得到预期结果的。
实际上这种情况不可能在HID中出现,因为协议指明了至少要有一个中断IN端点。
3、IN_REPORT_LEN代表要读取的数据的长度(实际的数据正文+一个byte 的报告ID),这里是一个常数,主要是因为设备固件的信息我是完全知道的,当然知道要读取多少数据(也就是报告的长度);不过也可以通过另外的函数(HidD_GetPreparsedData)来事先取得报告的长度,这里不做详细讨论。
因为很难想象在不了解固件信息的情况下来做自定义设备的HID通信,在实际应用中一般来说就是固件与PC程序匹配着来开发。
此参数如果设置过大,不会有实质性的错误,在recvBytes参数中会输出实际读到的长度;如果设置过小,即小于报告的长度,会返回1784号错误(用户提供的buffer无效)。
4、关于异步模式。
前面已经提过,此参数的设置必须与CreateFile时的设置相对应,否则会返回87号错误(参数错误)。
如果不需要异步模式,此参数需置为NULL。
在这种情况下,ReadFile会一直等待直到数据读取成功,所以会阻塞住程序的当前过程。
WriteFile(hDev, //设备句柄,即CreateFile的返回值reportBuf, //存有待发送数据的bufferOUT_REPORT_LEN, //待发送数据的长度&sendBytes, //实际收到的数据的字节数&ol); //异步模式在这里,WriteFile用于传输一个输出报告给HID设备。
有以下几点要注意:1、与ReadFile不同,WriteFile函数被调用后,虽然也是经过驱动程序,但是最终会反映到设备中。
也就是说,调用WriteFile后,设备会接收到输出报告的请求。
如果设备使用了中断OUT传输,则WriteFile会通过中断OUT管道来进行传输;否则会使用SetReport请求通过控制管道来传输。
2、OUT_REPORT_LEN代表要写入的数据长度(实际的数据正文+一个byte的报告ID)。
如果大于实际报告的长度,则使用实际报告长度;如果小于实际报告长度,会返回1784号错误(用户提供的buffer无效)。
3、reportBuf[0]必须存有待发送报告的ID,并且此报告ID指示的必须是输出报告,否则会返回87号错误(参数错误)。
这种情况可能容易被程序员忽略,结果不知错误号所反映的是什么,网上也经常有类似疑问的帖子。
顺便指出,输入报告、输入报告、特征报告这些报告类型,是反映在HID设备的报告描述符中。
后文将做举例讨论。
4、关于异步模式。
前面已经提过,此参数的设置必须与CreateFile时的设置相对应,否则会返回87号错误(参数错误)。
如果不需要异步模式,此参数需置为NULL。
在这种情况下,WriteFile会一直等待直到数据读取成功,所以会阻塞住程序的当前过程。
HidD_SetFeature(hDev, //设备句柄,即CreateFile的返回值reportBuf, //存有待发送数据的bufferFEATURE_REPORT_LEN); //buffer的长度HidD_SetOutputReport(hDev, //设备句柄,即CreateFile的返回值reportBuf, //存有待发送数据的bufferOUT_REPORT_LEN); //buffer的长度HidD_SetFeature发送一个特征报告给设备,HidD_ SetOutputReport发送一个输出报告给设备。
注意以下几点:1、跟WriteFile类似,必须在reportBuf[0]中指明要发送的报告的ID,并且和各自适合的类型相对应。
也就是说,HidD_SetFeature只能发送特征报告,因此报告ID必须是特征报告的ID;HidD_SetOutputReport只能发送输出报告,因此报告ID只能是输出报告的ID。
2、这两个函数最常返回的错误代码是23(数据错误)。
包括但不仅限于以下情况:- 报告ID与固件描述的不符。
- 传入的buffer长度少于固件描述的报告的长度。
据有关资料反映(非官方文档),只要是驱动程序对请求无反应,都会产生此错误。
5.常见错误汇总- HID ReadFile- Error Code 6 (handle is invalid)传入的句柄无效- Error Code 87 (参数错误)很可能是createfile时声明了异步方式,但是读取时按同步读取。
- Error Code 1784 (用户提供的buffer无效):传参时传入的“读取buffer长度”与实际的报告长度不符。
- HID WriteFile- Error Code 6 (handle is invalid)传入的句柄无效- Error Code 87(参数错误)- CreateFile时声明的同步/异步方式与实际调用WriteFile时传入的不同。
- 报告ID与固件中定义的不一致(buffer的首字节是报告ID)- Error Code 1784 (用户提供的buffer无效)传参时传入的“写入buffer长度”与实际的报告长度不符。
- HidD_SetFeature- HidD_SetOutputReport- Error Code 1 (incorrect function)不支持此函数,很可能是设备的报告描述符中未定义这样的报告类型(输入、输出、特征)- Error Code 6 (handle is invalid)传入的句柄无效- Error Code 23(数据错误(循环冗余码检查))- 报告ID与固件中定义的不相符(buffer的首字节是报告ID)- 传入的buffer长度少于固件定义的报告长度(报告正文+1byte, 1byte为报告ID)- 据相关资料反映(非官方文档),只要是驱动程序不接受此请求(对请求无反应),都会产生此错误6.报告描述符及数据通信程序示例报告描述符(由于是汇编代码,所以不必留意其语法,仅需注意表中的每个数据都占1个字节):_ReportDescriptor: //报告描述符.dw 0x06, 0x00, 0xff //用法页.dw 0x09, 0x01 //用法(供应商用法1).dw 0xa1, 0x01 //集合开始.dw 0x85, 0x01 //报告ID(1).dw 0x09, 0x01 //用法(供应商用法1).dw 0x15, 0x00 //逻辑最小值(0).dw 0x26, 0xff, 0x0 //逻辑最大值(255).dw 0x75, 0x08 //报告大小(8).dw 0x95, 0x07 //报告计数(7).dw 0x81, 0x06 //输入(数据,变量,相对值).dw 0x09, 0x01 //用法(供应商用法1).dw 0x85, 0x03 //报告ID(3).dw 0xb1, 0x06 //特征(数据,变量,相对值).dw 0x09, 0x01 //用法(供应商用法1).dw 0x85, 0x02 //报告ID(2).dw 0xb1, 0x06 //特征(数据,变量,相对值).dw 0x09, 0x01 //用法(供应商用法1).dw 0x85, 0x04 //报告ID(4).dw 0x91, 0x06 //输出(数据,变量,相对值).dw 0xc0 //结合结束_ReportDescriptor_End:这个报告描述符,定义了4个不同的报告:输入报告1,特征报告2,特征报告3,输出报告4(数字代表其报告ID)。