以下是总结的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. (转)CentOS搭建Nagios监控

    A.Nagios服务端1.安装软件包 yum install -y httpd 2.下载nagios wget http://syslab.comsenz.com/downloads/linux/na ...

  2. scaletype

    http://www.myexception.cn/image/726203.html 图片说明Andorid中ImageView的不同属性ScaleType的区别 ImageView是Android ...

  3. Magento How To Display Product Custom Option On list.phtml

    Some time we need to display custom option of product on category list page to achive this task we o ...

  4. 深入浅出Node.js (5) - 内存控制

    5.1 V8的垃圾回收机制与内存限制 5.1.1 Node与V8 5.1.2 V8的内存限制 5.1.3 V8的对象分配 5.1.4 V8的垃圾回收机制 5.1.5 查看垃圾回收日志 5.2 高效使用 ...

  5. 4Sum 解答

    Question Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c  ...

  6. python练习linux下创建路径

    #coding=utf-8 import os class MakeDirectory(): def mkdir(self,path): # 去除首位空格 path=path.strip() # 去除 ...

  7. UGUI 快捷键创建UGUI组件

      使用NGUI的时候还有xxx快捷键创建, spirte,label,button等等. 在UGUI里面的时候好像是没有快捷键的. 不知道以后多久才能有这个功能.  在家里闲无聊的时候写了一个脚本, ...

  8. pyqt 右击+指定位置点击例子学习

    # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' import sys from PyQt4.QtCore impor ...

  9. C++11里面的Lambda表达式

    Lambda Expressions in C++ C++中的Lambda表达式 In Visual C++, a lambda expression—referred to as a lambda— ...

  10. Session,有没有必要使用它?

    阅读目录 开始 Session的来龙去脉 Session对并发访问的影响 Session的缺点总结 不使用Session的替代方法 Asp.net MVC 中的Session 现有的代码怎么办? 今天 ...