//============================================================================ // 文件名: USBDESC.C // 用 途: USB描述符 // 作 者: shenfei5 // 时 间: 2007.2.3 // 版 本: V1.10 //============================================================================ #include #include "usb.h" // USB模块 #include "hid.h" // HID设备 #include "usbcfg.h" // 配置USB #include "usbdesc.h" // USB描述符 // // HID报文描述符 // const U8 HID_ReportDescriptor[] = { HID_UsagePageVendor(0x00), // 报告页版本: 0X06 0X00 0XFF HID_Usage(0x01), // 用途页: 0X05 0X01 // 如果是MOUSE,KEY,在这里应该有用法索引 HID_Collection(HID_Application), // 用法集合开始: 0XA1 0X01 HID_UsagePage(HID_USAGE_PAGE_BUTTON), // BUTTON用法页 HID_UsageMin(1), // 用法最小值 HID_UsageMax(3), // 用法最小值 HID_LogicalMin(0), // 逻辑最小值 HID_LogicalMax(1), // 逻辑最大值 HID_ReportCount(3), // 报告计数(3) HID_ReportSize(1), // 报告页大小 (1) HID_Input(HID_Data | HID_Variable | HID_Absolute), // 输入 (2) HID_ReportCount(1), // 报告计数值 HID_ReportSize(5), // 报告大小 HID_Input(HID_Constant), // 输入 1 HID_UsagePage(HID_USAGE_PAGE_LED), // LED用法页 HID_Usage(HID_USAGE_LED_GENERIC_INDICATOR), // 用法页 HID_LogicalMin(0), // 用法最小值 HID_LogicalMax(1), // 用法最大值 HID_ReportCount(8), // 报告计数值 HID_ReportSize(1), // 报告大小 (1) HID_Output(HID_Data | HID_Variable | HID_Absolute), // 输出 (2) HID_EndCollection, // 报告结束 }; // HID报告描述符大小 const U16 HID_ReportDescSize = sizeof(HID_ReportDescriptor); // // USB 设备描述符 // const U8 USB_DeviceDescriptor[] = { USB_DEVICE_DESC_SIZE, // bLength 描述符长度 = 12H USB_DEVICE_DESCRIPTOR_TYPE, // bDescriptorType 描述符类型 = 1H WBVAL(0x0110), // 1.10 // bcdUSB 设备版本号 = 你发行的版本的号 0x00, // bDeviceClass 类型代码 = 由USB指定 0x00, // bDeviceSubClass 子类型代码 = 由USB分配 0x00, // bDeviceProtocol 协议代码 = 由USB分配 USB_MAX_PACKET0, // bMaxPacketSize0 端点0的容量 = 64(只能是 8,16,32,64) WBVAL(0x1977), // idVendor 供应商ID(同USB协会分配,我就自己分配一份) WBVAL(0X1006), // idProduct 产品ID(由厂商分配) WBVAL(0x0100), // 1.00 // bcdDevice ( 设备出厂编号 ) 0x04, // iManufacturer ( 厂商描述字符串索引, 用来在字符串索引中查找字符串 ) 0x20, // iProduct ( 产品描述字符串索引, 用来在字符串索引中查找字符串 ) 0x42, // iSerialNumber ( 设备序列号描述字符串索引, 用来在字符串索引中查找字符串 ) 0x01 // bNumConfigurations ( 配置字符串的个数 ) }; // // USB 描述符集 // 所有描述符 (配置描述符, 接口描述符, 端点描述符, USB类描述符, 设备描述符 // const U8 USB_ConfigDescriptor[] = { // 配置描述符 USB_CONFIGUARTION_DESC_SIZE, // bLength 描述符长度 = 9H USB_CONFIGURATION_DESCRIPTOR_TYPE, // bDescriptorType 描述符类型 = 2H WBVAL( // wTotalLength USB_CONFIGUARTION_DESC_SIZE + // 返回描述符串集的长度, 配置描述字符长度 USB_INTERFACE_DESC_SIZE + // 接口描述字符长度 HID_DESC_SIZE + // HID描述字符长度 USB_ENDPOINT_DESC_SIZE // 端点描述字符长度 ), 0x01, // bNumInterfaces // 支持接口数 0x01, // bConfigurationValue // 配置值 0x00, // iConfiguration // 配置字符串描述索相 // 0: 不使用 // 如果使用,必须在字符串描述符中添加相应的字符串. USB_CONFIG_BUS_POWERED | // bmAttributes 设置的供电特性 USB_CONFIG_REMOTE_WAKEUP, // 总线供电 // 有唤醒功能 USB_CONFIG_POWER_MA(100), // bMaxPower 设备从供电总线吸取的电流值 //// 当前配置为 100MA // 接口类描述符 // 接口 0 ,位置 0 , HID类 // Interface 0, Alternate Setting 0, HID Class USB_INTERFACE_DESC_SIZE, // bLength 描述符长度 = 9H USB_INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType 描述符类型 = 4H 0x00, // bInterfaceNumber ( 接口编号 ) 0x00, // bAlternateSetting ( 可代替位置 ) 0x01, // bNumEndpoints 使用端点(不含端点0) USB_DEVICE_CLASS_HUMAN_INTERFACE, // bInterfaceClass // USB 类 // USB_DEVICE_CLASS_HUMAN_INTERFACE == 3 // HID类 HID_SUBCLASS_NONE, // bInterfaceSubClass // 子类,没有. HID_PROTOCOL_NONE, // bInterfaceProtocol // 协议代码 0x5C, // iInterface // 字符串描述符索引,要使用该字符串必须在字符串描述符里添加相应的字符串 // HID类描述符 // HID_DESC_OFFSET = 0x0012 // HID类描述符的偏移量 HID_DESC_SIZE, // bLength 描述符长度 = HID_HID_DESCRIPTOR_TYPE, // bDescriptorType HID描述符类型 = 21H WBVAL(0x0100), // 1.00 // bcdHID HID版本号 0x00, // bCountryCode 国家代码 0x01, // bNumDescriptors 支持其它类描述符个数 HID_REPORT_DESCRIPTOR_TYPE, // bDescriptorType 从属类描述类型 = 报告描述符22H WBVAL(HID_REPORT_DESC_SIZE), // wDescriptorLength 从属类描述的长度 // Endpoint, HID Interrupt In // HID 端点描述描,端点1输入 USB_ENDPOINT_DESC_SIZE, // bLength 端点描述符长度 USB_ENDPOINT_DESCRIPTOR_TYPE, // bDescriptorType 端点描述符类型 = 5H USB_ENDPOINT_IN(1), // bEndpointAddress 逻辑端点号 BIT.7 = DIR // BIT.0..3 端点号 // 这个值是用来把逻辑端点号换成物理端点号 USB_ENDPOINT_TYPE_INTERRUPT, // bmAttributes 端点属性 = 中断 WBVAL(0x0004), // wMaxPacketSize 端点容量 10, // 10ms // bInterval // 传输间隔时间.只对中断端点有效 // Terminator 0 // bLength // 结果码. }; // // USB 字符串描述符 (可选) // 字符描述符结构: // { // 字符串描述符 1 大小 // 描述符类型 = 字符串描述符(0X03) // 描述符内容. // ... ... // 字符串描述符n 1 大小 // 描述符类型n = 字符串描述符(0X03) // 描述符内容n. // } // const U8 USB_StringDescriptor[] = { // 字符串索引: 0x00: // 字符串用途: 语言代码 0x04, // 描述符长度 bLength USB_STRING_DESCRIPTOR_TYPE, // bDescriptorType,描述符类型:3(字符串描述符) //WBVAL(0x0409), // 使用 English 语言// 描述符内容 wLANGID WBVAL(0x0804), // 试一下中文的行不行,改了之后,在硬件属性里看不到,在客户端可以看到,不明原因. // 字符串索引: 0x04: // 字符串用途: 生产产商字符描述符 0x1C, // 描述符长度 bLength USB_STRING_DESCRIPTOR_TYPE, // bDescriptorType,描述符类型:3(字符串描述符) 0xc1,0, 0xd6,0, 0xca,0, 0xa4,0, 0xb7,0, 0xe1,0, ' ',0, ' ',0, ' ',0, ' ',0, ' ',0, ' ',0, ' ',0, // 字符串索引: 0x20 // 字符串用途: 产品名称 0x22, // 描述符长度 bLength USB_STRING_DESCRIPTOR_TYPE, // bDescriptorType,描述符类型:3(字符串描述符) 0xc1,0, 0xd6,0, 0xca,0, 0xa4,0, 0xb7,0, 0xe1,0, ' ',0, ' ',0, ' ',0, ' ',0, ' ',0, ' ',0, ' ',0, 'H',0, 'I',0, 'D',0, // 字符串索引: 0x42 // 字符串用途: 产品系列号 0x1A, // 描述符长度 bLength USB_STRING_DESCRIPTOR_TYPE, // bDescriptorType,描述符类型:3(字符串描述符) 'T',0, 'E',0, 'S',0, 'T',0, '0',0, '0',0, '0',0, '0',0, '0',0, '0',0, '0',0, '0',0, // 字符串索引号 0x5C // 接口 Interface 0, 位置 Alternate Setting 0 0x08, // 描述符长度 bLength USB_STRING_DESCRIPTOR_TYPE, // bDescriptorType,描述符类型:3(字符串描述符) 'H',0, 'I',0, 'D',0, }; |
|