调试模拟键盘鼠标花了我接近一周的时间,到处查找资料,结果东平西凑。靠上厕所的灵感,终于调通了,

主要注意的是绝对值坐标和相对坐标的表达不一样

最后在这里找到了答案,感谢21ic tanganrong 大虾的无私奉献,特作记录

鼠标使用绝对坐标,它的描述符的问题 - 书友会论坛 - 21ic电子技术开发论坛

详细解析

HID 报告描述 2_幕色夜行-CSDN博客

/*hid descriptor for a mouse*/

static struct hidg_func_descriptor kvm_mouse_data = {

.subclass = 0, /*NO SubClass*/

.protocol = 2, /*Mouse*/

.report_length = 6, //绝对值是6, 相对值是4不然打死调不通,实际很简单。但是没有全面了解协议是很难发现这些细节的

.report_desc_length = 126,//62,//104,

.report_desc={

#if 0

#else

0x05, 0x01, // USAGE_PAGE (Generic Desktop)

0x09, 0x02, // USAGE (Mouse)

0xa1, 0x01, // COLLECTION (Application)

0x09, 0x01, // USAGE (Pointer)

0xa1, 0x00, // COLLECTION (Physical)

0x85, 0x01, // REPORT_ID (1)

0x05, 0x09, // USAGE_PAGE (Button)

0x19, 0x01, // USAGE_MINIMUM (Button 1)

0x29, 0x03, // USAGE_MAXIMUM (Button 3)

0x15, 0x00, // LOGICAL_MINIMUM (0)

0x25, 0x01, // LOGICAL_MAXIMUM (1)

0x75, 0x01, // REPORT_SIZE (1)

0x95, 0x03, // REPORT_COUNT (3)

0x81, 0x02, // INPUT (Data,Var,Abs)

0x75, 0x05, // REPORT_SIZE (5)

0x95, 0x01, // REPORT_COUNT (1)

0x81, 0x01, // INPUT (Cnst,Ary,Abs)

0x05, 0x01, // USAGE_PAGE (Generic Desktop)

0x09, 0x30, // USAGE (X)

0x09, 0x31, // USAGE (Y)

0x15, 0x81, // LOGICAL_MINIMUM (-127)

0x25, 0x7f, // LOGICAL_MAXIMUM (127)

0x75, 0x08, // REPORT_SIZE (8)

0x95, 0x02, // REPORT_COUNT (2)

0x81, 0x06, // INPUT (Data,Var,Rel)

0xc0, // END_COLLECTION

0xc0, // END_COLLECTION

0x05, 0x01, // USAGE_PAGE (Generic Desktop)

0x09, 0x02, // USAGE (Mouse)

0xa1, 0x01, // COLLECTION (Application)

0x09, 0x01, // USAGE (Pointer)

0xa1, 0x00, // COLLECTION (Physical)

0x85, 0x02, // REPORT_ID (2)

0x05, 0x09, // USAGE_PAGE (Button)

0x19, 0x01, // USAGE_MINIMUM (Button 1)

0x29, 0x03, // USAGE_MAXIMUM (Button 3)

0x15, 0x00, // LOGICAL_MINIMUM (0)

0x25, 0x01, // LOGICAL_MAXIMUM (1)

0x75, 0x01, // REPORT_SIZE (1)

0x95, 0x03, // REPORT_COUNT (3)

0x81, 0x02, // INPUT (Data,Var,Abs)

0x75, 0x01, // REPORT_SIZE (1)

0x95, 0x05, // REPORT_COUNT (5)

0x81, 0x03, // INPUT (Cnst,Var,Abs)

0x05, 0x01, // USAGE_PAGE (Generic Desktop)

0x09, 0x30, // USAGE (X)

0x15, 0x00, // LOGICAL_MINIMUM (0)

0x26, 0xff, 0x7f, // LOGICAL_MAXIMUM (32767)

0x35, 0x00, // PHYSICAL_MINIMUM (0)

0x46, 0xff, 0x7f, // PHYSICAL_MAXIMUM (32767)

0x75, 0x10, // REPORT_SIZE (16)

0x95, 0x01, // REPORT_COUNT (1)

0x81, 0x02, // INPUT (Data,Var,Abs)

0x09, 0x31, // USAGE (Y)

0x15, 0x00, // LOGICAL_MINIMUM (0)

0x26, 0xff, 0x7f, // LOGICAL_MAXIMUM (32767)

0x35, 0x00, // PHYSICAL_MINIMUM (0)

0x46, 0xff, 0x7f, // PHYSICAL_MAXIMUM (32767)

0x75, 0x10, // REPORT_SIZE (16)

0x95, 0x01, // REPORT_COUNT (1)

0x81, 0x02, // INPUT (Data,Var,Abs)

0xc0, // END_COLLECTION

0xc0 // END_COLLECTION

#endif

}

};

复合键盘鼠标

 
  1. //该报告描述符号由HID Descriptor tool生成
  2. code ] = {
  3. //-------------键盘部分报告描述符----------------
  4. //表示用途页为通用桌面设备
  5. 0x05, 0x01, // USAGE_PAGE (Generic Desktop)
  6. //表示用途为键盘
  7. 0x09, 0x06, // USAGE (Keyboard)
  8. //表示应用集合,必须要以END_COLLECTION来结束它,见最后的END_COLLECTION
  9. 0xa1, 0x01, // COLLECTION (Application)
  10. //报告ID(报告ID 0是保留的)
  11. 0x85, 0x01, //Report ID (1)
  12. //表示用途页为按键
  13. 0x05, 0x07, // USAGE_PAGE (Keyboard)
  14. //用途最小值,这里为左ctrl键
  15. 0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)
  16. //用途最大值,这里为右GUI键,即window键
  17. 0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)
  18. //逻辑最小值为0
  19. 0x15, 0x00, // LOGICAL_MINIMUM (0)
  20. //逻辑最大值为1
  21. 0x25, 0x01, // LOGICAL_MAXIMUM (1)
  22. //报告大小(即这个字段的宽度)为1bit,所以前面的逻辑最小值为0,逻辑最大值为1
  23. 0x75, 0x01, // REPORT_SIZE (1)
  24. //报告的个数为8,即总共有8个bits
  25. 0x95, 0x08, // REPORT_COUNT (8)
  26. //输入用,变量,值,绝对值。像键盘这类一般报告绝对值,
  27. //而鼠标移动这样的则报告相对值,表示鼠标移动多少
  28. 0x81, 0x02, // INPUT (Data,Var,Abs)
  29. //上面这这几项描述了一个输入用的字段,总共为8个bits,每个bit表示一个按键
  30. //分别从左ctrl键到右GUI键。这8个bits刚好构成一个字节,它位于报告的第一个字节。
  31. //它的最低位,即bit-0对应着左ctrl键,如果返回的数据该位为1,则表示左ctrl键被按下,
  32. //否则,左ctrl键没有按下。最高位,即bit-7表示右GUI键的按下情况。中间的几个位,
  33. //需要根据HID协议中规定的用途页表(HID Usage Tables)来确定。这里通常用来表示
  34. //特殊键,例如ctrl,shift,del键等
  35. //这样的数据段个数为1
  36. 0x95, 0x01, // REPORT_COUNT (1)
  37. //每个段长度为8bits
  38. 0x75, 0x08, // REPORT_SIZE (8)
  39. //输入用,常量,值,绝对值
  40. 0x81, 0x03, // INPUT (Cnst,Var,Abs)
  41. //上面这8个bit是常量,设备必须返回0
  42. //这样的数据段个数为5
  43. 0x95, 0x05, // REPORT_COUNT (5)
  44. //每个段大小为1bit
  45. 0x75, 0x01, // REPORT_SIZE (1)
  46. //用途是LED,即用来控制键盘上的LED用的,因此下面会说明它是输出用
  47. 0x05, 0x08, // USAGE_PAGE (LEDs)
  48. //用途最小值是Num Lock,即数字键锁定灯
  49. 0x19, 0x01, // USAGE_MINIMUM (Num Lock)
  50. //用途最大值是Kana,这个是什么灯我也不清楚^_^
  51. 0x29, 0x05, // USAGE_MAXIMUM (Kana)
  52. //如前面所说,这个字段是输出用的,用来控制LED。变量,值,绝对值。
  53. //1表示灯亮,0表示灯灭
  54. 0x91, 0x02, // OUTPUT (Data,Var,Abs)
  55. //这样的数据段个数为1
  56. 0x95, 0x01, // REPORT_COUNT (1)
  57. //每个段大小为3bits
  58. 0x75, 0x03, // REPORT_SIZE (3)
  59. //输出用,常量,值,绝对
  60. 0x91, 0x03, // OUTPUT (Cnst,Var,Abs)
  61. //由于要按字节对齐,而前面控制LED的只用了5个bit,
  62. //所以后面需要附加3个不用bit,设置为常量。
  63. //报告个数为6
  64. 0x95, 0x06, // REPORT_COUNT (6)
  65. //每个段大小为8bits
  66. 0x75, 0x08, // REPORT_SIZE (8)
  67. //逻辑最小值0
  68. 0x15, 0x00, // LOGICAL_MINIMUM (0)
  69. //逻辑最大值255
  70. 0x25, 0xFF, // LOGICAL_MAXIMUM (255)
  71. //用途页为按键
  72. 0x05, 0x07, // USAGE_PAGE (Keyboard)
  73. //使用最小值为0
  74. 0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))
  75. //使用最大值为0x65
  76. 0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)
  77. //输入用,变量,数组,绝对值
  78. 0x81, 0x00, // INPUT (Data,Ary,Abs)
  79. //以上定义了6个8bit宽的数组,每个8bit(即一个字节)用来表示一个按键,所以可以同时
  80. //有6个按键按下。没有按键按下时,全部返回0。如果按下的键太多,导致键盘扫描系统
  81. //无法区分按键时,则全部返回0x01,即6个0x01。如果有一个键按下,则这6个字节中的第一
  82. //个字节为相应的键值(具体的值参看HID Usage Tables),如果两个键按下,则第1、2两个
  83. //字节分别为相应的键值,以次类推。
  84. //关集合,跟上面的对应
  85. 0xc0 , // END_COLLECTION
  86. //-----------------------鼠标部分报告描述符----------------------------
  87. 0x05, 0x01, // USAGE_PAGE (Generic Desktop)
  88. 0x09, 0x02, // USAGE (Mouse)
  89. 0xa1, 0x01, // COLLECTION (Application)
  90. 0x85, 0x02, // 报告ID (2)
  91. 0x09, 0x01, // USAGE (Pointer)
  92. 0xa1, 0x00, // COLLECTION (Physical)
  93. 0x05, 0x09, // USAGE_PAGE (Button)
  94. 0x19, 0x01, // USAGE_MINIMUM (Button 1)
  95. 0x29, 0x03, // USAGE_MAXIMUM (Button 3)
  96. 0x15, 0x00, // LOGICAL_MINIMUM (0)
  97. 0x25, 0x01, // LOGICAL_MAXIMUM (1)
  98. 0x95, 0x03, // REPORT_COUNT (3)
  99. 0x75, 0x01, // REPORT_SIZE (1)
  100. 0x81, 0x02, // INPUT (Data,Var,Abs)
  101. 0x95, 0x01, // REPORT_COUNT (1)
  102. 0x75, 0x05, // REPORT_SIZE (5)
  103. 0x81, 0x03, // INPUT (Cnst,Var,Abs)
  104. 0x05, 0x01, // USAGE_PAGE (Generic Desktop)
  105. 0x09, 0x30, // USAGE (X)
  106. 0x09, 0x31, // USAGE (Y)
  107. 0x09, 0x38, // USAGE (Wheel)
  108. 0x15, 0x81, // LOGICAL_MINIMUM (-127)
  109. 0x25, 0x7f, // LOGICAL_MAXIMUM (127)
  110. 0x75, 0x08, // REPORT_SIZE (8)
  111. 0x95, 0x03, // REPORT_COUNT (3)
  112. 0x81, 0x06, // INPUT (Data,Var,Rel)
  113. 0xc0, // END_COLLECTION
  114. 0xc0 // END_COLLECTION
  115. };

0x05, 0x01, // Usage Page (Generic Desktop)

0x04 代表是 Global 类的 Usage Page 功能,最位 2 位表示带多少个字节的数据,因为只带1 个数据,所以是 1,跟 0x04 组合起来就是 0x05 了。其他名称的意思都差不多,数值可以参照上一章的Generic Item Format

0x09, 0x02, // Usage (Mouse)

表示这是一个鼠标, Usage 是为了给对方解析数据时有个参照

0xA1, 0x01, // Collection (Application)

0xA1, 0x01 表示 CollectionApplication ; 0xA1, 0x00 表示 Collection Physical.表示下面所包含的是对 Mouse 的解释

0x85, 0x01, // Report Id (1)

该报告对应的 ID 是 1

0x09, 0x01, // Usage (Pointer)

这是个指针形式

0xA1, 0x00, // Collection (Physical)

下面所包含的是对指针的解释

0x05, 0x09, // Usage Page (Buttons)

下面定义的是按键

0x19, 0x01, // Usage Minimum (01) - Button 1

0x29, 0x03, // Usage Maximum (03) - Button 3

总共有 3 个按键

0x15, 0x00, // Logical Minimum (0)

0x25, 0x01, // Logical Maximum (1)

按键的值是 0 和 1,表示放开和按下

0x75, 0x01, // Report Size (1)

0x95, 0x03, // Report Count (3)

有 3 个 1 位,即用 3bits 分别对应三个按键

0x81, 0x02, // Input (Data, Variable,Absolute) - Button states

将这三个位加入本报告的数据中,这三位是可读写的绝对值

0x75, 0x05, // Report Size (5)

0x95, 0x01, // Report Count (1)

定义 1 个 5 位的数据

0x81, 0x01, // Input (Constant) - Padding or Reserved bits

将这个数据添加到本报告的数据中,主要是与前面 3 位组成一个字节,这 5 位是 Constant数据

0x05, 0x01, // Usage Page (Generic Desktop)

0x09, 0x30, // Usage (X)

0x09, 0x31, // Usage (Y)

0x09, 0x38, // Usage (Wheel)

下面定义的是 X,Y,Wheel 三个功能

0x15, 0x81, // Logical Minimum (-127)

0x25, 0x7F, // Logical Maximum (127)

X,Y,Wheel 的取值范围是-127~127

0x75, 0x08, // Report Size (8)

0x95, 0x03, // Report Count (3)

用三个字节来表示 x,y,wheel

0x81, 0x06, // Input (Data, Variable, Relative) - X & Y coordinate

将这三个字节添加到本报告中

0xC0, // End Collection

0xC0, // End Collection

以下是hid鼠标数据的生成,支持相对和绝对坐标鼠标数据

func generateMouseWheelReport(absolute bool, buttons [3]bool, axis [2]int, wheel uint8) (report []byte, err error) {var outdata [7]byteif absolute {outdata[0] = 0x02} else {outdata[0] = 0x01}if buttons[0] {outdata[1] |= BUTTON1}if buttons[1] {outdata[1] |= BUTTON2}if buttons[2] {outdata[1] |= BUTTON3}if absolute {binary.LittleEndian.PutUint16(outdata[2:], uint16(axis[0]))binary.LittleEndian.PutUint16(outdata[4:], uint16(axis[1]))outdata[6] = wheel} else {outdata[2] = uint8(axis[0])outdata[3] = uint8(axis[1])}return outdata[:], nil
}

usb gaghet hid 模拟鼠标键盘的绝对值描述相关推荐

  1. DM816X 实现 USB HID Gadget 鼠标键盘功能

    DM816X 实现 USB HID Gadget 鼠标键盘功能 开发环境: 平台: DM8168 内核 :linux 2.6.32 RDK:DVRRDK_04.00.00.03 USB口:DM8168 ...

  2. Delphi下利用WinIo模拟鼠标键盘详解

    本文最早在编程论坛上发表,文章地址:http://programbbs.com/bbs/view12-17207-1.htm,相关文件可以在上述地址的页面中下载.转载时请注明出处. 前言 一日发现Se ...

  3. Linux 模拟 鼠标 键盘 事件

    /************************************************************************* Linux 模拟 鼠标 键盘 事件* 说明:* 以 ...

  4. Delphi下利用SendInput模拟鼠标键盘

    前言 发了一篇<Delphi下利用WinIo模拟鼠标键盘详解>(http://programbbs.com/bbs/view12-17207-1.htm),再发一个利用SendInput模 ...

  5. C#模拟鼠标键盘控制其他窗口(一)

    编写程序模拟鼠标和键盘操作可以方便的实现你需要的功能,而不需要对方程序为你开放接口.比如,操作飞信定时发送短信等.我之前开发过飞信耗子,用的是对飞信协议进行抓包,然后分析协议,进而模拟协议的执行,开发 ...

  6. python 模拟鼠标键盘_python之模拟鼠标键盘动作

    上个月就打算开发个还算好玩的项目,但是一直没时间.这篇是此项目用到的一部分, 处理好此部分基本还差通信等方面的了.首先模拟鼠标键盘按下释放的动作,本人利用X11 这个库,所以要了解X11编程;其次,本 ...

  7. C# 模拟 鼠标 键盘操作

    C# 模拟 鼠标 键盘操作 转载于:https://www.cnblogs.com/macT/p/10208222.html

  8. python模拟鼠标键盘原理_Python-模拟鼠标键盘动作

    引 在使用电脑的时候,偶尔有需求要模拟鼠标键盘,进行一些机械重复的操作(刷新网页.抢票.某些小游戏等).如果为此专门下载一个按键精灵,总感觉杀鸡用牛刀,所以就开始探索一些轻量级解决方案.本人电脑上配置 ...

  9. python截图工具和模拟鼠标键盘_python PyAutoGUI 模拟鼠标键盘操作和截屏功能

    简介 一款跨平台/无依赖的自动化测试工具,目测只能控制鼠标/键盘/获取屏幕尺寸/弹出消息框/截屏. 安装 pip install pyautogui 鼠标键盘控制 >>> impor ...

最新文章

  1. java ide编辑器 idea 配置 与 插件
  2. uc/os内存管理的理解
  3. 去除冗余token的DETR效果怎么样?NUS颜水成团队提出端到端的PnP-DETR结构
  4. Android Studio 插件开发详解四:填坑
  5. Android监视器概述
  6. 《Reids 设计与实现》第十八章 事务
  7. zemax场曲畸变图_基于ZEMAX软件的短焦数字投影镜头的设计(2)
  8. 求问模式达人,静态类可否代替单件?
  9. 总结 | 四篇图网络综述文章提出的Future Directions
  10. linux中at重定位命令,readelf命令_Linux readelf 命令用法详解:用于显示elf格式文件的信息...
  11. IOS越狱运行Linux,iOS 13.4.1 Linux 简易越狱,重启就能打开
  12. win10强制删除文件夹(“你需要来自XXX的权限才能对此文件夹进行更改”的解决方法)
  13. 期货反向跟单—日内交易是否合适
  14. 音频播放AVAudioPlayer
  15. 杰理之无线MIC【篇】
  16. 魔兽世界场景组织浅析
  17. 昆仑通态人机界面与单片机通信实战教程三:脚本驱动与HDMI工程的关联
  18. 2021年中国绿茶产销现状及进出口贸易分析:产量达184.94万吨,同比增长0.36%[图]
  19. android 开关按钮素材,90个免费漂亮的切换开关按钮PSD
  20. tsd3dmapper软件使用方法_Mapper

热门文章

  1. 小程序公众号的微信支付0.2%费率商户号是怎么降低的?
  2. c#定义一个接口IShape,其中包括方法Area()用来计算面积,
  3. SpringBoot后台管理+Uniapp(混合APP)前端 之 酒店住宿+景点下单管理系统(SpringBoot前后端分离)
  4. Linux free 查看内存使用情况 常用命令
  5. EVE在Win10上安装
  6. 随身WiFi刷Debian系统折腾指南
  7. 第十七届D2大会(II)
  8. 北京小升初计算机编程特长生班,北京特长生小升初测试启动 家长凌晨排队取号 图...
  9. 苹果考虑推迟发布5G iPhone
  10. paper学习笔记 - PLE