USB键盘鼠标描述符及数据格式分析

这篇具有很好参考价值的文章主要介绍了USB键盘鼠标描述符及数据格式分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一:键盘

        1:键盘的hid描述符如下,数据的输入断点为中断方式,当有键盘敲击事件时,会上报长度为8字节的数据描述符,描述符共有8字节的输入报告和1字节的输出报告。

        0x05,0x01,// Global Generic Desktop

        0x09,0x06,// Local KeyBoard

        0xA1,0x01,// Main app collection

        0x05,0x07,// Global KeyBoard

        //第1字节

        0x19,0xe0,// Local Usage Min (KeyBoard LeftControl)

        0x29,0xe7,// Local Usage Max (KeyBoard Right GUI)

        0x15,0x00,// Global Logical Min

        0x25,0x01,// Global Logical Max

        0x95,0x08,// Global ReportCount

        0x75,0x01,// Global ReportSize

        0x81,0x02,// Main Input(Data,Var,Abs)

        //第2字节

        0x95,0x01,// Global ReportCount

        0x75,0x08,// Global ReportSize

        0x81,0x03,// Main Input(Cnst,Var,Abs)

        //第3-8字节

        0x95,0x06,// Global ReportCount

        0x75,0x08,// Global ReportSize

        0x15,0x00,// Global Logical Min

        0x26,0xff,0x00,//Global Logical Max

        0x19,0x00,// Local Usage Min

        0x29,0x65,// Local Usage Max

        0x81,0x00,// Main Output(Data,Ary,Abs)

        //1字节输出报告

        0x15,0x00,// Global Logical Min

        0x25,0x01,// Global Logical Max

        0x95,0x05,// Global ReportCount

        0x75,0x01,// Global ReportSize

        0x05,0x08,// Global LED

        0x19,0x01,// Local Usage Min

        0x29,0x05,// Local Usage Max

        0x91,0x02,// Main Output(Data,Var,Abs)

        //补足上面变成1个字节

        0x95,0x01,// Global ReportCount

        0x75,0x03,// Global ReportSize

        0x91,0x03,// Main Output(Cnst,Var,Abs)

        0xc0      // Main End collection

2:1字节的输出报告

        如果不给键盘配置OUT端点,那么键盘的1字节输出报告将由控制端点的SetReport进行传输。这1个字节总共用了5bit和3bit常量来补足1个字节。5bits用来点亮特殊键盘上的led灯,比如键盘的大小写,数字键等。

3:8字节的输入报告

        BYTE        bit7        bit6         bit5         bit4         bit3        bit2        bit1        bit0

           0           r-gui        r-alt       r-shitf       r-ctrl        l-gui       l-alt       l-shift      l-ctrl

           1          reserved

           2          keyboard page usage

           3          keyboard page usage

           4          keyboard page usage

           5          keyboard page usage

           6          keyboard page usage

           7          keyboard page usage

        BYTE0 各bit表示足有GUI(win),Alt,Shift,Ctrl键是否按下,按下为1。

        BYTE1 保留

        BYTE2-7 表示此时按下的其他所有键盘按键的键码,从低到高填充,没按就是0x00.如果同时按下的键超过允许,则显示0xff。

        keyboard page usage 定义如下:

        #define        KB_ERROR            0x01

        #define        KB_A                0x04

        #define        KB_B                0x05

        #define        KB_C                0x06

        #define        KB_D                0x07

        #define        KB_E                0x08

        #define        KB_F                0x09

        #define        KB_G                0x0A

        #define        KB_H                0x0B

        #define        KB_I                0x0C

        #define        KB_J                0x0D

        #define        KB_K                0x0E

        #define        KB_L                0x0F

        #define        KB_M                0x10

        #define        KB_N                0x11

        #define        KB_O                0x12

        #define        KB_P                0x13

        #define        KB_Q                0x14

        #define        KB_R                0x15

        #define        KB_S                0x16

        #define        KB_T                0x17

        #define        KB_U                0x18

        #define        KB_V                0x19

        #define        KB_W                0x1A

        #define        KB_X                0x1B

        #define        KB_Y                0x1C

        #define        KB_Z                0x1D

        #define        KB_1                0x1E

        #define        KB_2                0x1F

        #define        KB_3                0x20

        #define        KB_4                0x21

        #define        KB_5                0x22

        #define        KB_6                0x23

        #define        KB_7                0x24

        #define        KB_8                0x25

        #define        KB_9                0x26

        #define        KB_0                0x27

        #define        KB_ENTER            0x28

        #define        KB_ESC                0x29

        #define        KB_BACKSPACE        0x2A

        #define        KB_TAB                0x2B

        #define        KB_SPACE            0x2C

        #define        KB_MIUS                0x2D    //-_

        #define        KB_EQUAL            0x2E    //=+

        #define        KB_LSQUBRACKET        0x2F    //[{

        #define        KB_RSQUBRACKET        0x30    //]}

        #define        KB_BACKSLASH        0x31    //\|

        #define        KB_SEMICOLON        0x33    //;:

        #define        KB_APOSTROPHE        0x34    //'"

        #define        KB_TILDE            0x35    //`~

        #define        KB_COMMA            0x36    //,<

        #define        KB_FULLSTOP            0x37    //.>

        #define        KB_SLASH            0x38    ///?

        #define        KB_CAPSLOCK            0x39  

        #define        KB_F1                0x3A

        #define        KB_F2                0x3B

        #define        KB_F3                0x3C

        #define        KB_F4                0x3D

        #define        KB_F5                0x3E

        #define        KB_F6                0x3F

        #define        KB_F7                0x40

        #define        KB_F8                0x41

        #define        KB_F9                0x42

        #define        KB_F10                0x43

        #define        KB_F11                0x44

        #define        KB_F12                0x45

        #define        KB_PRTSCR            0x46

        #define        KB_SCOLLLOCK        0x47

        #define        KB_PAUSE            0x48

        #define        KB_INSERT            0x49

        #define        KB_HOME                0x4A

        #define        KB_PAGEUP            0x4B

        #define        KB_DELETE            0x4C

        #define        KB_END                0x4D

        #define        KB_PAGEDOWN            0x4E

        #define        KB_RARROW            0x4F

        #define        KB_LARROW            0x50

        #define        KB_DARROW            0x51

        #define        KB_UARROW            0x52

        #define        KB_NUMLOCK            0x53

        #define        KB_PAD_DIV            0x54    ///

        #define        KB_PAD_MUL            0x55    //*

        #define        KB_PAD_MINUS        0x56    //-

        #define        KB_PAD_PLUS           0x57    //+

        #define        KB_PAD_ENTER        0x58

        #define        KB_PAD_1            0x59

        #define        KB_PAD_2            0x5A

        #define        KB_PAD_3            0x5B

        #define        KB_PAD_4            0x5C

        #define        KB_PAD_5            0x5D

        #define        KB_PAD_6            0x5E

        #define        KB_PAD_7            0x5F

        #define        KB_PAD_8            0x60

        #define        KB_PAD_9            0x61

        #define        KB_PAD_0            0x62

        #define        KB_PAD_DEL           0x63

        #define        KB_APPLICATION        0x65    //RWin右边键

二:鼠标

        1:鼠标描述符如下

        0x05,0x01, // Global Generic Desktop

        0x09,0x02, // Local Mouse

        0xa1,0x01, // Main app collection

        0x09,0x01, // Local Pointer

        0xa1,0x00, // Main phy collection

        0x95,0x03, // Global ReportCount

        0x75,0x01, // Global ReportSize

        0x05,0x09, // Global Button

        0x19,0x01, // Local Usage Min

        0x29,0x03, // Local Usage Max

        0x15,0x00, // Global Logical Min

        0x25,0x01, // Global Logical Max

        0x81,0x02, // Main Input(Data,Var,Abs)

        0x95,0x01, // Global ReportCount

        0x75,0x05, // Global ReportSize

        0x81,0x03, // Main Input(Cnsr,Var,Abs)

        0x95,0x03,0x75,0x08, // Global ReportCount Global ReportSize

        0x05,0x01, // Global Generic Desktip

        0x09,0x30, // Local X

        0x09,0x31, // Local Y

        0x09,0x38, // Locak Wheel

        0x15,0x81, // Global Logical Min

        0x25,0x7f, // Global Logical Max

        0x81,0x06, // Main Input(Data,Var,Rel)

        0xc0,      // Main End collection

        鼠标发送给PC的数据每次4个字节。

        BYTE1字节:
        bit7~3:补充的常数,无意义,这里为0即可
        bit2: 1表示中键按下
        bit1: 1表示右键按下 0表示右键抬起
        bit0: 1表示左键按下 0表示左键抬起
        BYTE2 — X坐标变化量,与byte的bit4组成9位符号数,负数表示向左移,正数表右移。用补码表示变化量
        BYTE3 — Y坐标变化量,与byte的bit5组成9位符号数,负数表示向下移,正数表上移。用补码表示变化量
        BYTE4 — 滚轮变化。0x01(1)表示滚轮向前滚动一格;0xFF(-1)表示滚轮向后滚动一格;0x80(-0)是个中间值,不滚动

        实际测试:

        BYTE2 X坐标变化量,当BYTE1的bit4为0的时候,0x01~0x7F为向左移动,0x81~0xFF为向右移动,0x00,0x80为不移动。BYTE1的bit4为1的时候,依旧。试验数据是跟BYTE1的bit4没什么关系。

        BYTE3的变化跟BYTE2的一样。
因此BYTE2/BYTE3/BYTE4的变化趋势都是一样的,中间是分界点,山峰结构。从低到高,再从高到低。

        

 文章来源地址https://www.toymoban.com/news/detail-855444.html

到了这里,关于USB键盘鼠标描述符及数据格式分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • stm32 USB复合设备 cubeMX库一键生成 多路CDC串口 HID鼠标键盘 Composite Device

    最近有个需求,需要同时用usb键盘鼠标和虚拟串口等,因为平时没怎么研究过usb协议,所以自己写复合设备一直没有成功,然后正巧在github上看到了一个stm32的一个usb复合设备库,可以快速配置usb组合设备,并且支持超级多路串口 Gihub地址 https://github.com/alambe94/I-CUBE-USBD-Compo

    2024年02月09日
    浏览(49)
  • 【流量分析】USB键盘与鼠标流量分析

    USB流量指的是USB设备接口的流量,攻击者能够通过监听usb接口流量获取键盘敲击键、鼠标移动与点击、存储设备的铭文传输通信、USB无线网卡网络传输内容等等。 在CTF中,USB流量分析主要以键盘和鼠标流量为主。 下面通过简单的讲解与例题的展示,分析键盘流量与鼠标流量

    2024年02月08日
    浏览(31)
  • USB HID键盘实现全键无冲解析

    目录 前言 设备描述符 配置描述符 配置描述符 接口描述符 HID描述符 端点描述符 HID类报表描述符 输入输出数据解析 其他         看了稚辉君的瀚文键盘的源码之后对于键盘全键无冲的实现还是存在很多疑问。1、HID报表描述符的内容到底什么意思?2、瀚文源码里的键值映射

    2024年02月09日
    浏览(33)
  • STM32。USB HID,如何发送标准键盘的按键报告?

    我们要求STM32芯片的usb和windows电脑的USB接口进行连接,然后STM32芯片发送usb数据给windows电脑,实现电脑上按下一个f按键的效果。 下面开始操作: 使用STM32CubeMX生成代码,先选择对应的usb口 然后选择第三方软件,选择HID 然后点击生成代码,这时候就会生成usbd_hid.c相关的代码

    2024年02月12日
    浏览(29)
  • USB标准键盘按键数据包格式解析

    标准键盘一次发送8个字节,解释如下: 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

    2024年02月01日
    浏览(32)
  • 第10课【STM32 USB通讯协议实战】HID键盘+CDC虚拟串口组合设备

    文章中的部分概念可参考第9课【USB协议】USB总线 接口 端点 管道 数据包 枚举 STM32_USB-FS-Device_Lib V4.1.0 USB协议中为了提供对多样设备的支持,定义了许多外部设备子类,常见的包括: 人机交互类设备HID(Human Interface Device) 通信类设备CDC(Communicate Device Class) 大容量存储设备

    2024年02月04日
    浏览(44)
  • linux嵌入式开发-Zynq开发板配置usb_gadget模拟HID鼠标

    在PC上使用VMWare,在ubuntu下创建petalinux工程,编译内核,vmware、vivdado、petalinux的安装详见alinx官方教程course4-linux实验中的步骤 创建petalinux工程,在工程目录下打开终端,输入命令准备编译内核 然后编译内核: 进入Devicedrivers - USB Support,勾选USB Gadget Support(按Y) 进入USB Gadge

    2024年02月04日
    浏览(47)
  • 串口转HID键盘鼠标芯片沁恒微电子CH9329

    概述 沁恒微电子CH9329 是一款串口转标准 USB HID 设备(键盘、鼠标、自定义 HID)芯片,根据不同的工作模式, 在电脑上可被识别为标准的 USB 键盘设备、USB 鼠标设备或自定义 HID 类设备。该芯片接收客户端发送过来的串口数据,并按照 HID 类设备规范,将数据先进行打包再通过

    2024年02月10日
    浏览(29)
  • USB鼠标实现——设备描述符(一)

    仓库地址 枚举过程 USB鼠标实现——设备描述符(一) USB鼠标实现——设置地址(二) USB鼠标实现——配置描述符集合(三) USB鼠标实现——字符串描述符(四) USB鼠标实现——设备限定描述符(五) USB鼠标实现——设置配置和获取配置(六) USB鼠标实现——报告描述符

    2024年02月09日
    浏览(55)
  • 基于XG24-EK2703A的BLE HID蓝牙键盘+鼠标复合设备功能开发(BLE+HID+FreeRTOS+Gecko SDK)

    👉 【Funpack3-1】基于XG24-EK2703A的BLE HID蓝牙键盘+鼠标复合设备 👉 Github: EmbeddedCamerata/XG24_ble_hid_keymouse 本项目基于Silicon Labs XG24-EK2703A开发板,通过HID协议实现了一个蓝牙键盘+鼠标复合设备,可通过按键实现上下翻页、发送字符功能。使用板载两个按键,当BTN0按下,向上翻页;

    2024年01月25日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包