USB协议详解第8讲(USB描述符-字符串和语言ID描述符)

目录

1.字符串描述符相关概念

2.语言ID描述符组成、详解、代码

(1)语言ID描述符组成

(2)语言ID描述符详解

(3)语言ID描述符STM32代码

3.字符串描述符索引剖析

4.字符串描述符组成、详解、代码

(1)字符串描述符组成

(2)字符串描述符详解

(3)字符串描述符STM32代码


1.字符串描述符相关概念

字符串描述符:首先,字符串描述符就是用字符串描述一个设备的一些属性,毕竟人能看懂的是字符,而不是十六进制,描述的属性包括设备厂商名字、产品名字、产品序列号、各个配置名字、各个接口名字,还有就是由我们用户自己定义的字符串,说白了就是起名字,让人们一看就知道这个设备是什么设备,字符串描述符对于设备来说是可选的

语言ID描述符:给大家明确一点,其实语言ID描述符也是字符串描述符,它比较特殊,是用来告诉主机其他字符串描述符里面的字符串都支持哪国家语言,因为USB标准全球都在用,字符串的显示形式也是各种各样。

主机需要先获取语言ID描述符确定都用哪些编码,才能正确解析后续得到的字符串描述符。再次说明,语言ID描述符和字符串描述符是一起出现的,因为只有确定了用什么语言,才能读懂后面的字符串。

2.语言ID描述符组成、详解、代码

(1)语言ID描述符组成

(2)语言ID描述符详解

1.bLength

描述符长度,这里的长度不确定,有可能会指示主机需要支持多国语言;

2.bDescriptorType

描述符类型,语言ID描述符也是字符串述符,类型为0x03;

3.wLANGID[0]

要支持的语言ID号,从USB_LANGIDs.pdf这个文档中查询,我也没有下载,大家可以去搜索查询,这里截取了一张图,其实我们用的最多就是标红的两种编码;

4.wLANGID[n]

有可能会支持多种语言,我们这里先只支持一种,支持U.S English。

(3)语言ID描述符STM32代码

/* USB String Descriptors (optional) */
const uint8_t CustomHID_StringLangID[CUSTOMHID_SIZ_STRING_LANGID] =
{
    CUSTOMHID_SIZ_STRING_LANGID,
    USB_STRING_DESCRIPTOR_TYPE,
    0x09,
    0x04
}; /* LangID = 0x0409: U.S. English */

3.字符串描述符索引剖析

我们前面学过设备描述符、配置描述符、接口描述符,里面有各种字符串描述符索引项,大家肯定有疑惑不知道里面设置为多少,为什么厂商字符串索引、产品字符串索引、产品序列号字符串描述符索引规定为1、2、3等等。

在这里给大家解释下,其实索引号0是给语言ID字符串描述符的,主机必须先获取语言ID字符串描述符才能知道是哪国语言。所以设备如果要实现字符串描述符主机请求的响应,就必须先实现语言ID字符串描述符,当主机使用GET_DESCRIPTOR请求字符串描述符并且索引值为0时,设备必须返回语言ID字符串描述符(记住这里是必须)。

其它索引号也是主机规定的,主机请求索引号为1的字符串描述符,主机收到设备返回的字符串以后就认为是对厂商的字符串说明,设备你如果返回其它的字符串就是不按套路出牌,主机就会显示错位,比如会把厂商字符串显示到产品显示那块去。

如果设备不支持厂商字符串描述符、产品字符串描述符、产品序列号字符串描述符、配置字符串描述符、接口字符串描述符,则对应地方索引应该被设置为0,如下图几处地方设置为0即可。

 

4.字符串描述符组成、详解、代码

(1)字符串描述符组成

(2)字符串描述符详解

1.bLength

描述符长度,这里的长度不确定,因为字符串多长不定;

2.bDescriptorType

描述符类型,字符串描述符类型为0x03;

3.bString

UNICODE编码的字符串。

(3)字符串描述符STM32代码
 

ONE_DESCRIPTOR String_Descriptor[4] =
{
    // index = 0;
    {(uint8_t*)CustomHID_StringLangID, CUSTOMHID_SIZ_STRING_LANGID},
    // index = 1;
    {(uint8_t*)CustomHID_StringVendor, CUSTOMHID_SIZ_STRING_VENDOR},
    // index = 2;
    {(uint8_t*)CustomHID_StringProduct, CUSTOMHID_SIZ_STRING_PRODUCT},
    // index = 3;
    {(uint8_t*)CustomHID_StringSerial, CUSTOMHID_SIZ_STRING_SERIAL}
};

const uint8_t CustomHID_StringVendor[CUSTOMHID_SIZ_STRING_VENDOR] =
{
    CUSTOMHID_SIZ_STRING_VENDOR, /* Size of Vendor string */
    USB_STRING_DESCRIPTOR_TYPE,  /* bDescriptorType*/
    // Manufacturer: "STMicroelectronics" 
    'M', 0, 'y', 0, 'U', 0,'S', 0,'B', 0, '_', 0, 'H', 0,'I',0,'D',0
};

const uint8_t CustomHID_StringProduct[CUSTOMHID_SIZ_STRING_PRODUCT] =
{
    CUSTOMHID_SIZ_STRING_PRODUCT,          /* bLength */
    USB_STRING_DESCRIPTOR_TYPE,        /* bDescriptorType */
    'B', 0, 'y', 0, ' ', 0, 'v', 0, 'i', 0, 'e', 0,'w',0,'t',0,'o',0,'o',0,'l',0
};
uint8_t CustomHID_StringSerial[CUSTOMHID_SIZ_STRING_SERIAL] =
{
    CUSTOMHID_SIZ_STRING_SERIAL,           /* bLength */
    USB_STRING_DESCRIPTOR_TYPE,        /* bDescriptorType */
    'x', 0, 'x', 0, 'x', 0,'x', 0,'x', 0, 'x', 0, 'x', 0
};

 

1.本文部分素材来源网络,版权归原作者所有,如涉及作品版权问题,请与我联系删除。

2.未经原作者允许不得转载本文内容,否则将视为侵权;

3.转载或者引用本文内容请注明来源及原作者;

4.对于不遵守此声明或者其他违法使用本文内容者,本人依法保留追究权等。

下面是我的个人微信公众号,关注【一个早起的程序员】精彩系列文章每天不断。

  • 16
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
gu8ConfigDescriptor是一个USB配置描述符数组,用于描述USB设备的配置信息。它通常由USB设备的制造商在设备固件中定义,由USB主机在插入设备时读取。 USB配置描述符包含了USB设备的配置信息,包括配置的唯一标识符、配置的描述信息、配置所需的最大功率、以及该配置所包含的所有接口和其他描述符的信息。 以下是一个典型的USB配置描述符的格式: ``` typedef struct { uint8_t bLength; // 描述符长度 uint8_t bDescriptorType; // 描述符类型 uint16_t wTotalLength; // 描述符总长度 uint8_t bNumInterfaces; // 接口数目 uint8_t bConfigurationValue; // 配置唯一标识符 uint8_t iConfiguration; // 配置描述信息 uint8_t bmAttributes; // 配置属性 uint8_t bMaxPower; // 配置所需的最大功率 } USB_ConfigurationDescriptorTypeDef; ``` 其中,bLength字段表示该描述符的长度;bDescriptorType字段表示该描述符的类型,这里应该为0x02,表示该描述符是一个配置描述符;wTotalLength字段表示该配置描述符及其后续的所有描述符的总长度;bNumInterfaces字段表示该配置所包含的接口数目;bConfigurationValue字段表示该配置的唯一标识符;iConfiguration字段表示该配置的描述信息的字符串索引;bmAttributes字段表示该配置的属性,包括是否需要供电、是否支持远程唤醒等;bMaxPower字段表示该配置所需的最大功率,单位为2mA。 在gu8ConfigDescriptor描述符数组中,每个USB配置描述符之后通常还会包括该配置所包含的所有接口的描述符和其他描述符,如字符串描述符、端点描述符等。这些描述符的总长度应该等于wTotalLength字段指定的长度。通过读取gu8ConfigDescriptor数组中的各个描述符USB主机可以了解到USB设备支持的配置信息、接口信息和传输方式等,从而选择最合适的驱动程序进行通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个早起的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值