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,右键更新驱动 ...
随机推荐
- (转)CentOS搭建Nagios监控
A.Nagios服务端1.安装软件包 yum install -y httpd 2.下载nagios wget http://syslab.comsenz.com/downloads/linux/na ...
- scaletype
http://www.myexception.cn/image/726203.html 图片说明Andorid中ImageView的不同属性ScaleType的区别 ImageView是Android ...
- 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 ...
- 深入浅出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 高效使用 ...
- 4Sum 解答
Question Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c ...
- python练习linux下创建路径
#coding=utf-8 import os class MakeDirectory(): def mkdir(self,path): # 去除首位空格 path=path.strip() # 去除 ...
- UGUI 快捷键创建UGUI组件
使用NGUI的时候还有xxx快捷键创建, spirte,label,button等等. 在UGUI里面的时候好像是没有快捷键的. 不知道以后多久才能有这个功能. 在家里闲无聊的时候写了一个脚本, ...
- pyqt 右击+指定位置点击例子学习
# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' import sys from PyQt4.QtCore impor ...
- C++11里面的Lambda表达式
Lambda Expressions in C++ C++中的Lambda表达式 In Visual C++, a lambda expression—referred to as a lambda— ...
- Session,有没有必要使用它?
阅读目录 开始 Session的来龙去脉 Session对并发访问的影响 Session的缺点总结 不使用Session的替代方法 Asp.net MVC 中的Session 现有的代码怎么办? 今天 ...