找回密码
 立即注册
查看: 237|回复: 9

USB描述符详解

[复制链接]
  • TA的每日心情
    开心
    2024-3-22 08:53
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    7

    主题

    37

    回帖

    251

    积分

    等待验证会员

    积分
    251
    发表于 2024-3-8 15:30:19 | 显示全部楼层 |阅读模式
    本帖最后由 55337575 于 2024-3-8 15:32 编辑

    在学习STC程序代码时,偶尔在网上搜到这篇文章,在此贴出,希望对理解STC官方例程包的usb_desc.c结构有所帮助。


    USB描述符详解
    一、基本概念  

      1USB协议本身很复杂,但方便在提供了统一的接口方式,使得驱动程序在使用设备的时候,工作简化到了类似操作串行接口。

      2USB设备可以看作提供了多个串口的设备,依据USB的规范,我们将每个串口称作端点(Endpoint),要和这个端点通信,我们就要打开到这个端点的连接,这个连接就是管道(Pipe)

      3、打开端点之后,就可以像串口一样进行数据传输了。USB4种不同类型的传输方式:控制传输(Control Transfer),批量传输(Bulk Transfer),中断传输(Interrupt Transfer)和实时传输(IsochTransfer)

      4、由于一个设备可能要适应多种情况,端点的设置会有多套,以备使用。端点设置称为接口(Interface)USB设备展现给我们能够找到的东西就是这些Interface,我们选择要用的Interface,就可以找到Endpoint,再打开Endpoint,就可以传输数据了。所以,在驱动程序开始的时候,需要记录下这些Interface

      5、端点0是控制端点,用来设置参数以及起停设备;
    二、描述符介绍
      标准的USB设备有5USB描述符:设备描述符,配置描述符,字符串描述符,接口描述符,端点描述符。下面详解:

    1、设备描述符:一个设备只有一个设备描述符

    typedef struct _USB_DEVICE_DESCRIPTOR_
    {
        BYTE       bLength,
        BYTE       bDescriptorType,
       WORD      bcdUSB,
        BYTE       bDeviceClass,
        BTYE       bDeviceSubClass,
        BYTE       bDeviceProtol,
        BYTE       bMaxPacketSize0,
        WORD     idVenderI,
        WORD     idProduct,
        WORD     bcdDevice,
        BYTE       iManufacturer,
        BYTE       iProduct,
        BYTE       iSerialNumber,
        BYTE       iNumConfiguations
    }USB_DEVICE_DESCRIPTOR;

    bLength : 描述符大小.固定为0x12
    bDescriptorType : 设备描述符类型.固定为0x01
    bcdUSB : USB 规范发布号.表示了本设备能适用于那种协议,如2.0=02001.1=0110等.

    bDeviceClass : 类型代码(由USB指定)。当它的值是0时,表示所有接口在配置描述符里,并且所有接口是独立的。当它的值是1FEH时,表示不同的接口关联的。当它的值是FFH时,它是厂商自己定义的.
    bDeviceSubClass : 子类型代码(由USB分配).如果bDeviceClass值是0,一定要设置为0.其它情况就跟据USB-IF组织定义的编码.
    bDeviceProtocol : 协议代码(由USB分配).如果使用USB-IF组织定义的协议,就需要设置这里的值,否则直接设置为0。如果厂商自己定义的可以设置为FFH
    bMaxPacketSize0 : 端点0最大分组大小(只有8,16,32,64有效).
    idVendor : 供应商ID(由USB分配).

    idProduct : 产品ID(由厂商分配).由供应商ID和产品ID,就可以让操作系统加载不同的驱动程序.
    bcdDevice : 设备出产编码.由厂家自行设置.

    iManufacturer : 厂商描述符字符串索引.索引到对应的字符串描述符. 为0则表示没有.
    iProduct : :产品描述符字符串索引.同上.
    iSerialNumber : 设备序列号字符串索引.同上.
    bNumConfigurations : 可能的配置数.指配置字符串的个数
    2、配置描述符: 配置描述符定义了设备的配置信息,一个设备可以有多个配置描述符
    typedef struct_USB_CONFIGURATION_DESCRIPTOR_
    {
        BYTE     bLength,
        BYTE     bDescriptorType,
        WORD   wTotalLength,
        BYTE     bNumInterfaces,
        BYTE     bConfigurationValue,
        BYTE     iConfiguration,
        BYTE     bmAttributes,
        BYTE     MaxPower
    }USB_CONFIGURATION_DESCRIPTOR;

    bLength : 描述符大小.固定为0x09
    bDescriptorType : 配置描述符类型.固定为0x02
    wTotalLength : 返回整个数据的长度.指此配置返回的配置描述符,接口描述符以及端点描述符的全部大小.
    bNumInterfaces : 配置所支持的接口数.指该配置配备的接口数量,也表示该配置下接口描述符数量.
    bConfigurationValue : 作为SetConfiguration的一个参数选择配置值.
    iConfiguration : 用于描述该配置字符串描述符的索引.
    bmAttributes : 供电模式选择.Bit4-0保留,D7:总线供电,D6:自供电,D5:远程唤醒.
    MaxPower : 总线供电的USB设备的最大消耗电流.以2mA为单位.
    3、接口描述符:接口描述符说明了接口所提供的配置,一个配置所拥有的接口数量通过配置描述符的bNumInterfaces决定
    typedef struct _USB_INTERFACE_DESCRIPTOR_
    {
        BYTE     bLength,
        BYTE     bDescriptorType,
        BYTE     bInterfaceNumber,
        BYTE     bAlternateSetting,
        BYTE     bNumEndpoint,
        BYTE     bInterfaceClass,
        BYTE     bInterfaceSubClass,
        BYTE     bInterfaceProtocol,
        BYTE     iInterface
    }USB_INTERFACE_DESCRIPTOR;

    bLength : 描述符大小.固定为0x09
    bDescriptorType : 接口描述符类型.固定为0x04
    bInterfaceNumber: 该接口的编号.
    bAlternateSetting : 用于为上一个字段选择可供替换的位置.即备用的接口描述符标号.
    bNumEndpoint : 使用的端点数目.端点0除外.
    bInterfaceClass : 类型代码(由USB分配).
    bInterfaceSunClass : 子类型代码(由USB分配).
    bInterfaceProtocol : 协议代码(由USB分配).
    iInterface : 字符串描述符的索引
    4、端点描述符:USB设备中的每个端点都有自己的端点描述符,由接口描述符中的bNumEndpoint决定其数量
    typedef struct _USB_ENDPOINT_DESCRIPTOR_
    {
        BYTE       bLength,
        BYTE       bDescriptorType,
        BYTE       bEndpointAddress,
        BYTE       bmAttributes,
        WORD     wMaxPacketSize,
        BYTE       bInterval
    }USB_ENDPOINT_DESCRIPTOR;

    bLength : 描述符大小.固定为0x07
    bDescriptorType : 接口描述符类型.固定为0x05
    bEndpointType : USB设备的端点地址.Bit7,方向,对于控制端点可以忽略,1/0:IN/OUTBit6-4,保留.BIt3-0:端点号.
    bmAttributes : 端点属性.Bit7-2,保留.BIt1-000控制,01同步,02批量,03中断.
    wMaxPacketSize : 本端点接收或发送的最大信息包大小.
    bInterval : 轮训数据传送端点的时间间隔.对于批量传送和控制传送的端点忽略.对于同步传送的端点,必须为1,对于中断传送的端点,范围为1-255.
    5、字符串描述符:其中字符串描述符是可选的.如果不支持字符串描述符,其设备,配置,接口描述符内的所有字符串描述符索引都必须为0
    typedef struct _USB_STRING_DESCRIPTION_
    {
        BYTE     bLength,
        BYTE     bDescriptionType,
        BYTE     bString[1];
    }USB_STRING_DESCRIPTION;

    bLength : 描述符大小.由整个字符串的长度加上bLengthbDescriptorType的长度决定.
    bDescriptorType : 接口描述符类型.固定为0x03
    bString[1] : Unicode编码字符串.


    来源自:https://blog.csdn.net/Tommy_wxie/article/details/17790355

    2 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
    回复 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    3 天前
  • 签到天数: 97 天

    [LV.6]常住居民II

    9

    主题

    556

    回帖

    817

    积分

    高级会员

    积分
    817
    发表于 2024-3-8 16:17:15 | 显示全部楼层
    谢谢分享,相比STC其他功能/特性,USB开发涉及到的内容还是 复杂
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-22 08:53
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    7

    主题

    37

    回帖

    251

    积分

    等待验证会员

    积分
    251
     楼主| 发表于 2024-3-11 09:25:27 | 显示全部楼层
    21cnsound 发表于 2024-3-8 16:17
    谢谢分享,相比STC其他功能/特性,USB开发涉及到的内容还是 复杂

    嗯,不过有STC团队的例程,感觉只要理解了USB描述符,然后适当修改usb.c子程的相关EPOUT和EPIN就ok,还应该简单的不少
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    5 天前
  • 签到天数: 93 天

    [LV.6]常住居民II

    0

    主题

    77

    回帖

    186

    积分

    注册会员

    积分
    186
    发表于 2024-3-11 10:44:42 | 显示全部楼层
    感谢分享
    回复 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    昨天 02:02
  • 签到天数: 68 天

    [LV.6]常住居民II

    4

    主题

    414

    回帖

    1122

    积分

    金牌会员

    积分
    1122
    发表于 2024-3-11 17:17:37 | 显示全部楼层
    感谢分享
    回复 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    14 小时前
  • 签到天数: 58 天

    [LV.5]常住居民I

    0

    主题

    182

    回帖

    358

    积分

    中级会员

    积分
    358
    发表于 2024-3-12 09:16:29 | 显示全部楼层
    感谢分享
    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    13 小时前
  • 签到天数: 160 天

    [LV.7]常住居民III

    17

    主题

    280

    回帖

    402

    积分

    中级会员

    积分
    402
    发表于 2024-3-12 17:13:36 | 显示全部楼层
    谢谢分享
    回复 送花

    使用道具 举报

  • TA的每日心情

    5 小时前
  • 签到天数: 59 天

    [LV.5]常住居民I

    3

    主题

    544

    回帖

    728

    积分

    高级会员

    积分
    728
    发表于 2024-3-14 09:50:54 来自手机 | 显示全部楼层
    就知道vid和pid学习下
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    3 小时前
  • 签到天数: 46 天

    [LV.5]常住居民I

    0

    主题

    157

    回帖

    357

    积分

    中级会员

    积分
    357
    发表于 2024-4-7 22:38:23 | 显示全部楼层
    正需要,谢谢分享
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    14 小时前
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    0

    主题

    16

    回帖

    106

    积分

    注册会员

    积分
    106
    发表于 昨天 11:15 | 显示全部楼层
    感谢分享
    回复 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-3 14:19 , Processed in 0.071314 second(s), 65 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表