CH372实现HID键盘功能

有些IC发卡器在刷卡时,卡号可以填写在文档光标处。这种产品很多年前就有了,最近刚好有客户有这方面需求,用CH372做了一款HID键盘类型的发卡器。

一款HID设备包括设备描述符,配置描述符,接口描述符,端点描述符,HID描述符,HID描述符包括报告描述符,另外还有字符串描述符,语言描述符。对HID键盘设备,用BusHound抓包时没看到PC请求语言描述符和字符串描述符。

设备描述符:

image

image

配置描述符:

image

image

image

image

报告描述符:

 

image

键盘的报告描述符共有8字节的输入报告和1字节的输出报告。

8字节输入报告:第1字节特殊按键,第2字节保留常量,第3-8字节普通按键,键值可以参考USB HID to PS/2 Scan Code Translation Table.

1字节输出报告:这1个字节总共用了5bits,使用3bits常量来补足成1个字节。5bits用来点亮键盘上的LED灯,比如数字灯,大小写灯等等。

如果不给键盘配置OUT端点,那么键盘的1字节输出报告将由控制端点的Set Report进行传输。

下面详细解释下报告描述符

第二部分是用来描述输入报告的第1个字节的,即8个控制键,包括左右CTL,左右ALT,左右SHIFT,左右WIN。

0x19,0xe0

0x29,0xe7

表示范围为8

0x15,0x00

0x25,0x01

由于按键的值要么为1(按下),要么为0(松开),所以逻辑最大值为1,最小值为0.

0x75,0x01

0x95,0x08

Report size单位为1bit,report count为8,所以1*8共占用1个字节

0x81,0x02

由于按键为输入(对主机来说),所以为INPUT,并且为数据(DATA),变量(VAR),绝对值(ABS)

第3部分是描述键盘输入报告第2个字节的,这个字节是保留的,为常量

0x95,0x01

0x75,0x08

8bit*1为1字节。

0x81,0x03

这个字节为常量

第4部分是描述输出报告LED输出,只用了5个,所以report count为5

第5部分描述描述输出报告的剩余3bit,和第4部分的5bit凑成1个字节,这3个bit是常量。

第6部分描述6个字节的键盘键值(一个字节表示一个键)。所以一次最多可以发送6个键值。

例如键盘发送一帧数据

02 00 04 05 00 00 00 00

表示同时按下了left shift |+‘a’+‘b’三个键。

注意在发送键盘字符时,发送一个键盘字符后,要发送8字节0,表示按键已释放,否则电脑会认为这个键一直按下。两帧数据的间隔时间不能太短,在20ms左右。间隔太短,电脑会收不到数据。

发表评论

电子邮件地址不会被公开。 必填项已用*标注