转自:https://blog.csdn.net/techhome803/article/details/9928873

转自:http://www.amobbs.com/forum.php?mod=viewthread&tid=4823160&page=1&authorid=249202

想用STM32做个无线键鼠遥控、找了好几天没有找到完整的USB鼠标键盘协议介绍。最后自己收集整理了一份,希望对需要的朋友有所帮助。

废话不多说,进入正题:

鼠标发送给PC的数据每次4个字节
BYTE1 BYTE2 BYTE3 BYTE4
定义分别是:
BYTE1 --
       |--bit7:   1   表示   Y   坐标的变化量超出-256   ~   255的范围,0表示没有溢出 
       |--bit6:   1   表示   X   坐标的变化量超出-256   ~   255的范围,0表示没有溢出 
       |--bit5:   Y   坐标变化的符号位,1表示负数,即鼠标向下移动 
       |--bit4:   X   坐标变化的符号位,1表示负数,即鼠标向左移动 
       |--bit3:     恒为1 
       |--bit2:     1表示中键按下 
       |--bit1:     1表示右键按下 
       |--bit0:     1表示左键按下 
BYTE2 -- X坐标变化量,与byte的bit4组成9位符号数,负数表示向左移,正数表右移。用补码表示变化量 
BYTE3 -- Y坐标变化量,与byte的bit5组成9位符号数,负数表示向下移,正数表上移。用补码表示变化量
BYTE4 -- 滚轮变化。
由于手上没有USB鼠标,对BYTE1的4-7位没有测试,对于BYTE2 BYTE3做个测试,BYTE1的4-7全为0的时候,BYTE2 BYTE3的正负表示鼠标移动方向

键盘发送给PC的数据每次8个字节
BYTE1 BYTE2 BYTE3 BYTE4 BYTE5 BYTE6 BYTE7 BYTE8
定义分别是:
BYTE1 --
       |--bit0:   Left Control是否按下,按下为1 
       |--bit1:   Left Shift  是否按下,按下为1 
       |--bit2:   Left Alt    是否按下,按下为1 
       |--bit3:   Left GUI    是否按下,按下为1 
       |--bit4:   Right Control是否按下,按下为1  
       |--bit5:   Right Shift 是否按下,按下为1 
       |--bit6:   Right Alt   是否按下,按下为1 
       |--bit7:   Right GUI   是否按下,按下为1 
BYTE2 -- 暂不清楚,有的地方说是保留位
BYTE3--BYTE8 -- 这六个为普通按键
键盘经过测试。
例如:键盘发送一帧数据   02 00 0x04 0x05 00 00 00 00
表示同时按下了Left Shift + ‘a’+‘b’三个键
对于键码和PS2的键盘有所不同,具体请看附件。
USB HID to PS2 Scan Code 对照表.pdfourdev_651088NZ5EKW.pdf(文件大小:133K) (原文件名:USB
HID to PS2 Scan Code Translation Table .pdf)

2011.6.23补充说明
补充对于键盘BYTE2的说明:
参照百合网(http://www.baiheee.com/OpenSource/Easy%20USB%2051%20Programer/Easy%20USB%2051%20Programer12.htm)键盘的报告描述符,如下
/*******************************************************************************************/
//这里只列出了第二个字节的说明
    //这样的数据段个数为1    
    0x95, 0x01,                    //   REPORT_COUNT (1)    
    //每个段长度为8bits    
    0x75, 0x08,                    //   REPORT_SIZE (8)    
    //输入用,常量,值,绝对值    
    0x81, 0x03,                    //   INPUT (Cnst,Var,Abs)    
        
    //上面这8个bit是常量,设备必须返回0  
/*******************************************************************************************/
这里只是指明了这是一个以字节为单位的输入数据,并没有指明它的取值范围。

在HID1.11协议的Appendix B-->B.1 Protocol 1 (Keyboard) 的报告描述符中也有这样的说明(HID1.11协议的59页)
/*******************************************************************************************/
   Report Count (1),  
   Report Size (8), 
   Input (Constant),              ;Reserved byte 
   Report Count (5),  
   Report Size (1), 
/*******************************************************************************************/
在注释中说明,这个字节是保留字节。
这里我也把HID1.11传上来给大家研究。
ourdev_651409JXHOAD.pdf(文件大小:661K) (原文件名:HID1.11协议.pdf)

ourdev_651410WJINWH.pdf(文件大小:745K) (原文件名:HID用途表1.12.pdf)

把键盘的输出字节补充出来
USB-HID键盘一般还会有一个输出字节,由PC发送给键盘,控制键盘指示灯。
BYTE0 
格式如下
BYTE0 --
       |--bit0:   NUM LOCK 
       |--bit1:   CAPS LOCK 
       |--bit2:   SCROLL LOCK 
       |--bit3:   COMPOSE
       |--bit4:   KANA 
       |--bit5:   CONSTANT 
       |--bit6:   CONSTANT  
       |--bit7:   CONSTANT

0 = OFF, 1 = ON
CONSTANT表示保留位,为常数0

注:这种数据一般是根据Report
Descriptor指定数据格式的,只能说大部分是这样。比如罗技的鼠标,它就包含有5个字节,关于X和Y每个有12bit,而不是1Byte(8bit)。有的多功能鼠标还包含其他功能,比如说前进,后退,肯定不止这些功能,所以数据肯定不止这些

USB-HID鼠标、键盘通讯格式【转】的更多相关文章

  1. usb的hid鼠标键盘报告描述符(五)

    title: usb的hid鼠标键盘报告描述符 tags: linux date: 2018/12/20/ 18:05:08 toc: true --- usb的hid鼠标键盘报告描述符 https: ...

  2. USB-HID鼠标、键盘通讯格式(转) 与本人实际测试结果

    内容为网络转载,如有版权问题请联系删除 USB鼠标键盘协议介绍. 鼠标发送给PC的数据每次4个字节:BYTE1 BYTE2 BYTE3 BYTE4.定义分别是:BYTE1 -- |--bit7:    ...

  3. linux 读取 USB HID鼠标坐标和点击 在 LCD上显示

    首先要,编译内核时启用了 USB HID 设备.启用了 鼠标 . 在开发板上插入usb 时会有如下提示. 可以看到,多了一个 mouse0 和 eventX 打出来的是我的 联想鼠标. 1, 在 终端 ...

  4. 玩转X-CTR100 l USB功能-HOST鼠标键盘

    更多塔克创新资讯欢迎登陆[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] X-CTR100控制器具有MicroUSB接口,支持SLAVE和HOST两 ...

  5. USB HID复合设备实例—键盘+鼠标

    实现这种USB HID复合设备有两种方法,在<USB HID协议入门>一节已经讲到其中一种方法,说一个USB HID设备可以包含多种功能的报告描述符合集,这样可以实现复合设备,如带鼠标功能 ...

  6. DM816X 实现 USB HID Gadget 鼠标键盘功能【转】

    转自:https://my.oschina.net/renyongke/blog/410695 开发环境: 平台: DM8168 内核 :linux 2.6.32 RDK:DVRRDK_04.00.0 ...

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

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

  8. 使用Gadget 做usb鼠标键盘设备

    使用Gadget 做usb鼠标键盘设备 感谢TI社区提供的好帮助啊!http://e2e.ti.com/support/arm/sitara_arm/f/791/p/571771/2103409?pi ...

  9. 技巧.【转】在虚拟机Vmware中使用HID设备(如USB免驱键盘)

    ZC:我的环境:Win7x64.VMware10 ZC:我的处理: ZC: (1).usb.generic.allowHID = "TRUE" (本来就有,将它的位置提前) ZC: ...

随机推荐

  1. 第三次spring冲刺2

    完成了对错题的收集,和做错题的功能,运用了android自带的SQLite数据库.

  2. Beta吐槽

    目录 感想 管理团队 推进项目 pm吐槽 开发 经过我慎重的考虑,我jio得,Beta版本的吐槽还是不能少. 感想 管理团队 这学期十分庆幸成为我们这个这么优秀的团队的pm.身在pm的位置上经历这么一 ...

  3. ElasticSearch 2 (34) - 信息聚合系列之多值排序

    ElasticSearch 2 (34) - 信息聚合系列之多值排序 摘要 多值桶(terms.histogram 和 date_histogram)动态生成很多桶,Elasticsearch 是如何 ...

  4. Alpha 冲刺二

    团队成员 051601135 岳冠宇 051604103 陈思孝 031602629 刘意晗 031602248 郑智文 031602234 王淇 会议照片 项目燃尽图 项目进展 暂无进展, 项目描述 ...

  5. PHP随机函数rand()、mt_rand()、srand()、mt_srand() 的区别

    1.生成随机数发生器种子的函数 srand(). mt_srand() 区别:mt_srand()  比 srand() 更好的生成随机数发生器种子 定义: void srand([int $seed ...

  6. 使用ETL构建数据仓库的思考

    使用ETL构建数据仓库的思考 背景:公司的数据仓库建设项目启动在即,所谓万事开头难,如何在我们数仓建设规划的前期做好业务数据准备和系统建设规划是我们需要思考的问题,这里根据之前的自己参与过的公司ODS ...

  7. BZOJ4628 BJOI2016IP地址(trie)

    离线,每次修改相当于对该规则的所有匹配点的值+1,考虑在trie上打加法标记和匹配标记,匹配标记不下传,加法标记下传遇到匹配标记时清空.注意是用b时刻前缀-a时刻前缀,而不是(a-1)时刻前缀,具体我 ...

  8. 【洛谷】NOIP2018原创模拟赛DAY1解题报告

    点此进入比赛 T1:小凯的数字 题意:给定q个l,r,求l(l+1)(l+2)...(r-1)r模9的结果 很显然,这是道考验数(运)学(气)的题目 结论:输出\((l+r)*(r-l+1)\over ...

  9. 浅谈平衡树splay

    首先splay和treap不一样,treap通过随机数来调整树的形态.但splay不一样,再每插入或操作一次后,你都会把他旋转到根,再旋转过程中树的形态会不断改变,这样来达到均摊效果 常数据大. 来看 ...

  10. 【题解】 luogu 3857 [TJOI2008]彩灯 (线性基)

    luogu3857,懒得复制 Solution: 裸的线性基,往里面添加数,记录添加个数\(sum\),快速幂输出\(2^{sum}\)即可 Code: //It is coded by Ning_M ...