有些IC发卡器在刷卡时,卡号可以填写在文档光标处。这种产品很多年前就有了,最近刚好有客户有这方面需求,用CH372做了一款HID键盘类型的发卡器。
一款HID设备包括设备描述符,配置描述符,接口描述符,端点描述符,HID描述符,HID描述符包括报告描述符,另外还有字符串描述符,语言描述符。对HID键盘设备,用BusHound抓包时没看到PC请求语言描述符和字符串描述符。
设备描述符:
配置描述符:
报告描述符:
键盘的报告描述符共有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左右。间隔太短,电脑会收不到数据。