以下是总结的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                         //中断扫描时间:批量端点无效
}
};

USB class总结的更多相关文章

  1. Linux自动共享USB设备:udev+Samba

    一.概述 公司最近要我实现USB设备插入Ubuntu后,自动共享到网络上,能像Windows共享一样(如\\192.168.1.10)访问里面的内容,不需要写入权限.当时听完这需求,我这新人表示惊呆了 ...

  2. OpenWrt中开启usb存储和samba服务

    在从官网安装的WNDR3800 15.05.1版本OpenWrt中, 不带usb存储支持以及samba, 需要另外安装 1. 启用usb支持 USB Basic Support https://wik ...

  3. USB设备(移动硬盘、鼠标)掉电掉驱动的两种解决方案

    症状: 当你发现"移动硬盘图标"经常无故消失,又自己出现时. 你可以把这个现象称之为"掉电" or "掉驱动". 遇到这种情况,相当不爽. ...

  4. 【.NET MF】.NET Micro Framework USB移植

    1.开发环境 windows 7  32位 MDK 4.54 .Net Micro Framework Porting Kit 4.2(RTM QFE2) .Net Micro Framework   ...

  5. USB Host的上拉下拉电阻

      关于USB的上下拉电阻,不是随便接个任意阻值的电阻就ok了. 当你的USB为主设备的时候,D+.D-上分别接一个15K的下拉电阻,这样可以使得在没有设备插入的时候,D+.D-上始终保持低电平:当为 ...

  6. stm32 usb error : identifier "bool" is undefined

    .\usb\USB\usb_pwr.h(54): error:  #20: identifier "bool" is undefinedusb\USB\usb_pwr.h(54): ...

  7. 如果mac电脑的usb转接器连接wlan时不显示,也就是不识别usb此时的网络连接没有,解决办法就是如下

    1.接上电源   关机 先按下shift +ctrl + opt + 开机键    ,等待10秒,这10秒是没有反应的,屏幕不会亮,系统不会跑起来,  10秒之后松开所有键,再按下opt + cmd ...

  8. UP Board USB无线网卡一贴通

    前言 原创文章,转载引用务必注明链接,水平有限,欢迎指正. 本文环境:ubilinux 3.0 kernel 4.4.0 本文使用Markdown写成,为获得更好的阅读体验和正常的图片.链接,请访问我 ...

  9. AD域控制器通过组策略禁止USB设备

    问题:域环境下如何禁用USB口设备? 第一种:用传统的办法,在Bios中禁用USB. 第二种: 微软技术支持回答:根据您的需求, Windows识别USB设备主要通过两个文件,一个是Usbstor.p ...

  10. 安卓手机USB网络共享,电脑卡顿、反应慢

    1.首先需要把手机连接到电脑,在手机上打开USB网络共享. 2.打开设备管理器 3.在网络适配器中,找到Remote NDIS based Internet Sharing Device,右键更新驱动 ...

随机推荐

  1. Codeforces 577B Modulo Sum

    http://codeforces.com/problemset/problem/577/B 题意:有n个数,求有无一个子序列满足和是m的倍数 思路:用模下的背包做,发现n是十的六次方级别,但是有个神 ...

  2. 《Programming WPF》翻译 第6章 3.二进制资源

    原文:<Programming WPF>翻译 第6章 3.二进制资源 尽管ResourceDictionary和系统级别的资源适合于作为数据存在于对象中,然而,并不是所有的资源都能很好的满 ...

  3. MVC4+Springnet+Nhibernate学习系列随笔(一)

    Springnet与asp.net mvc4集成大体步骤 1.首先要在MVC项目中引用的两个程序集(Spring.Web与Spring.Web.Mvc4) 集 2.修改MVC项目的Global.asa ...

  4. 【转】notepad++设置字体和字体大小

    原文网址:http://www.aichengxu.com/view/604 今天很多朋友问我怎么设置notepad++的代码字体和代码字体的大小,习惯了editplus的朋友可能会在notepad+ ...

  5. SxsTrace工具使用方法

    Windows7平台上有一个强大的SxsTrace工具,可以跟踪调试应用程序运行时需要的动态库的版本和路径.   SxsTrace使用的方法:   1.首先必须以Administrator用户身份登录 ...

  6. C/C++内存存储问题

    #include <stdio.h> #include "string.h" #include "malloc.h" void Swap(int a ...

  7. Calculate Number Of Islands And Lakes 解答

    Question 1 1 1 1 1 01 0 1 0 0 11 0 1 0 0 11 1 0 1 1 1 1 is earth, 0 is water. i) count the number of ...

  8. 《Algorithms 4th Edition》读书笔记——2.4 优先队列(priority queue)-Ⅵ

    · 学后心得体会与部分习题实现 心得体会: 曾经只是了解了优先队列的基本性质,并会调用C++ STL库中的priority_queue以及 java.util.PriorityQueue<E&g ...

  9. 《Java程序员面试笔试宝典》之字符串创建与存储的机制是什么

    在Java语言中,字符串起着非常重要的作用,字符串的声明与初始化主要有如下两种情况: (1)       对于String s1=new String("abc")语句与Strin ...

  10. 汉字与utf8相互转化

    NSString* strA = [@"%E4%B8%AD%E5%9B%BD"stringByReplacingPercentEscapesUsingEncoding:NSUTF8 ...