/*
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相关推荐

  1. hid设备驱动linux,Linux HID 驱动开发(2) USB HID Report 描述及usage 概念

    在USB的枚举后,即交互完 设备描述符(device descriptor),配置描述符(configure descriptor),接口描述符(interface descriptor)和 在inp ...

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

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

  3. STM32设置USB HID模式

    使用USBHID模式与电脑.手机终端通讯,速率和准确率比虚拟串口和CH340转接速度要快. 在USB_OTG_FS中,选择Device_Only,其它默认. 在Middleware中的Class Fo ...

  4. 记录一下 开发STM32 USB HID踩过的坑

    记录一下 开发STM32 USB HID踩过的坑 一.前言 二.代码配置 一.前言 MCU: STM32F103C8T6 CubeMX: STM32CubeMX 5.3.0 二.代码配置 引脚配置 时 ...

  5. Android USB HID整理

    概述 USB协议支持外设热插拔,这些外设分为许多不同类型,每一种设备类都具有相同的动作和类似的功能.比如显示器,鼠标,话筒等等. HID(Human Interface Device)类提供了人机接口 ...

  6. USB HID Class 的具体应用

    Introduction wikipedia 上的一段话: The HID protocol makes implementation of devices very simple. Devices ...

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

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

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

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

  9. stm32 USB HID+CDC 鼠标键盘串口 组合设备配置解析

    前言 查阅网上的博客与代码,很多都是关于USB的鼠标配置.USB的键盘配置.USB的虚拟串口配置,稍微深入一点的会将鼠标键盘合在一起,但移植起来就会报很多错误,要么是检测不到,要么是警告,这很正常,因 ...

最新文章

  1. 使用ubuntu(18.04) 作为软路由器连接互联网
  2. gcc编译参数[转]
  3. 利用OpenCV进行图像的轮廓检测
  4. Android开发简易教程
  5. 提高抗打击能力_输不起、爱放弃,孩子抗挫能力差怎么办?3招教你培养孩子抗挫力...
  6. FC3服务器配置一条龙
  7. numberformatexception是什么异常_译文《最常见的10种Java异常问题》
  8. Dreamoon Likes Sequences CodeForces - 1330D(组合数学+位运算)
  9. 用别的表格中数据进行计算机,tusimpleBI 做的图表,别的电脑可以打开吗?
  10. 阿里双十一 5 大招式!
  11. 函数:MySQL中取整函数round和floor
  12. 九联UNT401H零配置、芒果、南传、百视通等版本通刷固件及教程
  13. C++:封装 继承 多态
  14. 茴字有几种写法?SQL排名问题之全局排名的四种解法
  15. 计算机怎么设置加密文件,电脑文件夹怎么设置密码 电脑文件夹加密的3种方法...
  16. 新高考如何选科?职引教你一招简单又直接的方法
  17. 天池大赛 xgboost/lightgbm + python36 + win10_64 环境配置
  18. 苹果8android价格,iphone8plus相当于什么档次的安卓机?从这3方面就可看出
  19. Unity3d 周分享(14期 2019.4.1 )
  20. java使用poi导出ppt图表——环形图/空心饼图

热门文章

  1. bzoj 2406 矩阵——有源汇上下界可行流
  2. 六,ESP8266 TCP Client(基于Lua脚本语言)
  3. 项目管理知识框架PMBOK(文字版)
  4. 解决VirtualBox 上的XP 关机时重启 , 启动时蓝屏 ,点击电源选项蓝屏
  5. hdu 1688 Sightseeing
  6. 《算法竞赛入门经典》习题——Chapter 3
  7. linux下apache+SVN搭建完美版
  8. (转)oracle extent
  9. Oracle大规模数据快速导出文本文件
  10. python对接微信支付_python3接入微信企业支付实现小程序提现