USB的描述符有:
1、设备描述符
2、配置描述符
3、接口描述符
4、端点描述符
5、字符串描述符
枚举就是利用端点0与主机HOST交换各个描述符,让主机HOST知晓你是谁,加载相应的驱动与你相匹配。
各个描述符如下:
1、设备描述符:一个设备只有一个设备描述符
typedef struct _USB_DEVICE_DESCRIPTOR_
{
BYTE bLength, //描述符大小.固定为0x12
BYTE bDescriptorType, //设备描述符类型.固定为0x01
WORD bcdUSB, // USB 规范发布号.表示了本设备能适用于那种协议,
//如2.0=0200,1.1=0110等
BYTE bDeviceClass, //类型代码(由USB指定)。当它的值是0时,
//表示所有接口在配置描述符里,并且所有接口是独立的。
//当它的值是1到FEH时,表示不同的接口关联的。
//当它的值是FFH时,它是厂商自己定义的
BTYE bDeviceSubClass, //子类型代码(由USB分配).如果bDeviceClass值是0,
//一定要设置为0.其它情况就跟据USB-IF组织定义的编码
BYTE bDeviceProtol, //协议代码(由USB分配).
//如果使用USB-IF组织定义的协议,
//就需要设置这里的值,否则直接设置为0。
//如果厂商自己定义的可以设置为FFH
BYTE bMaxPacketSize0, //端点0最大分组大小(只有8, 16,32, 64有效)
WORD idVenderI, //供应商ID(由USB分配)
WORD idProduct, //产品ID(由厂商分配).由供应商ID和产品ID,
//就可以让操作系统加载不同的驱动程序
WORD bcdDevice, //设备出产编码.由厂家自行设置
BYTE iManufacturer, //厂商描述符字符串索引.
//索引到对应的字符串描述符. 为0则表示没有
BYTE iProduct, //产品描述符字符串索引.同上
BYTE iSerialNumber, //设备序列号字符串索引.同上
BYTE iNumConfiguations //可能的配置数.指配置字符串的个数
}USB_DEVICE_DESCRIPTOR;
2、配置描述符:配置描述符定义了设备的配置信息,一个设备可以有多个配置描述符
typedef struct_USB_CONFIGURATION_DESCRIPTOR_
{
BYTE bLength, //描述符大小.固定为0x09
BYTE bDescriptorType, //配置描述符类型.固定为0x02
WORD wTotalLength, //返回整个数据的长度.指此配置返回的配置描述符,
//接口描述符以及端点描述符的全部大小
BYTE bNumInterfaces, //配置所支持的接口数.指该配置配备的接口数量,
//也表示该配置下接口描述符数量
BYTE bConfigurationValue, //作为SetConfiguration的一个参数选择配置值
BYTE iConfiguration, //用于描述该配置字符串描述符的索引
BYTE bmAttributes, //供电模式选择.Bit4-0保留,
//D7:总线供电,D6:自供电,D5:远程唤醒
BYTE MaxPower //总线供电的USB设备的最大消耗电流.以2mA为单位
}USB_CONFIGURATION_DESCRIPTOR;
3、接口描述符:接口描述符说明了接口所提供的配置,一个配置所拥有的接口数量通过配置描述符的bNumInterfaces决定
typedef struct _USB_INTERFACE_DESCRIPTOR_
{
BYTE bLength, //描述符大小.固定为0x09
BYTE bDescriptorType, //接口描述符类型.固定为0x04
BYTE bInterfaceNumber, //该接口的编号
BYTE bAlternateSetting, //用于为上一个字段选择可供替换的位置.
//即备用的接口描述符标号
BYTE bNumEndpoint, //使用的端点数目.端点0除外
BYTE bInterfaceClass, //类型代码(由USB分配)
BYTE bInterfaceSubClass, //子类型代码(由USB分配)
BYTE bInterfaceProtocol, //协议代码(由USB分配)
BYTE iInterface //字符串描述符的索引
}USB_INTERFACE_DESCRIPTOR;
4、端点描述符:USB设备中的每个端点都有自己的端点描述符,由接口描述符中的bNumEndpoint决定其数量
typedef struct _USB_ENDPOINT_DESCRIPTOR_
{
BYTE bLength, //描述符大小.固定为0x07
BYTE bDescriptorType, //接口描述符类型.固定为0x05
BYTE bEndpointAddress, // USB设备的端点地址.Bit7,方向,
//对于控制端点可以忽略,
//1/0:IN/OUT.Bit6-4,保留.BIt3-0:端点号
BYTE bmAttributes, //端点 属性.Bit7-2,保留.BIt1-0:
//00控制,01同步,02批量,03中断
WORD wMaxPacketSize, //本端点接收或发送的最大信息包大小
BYTE bInterval //轮训数据传送端点的时间间隔.
//对于批量传送和控制传送的端点忽略.
//对于同步传送的端点,必须为1,
//对于中断传送的端点,范围为1-255
}USB_ENDPOINT_DESCRIPTOR;
5、字符串描述符:其中字符串描述符是可选的.如果不支持字符串描述符,其设备,配置,接口描述符内的所有字符串描述符索引都必须为0
typedef struct _USB_STRING_DESCRIPTION_
{
BYTE bLength, //描述符大小
//由整个字符串的长度加上bLength和bDescriptorType的长度决定
BYTE bDescriptionType, //接口描述符类型.固定为0x03
BYTE bString[1] // Unicode编码字符串
}USB_STRING_DESCRIPTION;
需要注意的是,在每个描述符中都有对下一个描述符描述。思路如下:
USB_DEVICE_DESCRIPTOR->iNumConfiguations;
USB_CONFIGURATION_DESCRIPTOR->bNumInterfaces;
USB_INTERFACE_DESCRIPTOR-> bNumEndpoint;
iSerialNumber->iSerialNumber;
参考stm32f10x对HID的赋值:
const u8 CustomHID_DeviceDescriptor[CUSTOMHID_SIZ_DEVICE_DESC] =
{
0x12, /*bLength */
USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType*/
0x00, /*bcdUSB */
0x02,
0x00, /*bDeviceClass*/ //dahan 0x00 ->HID
0x00, /*bDeviceSubClass*/ //dahan 0x00 ->HID
0x00, /*bDeviceProtocol*/ //dahan 0x00 ->HID
0x40, /*bMaxPacketSize40*/
0x47, /*idVendor (0x2047)*/
0x20,
0x01, /*idProduct = 0x0301*/
0x03,
0x00, /*bcdDevice rel. 2.00*/
0x03,
1, /*Index of string descriptor describing
manufacturer */
2, /*Index of string descriptor describing
product*/
3, /*Index of string descriptor describing the
device serial number */
0x01 /*bNumConfigurations*/
}
; /* CustomHID_DeviceDescriptor */
/* USB Configuration Descriptor */
/* All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */
const u8 CustomHID_ConfigDescriptor[CUSTOMHID_SIZ_CONFIG_DESC] =
{
//================ Configuation Descriptor ========================
0x09, /* bLength: Configuation Descriptor size */
USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */
CUSTOMHID_SIZ_CONFIG_DESC,
/* wTotalLength: Bytes returned */
0x00,
0x01, /* bNumInterfaces: 1 interface */
0x01, /* bConfigurationValue: Configuration value */
0x00, /* iConfiguration: Index of string descriptor describing
the configuration*/
0xC0, /* bmAttributes: Bus powered */
/*Bus powered: 7th bit, Self Powered: 6th bit, Remote wakeup: 5th bit, reserved: 4..0 bits */
0x32, /* MaxPower 100 mA: this current is used for detecting Vbus */
// 0x96, /* MaxPower 300 mA: this current is used for detecting Vbus */
/************** Descriptor of Custom HID interface ****************/
/* 09 */
//================ Interface Descriptor ========================
0x09, /* bLength: Interface Descriptor size */
USB_INTERFACE_DESCRIPTOR_TYPE,/* bDescriptorType: Interface descriptor type */
0x00, /* bInterfaceNumber: Number of Interface */
0x00, /* bAlternateSetting: Alternate setting */
0x02, /* bNumEndpoints */
0x03, /* bInterfaceClass: HID */ //--> HID
0x00, /* bInterfaceSubClass : 1=BOOT, 0=no boot */ //-->HID 0x00 or 0x01
0x00, //0x00, /*dahan 0x00*/ /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */
0, /* iInterface: Index of string descriptor */
/******************** Descriptor of Custom HID HID ********************/
/* 18 */
//================ HID Descriptor ========================
0x09, /* bLength: HID Descriptor size */
HID_DESCRIPTOR_TYPE, /* bDescriptorType: HID */
0x10, /* bcdHID: HID Class Spec release number */
0x01,
0x00, /* bCountryCode: Hardware target country */
0x01, /* bNumDescriptors: Number of HID class descriptors to follow */
0x22, /* bDescriptorType */
CUSTOMHID_SIZ_REPORT_DESC,/* wItemLength: Total length of Report descriptor */
0x00,
/******************** Descriptor of Custom HID endpoints ******************/
/* 27 */
//================ Endpoint Descriptor 1 ========================
0x07, /* bLength: Endpoint Descriptor size */
USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */
0x82, /* bEndpointAddress: Endpoint Address (IN) bit:1(IN/OUT)000 0010(endpoint number 2)*/
//端点2 输入 // bit 3...0 : the endpoint number
//向PC发数据 // bit 6...4 : reserved
// bit 7 : 0(OUT), 1(IN)
0x03, /* bmAttributes: Interrupt endpoint */
SendLength%256, /* wMaxPacketSize:SendLength Bytes max *///向PC发送SendLength字节数据
SendLength/256,
0x01, /* bInterval: Polling Interval (21 ms) */
/* 34 */
//================ Endpoint Descriptor 2 ========================
0x07, /* bLength: Endpoint Descriptor size */
USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */
/* Endpoint descriptor type */
0x01, /* bEndpointAddress: */ //0000 0001(endpoint number 1)
//端点1 输出 /* Endpoint Address (OUT) */
//接收PC向单片机发送的数据
0x03, /* bmAttributes: Interrupt endpoint */
ReceiveLength%256,/* wMaxPacketSize: ReceiveLength Bytes max */
ReceiveLength/256,//接收pc发过来的数据 ReceiveLength个 字节
0x01, /* bInterval: Polling Interval (32 ms) */ //0x10
/* 41 */
};
用CustomHID_ConfigDescriptor把各个描述符都包涵进去。