HID键盘与对应中断报文

huiyi
2024-03-04 / 0 评论 / 285 阅读 / 正在检测是否收录...

概述

在编写键盘固件时,理解如何注册设备并发送按键上报是至关重要的。常用的USB键盘通常采用WASD布局。下面将介绍如何实现HID键盘与对应中断报文的通信。

设备注册

想要想系统注册设备,首先需要了解一下 USB 的 HID 类中最重要的报告描述符。

报告描述符定义了 USB 设备功能的数据格式和使用方法。

USB中文网有专门的专题页对其进行讲解,推荐看看。

USB官网HID报告描述符生成工具 - USB中文网 (usbzh.com)

以下为我在瀚文75扩展中注册的虚拟键盘设备的报告描述符

image.png

按键上报

HID报文长度为8字节,我的报文增加了一个Report ID,所以是9字节,首字节固定为报告ID,也就是2

uint8_t keyBoardData[9] = {2, 0, 0, 0, 0, 0, 0, 0};

除掉报告首字节,第一个报表报文字节为附加按键状态

报文码

第一个字节可以使用计算器或者位移计算

例如:

我想同时按下左CTRL+左GUI(WIN)+TAB那么第一位如下

计算器算键码

加上键扫描码0x2B(扫描代码大全见附录)

最终发送

uint8_t keyBoardData[9] = {2, 0x9, 0, 0x2B, 0, 0, 0, 0};

键扫描码

按键名称HID码(扫描码)十进制[十六进制]虚拟键码VK 十进制[十六进制]
ESC41 [0X29]27 [0x1B]
F158 [0X3a]112 [0x70]
F259 [0X3b]113 [0x71]
F360 [0X3c]114 [0x72]
F461 [0X3d]115 [0x73]
F562 [0X3e]116 [0x74]
F663 [0X3f]117 [0x75]
F764 [0X40]118 [0x76]
F865 [0X41]119 [0x77]
F966 [0X42]120 [0x78]
F1067 [0X43]121 [0x79]
F1168 [0X44]122 [0x7A]
F1269 [0X45]123 [0x7B]
Esc41 [0X29]27 [0x1B]
(回退)Back42 [0X2a]8 [0x08]
Tab43 [0X2b]9 [0x09]
(大小写)CapLck57 [0X39]20 [0x14]
(回车)Enter40 [0X28]13 [0x0D]
(空格)Space44 [0X2c]32 [0x20]
Scroll71 [0X47]145 [0x91]
(暂停)Pause72 [0X48]19 [0x13]
(插入)Insert73 [0X49]45 [0x2D]
(截屏)PrintScr70 [0X46]44 [0x2C]
(删除)Delete76 [0X4c]46 [0x2E]
(首页)Home74 [0X4a]36 [0x24]
(结尾)End77 [0X4d]35 [0x23]
(上一页)PageUp75 [0X4b]33 [0x21]
(下一页)PageDn78 [0X4e]34 [0x22]
(左)Left80 [0X50]37 [0x25]
(上)Up82 [0X52]38 [0x26]
(右)Right79 [0X4f]39 [0x27]
(下)Down81 [0X51]40 [0x28]
(小键盘0)Num098 [0X62]96 [0x60]
Num189 [0X59]97 [0x61]
Num290 [0X5a]98 [0x62]
Num391 [0X5b]99 [0x63]
Num492 [0X5c]100 [0x64]
Num593 [0X5d]101 [0x65]
Num694 [0X5e]102 [0x66]
Num795 [0X5f]103 [0x67]
Num896 [0X60]104 [0x68]
Num997 [0X61]105 [0x69]
(加号)NumAdd87 [0X57]107 [0x6B]
(减号)NumSub86 [0X56]109 [0x6D]
(乘号)NumMult85 [0X55]106 [0x6A]
(除号)NumDiv84 [0X54]111 [0x6F]
(点)NumDecim99 [0X63]110 [0x6E]
(数字锁定键)NumLock83 [0X53]144 [0x90]
Ctrl1 [0X01]17 [0x11]
(左CTR)LCtrl1 [0X01]162 [0xA2]
RCtrl16 [0X10]163 [0xA3]
Shift2 [0X02]16 [0x10]
LShift2 [0X02]160 [0xA0]
RShift32 [0X20]161 [0xA1]
Alt4 [0X04]18 [0x12]
LAlt4 [0X04]164 [0xA4]
RAlt64 [0X40]165 [0xA5]
WIN8 [0X08]91 [0x5B]
LWIN8 [0X08]91 [0x5B]
RWIN128 [0X80]92 [0x5C]
A4 [0X04]65 [0x41]
B5 [0X05]66 [0x42]
C6 [0X06]67 [0x43]
D7 [0X07]68 [0x44]
E8 [0X08]69 [0x45]
F9 [0X09]70 [0x46]
G10 [0X0a]71 [0x47]
H11 [0X0b]72 [0x48]
I12 [0X0c]73 [0x49]
J13 [0X0d]74 [0x4A]
K14 [0X0e]75 [0x4B]
L15 [0X0f]76 [0x4C]
M16 [0X10]77 [0x4D]
N17 [0X11]78 [0x4E]
O18 [0X12]79 [0x4F]
P19 [0X13]80 [0x50]
Q20 [0X14]81 [0x51]
R21 [0X15]82 [0x52]
S22 [0X16]83 [0x53]
T23 [0X17]84 [0x54]
U24 [0X18]85 [0x55]
V25 [0X19]86 [0x56]
W26 [0X1a]87 [0x57]
X27 [0X1b]88 [0x58]
Y28 [0X1c]89 [0x59]
Z29 [0X1d]90 [0x5A]
039 [0X27]48 [0x30]
130 [0X1e]49 [0x31]
231 [0X1f]50 [0x32]
332 [0X20]51 [0x33]
433 [0X21]52 [0x34]
534 [0X22]53 [0x35]
635 [0X23]54 [0x36]
736 [0X24]55 [0x37]
837 [0X25]56 [0x38]
938 [0X26]57 [0x39]
0

评论 (0)

取消