以下是总结的USB的类,不同的USB类,主机询问的描述符格式和内容都不一样,具体的descriptor的内容可以查看

USB spec(http://www.usb.org/home/),如HID的spec里有关于鼠标键盘描述符的详细说明(在appendix E里)

1、宏定义

#define DEVICE_DESCRIPTOR        0x01 //设备描述符
#define CONFIGURATION_DESCRIPTOR 0x02 //配置描述符
#define STRING_DESCRIPTOR        0x03 //字符串描述符
#define INTERFACE_DESCRIPTOR     0x04 //接口描述符
#define ENDPOINT_DESCRIPTOR      0x05 //端点描述符
#define HID_DESCRIPTOR           0x21 //HID描述符
#define REPORT_DESCRIPTOR        0x22 //报告描述符
#define PHYSICAL_DESCRIPTOR      0x23 //物理描述符
//定义标准的USB设备请求命令,即USB分配的各种请求的编号,即bRequest字段的值
#define GET_STATUS             0x00 //获取状态请求
#define CLEAR_FEATURE         0x01 //清除状态特性
#define SET_FEATURE         0x03 //设置特性请求
#define SET_ADDRESS         0x05 //设置地址请求
#define GET_DESCRIPTOR         0x06 //获取描述符请求
#define SET_DESCRIPTOR         0x07 //设置描述符请求
#define GET_CONFIGURATION     0x08 //获取配置请求
#define SET_CONFIGURATION     0x09 //设置配置请求
#define GET_INTERFACE         0x0a //获取接口请求
#define SET_INTERFACE         0x0b //设置接口请求
#define SYNC_FRAME             0x0c //同步帧请求
//定义USB HID特定命令请求
#define GET_REPORT         0x01 //设置报告
#define GET_IDLE         0x02 //获取空闲状态
#define GET_PROTOCOL    0x03 //获取协议
#define SET_REPORT         0x09 //设置报告
#define SET_IDLE         0x0A //设置空闲
#define SET_PROTOCOL    0x0B //设置协议
//定义的端点类型
#define ENDPOINT_TYPE_CONTROL     0x00 //控制传输
ENDPOINT_TYPE_ISOCHRONOUS       0x01 //同步传输
ENDPOINT_TYPE_BULK              0x02 //批量传输
ENDPOINT_TYPE_INTERRUPT         0x03 //中断传输

2、结构体

1)标准的设备描述符

typedef struct Device_Descriptor
{
    uchar     bLength;            //设备描述符的字节数
    uchar     bDescriptorType;    //设备描述符类型编号
    uint    bcdUSB;                //USB版本号
    uchar     bDeviceClass;        //USB分配的设备类
    uchar     bDeviceSubClass;    //USB分配的设备子类
    uchar     bDeviceProtocol;    //USB分配的设备协议代码
    uchar     bMaxPacketSize0;    //端点0的最大包大小
    uint     idVendor;            //厂商编号
    uint    idProduct;            //产品编号
    uint     bcdDevice;            //设备出厂编号
    uchar     iManufacturer;        //设备厂商字符串索引
    uchar    iProduct;            //产品字符串索引
    uchar     iSerialNumber;        //设备序列号索引
    uchar     bNumConfigurations; //可能的配置数

}Device_Descriptor,*pDevice_Descriptor;

2)配置描述符

typedef struct Configuration_Descriptor
{
    uchar     bLength;            //配置描述符 的字节数
    uchar     bDescriptorType;    //配置描述符类型编号
    uint     wTotalLength;        //此配置返回的所有数据大小
    uchar     bNumInterfaces;        //此配置支持的接口数量
    uchar     bConfigurationValue;//Set_Configuration命令所需要的参数
    uchar     iConfiguration;        //描述该配置的字符串索引
    uchar     bmAttributes;        //供电模式的选择
    uchar    bMaxPower;            //设备从总线获取的最大电流

}Configuration_Descriptor,*pConfiguration_Descriptor;

3)接口描述符

typedef struct Interface_Descriptor
{
    uchar    bLength;            //接口描述符的字节数
    uchar    bDescriptorType;    //接口描述符的类型编号
    uchar     bInterfaceNumber;    //该接口的编号
    uchar     bAlternateSetting;    //备用的接口描述符的编号
    uchar     bNumEndPoints;        //该接口使用 的端点数,不包括端点0
    uchar     bInterfaceClass;    //接口类
    uchar     bInterfaceSubClass;    //接口子类
    uchar     bInterfaceProtocol;    //接口类协议
    uchar     iInterface;            //描述该接口的字符串索引值
}Interface_Descriptor,*pInterface_Descriptor;

4)端点描述符

typedef struct EndPoint_Descriptor
{
    uchar     bLength;            //端点描述符字节数
    uchar     bDescriptorType;    //端点描述符类型编号
    uchar     bEndpointAddress;    //端点地址及输入输出类型
    uchar     bmAtrributes;        //端点的传输类型
    uint     wMaxPacketSize;        //端点收发的最大包大小
    uchar     bInterval;          //主机查询端点的时间间隔

}EndPoint_Descriptor,*pEndPoint_Descriptor;

5)HID描述符的下级描述符号

typedef struct Hid_SubDescriptor
{
uchar     bDescriptortype;      //下级描述符的类型编号
uint     wDescriptorLength;    //下级描述符的长度
}Hid_SubDescriptor,*pHid_SubDescriptor;

6)HID描述符

#define NUM_SUB_DESCRIPTORS 1

typedef struct HID_Descriptor
{
uchar     bLength;
uchar     bDescriptorType;
uint     bcdHID;
uchar     bCountryCode;
uchar    bNumDescriptors;
Hid_SubDescriptor hidSubDescriptors[NUM_SUB_DESCRIPTORS];
}HID_Descriptor,*pHID_Descriptor;

7)字符串描述符

typedef struct String_Descriptor
{
uchar     bLength;           //字符串描述符的字节数大小
uchar     bDescriptorType;   //字符串描述符类型的编号
uchar     SomeDescriptor;    //UNICODE编码的字符串
}String_Descriptor,*pString_Descriptor;

3、USB键盘类描述符实例

code Device_Descriptor device_descriptor= //设备描述符
{
    0x12,        //设备描述符的字节数大小
    DEVICE_DESCRIPTOR,//设备描述符类型编号
    0x0002,           //USB版本号
    0x00,             //USB分配的设备类代码
    0x00,             //USB分配的子类代码
    0x00,             //USB分配的设备协议代码
    0x40,             //端点0的最大包大小
    0ff0,             //厂商编号VID,这里只是作为测试用,请使用自己的VID
    0xff03,           //产品编号PID,这里只是作为测试用,请使用自己的PID
    0x0001,           //设备出厂编号
    0x01,             //设备厂商字符串的索引
    0x02,             //描述产品字符串的索引
    0x03,             //描述设备序列号字符串的索引
    0x01              //可能的配置数量
//定义配置,接口,端点等描述符结构体,因为它们是随配置描述符一起返回的
typedef struct CON_INT_ENDP_DESCRIPTOR_STRUCT
{
  Configuration_Descriptor configuration_descriptor;
  Interface_Descriptor     interface_descriptor;
  HID_Descriptor           hid_descriptor;
  EndPoint_Descriptor endpoint_descriptor[ENDPOINT_NUMBER];
}CON_INT_ENDP_DESCRIPTOR_STRUCT;
code CON_INT_ENDP_DESCRIPTOR_STRUCT con_int_endp_descriptor=
{
//configuration_descriptor //配置描述符
{
    0x09,//配置描述符的字节数大小
    CONFIGURATION_DESCRIPTOR,       //配置描述符类型编号
    0x2200,
    0x01,//只包含一个接口
    0x01,//该配置的编号
    0x00,//iConfiguration字段
    0xA0,//采用总线供电,支持远程唤醒
    0xC8//从总线获取最大电流400mA
},
//interface_descritor //接口描述符
{
    0x09, //接口描述符的字节数大小
    INTERFACE_DESCRIPTOR,        //接口描述符类型编号
    0x00, //接口编号为0
    0x00, //该接口描述符的编号
    0x01, //非0端点数量为1,只使用端点主端点输入
    0x03, //人机接口设备(HID)类
    0x01, //使用的子类:支持BIOS根启动Boot的子类
    0x01, //使用的协议:键盘
    0x00  //接口描述符字符串索引
},
//hid_descriptor
{
    0x09,                   //HID描述符的字节数大小
    HID_DESCRIPTOR,         //HID描述符类型编号
    0x1001,                 //HID类协议版本号,为1.1
    0x21,                   //固件的国家地区代号,0x21为美国
    NUM_SUB_DESCRIPTORS,    //下级描述符的数量
    {
        {
        0x22,                                    //下级描述符为报告描述符
        SWAP16(sizeof(KeyBoardReportDescriptor)) //下级描述符的长度
        }
    },
},
//endpoint_descriptor[]
{
    {//主端点输入描述
    0x07,                        //端点描述符的字节数大小
    ENDPOINT_DESCRIPTOR,         //端点描述符类型编号
    0x81,                        //端点号,主输入端点
    0x03,                        //使用的传输类型:中断传输
    0x0800,                      //该端点支持的最大包尺寸,64字节
    0x0A                         //中断扫描时间:设置为10ms
    },
}
};

补充上hid_descriptor中keyBoardReportDescriptor

code ]={
0x05,0x01, //USAGE_PAGE(GenericDesktop)
0x09,0x06, //USAGE(Keyboard)
0xa1,0x01, //COLLECTION(Application)
0x05,0x07, // USAGE_PAGE(Keyboard)
0x19,0xe0, // USAGE_MINIMUM(KeyboardLeftControl)
0x29,0xe7, // USAGE_MAXIMUM(KeyboardRightGUI)
0x15,0x00, // LOGICAL_MINIMUM(0)
0x25,0x01, // LOGICAL_MAXIMUM(1)
0x75,0x01, // REPORT_SIZE(1)
0x95,0x08, // REPORT_COUNT(8)
0x81,0x02, // INPUT(Data,Var,Abs)
0x95,0x01, // REPORT_COUNT(1)
0x75,0x08, // REPORT_SIZE(8)
0x81,0x03, // INPUT(Cnst,Var,Abs)
//0x95,0x05, // REPORT_COUNT(5)
//0x75,0x01, // REPORT_SIZE(1)
//0x05,0x08, // USAGE_PAGE(LEDs)
//0x19,0x01, // USAGE_MINIMUM(NumLock)
//0x29,0x05, // USAGE_MAXIMUM(Kana)
//0x91,0x02, // OUTPUT(Data,Var,Abs)
//0x95,0x01, // REPORT_COUNT(1)
//0x75,0x03, // REPORT_SIZE(3)
//0x91,0x03, // OUTPUT(Cnst,Var,Abs)
0x95,0x06, // REPORT_COUNT(6)
0x75,0x08, // REPORT_SIZE(8)
0x15,0x00, // LOGICAL_MINIMUM(0)
0x25,0xFF, // LOGICAL_MAXIMUM(255)
0x05,0x07, // USAGE_PAGE(Keyboard)
0x19,0x00, // USAGE_MINIMUM(Reserved(noeventindicated))
0x29,0x65, // USAGE_MAXIMUM(KeyboardApplication)
0x81,0x00, // INPUT(Data,Ary,Abs)
0xc0 //END_COLLECTION
};

4、USB鼠标

code Device_Descriptor device_descriptor= //设备描述符
{
sizeof(Device_Descriptor), //设备描述符的字节数大小
DEVICE_DESCRIPTOR,         //设备描述符类型编号
SWAP16(0x0110),            //USB版本号,usb1.1
0x00,           //USB分配的设备类代码
0x00,           //USB分配的子类代码
0x00,           //USB分配的设备协议代码
0x10,           //端点0的最大包大小
SWAP16(0x8888), //厂商编号VID,这里只是作为测试用,请使用自己的VID
SWAP16(0x0002), //产品编号PID,这里只是作为测试用,请使用自己的PID
SWAP16(0x0100), //设备出厂编号
0x01,           //设备厂商字符串的索引
0x02,           //描述产品字符串的索引
0x03,           //描述设备序列号字符串的索引
0x01            //可能的配置数量
};

//定义配置,接口,端点等描述符结构体,因为它们是随配置描述符一起返回的
code CON_INT_ENDP_DESCRIPTOR_STRUCT con_int_endp_descriptor=
{
    Configuration_Descriptor    configuration_descriptor;
    Interface_Descriptor        interface_descriptor;
    HID_Descriptor                hid_descriptor;
    EndPoint_Descriptor            endpoint_descriptor[ENDPOINT_NUMBER];
}CON_INT_ENDP_DESCRIPTOR_STRUCT; 

code CON_INT_ENDP_DESCRIPTOR_STRUCT con_int_endp_descriptor=
{
//configuration_descriptor //配置描述符
{
    sizeof(Configuration_Descriptor), //配置描述符的字节数大小
    CONFIGURATION_DESCRIPTOR,         //配置描述符类型编号
    SWAP16(sizeof(CON_INT_ENDP_DESCRIPTOR_STRUCT)),
    0x01,                             //只包含一个接口
    0x01,                             //该配置的编号
    0x00,                             //iConfiguration字段
    0xA0,                             //采用总线供电,支持远程唤醒
    0xC8                              //从总线获取最大电流400mA
},
//interface_descritor //接口描述符
{
    sizeof(Interface_Descriptor), //接口描述符的字节数大小
    INTERFACE_DESCRIPTOR,         //接口描述符类型编号
    0x00,                         //接口编号为0
    0x00,                         //该接口描述符的编号
    0x02,                         //非0端点数量为2,只使用端点主端点输入和输出
    0x03,                         //人机接口设备(HID)类
    0x01,                         //使用的子类:支持BIOS根启动Boot的子类
    0x02,                         //使用的协议:鼠标
    0x00                          //接口描述符字符串索引
},
//hid_descriptor
{
    sizeof(HID_Descriptor), //HID描述符的字节数大小
    HID_DESCRIPTOR,         //HID描述符类型编号
    SWAP16(0x0110),         //HID类协议版本号,为1.1
    0x21,                   //固件的国家地区代号,0x21为美国
    NUM_SUB_DESCRIPTORS,    //下级描述符的数量
    {
        {
        REPORT_DESCRIPTOR,                    //下级描述符为报告描述符
        SWAP16(sizeof(MouseReportDescriptor)) //下级描述符的长度
        }
    },
},
//endpoint_descriptor[]
{
    { //主端点输入描述
    sizeof(EndPoint_Descriptor), //端点描述符的字节数大小
    ENDPOINT_DESCRIPTOR,         //端点描述符类型编号
    0x82,                        //端点号,主输入端点
    ENDPOINT_TYPE_INTERRUPT,     //使用的传输类型:中断传输
    SWAP16(0x0040),              //该端点支持的最大包尺寸,64字节
    0x0A                         //中断扫描时间:设置为10ms
    },
    { //主端点输出描述
    sizeof(ENDPOINT_DESCRIPTOR_STRUCT), //端点描述符的字节数大小
    ENDPOINT_DESCRIPTOR,                //端点描述符类型编号
    0x02,                               //端点号,主输出端点
    ENDPOINT_TYPE_INTERRUPT,            //使用的传输类型:中断传输
    SWAP16(0x0040),                     //该端点支持的最大包尺寸,64字节
    0x0A                                //中断扫描时间:设置为10ms
    }
}
}

补充上hid_descriptor中MouseReportDescriptor

code ]={
0x05,0x01, //USAGE_PAGE(GenericDesktop)
0x09,0x02, //USAGE(Mouse)
0xa1,0x01, //COLLECTION(Application)
0x09,0x01, // USAGE(Pointer)
0xa1,0x00, // COLLECTION(Physical)
0x05,0x09, // USAGE_PAGE(Button)
0x19,0x01, // USAGE_MINIMUM(Button1)
0x29,0x03, // USAGE_MAXIMUM(Button3)
0x15,0x00, // LOGICAL_MINIMUM(0)
0x25,0x01, // LOGICAL_MAXIMUM(1)
0x95,0x03, // REPORT_COUNT(3)
0x75,0x01, // REPORT_SIZE(1)
0x81,0x02, // INPUT(Data,Var,Abs)
0x95,0x01, // REPORT_COUNT(1)
0x75,0x05, // REPORT_SIZE(5)
0x81,0x03, // INPUT(Cnst,Var,Abs)
0x05,0x01, // USAGE_PAGE(GenericDesktop)
0x09,0x30, // USAGE(X)
0x09,0x31, // USAGE(Y)
0x09,0x38, // USAGE(Wheel)
0x15,0x81, // LOGICAL_MINIMUM(-127)
0x25,0x7f, // LOGICAL_MAXIMUM(127)
0x75,0x08, // REPORT_SIZE(8)
0x95,0x03, // REPORT_COUNT(3)
0x81,0x06, // INPUT(Data,Var,Rel)
0xc0,      // END_COLLECTION
0xc0       //END_COLLECTION
};

5、USB Mass Storage Class

code Device_Descriptor device_descriptor= //设备描述符
{
    sizeof(Device_Descriptor), //设备描述符的字节数大小
    DEVICE_DESCRIPTOR,         //设备描述符类型编号
    SWAP16(0x0110),            //USB版本号
    0x00,                      //USB分配的设备类代码
    0x00,                      //USB分配的子类代码
    0x00,                      //USB分配的设备协议代码
    0x10,                      //端点0的最大包大小
    SWAP16(0x8888),            //厂商编号
    SWAP16(0x0005),            //产品编号
    SWAP16(0x0001),            //设备出厂编号
    0x01,                      //设备厂商字符串的索引
    0x02,                      //描述产品字符串的索引
    0x03,                      //描述设备序列号字符串的索引
    0x01                       //可能的配置数量
};

//定义配置,接口,端点等描述符结构体,因为它们是随配置描述符一起返回的
code CON_INT_ENDP_DESCRIPTOR_STRUCT con_int_endp_descriptor=
{
Configuration_Descriptor   configuration_descriptor;
Interface_Descriptor       interface_descriptor;
EndPoint_Descriptor     endpoint_descriptor[ENDPOINT_NUMBER];
}CON_INT_ENDP_DESCRIPTOR_STRUCT;

code CON_INT_ENDP_DESCRIPTOR_STRUCT con_int_endp_descriptor=
{
//configuration_descriptor //配置描述符
{
    sizeof(Configuration_Descriptor), //配置描述符的字节数大小
    CONFIGURATION_DESCRIPTOR,         //配置描述符类型编号
    (+
    (,
    0x01,                             //只包含一个接口
    0x01,                             //该配置的编号
    0x00,                             //iConfiguration字段
    0x80,                             //采用总线供电,不支持远程唤醒
    0xC8                              //从总线获取最大电流400mA
},
//interface_descritor //接口描述符
{
    sizeof(Interface_Descriptor), //接口描述符的字节数大小
    INTERFACE_DESCRIPTOR,         //接口描述符类型编号
    0x00,                         //接口编号为0
    0x00,                         //该接口描述符的编号
    0x02,                         //非0端点数量为2,只使用端点主端点输入和输出
    0x08,                         //USB大容量存储设备
    0x06,                         //使用的子类,为简化块命令
    0x50,                         //使用的协议,这里使用单批量传输协议
    0x00                          //接口描述符字符串索引
},
//endpoint_descriptor[]
{
    { //主端点输入描述
    sizeof(EndPoint_DescriptorT), //端点描述符的字节数大小
    ENDPOINT_DESCRIPTOR,          //端点描述符类型编号
    0x82,                         //端点号,主输入端点
    ENDPOINT_TYPE_BULK,           //使用的传输类型,批量传输
    SWAP16(0x0040),               //该端点支持的最大包尺寸,64字节
    0x00                          //中断扫描时间,对批量传输无效
    },
    { //主端点输出描述
    sizeof(EndPoint_DescriptorT), //端点描述符的字节数大小
    ENDPOINT_DESCRIPTOR,          //端点描述符类型编号
    0x02,                         //端点号,主输出端点
    ENDPOINT_TYPE_BULK,           //使用的传输类型,批量传输
    SWAP16(0x0040),               //该端点支持的最大包尺寸,64字节
    0x00                          //中断扫描时间,对批量传输无效
    }
}
};

6、USB Communication Device

这个很重要,比如可以实现USB转串口模块,然后会在电脑的设备管理器上面显示串口

code Device_Descriptor device_descriptor= //设备描述符
{
    sizeof(Device_Descriptor), //设备描述符的字节数大小
    DEVICE_DESCRIPTOR,         //设备描述符类型编号
    SWAP16(0x0110),            //USB版本号,USB1.1
    0x02,                      //USB分配的设备类代码,通信设备类(CDC)
    0x00,                      //USB分配的子类代码
    0x00,                      //USB分配的设备协议代码
    0x10,                      //端点0的最大包大小
    SWAP16(0x8888),            //厂商编号VID,这里只是作为测试用,请使用自己的VID
    SWAP16(0x0006),            //产品编号PID,这里只是作为测试用,请使用自己的PID
    SWAP16(0x0001),            //设备出厂编号
    0x01,                      //设备厂商字符串的索引
    0x02,                      //描述产品字符串的索引
    0x03,                      //描述设备序列号字符串的索引
    0x01                       //可能的配置数量
};

typedef struct Header_Functional_Descriptor
{
    uchar     bFunctionLength;
    uchar     bDescriptorType;
    uchar     bDescriptorSubType;
    uint     bcdCDC;
}Header_Functional_Descriptor;

typedef struct Call_Management_Funicational_Descriptor
{
    uchar     bFunctionLength;
    uchar     bDescriptorType;
    uchar     bDescriptorSubType;
    uchar     bmCapabilities;
    uchar     bmDataInterface;
}Call_Management_Funicational_Descriptor;

typedef struct Abstract_Control_Management_Functional_Descriptor
{
    uchar    bFunctionLength;
    uchar    bDescriptorType;
    uchar    bDescriptorSubtype;
    uchar    bmCapabilities;
}Abstract_Control_Management_Functional_Descriptor;

typedef struct Union_Functional_Descriptor
{
    uchar     bFunctionLength;
    uchar     bDescriptorType;
    uchar     bDescriptorSubtype;
    uchar     bMasterInterface;
    uchar     bSlaveInterface;
}Union_Functional_Descriptor;

//定义配置,接口,端点等描述符结构体,因为它们是随配置描述符一起返回的
typedef struct CON_INT_ENDP_DESCRIPTOR_STRUCT
{
    Configuration_Descriptor                          configuration_descriptor;
    Interface_Descriptor                              interface_descriptor;
    Header_Functional_Descriptor                      header_functional_descriptor;
    Call_Management_Funicational_Descriptor           call_management_functional_descriptor;
    Abstract_Control_Management_Functional_Descriptor abstract_ontrol_anagement_unctional_escriptor;
    Union_Functional_Descriptor                       union_functional_descriptor;
    EndPoint_Descriptor                               endpoint1in_descriptor;
    Interface_Descriptor                              interface1_descriptor;
    EndPoint_Descriptor                               endpoint2in_descriptor;
    EndPoint_Descriptor                               endpoint2out_descriptor;
}CON_INT_ENDP_DESCRIPTOR_STRUCT;

code CON_INT_ENDP_DESCRIPTOR_STRUCT con_int_endp_descriptor=
{
//configuration_descriptor //配置描述符
{
    sizeof(Configuration_Descriptor),                 //配置描述符的字节数大小
    CONFIGURATION_DESCRIPTOR,                         //配置描述符类型编号
    SWAP16(sizeof(CON_INT_ENDP_DESCRIPTOR_STRUCT)),
    0x02,                                             //只包含一个接口
    0x01,                                             //该配置的编号
    0x00,                                             //iConfiguration字段
    0xA0,                                             //采用总线供电,支持远程唤醒
    0xC8                                              //从总线获取最大电流400mA
},
//CDC interface_descritor //CDC类接口描述符
{
    sizeof(Interface_Descriptor),    //接口描述符的字节数大小
    INTERFACE_DESCRIPTOR,             //接口描述符类型编号
    0x00,                             //接口编号为0
    0x00,                             //该接口描述符的备用编号
    0x01,                             //非0端点数量为1,端点1中断
    0x02,                             //所使用的类,Communication InterfaceClass
    0x02,                             //使用的子类,AbstractControlModel
    0x01,                             //使用的协议,CommonATcommands
    0x00                              //接口描述符字符串索引
},
//header_functional_descriptor
{
    sizeof(Header_Functional_Descriptor), //Sizeofthisdescriptorin bytes
    CS_INTERFACE_DESCRIPTOR,              //CS_INTERFACE descriptor type
    0x00,                                 //Header functional descriptorsubtype
    SWAP16(0x0110)                        //CDC版本号
},
//call_management_functional_descriptor
{
    sizeof(Call_Management_Funicational_Descriptor), //Sizeof this descriptor in bytes
    CS_INTERFACE_DESCRIPTOR,                         //CS_INTERFACE descriptortype
    0x01,                                            //Call Management functional descriptorsubtype
    0x00,                                            //D1=0:Device sends receives call management
                                                    //information only over the Communication Class interface.
                                                    //D0=0:Device does not handle call management itself
    0x00                                             //Interface number of DataClass interface optionally used for call management(here not use).
},
//abstract_ontrol_anagement_unctional_escriptor
{
    sizeof(Abstract_Control_Management_Functional_Descriptor),    //Size of this descriptor in bytes
    CS_INTERFACE_DESCRIPTOR,                                      //CS_INTERFACE descriptor type
    0x02,                                                         //Abstract Control Management functional descriptor subtype
    0x02,                                                         //D3=0:Device DO NOT supports the notification Network_Connection.
                                                                //D2=0:Device DO NOT supports the request Send_Break
                                                                //D1=0:Device supports the request combination of
                                                                // Set_Line_Coding,Set_Control_Line_State,
                                                                // Get_Line_Coding,andthenotificationSerial_State.
},
//union_functional_descriptor
{
    sizeof(Union_Functional_Descriptor), //Sizeofthisdescriptorin bytes
    CS_INTERFACE_DESCRIPTOR,             //CS_INTERFACEdescriptortype
    0x06,                                //UnionfunctionaldescriptorSubType
    0x00,                                //MasterInterface,CDC接口
    0x01                                 //SlaveInterface,数据接口
},
//endpoint1in_descriptor
{ //中断输入端点描述
    sizeof(EndPoint_Descriptor),         //端点描述符的字节数大小
    ENDPOINT_DESCRIPTOR,                 //端点描述符类型编号
    0x81,                                //端点号,输入端点1
    ENDPOINT_TYPE_INTERRUPT,             //使用的传输类型:中断传输
    SWAP16(0x0010),                      //该端点支持的最大包尺寸,16字节
    0x01                                 //中断扫描时间:设置为1ms
},
//interface_descritor //数据接口描述符
{
    sizeof(Interface_Descriptor),         //接口描述符的字节数大小
    INTERFACE_DESCRIPTOR,                 //接口描述符类型编号
    0x01,                                 //接口编号为1
    0x00,                                 //该接口描述符的备用编号
    0x02,                                 //端点数量为2,使用主端点输入和输出
    0x0A,                                 //所使用的类,Data InterfaceClass
    0x00,                                 //使用的子类
    0x00,                                 //使用的协议,CommonAT commands
    0x00                                  //接口描述符字符串索引
},
//endpoint2in_descriptor
{ //主端点输入描述
    sizeof(EndPoint_Descriptor),         //端点描述符的字节数大小
    ENDPOINT_DESCRIPTOR,                 //端点描述符类型编号
    0x82,                               //端点号,主输入端点
    ENDPOINT_TYPE_BULK,                  //使用的传输类型:批量传输
    SWAP16(0x0040),                      //该端点支持的最大包尺寸,64字节
    0x0A                                 //中断扫描时间:批量端点无效
},
{ //主端点输出描述
    sizeof(EndPoint_Descriptor),         //端点描述符的字节数大小
    ENDPOINT_DESCRIPTOR,                 //端点描述符类型编号
    0x02,                                 //端点号,主输出端点
    ENDPOINT_TYPE_BULK,                 //使用的传输类型:批量传输
    SWAP16(0x0040),                     //该端点支持的最大包尺寸,64字节
    0x0A                                 //中断扫描时间:批量端点无效
}
};

7、定义自己的USB设备

code Device_Descriptor device_descriptor= //设备描述符
{
    sizeof(Device_Descriptor), //设备描述符的字节数大小
    DEVICE_DESCRIPTOR,         //设备描述符类型编号
    SWAP16(0x0110),            //USB版本号,USB1.1
    0xFF,                      //USB分配的设备类代码,0xFF为厂家自定义类
    0x00,                      //USB分配的子类代码
    0x00,                      //USB分配的设备协议代码
    0x10,                      //端点0的最大包大小
    SWAP16(0x8888),            //厂商编号VID,这里只是作为测试用,请使用自己的VIDSWAP16(0x0088), //产品编号PID,这里只是作为测试用,请使用自己的PID
    SWAP16(0x0001),            //设备出厂编号
    0x01,                      //设备厂商字符串的索引
    0x02,                      //描述产品字符串的索引
    0x03,                      //描述设备序列号字符串的索引
    0x01                       //可能的配置数量
};

//定义配置,接口,端点等描述符结构体,因为它们是随配置描述符一起返回的
typedef struct CON_INT_ENDP_DESCRIPTOR_STRUCT
{
    Configuration_Descriptor configuration_descriptor;
    Interface_Descriptor     interface_descriptor;
    EndPoint_Descriptor      endpoint1in_descriptor;
    EndPoint_Descriptor      endpoint1out_descriptor;
    EndPoint_Descriptor      endpoint2in_descriptor;
    EndPoint_Descriptor      endpoint2out_descriptor;
}CON_INT_ENDP_DESCRIPTOR_STRUCT;

code CON_INT_ENDP_DESCRIPTOR_STRUCT con_int_endp_descriptor=
{
//configuration_descriptor //配置描述符
{
    sizeof(Configuration_Descriptor), //配置描述符的字节数大小
    CONFIGURATION_DESCRIPTOR,         //配置描述符类型编号
    SWAP16(sizeof(CON_INT_ENDP_DESCRIPTOR_STRUCT)),
    0x01, //只包含一个接口
    0x01, //该配置的编号
    0x00, //iConfiguration字段
    0xA0, //采用总线供电,支持远程唤醒
    0xC8 //从总线获取最大电流400mA
},
//interface_descritor //接口描述符
{
    sizeof(Interface_Descriptor), //接口描述符的字节数大小
    INTERFACE_DESCRIPTOR,         //接口描述符类型编号
    0x00, //接口编号为0
    0x00, //该接口描述符的备用编号
    0x04, //端点数量为4
    0x00, //所使用的类
    0x00, //使用的子类
    0x00, //使用的协议
    0x00  //接口描述符字符串索引
},
//endpoint1in_descriptor
{ //中断输入端点描述
    sizeof(EndPoint_Descriptor), //端点描述符的字节数大小
    ENDPOINT_DESCRIPTOR,         //端点描述符类型编号
    0x81,                        //端点号,输入端点1
    ENDPOINT_TYPE_INTERRUPT,     //使用的传输类型:中断传输
    SWAP16(0x0010),              //该端点支持的最大包尺寸,16字节
    0x0A                         //中断扫描时间:设置为10ms
},
//endpoint1in_descriptor
{ //中断输出端点描述
    sizeof(EndPoint_Descriptor), //端点描述符的字节数大小
    ENDPOINT_DESCRIPTOR,         //端点描述符类型编号
    0x01,                        //端点号,输出端点1
    ENDPOINT_TYPE_INTERRUPT,     //使用的传输类型:中断传输
    SWAP16(0x0010),              //该端点支持的最大包尺寸,16字节
    0x0A                         //中断扫描时间:设置为10ms
},
//endpoint2in_descriptor
{ //主端点输入描述
    sizeof(EndPoint_Descriptor), //端点描述符的字节数大小
    ENDPOINT_DESCRIPTOR,         //端点描述符类型编号
    0x82,                        //端点号,主输入端点
    ENDPOINT_TYPE_BULK,          //使用的传输类型:批量传输
    SWAP16(0x0040),              //该端点支持的最大包尺寸,64字节
    0x00                         //中断扫描时间:批量端点无效
},
{ //主端点输出描述
    sizeof(EndPoint_Descriptor), //端点描述符的字节数大小
    ENDPOINT_DESCRIPTOR,         //端点描述符类型编号
    0x02,                        //端点号,主输出端点
    ENDPOINT_TYPE_BULK,          //使用的传输类型:批量传输
    SWAP16(0x0040),              //该端点支持的最大包尺寸,64字节
    0x00                         //中断扫描时间:批量端点无效
}
};

最新文章

  1. hadoop 8088无法访问
  2. 运行python代码报错UnicodeDecodeError: 'ascii' codec can't decode byte 0xe7 in position 91: ordinal not in range(128)的解决办法
  3. springboot 添加job定时任务
  4. [反汇编练习] 160个CrackMe之017
  5. iOS,OC,图片相似度比较,图片指纹
  6. libcurl的封装,支持同步异步请求,支持多线程下载,支持https
  7. ORACLE环境变量设置
  8. [Swift]LeetCode508. 出现次数最多的子树元素和 | Most Frequent Subtree Sum
  9. 局部敏感哈希(LSH)之simhash和minhash
  10. C#VS2017添加ReportViewer控件
  11. C# 事件的使用方法
  12. qml性能优化(来源于群友分享);
  13. MyBatis中调用存储过程和函数
  14. (转)Spring常用注解
  15. 每日英语:The Most Destructive, Unpredictable Force in Tech
  16. 【C#】#103 动态修改App.config配置文件
  17. 2011年入侵 Kernel.org 的黑客被捕 面临10年监禁
  18. rac库grid目录权限(6751)导致数据库宕机案例 此方法仅用于紧急救助
  19. 前端 html span标签
  20. 【Python】nvshens按目录批量下载图片爬虫1.00(单线程版)

热门文章

  1. KEIL的宏汇编器A51介绍
  2. 【温故而知新:文件操作】C#的文件读写相关
  3. 【转】ARM Linux 3.x的设备树(Device Tree)
  4. jquery IE6 select.val() bug报错解决办法
  5. Apache本地服务无法自启动问题解决
  6. Sliding Window Maximum 解答
  7. SharePoint excel service web part 连接到 filter web part
  8. 判断一个key 是否在map中存在
  9. Leetcode 238 Product of Array Except Self 时间O(n)和空间O(1)解法
  10. java RMI入门指南