在《让Windows找到我们的USB设备》一节我们得到了一个D12固件驱动,在这个驱动和基础上,我们来实现一个USB鼠标的例子。 在《如何学习USB开发》一节就已经提到学习USB开发的重要是要了解各种描述符,所以在D12固件范例的基础上实现USB鼠标,主要的工作还是修改和种描述符。通过《USB HID协议入门》一节以及USB开发网的《USB命令请求及描述符详解(速查手册)》一文学习,我们知道与HID设备类有关的描述符有:接口描述符里的bInterfaceClass字段应为0x03(代表HID接口),除此之外,还应指定设备描述符里的bDeviceClass字段(设备类码)的值为零,意思是设备类型由接口描述符提供。(描述符相关代码在Descriptor.c文件中) 修改好上面两处后,烧录程序,插上设备,怀着激动的心情,电脑真的发现我们插入的是一个人体学输入设备(HID)了: 但是接下却提示硬件有问题: 其原因是5个标准描述符中与HID设备有关的部分有:
所以至少还有一处需要修改:把接口描述符里的bInterfaceProtocol字段值修改为1,代表鼠标。
对标准描述符的修改已经完成,但是目前我们的USB鼠标还是不正常,因为还有3个HID设备类特有的描述符没有完成,它们分别是:HID描述符、报告描述符和实体描述符,其中实体描述符是可选描述符,这里我只完成HID描述符和报告描述符就可以了。 USB主机在请求HID设备的配置描述符时,设备返回的描述符为:配置描述符、接口描述符、HID描述符、端点描述符。HID描述符里包含了其附属的描述的类型和长度(如报告描述符),然后主机再根据HID描述符的信息请求其相关的描述符。所以我们现在来完成HID设备类的两必须的类特定描述符:HID描述符和报告描述符。
代码中的USB_HID_DESCRIPTOR为HID描述符结构体,原固件范例没有定义,我们可以在Descriptor.h中定义,根据USB HID协议来定义这个结构体:
另外,由于加入HID描述符结构体而引起计算各种描述符结构体长度的代码也要修改。 除了HID描述符外,报告描述符对USB HID设备来说非常重要,不能缺少。USB HID报告描述符描绘 了数据交换含义,可以是按键信息、也可是LED指定灯状态,还可能温度、温度等物理量....。 HID报告描述符比较复杂,不太容易理解,相关内容请查阅USB HID协议及HID Usabe Table。 下面是我们在Descriptor.c中加入的一个鼠标的报告描述符:
队此之外,还应在固件中加入请求报告描述符时的相关代码,这里不详细列出修改步骤了,可以直接看我修改好后的示例就会明白,这些修改不需要过多了解D12数据手册就能轻易完成。
不知您发现没有,这个鼠标一点功能也没有,好,现在我们就来实现真正意思上的鼠标,不过项目制作的电路板上只有扩展板EXT-BOARD-A上有两个按键,所以不可以将鼠标的所有功能都实现,这里只实现鼠标光标左移和右移功能(按K1左移,按K2右移),虽然功能不全,但对于演示原理足够了。 USB鼠标的各个功能键在报告描述符里定义,上面的报告描述符定义了一个报告数据包有4个字节(即USB鼠标向主机发送的数据包由4个字节组成),第零个字节用最低5位分别代表鼠标各功能键(下表中Button1左键,Button2为中键,Button3为右键,button4和button5在报告描述符里没有定义), 第一个字节表示按键,第二个字节表示x轴(即鼠标左右移动,0表示不动,正值表示往右移,负值表示往左移),第三个字节表示y轴(即鼠标上下移动,0表示不动,正值表示往下移动,负值表示往上移动),第四个字节表示鼠标滚轮(正值为往上滚动,负值为往下滚动)。
实例中为了演示方便,没有对铵键进行消抖处理,实际应用中应加上。 |