USB class总结


以下是总结的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 char KeyBoardReportDescriptor[63]={
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 char MouseReportDescriptor[52]={
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,         //配置描述符类型编号
    (sizeof(Configuration_Descriptor)+sizeof(Interface_Descriptor)+sizeof(EndPoint_Descriptor)*ENDPOINT_NUMBER)*256+
    (sizeof(Configuration_Descriptor)+sizeof(Interface_Descriptor)+sizeof(EndPoint_Descriptor)*ENDPOINT_NUMBER)/256,
    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                         //中断扫描时间:批量端点无效
}
};








你可能感兴趣的:(电路)