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