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 ]={ 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总结的更多相关文章
- Linux自动共享USB设备:udev+Samba
一.概述 公司最近要我实现USB设备插入Ubuntu后,自动共享到网络上,能像Windows共享一样(如\\192.168.1.10)访问里面的内容,不需要写入权限.当时听完这需求,我这新人表示惊呆了 ...
- OpenWrt中开启usb存储和samba服务
在从官网安装的WNDR3800 15.05.1版本OpenWrt中, 不带usb存储支持以及samba, 需要另外安装 1. 启用usb支持 USB Basic Support https://wik ...
- USB设备(移动硬盘、鼠标)掉电掉驱动的两种解决方案
症状: 当你发现"移动硬盘图标"经常无故消失,又自己出现时. 你可以把这个现象称之为"掉电" or "掉驱动". 遇到这种情况,相当不爽. ...
- 【.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 ...
- USB Host的上拉下拉电阻
关于USB的上下拉电阻,不是随便接个任意阻值的电阻就ok了. 当你的USB为主设备的时候,D+.D-上分别接一个15K的下拉电阻,这样可以使得在没有设备插入的时候,D+.D-上始终保持低电平:当为 ...
- stm32 usb error : identifier "bool" is undefined
.\usb\USB\usb_pwr.h(54): error: #20: identifier "bool" is undefinedusb\USB\usb_pwr.h(54): ...
- 如果mac电脑的usb转接器连接wlan时不显示,也就是不识别usb此时的网络连接没有,解决办法就是如下
1.接上电源 关机 先按下shift +ctrl + opt + 开机键 ,等待10秒,这10秒是没有反应的,屏幕不会亮,系统不会跑起来, 10秒之后松开所有键,再按下opt + cmd ...
- UP Board USB无线网卡一贴通
前言 原创文章,转载引用务必注明链接,水平有限,欢迎指正. 本文环境:ubilinux 3.0 kernel 4.4.0 本文使用Markdown写成,为获得更好的阅读体验和正常的图片.链接,请访问我 ...
- AD域控制器通过组策略禁止USB设备
问题:域环境下如何禁用USB口设备? 第一种:用传统的办法,在Bios中禁用USB. 第二种: 微软技术支持回答:根据您的需求, Windows识别USB设备主要通过两个文件,一个是Usbstor.p ...
- 安卓手机USB网络共享,电脑卡顿、反应慢
1.首先需要把手机连接到电脑,在手机上打开USB网络共享. 2.打开设备管理器 3.在网络适配器中,找到Remote NDIS based Internet Sharing Device,右键更新驱动 ...
随机推荐
- Codeforces 577B Modulo Sum
http://codeforces.com/problemset/problem/577/B 题意:有n个数,求有无一个子序列满足和是m的倍数 思路:用模下的背包做,发现n是十的六次方级别,但是有个神 ...
- 《Programming WPF》翻译 第6章 3.二进制资源
原文:<Programming WPF>翻译 第6章 3.二进制资源 尽管ResourceDictionary和系统级别的资源适合于作为数据存在于对象中,然而,并不是所有的资源都能很好的满 ...
- MVC4+Springnet+Nhibernate学习系列随笔(一)
Springnet与asp.net mvc4集成大体步骤 1.首先要在MVC项目中引用的两个程序集(Spring.Web与Spring.Web.Mvc4) 集 2.修改MVC项目的Global.asa ...
- 【转】notepad++设置字体和字体大小
原文网址:http://www.aichengxu.com/view/604 今天很多朋友问我怎么设置notepad++的代码字体和代码字体的大小,习惯了editplus的朋友可能会在notepad+ ...
- SxsTrace工具使用方法
Windows7平台上有一个强大的SxsTrace工具,可以跟踪调试应用程序运行时需要的动态库的版本和路径. SxsTrace使用的方法: 1.首先必须以Administrator用户身份登录 ...
- C/C++内存存储问题
#include <stdio.h> #include "string.h" #include "malloc.h" void Swap(int a ...
- 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 ...
- 《Algorithms 4th Edition》读书笔记——2.4 优先队列(priority queue)-Ⅵ
· 学后心得体会与部分习题实现 心得体会: 曾经只是了解了优先队列的基本性质,并会调用C++ STL库中的priority_queue以及 java.util.PriorityQueue<E&g ...
- 《Java程序员面试笔试宝典》之字符串创建与存储的机制是什么
在Java语言中,字符串起着非常重要的作用,字符串的声明与初始化主要有如下两种情况: (1) 对于String s1=new String("abc")语句与Strin ...
- 汉字与utf8相互转化
NSString* strA = [@"%E4%B8%AD%E5%9B%BD"stringByReplacingPercentEscapesUsingEncoding:NSUTF8 ...