在上一节中我们实现了USB鼠标实例,通过学习,知道决定HID设备的“身份”的因素有 1)5个标准描述符中与HID设备有关的部分有:
2)队了上面提到的usb标准描述符里影响HID设备类型的地方外,还包括3个HID设备类特定描述符:HID描述符、报告描述符、实体描述符。 如此看来我们只需在上一节实例的基础上把接口描述符中 bInterfaceProtocol 的值改为2,系统就应该能别设备识别成USB键盘。先下载上一节实例: 然后再将Descriptor.c文件里接口描述符的bInterfaceProtocol字段值改为2,保存,编译并烧录程序试试效果,下面是改好后的程序:
下面我们就来修改报告描述符,把报告描述符的内容修改如下:
另外,还需要修改Descriptor.h中定义这个报告描述符的相关代码。 上面定义的报告描述符描述了输入(设备到主机)和输出(主机到设备)两个数据包,输入数据包由8个字节组成,第一个字节用来描述特殊键,第二字节保留,后面六个字节代表6个普通按键。 特殊键用第一个字节的不同位来表示,特殊键由USB HID Usage Table定义(P59),如果按下的是左边那个Ctrl键,那应该发送01 00 00 00 00 00 00 00(十六进制),如果按下的是右边的Ctrl键,则应该发送10 00 00 00 00 00 00 00,如果同时按下左Ctrl和左Alt,应该发送:05 00 00 00 00 00 00 00。 普通键用后面六个字节来表示,如果只按下字母“a”,应发送00 00 04 00 00 00 00 00,如果同时按下字母“a”和“b”应发送00 00 04 05 00 00 00 00或00 00 05 04 00 00 00 00都可以,如果同时按下左Shift和字母“a”,那就应该发送02 00 04 00 00 00 00 00,在此状态下先释放字母“a”再释放左Shitf,那应该先发送一次02 00 00 00 00 00 00 00,再发送一次00 00 00 00 00 00 00 00。 输出报告是用来指示状态LED的,在USB HID Usage Table定义(P61)了各种状态LED,上面的报告描述符定义了可用的状态LED有Num Lock、Caps Lock 、Scroll Lock 、Compose、Kana五种(后面两种我也不知道是什么作用),当LED状态发生变化时,主机就会向设备发送只一个字节的数据包,用不两同的位来表示,如果没有灯亮,则发送0x00,Num Lock亮则发送0x01,Caps Lock 亮则发送0x02,如果两个都亮则发送0x03。 根据上面的知识我们用扩展板上的K1和K2分别代表Windows键和NumLock键,并用扩展板上的一个LED指示灯来代表Num Lock灯,特别需要注意的是,控制NumLock指示灯不应该在主控芯片里判断当到K2按下后就打开或熄灭LED,其正确的方法是:当主机接收到NumLock按键信息后,会根据系统当前NumLock的状态决定打开还是关闭LED指示灯,然后将这一信息通过传给设备(发送一个字节的数据给设置,最低位表示NumLock的状态)。 修改main函数如下:
烧录程序,当按下K1时,应弹出开始菜单,按下K2后,会发现电脑原来的键盘和Easy usb 51 programer plus扩展板上的LED指示灯同时会发生改变,这也印证了设备应该根据主机发过来的LED状态数据包来控制指示灯。
实例中为了演示方便,没有对铵键进行消抖处理,实际应用中应加上。 |