目录

1.12版本规范的GamePad参考报表描述符,报表格式如下图。

用CH582模拟GamePad,在电脑上显示的HID接口↓

报表描述符↓,其他描述符可以直接参考JoyStick相关一文,改一下HID类描述符中的一个长度值即可,见文章最后。

const uint8_t GamePadRepDesc[] = { //HID1.12规范,该报表适用于类似街机游戏机上有1个摇杆+6个按键的设备
  0x05, 0x01,       //UsagePage(Generic Desktop) UsagePage定义数据的用法或功能
  0x09, 0x05,       //Usage(Game Pad) Usage描述项目
  0xA1, 0x01,       //Collection(Application) Collection:包含有共同用途或者执行单一功能的项目。
    0x09, 0x01,     //Usage (Pointer)   定义指针(摇杆)
    0xA1, 0x00,     //Collection(Physical) 物理按键集合
      0x09, 0x30,   //Usage (X)    X方向
      0x09, 0x31,   //Usage (Y)    Y方向
      0x15, 0xFF,   //Logical Minimum (-1) 报表项目的最小数值
      0x25, 0x01,   //Logical Maximum (1) 报表项目的最大数值
      0x75, 0x02,   //Report Size (2) 项目字段的大小
      0x95, 0x02,   //Report Count (2) 项目的数据域位的数目
      0x81, 0x02,   //Input (Data,Variable,Absolute,No Null) 0x02的各位含义详见卷标
    0xC0,         //End Collection 关闭集合     0x75, 0x04,     //Report Size (4) 项目字段的大小 4-bit pad
    0x95, 0x01,     //Report Count (1) 项目的数据域位的数目
    0x81, 0x03,     //Input (Constant, Variable, Absolute) 0x03的各位含义详见卷标     0x05, 0x09,     //Usage Page (Buttons)  定义按键
    0x19, 0x01,     //Usage Minimum (Button 1)  定义1~6号六个按键
    0x29, 0x06,     //Usage Maximum (Button 6)
    0x15, 0x00,     //Logical Minimum (0) 报表项目的最小数值
    0x25, 0x01,     //Logical Maximum (1) 报表项目的最大数值
    0x95, 0x06,     //Report Count (6) 6个数据段
    0x75, 0x01,     //Report Size (1) 每个数据段占1位
    0x81, 0x02,     //Input (Data, Variable, Absolute) 0x02的各位含义详见卷标     0x95, 0x02,     //Report Count (2) 回传2个数据 Size沿用上一个 2-bit pad
    0x81, 0x03,     //Input (Constant, Variable, Absolute) 0x03的各位含义详见卷标
  0xC0           //End Collection 关闭集合
}; 

HID兼容设备也是HID中的一种设备。之所以“兼容”,是因为其支持双向传输,基本不做报表格式的限制,但数据中各字节各位的内容,就需要上层软件作区分。

下列描述符能够实现64字节的双向传输,无固定格式,在电脑上显示如图的HID接口↓

设备描述符略,具体含义见JoyStick相关一文,配置描述符↓

const uint8_t MyCfgDescr[] = {
0x09,0x02,0x29,0x00,0x01,0x01,0x04,0xA0,0x32, //配置描述符
0x09,0x04,0x00,0x00,0x02,0x03,0x00,0x00,0x00, //接口描述符
0x09,0x21,0x00,0x01,0x00,0x01,0x22,0x22,0x00, //HID类描述符  
0x07,0x05,0x81,0x03,0x40,0x00,0x01, //端点1 IN方向
0x07,0x05,0x01,0x03,0x40,0x00,0x01 //端点1 OUT方向
};

const uint8_t HIDDescr[] = { //HID1.0版本协议,双向传输HID兼容设备
  0x06, 0x00,0xFF,      //UsagePage(Vendor-defined)  厂商自定义用法或功能(在UsagePage使用了“厂商自定义”之后,以下的Usage都为厂商自定义,这里我都写0xFF了,厂商能够自行区分就好。在使用了标准的UsagePage后,Usage才需要继续查表格去得到标准值)
  0x09, 0xFF,         //Usage  自定义
  0xA1, 0xFF,         //Collection(Vendor-defined)  厂商自定义集合
    0x09, 0xFF,       //Usage  自定义
    0x15, 0x00,       //Logical Minimun(0)  报表项目的最小数值
    0x26, 0x00,0xFF,    //Logical Maximun(65280)  报表内容最大数值
    0x75, 0x08,       //Report Size(8)  每个数据段占8位
    0x95, 0x40,       //Report Counet(64)  64个数据段  双向64字节数据的IN方向传输
    0x81, 0x02,       //Input(Data,Variable,Absolute)  0x02各项含义详见卷标
    0x09, 0xFF,       //Usage  自定义
    0x15, 0x00,       //Logical Minimun(0)  报表项目的最小数值
    0x26, 0x00,0xFF,    //Logical Maximun(65280)  报表内容最大数值
    0x75, 0x08,       //Report Size(8)  每个数据段占8位
    0x95, 0x40,       //Report Counet(64)  64个数据段  双向64字节数据的OUT方向传输
    0x91, 0x02,       //Output(Data,Variable,Absolute)  0x02各项含义详见卷标
  0xC0             //End Collection 关闭集合
};

小贴士:HID类描述符中有代码是相关报表描述符总长度的↓

  0xXX(低8位), 0xXX(高8位),     //wDescriptorLength 报表描述符总长度

如果报表描述符不长,也可以将其写在类描述符的前面,用sizeof来获取长度,直接放到低8位的字节内。若报表描述符较长,就需要另行自定义函数去判断长度,再放进共计16位的数据中。

HID类GamePad和兼容HID设备报表描述符的更多相关文章

  1. Day 21 python :面向对象 类的相关内置函数 /单例模式 /描述符

    1.isinstance(obj,cls) 检查obj是否是类cls的对象: 备注:用isinstance 的时候,产生实例后,会显示实例既是父类的实例,也是子类的实例 class Mom: gend ...

  2. USB HID设备报告描述符详解(转)

    转自:http://group.ednchina.com/93/198.aspx. 参考:USB HID usage table 概述:   报告在这里意思是数据传输(data transfer),而 ...

  3. USB系列之二:读取USB设备的描述符

    在前面的文章中,我们已经给出了USB协议的链接地址,从这篇文章起,我们会涉及到许多USB 1.1的内容,我们的指导思想是先从熟悉USB 1.1协议入手,先使用现成的HCD和USBD,直接面对客户端驱动 ...

  4. HID 报告描述符精细说明.

    1,报告描述符概述    1.1) 报表描述符        报表描述符和USB的其他描述符是不一样的,它不是一个简单的表格,报表描述符是USB所有描述符中最复杂的.报表描述符非常复杂而有弹性,因为它 ...

  5. 11.python描述符---类的装饰器---@property

    描述符1.描述符是什么:描述符本质就是一个新式类,在这个新式类中,至少实现了__get__(),__set__(),__delete__()这三个内置方法中的一个,描述符也被称为描述符协议(1):__ ...

  6. Ubuntu/Windows下利用“HIDAPI”库函数实现与Hid类USB设备通信

    一.背景: 最近在做的一个项目需要使用USB传递数据,对USB理解不是很深,USB的系统驱动编写则更是天方 夜谭,因此将设备配置成HID类设备成为了首选.其最大的好处在于,LINUX/Windows系 ...

  7. 基于MDK的ARM-GCC开发环境建立及新唐M0的HID类设备的C++开发

    一,下载安装测试arm-none-eabi-gcc编译工具链 1,查看arm-none-eabi-gcc编译工具版本        打开网页:https://sourcery.mentor.com/G ...

  8. USB学习小记-HID类键盘的报告描述符的理解

    前言 断断续续的学习了将近三个月,才把USB的HID类搞明白,速度真是够慢的.利用晚上+周末的时间学习自己的东西确实是必要的,不过效率是有点低,以后要更专注一些才行,希望自己能做到吧. 在学习过程中, ...

  9. 一个AVRUSB作品HID类

    最近为了HID类设备弄了半个把月.终于完成这个无线(红外)多媒体键盘,带鼠标功能.难就难在描述符上,不过在近4天的资料翻阅及多次的测试下,电脑不知道重启了多少次啊,的情况下 搞定了这个东西,大家可以看 ...

  10. USB HID描述符【转】

    本文转载自: USB是个通用的总线,端口都是统一的.但是USB设备却各种各样,例如USB鼠标,USB键盘,U盘等等,那么USB主机是如何识别出不同的设备的呢?这就要依赖于描述符了.USB的描述符主要有 ...

随机推荐

  1. C# lock 、 Monitor Wait、Pulse和PulseAll 的区别和用法(转载)

    1.Monitor.Wait方法当线程调用 Wait 时,它释放对象的锁并进入对象的等待队列,对象的就绪队列中的下一个线程(如果有)获取锁并拥有对对象的独占使用.Wait()就是交出锁的使用权,使线程 ...

  2. 判断一个对象是否是数组的n个方法,typeOf不能判断引用类型对象

  3. Object类中wait带参方法和notifyAll方法-线程间通信

    Object类中wait带参方法和notifyAll方法 void wait (在其他线程调用此对象的notify()方法或notifyAll()方法前,导致当前线程等待.void wait  (lo ...

  4. 文盘Rust -- rust 连接云上数仓 starwift

    作者:京东云 贾世闻 最近想看看 rust 如何集成 clickhouse,又犯了好吃懒做的心理(不想自己建环境),刚好京东云发布了兼容ck 的云原生数仓 Starwfit,于是搞了个实例折腾一番. ...

  5. .NET 团队 更新了 .NET 语言策略

    2023年2月6日 ,.NET团队在官方博客上发布了.NET 语言策略的更新文章,具体参见 https://devblogs.microsoft.com/dotnet/update-to-the-do ...

  6. Mybatis Plus整合PageHelper分页的实现示例

    1.依赖引入 <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pag ...

  7. SQL优化的七个方面

    SQL优化的七个方面 1. 创建索引 禁止给表中每一列都建立单独索引 每个Innodb表都必须有一个主键 要注意组合索引的字段顺序 优先考虑覆盖索引 避免使用外键约束 2. 避免索引失效 失效场景: ...

  8. 面向对象程序设计(三):new&deleet什么是动态内存

    <C++ primer>中提到:在C++中,动态内存的管理是通过一对运算符来完成的: new 在内存池中为对象分配一块空间,并指向这个对象的指针,我们可以在这里对对象进行初始化: dele ...

  9. WPF 使用动画绘制一个点赞大拇指

    效果图 好久没有写wpf了. 最近看到飞书的点赞动画非常有意思,决定试试,虽然不及飞书那样的绚丽,但是练手还是可以的,希望自己的手艺还在! 那么如何写一个这样的动画呢? 首先需要刨析这个动画的构成: ...

  10. .NET Core MongoDB的简单使用

    一.创建测试库.测试表.添加测试数据 使用之前文章提到的MongoDB Compass用法分别添加数据库[myDb]和集合(表)[userinfos]信息, 参考链接为:MongoDB Compass ...