3.接口描述符
- //定义标准的接口描述符结构
- typedef struct _INTERFACE_DESCRIPTOR_STRUCT
- {
- BYTE bLength; //接口描述符的字节数大小
- BYTE bDescriptorType; //接口描述符的类型编号
- BYTE bInterfaceNumber; //该接口的编号
- BYTE bAlternateSetting; //备用的接口描述符编号
- BYTE bNumEndpoints; //该接口使用的端点数,不包括端点0
- BYTE bInterfaceClass; //接口类型
- BYTE bInterfaceSubClass; //接口子类型
- BYTE bInterfaceProtocol; //接口遵循的协议
- BYTE iInterface; //描述该接口的字符串索引值
- }
- INTERFACE_DESCRIPTOR_STRUCT, * pINTERFACE_DESCRIPTOR_STRUCT;
4.端点描述符
- //定义标准的端点描述符结构
- typedef struct _ENDPOINT_DESCRIPTOR_STRUCT
- {
- BYTE bLegth; //端点描述符字节数大小
- BYTE bDescriptorType; //端点描述符类型编号
- BYTE bEndpointAddress; //端点地址及输入输出属性
- BYTE bmAttributes; //端点的传输类型属性
- WORD wMaxPacketSize; //端点收、发的最大包大小
- BYTE bInterval; //主机查询端点的时间间隔
- }
- ENDPOINT_DESCRIPTOR_STRUCT, * pENDPOINT_DESCRIPTOR_STRUCT;
下面是一个配置描述符集合的定义
- typedef struct _CON_INT_ENDP_DESCRIPTOR_STRUCT
- {
- CONFIGURATION_DESCRIPTOR_STRUCT configuration_descriptor;
- INTERFACE_DESCRIPTOR_STRUCT interface_descritor;
- ENDPOINT_DESCRIPTOR_STRUCT endpoint_descriptor[ENDPOINT_NUMBER];
- }CON_INT_ENDP_DESCRIPTOR_STRUCT;
配置描述符集合的示例
- code CON_INT_ENDP_DESCRIPTOR_STRUCT con_int_endp_descriptor= //配置描述符集合
- {
- //configuration_descriptor //配置描述符
- {
- sizeof(CONFIGURATION_DESCRIPTOR_STRUCT), //配置描述符的字节数大小,这里为9
- CONFIGURATION_DESCRIPTOR, //配置描述符类型编号,配置描述符为2
- (sizeof(CONFIGURATION_DESCRIPTOR_STRUCT)+
- sizeof(INTERFACE_DESCRIPTOR_STRUCT)+
- sizeof(ENDPOINT_DESCRIPTOR_STRUCT)*ENDPOINT_NUMBER)*256+
- (sizeof(CONFIGURATION_DESCRIPTOR_STRUCT)+
- sizeof(INTERFACE_DESCRIPTOR_STRUCT)+
- sizeof(ENDPOINT_DESCRIPTOR_STRUCT)*ENDPOINT_NUMBER)/256, //配置描述符集合的总大小
- 0x01, //只包含一个接口
- 0x01, //该配置的编号
- 0x00, //iConfiguration字段
- 0x80, //采用总线供电,不支持远程唤醒
- 0xC8 //从总线获取最大电流400mA
- },
- //interface_descritor //接口描述符
- {
- sizeof(INTERFACE_DESCRIPTOR_STRUCT), //接口描述符的字节数大小,这里为9
- INTERFACE_DESCRIPTOR, //接口描述符类型编号,接口描述符为3
- 0x00, //接口编号为4
- 0x00, //该接口描述符的编号为0
- ENDPOINT_NUMBER, //非0端点数量为2,只使用端点主端点输入和输出
- 0x08, //定义为USB大容量存储设备
- 0x06, //使用的子类,为简化块命令
- 0x50, //使用的协议,这里使用单批量传输协议
- 0x00 //接口描述符字符串索引,为0,表示没有字符串
- },
- //endpoint_descriptor[]
- {
- { 主端点输入描述
- sizeof(ENDPOINT_DESCRIPTOR_STRUCT), //端点描述符的字节数大小,这里为7
- ENDPOINT_DESCRIPTOR, //端点描述符类型编号,端点描述符为5
- MAIN_POINT_IN, //端点号,主输入端点
- ENDPOINT_TYPE_BULK, //使用的传输类型,批量传输
- 0x4000, //该端点支持的最大包尺寸,64字节
- 0x00 //中断扫描时间,对批量传输无效
- },
- { //主端点输出描述
- sizeof(ENDPOINT_DESCRIPTOR_STRUCT), //端点描述符的字节数大小,这里为7
- ENDPOINT_DESCRIPTOR, //端点描述符类型编号,端点描述符为5
- MAIN_POINT_OUT, //端点号,主输出端点
- ENDPOINT_TYPE_BULK, //使用的传输类型,批量传输
- 0x4000, //该端点支持的最大包尺寸,64字节
- 0x00 //中断扫描时间,对批量传输无效
- }
- }
- };
其中关于端点的类型定义如下
- //定义的端点类型
- #define ENDPOINT_TYPE_CONTROL 0x00 //控制传输
- #define ENDPOINT_TYPE_ISOCHRONOUS 0x01 //同步传输
- #define ENDPOINT_TYPE_BULK 0x02 //批量传输
- #define ENDPOINT_TYPE_INTERRUPT 0x03 //中断传输
端点号的定义如下
- #define MAIN_POINT_OUT 0x02 //2号输出端点
- #define MAIN_POINT_IN 0x82 //2号输入端点
温馨提示:
百合电子工作室有一个关于USB开发方面的开源项目-Easy USB 51 Programer,整个开发过程写得非常详细,不防参考一下,您还可以进入她的论坛参与此项目的讨论。