处理HID报告

HID设备和主机之间的通信使用称为“报告”的数据结构进行。输入报告从设备发送到主机,以响应设备状态更改、主机查询或可配置超时。在状态改变的情况下,设备通过中断终端向主机发送相关输入报告的新副本。这是通过调用USBDHIDReportWrite()实现的。尽管其他USB设备类驱动程序要求应用程序在每次调用驱动程序的“PacketWrite”功能时不发送超过1个数据包,但HID设备类驱动程序允许发送完整的报告。如果传递的报告长于端点的最大数据包大小,则类驱动程序将处理将其拆分为多个USB数据包的过程。将完整报告传输到主机并确认后,应用程序的传输事件处理程序将接收USB事件发送完成,指示应用程序可以发送另一份报告。主机还可以轮询输入报告的最新版本。此过程涉及对端点0的请求,并导致应用程序必须响应的一系列事件。在收到Get_Report请求时,HID设备类驱动程序将USBD_HID_EVENT_Get_Report发送到应用程序receive回调。应用程序必须通过返回指向所请求报表的最新版本的指针和以字节为单位的报表大小来对此作出响应。然后,该数据通过端点0返回到主机,并使用发送到接收回调的USBD_HID_EVENT_REPORT_通知应用程序成功完成传输。另一种情况可能导致发送输入报告。每个输入报告都有一个与其相关联的超时,当此时间间隔到期时,无论设备状态是否已更改,都必须将报告返回到主机。使用来自的set-Idle请求设置超时通过将超时设置为0,可以完全禁用主机(例如,当与Windows PC通信时,通常对鼠标和键盘执行此操作)。HID设备类驱动程序在内部跟踪每个输入报告所需的超时。当计时器过期,指示必须重新发送报告时,USBD_HID_EVENT_IDLE_TIMEOUT将发送到应用程序接收回调。与前一种情况一样,应用程序必须使用指向相应报表的指针及其字节长度进行响应。在这种情况下,返回的报告使用中断进入端点传输到主机,并使用发送到传输回调的USB-EVENT-TX-COMPLETE通知应用程序成功完成传输。请注意,应用程序返回有关报表位置和大小的信息,并且不能调用USBDHIDReportWrite()来响应此事件。输出和功能报告从主机发送到设备,指示其设置各种参数和选项。设备可以选择是通过端点0进行所有主机到设备的报告通信,还是使用专用中断输出端点。典型的主机到设备通信是低带宽的,可以使用端点零通信,但是,如果需要专用端点,则设备的tUSBDHIDDevice结构中的现场总线输出点应设置为true。如果使用专用端点进行输出和功能报告,则只要报告数据包可用,就会调用应用程序接收回调,并使用可用的USB事件接收。在这个回调过程中,应用程序可以调用USBDHIDPacketRead()来检索数据包。如果不能立即读取数据包,HID设备类驱动程序稍后会回拨应用程序,以给它另一个机会。在读取数据包之前,NAK被发送到主机,以防止发送更多数据。在使用端点0传输输出和功能报告的更典型情况下,应用程序可以在接收回调上预期以下事件序列

USBD_HID_EVENT_GET_REPORT_BUFFER表示已从主机接收到Set_REPORT请求,设备类驱动程序正在请求一个缓冲区,可将接收到的报告写入其中。应用程序必须返回一个指向缓冲区的指针,该缓冲区至少与存储报表所需的大小相同。USBD_HID_EVENT_SET_REPORT一旦报告数据已从端点0读取到先前USBD_HID_EVENT_GET_REPORT_buffer回调上提供的缓冲区中,接下来将执行USBD_HID_EVENT_REPORT。在发送此事件后,设备类驱动程序无法访问报告缓冲区,应用程序可以在这一点之后按照自己的意愿处理内存。

HID设备类驱动程序定义

数据结构

Data Structures
tHIDClassDescriptorInfo
tHIDDescriptor
tHIDKeyboardUsageT able
tHIDReportIdle
tUSBDHIDDevice
Collection(ui8Value)
COMPOSITE_DHID_SIZE
EndCollection
Feature(ui8Value)
Feature2(ui16Value)
Input(ui8Value)
Input2(ui16Value)
LogicalMaximum(i8Value)
LogicalMinimum(i8Value)
Output(ui8Value)
Output2(ui16Value)
PhysicalMaximum(i16Value)
PhysicalMinimum(i16Value)
ReportCount(ui8Value)
ReportID(ui8Value)
ReportSize(ui8Value)
Unit(ui32Value)
UnitAccelerationSI
UnitAngAccelerationSI
UnitCurrent_A
UnitDistance_cm
UnitDistance_i
UnitEnergySI
UnitExponent(i8Value)
UnitForceSI
UnitMass_g
UnitMomentumSI
UnitRotation_deg
UnitRotation_rad
UnitT emp_F
UnitT emp_K
UnitTime_s
UnitVelocitySI
UnitVoltage
Usage(ui8Value)
UsageMaximum(ui8Value)
UsageMinimum(ui8Value)
UsagePage(ui8Value)
UsagePageVendor(ui16Value)
UsageVendor(ui16Value)
USBD_HID_EVENT_GET_PROTOCOL
USBD_HID_EVENT_GET_REPORT
USBD_HID_EVENT_GET_REPORT_BUFFER
USBD_HID_EVENT_IDLE_TIMEOUT
USBD_HID_EVENT_REPORT_SENT
USBD_HID_EVENT_SET_PROTOCOL
USBD_HID_EVENT_SET_REPORT

void ∗ USBDHIDCompositeInit (uint32_t ui32Index, tUSBDHIDDevice ∗psHIDDevice, tCom-
positeEntry ∗psCompEntry)
void ∗ USBDHIDInit (uint32_t ui32Index, tUSBDHIDDevice ∗psHIDDevice)
uint32_t USBDHIDPacketRead (void ∗pvHIDInstance, uint8_t ∗pi8Data, uint32_t ui32Length,
bool bLast)
void USBDHIDPowerStatusSet (void ∗pvHIDInstance, uint8_t ui8Power)
bool USBDHIDRemoteWakeupRequest (void ∗pvHIDInstance)
uint32_t USBDHIDReportWrite (void ∗pvHIDInstance, uint8_t ∗pi8Data, uint32_t ui32Length,
bool bLast)
uint32_t USBDHIDRxPacketAvailable (void ∗pvHIDInstance)
void ∗ USBDHIDSetRxCBData (void ∗pvHIDInstance, void ∗pvCBData)
void ∗ USBDHIDSetTxCBData (void ∗pvHIDInstance, void ∗pvCBData)
void USBDHIDT erm (void ∗pvHIDInstance)
uint32_t USBDHIDTxPacketAvailable (void ∗pvHIDInstance)

详细说明本节中定义的宏和函数可以在头文件device/usbdhid.h中找到。

HID设备类驱动程序的用户还需要包括usbhid.h,其中包括主机和设备实现所需的HID相关定义。

数据结构文档

tHIDClassDescriptorInfo
定义:
typedef struct
{
uint8_t bDescriptorType;
uint16_t wDescriptorLength;
}
tHIDClassDescriptorInfo

成员:bdescriptor键入HID类描述符的类型。这将是USB USB_HID_DTYPE_REPORT or USB_HID_DTYPE_PHYSICAL (隐藏数据类型报告或USB隐藏数据类型物理报告)。wDescriptorLength隐藏类描述符的总长度。

描述:类描述符信息结构用于宣布HID描述符中存在HID特定的类描述符。

tHIDDescriptor定义

typedef struct
{
uint8_t bLength;
uint8_t bDescriptorType;
uint16_t bcdHID;
uint8_t bCountryCode;
uint8_t bNumDescriptors;
tHIDClassDescriptorInfo sClassDescriptor[1];
}
tHIDDescriptor

成员:

bLength此描述符的长度(字节)。

bdescriptor键入描述符的类型。对于HID描述符,这将是USB HID DTYPE HID。

BCD HID标识设备支持的HID类规范版本的BCD值。例如,对于版本1.11,该值将为0x0111。

bccountrycode此硬件本地化的国家/地区代码,如果未执行本地化,则为0。有效的国家(或语言)代码以USB HID U country U xxx格式的标签表示。

bNumDescriptors此设备存在的特定于类的描述符数。这表示附加到此结构且必须至少为1的类描述符信息结构的数目(因为所有HID设备必须至少发布1个报表描述符)。

sClassDescriptor宣布此设备发布的每个特定于类的描述符的表。数组中的实际条目数由bNumDescriptors字段给出。

描述:HID描述符插入到接口描述符之后,HID类设备的端点描述符之前。

tHIDKeyboardUsageT able

typedef struct
{
uint8_t ui8BytesPerChar;
uint32_t pui32CapsLock[USBH_HID_CAPS_ARRAY_SZ];
void*pvCharMapping;
}
tHIDKeyboardUsageTable

成员:ui8bytes此结构的pCharMapping表中每个字符的字节数。

pui32CapsLock这是一个压缩的位屏蔽结构,具有一个位标志,指示相应的用法ID是否受Caps Lock键的影响。

pvCharMapping这是使用ID到字符值的索引表。它的大小必须至少为ui8BytesPerChar*2*USBH_HID_MAX_USAGE字节,因为它被视为双索引数组

说明:此结构定义USB使用标识符到可打印字符的映射。这个结构有三个成员来保存这些信息。ui8BytesPerChar表示表中每个字符的字节数。pui32CapsLock数组包含一个使用标识符的压缩位数组,可以通过Caps Lock键进行修改。pCharMapping数组被视为具有两个“列”的双索引数组。在单字节字符的情况下,对于非移位和移位的值,它被视为8位值对。对于双字节字符,它被视为16位值对

tHIDReportIdle
Definition:
typedef struct
{
uint8_t ui8Duration4mS;
uint8_t ui8ReportID;
uint16_t ui16TimeTillNextmS;
uint32_t ui32TimeSinceReportmS;
}
tHIDReportIdle

成员:

ui8Duration4mS以4mS为单位表示报表的空闲持续时间。0表示无限长,并通知类驱动程序除非发生状态更改,否则不要发送报表。

ui8ReportID此结构应用于的报表的ID。这是使用报表描述符中的report ID标记指定的报表ID,而不是HID类描述符数组中报表的索引。如果只支持一个输入报告,因此不存在ReportID标记,则此字段应设置为0。

ui16TimeTillNextmS需要将给定报告的副本发送回主机之前的毫秒数。该字段由HID驱动程序更新,用于USBD_HID_EVENT_IDLE_TIMEOUT的时间发送。

ui32TimesInceportms自上次发送此报告以来经过的毫秒数。HID类驱动程序需要跟踪这一点,因为Set_Idle请求必须在它们所引用的报告的最后一次传输之后立即生效。

描述:用于跟踪报表空闲时间的结构。这些结构的数组在USBDHIDInit期间传递给HID设备类驱动程序,用于跟踪每个报告的自动重新发送(如果主机未禁用)。

tUSBDHIDDevice
Definition:
typedef struct
{
uint16_t ui16VID;
uint16_t ui16PID;
uint16_t ui16MaxPowermA;
uint8_t ui8PwrAttributes;
uint8_t ui8Subclass;
uint8_t ui8Protocol;
uint8_t ui8NumInputReports;
tHIDReportIdle*psReportIdle;
tUSBCallback pfnRxCallback;
void*pvRxCBData;
tUSBCallback pfnTxCallback;
void*pvTxCBData;
bool bUseOutEndpoint;
const tHIDDescriptor*psHIDDescriptor;
const uint8_t*const*ppui8ClassDescriptors;
const uint8_t*const*ppui8StringDescriptors;
uint32_t ui32NumStringDescriptors;
const tConfigHeader*const*ppsConfigDescriptor;
tHIDInstance sPrivateData;
}
tUSBDHIDDevice

成员:

ui16VID设备描述符中要显示的供应商ID。

ui16PID设备描述符中要显示的产品标识。

ui16MaxPowermA设备的最大功耗,单位为毫安。

ui8PwrAttributes指示设备是自供电还是总线供电,以及是否支持远程唤醒。有效值为USB_CONF_ATTR_SELF_PWR或USB_CONF_ATTR_BUS_PWR,可选或与USB_CONF_ATTR_RWAKE一起存储。

ui8Subclass要发布到此HID设备的服务器的接口子类。

ui8Protocol要发布到此HID设备的服务器的接口协议。

ui8NumInputReports此设备支持的输入报告数。此字段必须等于设备的HID类描述符中发布的报告数,以及下面字段pi16ReportIdle指向其第一个元素的数组中的条目数。

psReportIdle指向结构数组中第一个元素的指针,用于跟踪每个输入报告的空闲时间。调用时,应初始化每个数组成员的ui8Duration4mS和ui8ReportID字段,以指示每个输入报告的默认空闲超时。这个数组必须在RAM中,因为HID设备类驱动程序会根据主机的请求更新其中的值并跟踪经过的时间。数组中的元素数必须与上面ui8NumInputReports字段中提供的元素数匹配。pfnRxCallback指向回调函数的指针,该函数被调用以通知应用程序常规事件、与端点0上的报告传输相关的事件以及与通过(可选)中断输出端点接收输出和功能报告相关的事件。

pvRxCBData客户端提供的指针,作为对接收通道回调pfnRxCallback的所有调用中的第一个参数发送。

pfnTxCallback指向回调函数的指针,该函数被调用来通知应用程序与通过端点中断传输输入报告相关的事件。

pvTxCBData客户端提供的指针,在所有对传输通道回调pfnTxCallback的调用中作为第一个参数发送。总线输出点如果设置为真,此字段指示设备应使用专用中断输出端点从主机接收报告。在这种情况下,来自主机的报告通过使用USB事件RX可用事件的接收回调传递给应用程序。如果为false,则通过端点0接收来自主机的报告,并通过USBD_HID_EVENT_REPORT_SENT events传递给应用程序。pshiddecriptor设备要发布的HID描述符(在标准接口描述符之后,在接口的端点描述符之前)。

ppui8ClassDescriptors设备提供的HID类描述符在字节指针数组中定义,此字段指向该数组。数组中元素的顺序和数量必须与pi16HIDDescriptor在HID descriptor in字段中提供的相关信息匹配。ppui8StringDescriptors指向此设备的字符串描述符数组的指针。此数组必须按此顺序包含以下字符串描述符指针。语言描述符,制造商名称字符串(语言1),产品名称字符串(语言1),序列号字符串(语言1),HID接口描述字符串(语言1),配置描述字符串(语言1),(可选)第一个HID设备特定字符串(语言1),(可选)第二个HID设备特定字符串(语言1),等等。如果支持多个语言,则必须为语言描述符中定义的每种语言重复描述符块(字符串描述符0除外)。HID设备特定字符串的数量取决于传递给接口的报表描述符的内容,因此由应用程序控制。ui32NumStringDescriptors ppStringDescriptors数组中提供的描述符数。这必须是1+((5+(num HID strings))*(num languages))。ppsConfigDescriptor sPrivateData此设备实例的专用实例数据。在HID设备使用期间,此内存必须保持可访问状态,并且不能被HID类驱动程序之外的任何代码修改。说明:应用程序用于定义HID设备的操作参数的结构。

定义文档

集合这是一个宏,用于帮助在HID报表描述符中添加集合项。

定义 定义集合(ui8Value)参数:ui8Value是集合的类型。描述:此宏接受一个值,并准备将其作为集合项放入HID报表结构中。这是要组合在一起的值的类型,例如输入、输出或要素可以作为集合组合在一起。返回:不是函数。

TM4C USB-HID了解学习(二)相关推荐

  1. USB HID学习:MFC检测USB拔插事件

    MFC具备检测设备的消息,但需要手动添加.针对USB设备,需要注册对应的GUID方可.本文对此进行简单记录. 本省略对MFC机制的描述,仅描述主要的模块代码. 一.步骤 Dbt.h头文件引用 在std ...

  2. USB HID学习:数据包分析

    本文使用 Bus Hound 工具对 USB HID 设备数据包进行分析,并结合官方手册及网上文章进行整理.文中未提到的知识,建议移步参考资源. 以笔者经验,直接阅读协议无法直观理解,最好使用工具抓包 ...

  3. STM32CubeMX学习(一) USB HID 双向通信

    STM32CubeMX学习(一) USB HID 双向通信 简介 CubeMX新建工程(串口+LED) 测试串口和LED 设置USB HID 测试USB HID通信 结论 简介 利用正点原子F407探 ...

  4. ZYNQ学习之路9.USB总线学习(二)

    Linux中USB驱动程序依然遵循标准的设备驱动模型--总线.设备.驱动.和I2C总线设备驱动一样,所有的USB驱动程序都必须创建的主要结构体是struct usb_driver,它们向USB核心代码 ...

  5. CSR8675学习笔记:USB HID通信

    为了让CSR867x的开发更容易,现与思度科技联合推出CSR867x学习板[淘宝链接:思度科技CSR开发板]. 技术交流QQ群号:743434463 开发板会员QQ群号:725398389(凭订单号入 ...

  6. Linux下USB HID device driver研究

    首先介绍HID: HID是Human Interface Devices的缩写.翻译成中文即为人机交互设备.这里的人机交互设备是一个宏观上面的概念,任何设备,只要符合HID spec,都可以称之为HI ...

  7. C++ MFC界面读写USB HID设备数据程序

    C++ MFC界面读写USB HID设备数据程序 发一个简单易用的界面,用来对USB HID设备(比如说游戏手柄,控制面板等)读写数据,一般情况下面板上有一些LED,可以帮助我们测试读写是否正确.另外 ...

  8. [转载]基于Stm32,LD3320的非特定语音识别USB HID Keyboar

    基于Stm32,LD3320的非特定语音识别USB HID Keyboard实现 ---用声音跟机器沟通 鉴于手头拥有一块ST官方的stm32f407VG discover板子以及一块ICRoute公 ...

  9. Visual Studio 2010 Win32 Usb HID 动态库创建

    一.概述 最近在项目中使用md5和sh1 算法,发现在原来的工程上,加上这两个算法的源代码竟然编译不能通过,出现100 多个bug.后来上来发现错误都是源于两个算法使用的一个头文件"StdI ...

最新文章

  1. Action请求后台出现Response already commited异常解决方法
  2. codeforces 拼手速题2
  3. 【thymeleaf】th:with
  4. linux内核关闭网络巨帧xenomai,xenomai内核解析--双核系统调用(二)--应用如何区分xenomai/linux系统调用或服务...
  5. 用EnumProcesses()枚举进程
  6. Android 使用SWIG生成Jni代码转
  7. [Asp.net MVC]HandleErrorAttribute异常过滤器
  8. java获取发件人_如何获取发件人outlook / Exchange的SMTP地址
  9. Atitit s2018 s3 doc list alldvc.docx .docx s2018 s3f doc compc s2018 s3f doc homepc sum doc dvcCom
  10. 计算机硬盘的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  11. matlab 取符号函数,Matlab 符号表达式和符号函数的操作
  12. 软件工程复习提纲——第六章
  13. KOG注释[Ubuntu 15.10系统]
  14. 2002普及组第四题过河卒
  15. 谭浩强《C语言》学习1
  16. php 计算时间的年月日
  17. 计算机丢失quartz.dll什么意思,计算机中丢失quartz.dll解决方法
  18. 威客witkey模式的提出
  19. KVM——5——kvm网络
  20. 基于物联网技术的商厦、工矿企业智慧消防管理云平台——安科瑞 严新亚

热门文章

  1. Matlab文件读写
  2. 160W有桥PFC+LLC电源设计
  3. 智能移动设备部件概况——降噪麦克风及其扬声器
  4. python docx 图片_python-docx图像的添加与删除
  5. PowerPoint 2010做DEMO更加方便
  6. STM32 HAL库 看门狗
  7. python编写动漫人或物
  8. 框架 Onboard-引导页样式制作库
  9. 从TCP三次握手说起–浅析TCP协议中的疑难杂症(2)
  10. 一文说透 Jarvis+ 去中心化社群经济