查了一整天的资料,自己把不懂的全部试了一遍
一下是程序以及注释
/* USB设备描述符*/ const uint8_t CustomHID_DeviceDescriptor[CUSTOMHID_SIZ_DEVICE_DESC] = { 0x12, /*bLength 描述符的长度*/ USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType 描述符的类型(设备描述符为0x01)*/ 0x00, /*bcdUSB USB协议的版本*/ 0x02, 0x00, /*bDeviceClass 类代码*/ 0x00, /*bDeviceSubClass 子类代码*/ 0x00, /*bDeviceProtocol 设备所使用的协议*/ 0x40, /*bMaxPacketSize 端点0的最大包长*/ /*idVendor 厂商ID*/ LOBYTE(USB_VID), HIBYTE(USB_VID), /*idProduct 设备ID*/ LOBYTE(USB_PID), HIBYTE(USB_PID), 0x00, /*bcdDevice rel 设备版本号*/ 0x02, 1, /*描述生产厂家的字符串描述符的索引*/ 2, /*描述产品的字符串描述符的索引*/ 3, /*产品序列号的字符串描述符的索引*/ 0x01 /*bNumConfigurations 可能的配置数*/ } ; /* CustomHID_DeviceDescriptor */ /* USB配置描述符 */ /* All Descriptor s (Configuration, Interface, Endpoint, Class, Vendor */ const uint8_t CustomHID_ConfigDescriptor[CUSTOMHID_SIZ_CONFIG_DESC] = { //以下为配置描述符 0x09, /* bLength: 端点描述符长度*/ USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: 描述符类型 (配置描述符为0x02) */ LOBYTE(CUSTOMHID_SIZ_CONFIG_DESC),/* wTotalLength: 配置描述符集合总长度 */ HIBYTE(CUSTOMHID_SIZ_CONFIG_DESC), 0x01, /* bNumInterfaces: 该配置所支持的接口数*/ 0x01, /* bConfigurationValue: 该配置的值*/ 0x00, /* iConfiguration: 描述配置的字符串描述符的索引*/ 0xA0, /* bmAttributes:该设备的属性(总线供电,支持远程唤醒) bit 4 ... 0: 保留(必须为0) bit 5: 1表示支持远程唤醒 bit 6: 1表示设备是自供电 0表示是总线供电 bit 7: 保留(必须为1) */ 0xC8, /* MaxPower 设备所需要的电流(单位为2mA)400 mA*/ //以下为接口描述符 0x09, /* bLength: 接口描述符长度*/ USB_INTERFACE_DESCRIPTOR_TYPE,/* bDescriptorType: 描述符类型 (接口描述符为0x04)*/ 0x00, /* bInterfaceNumber: 该接口编号(从0开始) */ 0x00, /* bAlternateSetting: 该接口的备用编号 */ 0x02, /* bNumEndpoints 该接口所使用的端点数*/ 0x03, /* bInterfaceClass: 该接口所使用的类*/ 0x00, /* bInterfaceSubClass : 该接口所使用的子类 */ 0x00, /* nInterfaceProtocol : 该接口所使用的协议 0 =无,1 =键盘,2 =鼠标*/ 0, /* iInterface: 描述该接口的字符串描述符的索引 */ //以下为HID描述符 0x09, /* bLength: HID描述符长度 */ HID_DESCRIPTOR_TYPE, /* bDescriptorType: 描述符类型 (接口描述符为0x21) */ 0x10, /* bcdHID: HID 协议版本号 */ 0x01, 0x00, /* bCountryCode: 国家代码 (美式键盘代码为0x21)*/ 0x01, /* bNumDescriptors:下级描述符的数量*/ 0x22, /* bDescriptorType 下级描述符的类型*/ LOBYTE(CUSTOMHID_SIZ_REPORT_DESC),/* wItemLength: 下级描述符的长度*/ HIBYTE(CUSTOMHID_SIZ_REPORT_DESC), //以下为端点描述符 /******************** Descriptor of Custom HID endpoints ******************/ 0x07, /* bLength:端点描述符长度 */ USB_ENDPOINT_DESCRIPTOR_TYPE, /* 描述符类型 (端点描述符为0x05)*/ 0x81, /* bEndpointAddress:端点地址 bit 3 ... 0:端点号 bit 6 ... 4:保留(设置为0) bit 7:0(OUT),1(IN)*/ 0x03, /* bmAttributes: 端点属性 bit 1 ... 0:表示该端点的传输类型 0 控制传输 1 等时传输 2 批量传输 3 中断传输 bit 7 ... 2:如果该端点是非等时传输 则bit 7 ~ 2 保留(设置为0) 如果该端点是等时传输 bit 3 ... 2: 表示同步类型 0 无同步 1 异步 2 适配 3 同步 bit 5 ... 4: 表示用途 0 数据端点 1 反馈端点 2 暗含反馈的数据端点 3 保留 bit 7 ... 6: 保留*/ 0x40, /* wMaxPacketSize: 该端点支持的最大包长度 */ 0x00, 0x0A, /* bInterval:端口的查询时间*/ //以下为输出端点1描述符 0x07, /*bLength:端点描述符大小 */ USB_ENDPOINT_DESCRIPTOR_TYPE, /* 端点描述符类型*/ 0x01, /* bEndpointAddress:端点地址 bit 3 ... 0:端点号 bit 6 ... 4:保留 bit 7:0(OUT),1(IN)*/ 0x03, /* bmAttributes: 中断端点 */ 0x40, /* wMaxPacketSize: 最多64个字节 */ 0x00, 0x0A, /* bInterval: 轮询间隔(20毫秒)*/ };