//============================================================================

//       文件名:   USBDESC.C

//       用 途:    USB描述符

//       作 者:    shenfei5

//       时 间:    2007.2.3

//       版 本:    V1.10

//============================================================================      


#include <RTL.h>


#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,

};