USB自定义HID设备实现-LPC1768
扫描二维码
随时随地手机看文章
首先在之前鼠标的基础上修改设备描述符
#include "usbdesc.h"
//usb标准设备描述符
const U8 USB_DeviceDescriptor[]={
USB_DEVICE_DESC_SIZE, //bLength字段。设备描述符的长度为18(0x12)字节
USB_DEVICE_DESCRIPTOR_TYPE, //bDescriptorType字段。设备描述符的编号为0x01
WBVAL(0x0110), //bcdUSB字段。这里设置版本为USB1.1,即0x0110。
0x00, //bDeviceClass字段。我们不在设备描述符中定义设备类,
0x00, //bDeviceSubClass字段。bDeviceClass字段为0时,该字段也为0。
0x00, //bDeviceProtocol字段。bDeviceClass字段为0时,该字段也为0。
USB_MAX_PACKET0, //bMaxPacketSize0字段。端点0的最大包长度。
WBVAL(0x8888), //idVender字段。厂商ID号,我们这里取0x8888,仅供实验用。
WBVAL(0x8877), //idProduct字段。产品ID号,由于是第一个实验,我们这里取0x0001。。
WBVAL(0x0100), // 设备的版本
0x01, //iManufacturer字段。厂商字符串的索引值,为了方便记忆和管理
0x02, //iProduct字段。产品字符串的索引值。刚刚用了1,这里就取2吧。
0x03, //iSerialNumber字段。设备的序列号字符串索引值。
0x01 //bNumConfigurations字段。该设备所具有的配置数。
};
//USB报告描述符的定义
const u8 HID_ReportDescriptor[]=
{
0x06,0xA0,0xFF,//用法页(FFA0h, vendor defined)
0x09,0x01,//用法(vendor defined)
0xA1,0x01,//集合(Application)
0x09,0x02,//用法(vendor defined)
0xA1,0x00,//集合(Physical)
0x06,0xA1,0xFF,//用法页(vendor defined)
//输入报告
0x09,0x03,//用法(vendor defined)
0x09,0x04,//用法(vendor defined)
0x15,0x80,//逻辑最小值(0x80 or -128)
0x25,0x7F,//逻辑最大值(0x7F or 127)
0x35,0x00,//物理最小值(0)
0x45,0xFF,//物理最大值(255)
0x75,0x08,//报告长度Report size (8位)
0x95,0x40,//报告数值(64 fields)
0x81,0x02,//输入(data, variable, absolute)
//输出报告
0x09,0x05,//用法(vendor defined)
0x09,0x06,//用法(vendor defined)
0x15,0x80,//逻辑最小值(0x80 or -128)
0x25,0x7F,//逻辑最大值(0x7F or 127)
0x35,0x00,//物理最小值(0)
0x45,0xFF,//物理最大值(255)
0x75,0x08,//报告长度(8位)
0x95,0x40,//报告数值(64 fields)
0x91,0x02,//输出(data, variable, absolute)
0xC0,//集合结束(Physical)
0xC0//集合结束(Application)
};
//通过上面的报告描述符的定义,我们知道返回的输入报告具有8字节。
//输出报告也有64字节。至于这64字节的数据是干什么用的,就要由用户
//自己来决定了。
///////////////////////////报告描述符完毕////////////////////////////
const U16 HID_ReportDescSize=sizeof(HID_ReportDescriptor);
//usb配置描述符
const U8 USB_ConfigDescriptor[]={
/***************配置描述符***********************/
USB_CONFIGUARTION_DESC_SIZE, //bLength字段。配置描述符的长度为9字节。
USB_CONFIGURATION_DESCRIPTOR_TYPE,//bDescriptorType字段。配置描述符编号为0x02。
//wTotalLength字段。配置描述符集合的总长度,
//包括配置描述符本身、接口描述符、类描述符、端点描述符等。
WBVAL(
USB_CONFIGUARTION_DESC_SIZE+ //配置描述符
USB_INTERFACE_DESC_SIZE+ //接口1描述符
9+ //hid描述符
USB_ENDPOINT_DESC_SIZE+ //端点描述符
USB_ENDPOINT_DESC_SIZE //端点描述符
),
0x01, //bNumInterfaces字段。该配置包含的接口数,只有一个接口。
0x01, //bConfiguration字段。该配置的值为1。
0x00, //iConfigurationz字段,该配置的字符串索引。这里没有,为0。
USB_CONFIG_BUS_POWERED, //bmAttributes字段,该设备的属性
USB_CONFIG_POWER_MA(500), //bMaxPower字段,该设备需要的最大电流量
/*********************第一个接口描述符,hid设备**********************/
USB_INTERFACE_DESC_SIZE, //bLength字段。接口描述符的长度为9字节。
USB_INTERFACE_DESCRIPTOR_TYPE, //bDescriptorType字段。接口描述符的编号为0x04。
0x00, //bInterfaceNumber字段。该接口的编号,第一个接口,编号为0。
0x00, //bAlternateSetting字段。该接口的备用编号,为0。
0x02, //bNumEndpoints字段。非0端点的数目。该接口有2个批量端点
USB_DEVICE_CLASS_HUMAN_INTERFACE, //bInterfaceClass字段。该接口所使用的类。大容量存储设备接口类的代码为0x08。,
0x00, //bInterfaceSubClass字段。该接口所使用的子类。在HID1.1协议中,
//只规定了一种子类:支持BIOS引导启动的子类。
//USB键盘、鼠标属于该子类,子