以下是总结的USB的类,不同的USB类,主机询问的描述符格式和内容都不一样,具体的descriptor的内容可以查看
USB spec(http://www.usb.org/home/),如HID的spec里有关于鼠标键盘描述符的详细说明(在appendix E里)
#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 //中断传输
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;
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
};
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
};
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 //中断扫描时间,对批量传输无效
}
}
};
这个很重要,比如可以实现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 //中断扫描时间:批量端点无效
}
};
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 //中断扫描时间:批量端点无效
}
};