USB HID report descriptor
/*
23~16 15~8 7~4 3~2 1~0
[DATA] [DATA] bTag bType bSize
*/
#define ITEM_SIZE(x) ((x) & 0x03)
#define TYPE_MAIN (0)
#define TYPE_GLOBAL (0x04)
#define TYPE_LOCAL (0x08)
/* MAIN */
#define TAG_MAIN_INPUT (0x80)
#define TAG_MAIN_OUTPUT (0x90)
#define TAG_MAIN_FEATURE (0xB0)
#define TAG_MAIN_COLLECTION (0xA0)
#define TAG_MAIN_COL_END (0xC0)
/* GLOBAL */
#define TAG_GLOBAL_USAGE_PAGE (0x00)
#define TAG_GLOBAL_LOG_MIN (0x10)
#define TAG_GLOBAL_LOG_MAX (0x20)
#define TAG_GLOBAL_PHY_MIN (0x30)
#define TAG_GLOBAL_PHY_MAX (0x40)
#define TAG_GLOBAL_UNIT_EXP (0x50)
#define TAG_GLOBAL_UNIT (0x60)
#define TAG_GLOBAL_RPT_SIZE (0x70)
#define TAG_GLOBAL_RPT_ID (0x80)
#define TAG_GLOBAL_RPT_CNT (0x90)
#define TAG_GLOBAL_PUSH (0xA0)
#define TAG_GLOBAL_POP (0xB0)
/* LOCAL */
#define TAG_LOCAL_USAGE_ID (0x00)
#define TAG_LOCAL_USAGE_MIN (0x10)
#define TAG_LOCAL_USAGE_MAX (0x20)
#define TAG_LOCAL_DES_IDX (0x30)
#define TAG_LOCAL_DES_MIN (0x40)
#define TAG_LOCAL_DES_MAX (0x50)
#define TAG_LOCAL_NA (0x60)
#define TAG_LOCAL_STR_IDX (0x70)
#define TAG_LOCAL_STR_MIN (0x80)
#define TAG_LOCAL_STR_MAX (0x90)
#define TAG_LOCAL_Delimiter (0xA0)
#define USAGE_PAGE_2(x) (TAG_GLOBAL_USAGE_PAGE | TYPE_GLOBAL | ITEM_SIZE(2)), (uint8_t)((x) & 0x00ff), (uint8_t)((x)>>8)
#define USAGE_PAGE(x) (TAG_GLOBAL_USAGE_PAGE | TYPE_GLOBAL | ITEM_SIZE(1)), (x)
#define USAGE_ID(x) (TAG_LOCAL_USAGE_ID | TYPE_LOCAL | ITEM_SIZE(1)), (x)
#define LOGICAL_MIN(x) (TAG_GLOBAL_LOG_MIN | TYPE_GLOBAL | ITEM_SIZE(1)), (x)
#define LOGICAL_MAX(x) (TAG_GLOBAL_LOG_MAX | TYPE_GLOBAL | ITEM_SIZE(1)), (x)
#define LOGICAL_MAX_2(x) (TAG_GLOBAL_LOG_MAX | TYPE_GLOBAL | ITEM_SIZE(2)), (uint8_t)((x) & 0x00ff), (uint8_t)((x)>>8)
#define REPORT_ID(x) (TAG_GLOBAL_RPT_ID | TYPE_GLOBAL | ITEM_SIZE(1)), (x)
#define REPORT_SIZE(x) (TAG_GLOBAL_RPT_SIZE | TYPE_GLOBAL | ITEM_SIZE(1)), (x)
#define REPORT_CNT(x) (TAG_GLOBAL_RPT_CNT | TYPE_GLOBAL | ITEM_SIZE(1)), (x)
#define COLLECTION_END (TAG_MAIN_COL_END | TYPE_MAIN)
#define COLLECTION(x) (TAG_MAIN_COLLECTION | TYPE_MAIN | ITEM_SIZE(1)), (x)
#define FEATURE(x) (TAG_MAIN_FEATURE | TYPE_MAIN | ITEM_SIZE(1)), (x)
#define OUTPUT(x) (TAG_MAIN_OUTPUT | TYPE_MAIN | ITEM_SIZE(1)), (x)
#define INPUT(x) (TAG_MAIN_INPUT | TYPE_MAIN | ITEM_SIZE(1)), (x)
e.g:
const uint8_t CustomHID_ReportDescriptor[122] =
{
USAGE_PAGE(0x0D),
USAGE_ID(0x01),
COLLECTION(0x01),
//0x05, 0x0D, /* USAGE_PAGE (Vendor Page: 0x008D -- SCALE ) */
//0x09, 0x01, /* USAGE (Demo Kit) */
//0xa1, 0x01, /* COLLECTION (Application) */
/* 6 */
/* Led 1 */
REPORT_ID(0x01),
//0x85, 0x01, /* REPORT_ID (1) */
USAGE_ID(1),
//0x09, 0x01, /* USAGE (LED 1) */
LOGICAL_MIN(0),
//0x15, 0x00, /* LOGICAL_MINIMUM (0) */
LOGICAL_MAX(1),
//0x25, 0x01, /* LOGICAL_MAXIMUM (1) */
REPORT_SIZE(8),
//0x75, 0x08, /* REPORT_SIZE (8) */
REPORT_CNT(1),
//0x95, 0x01, /* REPORT_COUNT (1) */
FEATURE(0x82),
//0xB1, 0x82, /* FEATURE (Data,Var,Abs,Vol) */
REPORT_ID(1),
//0x85, 0x01, /* REPORT_ID (1) */
USAGE_ID(1),
//0x09, 0x01, /* USAGE (LED 1) */
OUTPUT(0x82),
//0x91, 0x82, /* OUTPUT (Data,Var,Abs,Vol) */
/* 26 */
/* Led 2 */
REPORT_ID(2),
//0x85, 0x02, /* REPORT_ID 2 */
USAGE_ID(2),
//0x09, 0x02, /* USAGE (LED 2) */
LOGICAL_MIN(0),
//0x15, 0x00, /* LOGICAL_MINIMUM (0) */
LOGICAL_MAX(1),
//0x25, 0x01, /* LOGICAL_MAXIMUM (1) */
REPORT_SIZE(8),
//0x75, 0x08, /* REPORT_SIZE (8) */
REPORT_CNT(1),
//0x95, 0x01, /* REPORT_COUNT (1) */
FEATURE(0x82),
//0xB1, 0x82, /* FEATURE (Data,Var,Abs,Vol) */
REPORT_ID(2),
//0x85, 0x02, /* REPORT_ID (2) */
USAGE_ID(2),
//0x09, 0x02, /* USAGE (LED 2) */
OUTPUT(0x82),
//0x91, 0x82, /* OUTPUT (Data,Var,Abs,Vol) */
/* 46 */
/* key Push Button */
REPORT_ID(3),
//0x85, 0x05, /* REPORT_ID (5) */
USAGE_ID(3),
//0x09, 0x05, /* USAGE (Push Button) */
LOGICAL_MIN(0),
//0x15, 0x00, /* LOGICAL_MINIMUM (0) */
LOGICAL_MAX(1),
//0x25, 0x01, /* LOGICAL_MAXIMUM (1) */
REPORT_SIZE(1),
//0x75, 0x01, /* REPORT_SIZE (1) */
INPUT(0x82),
//0x81, 0x82, /* INPUT (Data,Var,Abs,Vol) */
USAGE_ID(3),
//0x09, 0x05, /* USAGE (Push Button) */
REPORT_SIZE(1),
//0x75, 0x01, /* REPORT_SIZE (1) */
FEATURE(0x82),
//0xb1, 0x82, /* FEATURE (Data,Var,Abs,Vol) */
REPORT_SIZE(7),
//0x75, 0x07, /* REPORT_SIZE (7) */
INPUT(0x83),
//0x81, 0x83, /* INPUT (Cnst,Var,Abs,Vol) */
REPORT_ID(3),
//0x85, 0x05, /* REPORT_ID (2) */
REPORT_SIZE(7),
//0x75, 0x07, /* REPORT_SIZE (7) */
FEATURE(0x83),
//0xb1, 0x83, /* FEATURE (Cnst,Var,Abs,Vol) */
/* 74 */
/* Tamper Push Button */
REPORT_ID(4),
//0x85, 0x06, /* REPORT_ID (6) */
USAGE_ID(4),
//0x09, 0x06, /* USAGE (Tamper Push Button) */
LOGICAL_MIN(0),
//0x15, 0x00, /* LOGICAL_MINIMUM (0) */
LOGICAL_MAX(1),
//0x25, 0x01, /* LOGICAL_MAXIMUM (1) */
REPORT_SIZE(1),
//0x75, 0x01, /* REPORT_SIZE (1) */
INPUT(0x82),
//0x81, 0x82, /* INPUT (Data,Var,Abs,Vol) */
USAGE_ID(4),
//0x09, 0x06, /* USAGE (Tamper Push Button) */
REPORT_SIZE(1),
//0x75, 0x01, /* REPORT_SIZE (1) */
FEATURE(0x82),
//0xb1, 0x82, /* FEATURE (Data,Var,Abs,Vol) */
REPORT_SIZE(7),
//0x75, 0x07, /* REPORT_SIZE (7) */
INPUT(0x83),
//0x81, 0x83, /* INPUT (Cnst,Var,Abs,Vol) */
REPORT_ID(4),
//0x85, 0x06, /* REPORT_ID (6) */
REPORT_SIZE(7),
//0x75, 0x07, /* REPORT_SIZE (7) */
FEATURE(0x83),
//0xb1, 0x83, /* FEATURE (Cnst,Var,Abs,Vol) */
/* 102 */
/* ADC IN */
REPORT_ID(5),
//0x85, 0x07, /* REPORT_ID (7) */
USAGE_ID(5),
//0x09, 0x07, /* USAGE (ADC IN) */
LOGICAL_MIN(0),
//0x15, 0x00, /* LOGICAL_MINIMUM (0) */
LOGICAL_MAX_2(0x00ff),
//0x26, 0xff, 0x00, /* LOGICAL_MAXIMUM (255) */
REPORT_SIZE(8),
//0x75, 0x08, /* REPORT_SIZE (8) */
INPUT(0x82),
//0x81, 0x82, /* INPUT (Data,Var,Abs,Vol) */
REPORT_ID(5),
//0x85, 0x07, /* REPORT_ID (7) */
USAGE_ID(5),
//0x09, 0x07, /* USAGE (ADC in) */
FEATURE(0x82),
//0xb1, 0x82, /* FEATURE (Data,Var,Abs,Vol) */
/* 121 */
COLLECTION_END /* END_COLLECTION */
}; /* CustomHID_ReportDescriptor */
转载于:https://www.cnblogs.com/ele-eye/archive/2013/04/21/3033846.html
USB HID report descriptor相关推荐
- hid设备驱动linux,Linux HID 驱动开发(2) USB HID Report 描述及usage 概念
在USB的枚举后,即交互完 设备描述符(device descriptor),配置描述符(configure descriptor),接口描述符(interface descriptor)和 在inp ...
- STM32CubeMX学习(一) USB HID 双向通信
STM32CubeMX学习(一) USB HID 双向通信 简介 CubeMX新建工程(串口+LED) 测试串口和LED 设置USB HID 测试USB HID通信 结论 简介 利用正点原子F407探 ...
- STM32设置USB HID模式
使用USBHID模式与电脑.手机终端通讯,速率和准确率比虚拟串口和CH340转接速度要快. 在USB_OTG_FS中,选择Device_Only,其它默认. 在Middleware中的Class Fo ...
- 记录一下 开发STM32 USB HID踩过的坑
记录一下 开发STM32 USB HID踩过的坑 一.前言 二.代码配置 一.前言 MCU: STM32F103C8T6 CubeMX: STM32CubeMX 5.3.0 二.代码配置 引脚配置 时 ...
- Android USB HID整理
概述 USB协议支持外设热插拔,这些外设分为许多不同类型,每一种设备类都具有相同的动作和类似的功能.比如显示器,鼠标,话筒等等. HID(Human Interface Device)类提供了人机接口 ...
- USB HID Class 的具体应用
Introduction wikipedia 上的一段话: The HID protocol makes implementation of devices very simple. Devices ...
- CSR8675学习笔记:USB HID通信
为了让CSR867x的开发更容易,现与思度科技联合推出CSR867x学习板[淘宝链接:思度科技CSR开发板]. 技术交流QQ群号:743434463 开发板会员QQ群号:725398389(凭订单号入 ...
- USB HID学习:数据包分析
本文使用 Bus Hound 工具对 USB HID 设备数据包进行分析,并结合官方手册及网上文章进行整理.文中未提到的知识,建议移步参考资源. 以笔者经验,直接阅读协议无法直观理解,最好使用工具抓包 ...
- stm32 USB HID+CDC 鼠标键盘串口 组合设备配置解析
前言 查阅网上的博客与代码,很多都是关于USB的鼠标配置.USB的键盘配置.USB的虚拟串口配置,稍微深入一点的会将鼠标键盘合在一起,但移植起来就会报很多错误,要么是检测不到,要么是警告,这很正常,因 ...
最新文章
- 使用ubuntu(18.04) 作为软路由器连接互联网
- gcc编译参数[转]
- 利用OpenCV进行图像的轮廓检测
- Android开发简易教程
- 提高抗打击能力_输不起、爱放弃,孩子抗挫能力差怎么办?3招教你培养孩子抗挫力...
- FC3服务器配置一条龙
- numberformatexception是什么异常_译文《最常见的10种Java异常问题》
- Dreamoon Likes Sequences CodeForces - 1330D(组合数学+位运算)
- 用别的表格中数据进行计算机,tusimpleBI 做的图表,别的电脑可以打开吗?
- 阿里双十一 5 大招式!
- 函数:MySQL中取整函数round和floor
- 九联UNT401H零配置、芒果、南传、百视通等版本通刷固件及教程
- C++:封装 继承 多态
- 茴字有几种写法?SQL排名问题之全局排名的四种解法
- 计算机怎么设置加密文件,电脑文件夹怎么设置密码 电脑文件夹加密的3种方法...
- 新高考如何选科?职引教你一招简单又直接的方法
- 天池大赛 xgboost/lightgbm + python36 + win10_64 环境配置
- 苹果8android价格,iphone8plus相当于什么档次的安卓机?从这3方面就可看出
- Unity3d 周分享(14期 2019.4.1 )
- java使用poi导出ppt图表——环形图/空心饼图