基于stm32f10x单片机USB各描述符

来源:互联网 发布:报复前女友 知乎 编辑:程序博客网 时间:2024/05/29 04:35

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把各个描述符都包涵进去。