USB协议详解第8讲(USB描述符-字符串和语言ID描述符)
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
};
USB协议详解第8讲(USB描述符-字符串和语言ID描述符)的更多相关文章
- Android USB 开发详解
Android USB 开发详解 先附上 Android USB 官方文档 Android通过两种模式支持各种 USB 外设和 Android USB 附件(实现Android附件协议的硬件):USB ...
- linux usb 驱动详解
linux usb 驱动详解 USB 设备驱动代码通过urb和所有的 USB 设备通讯.urb用 struct urb 结构描述(include/linux/usb.h ). urb 以一种异步的方式 ...
- bt协议详解 DHT篇(上)
bt协议详解 DHT篇(上) 最近开发了一个免费教程的网站,突然产生了仔细了解bt协议的想法,这篇文章是bt协议详解系列的第三篇,后续还会写一些关于搜索和索引的东西,都是在开发这个网站的过程中学习到的 ...
- HTTP协议详解以及URL具体访问过程
1.简介 1.1.HTTP协议是什么? 即超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵守这个标准.从 ...
- (转)HTTP 协议详解(基础)
HTTP 协议详解 作者: 小坦克 来源: 博客园 发布时间: 2012-02-14 13:32 阅读: 95523 次 推荐: 99 原文链接 [收藏] 相关文章:HTTP 协议 ...
- Java web 入门知识 及HTTP协议详解
Java web 入门知识 及HTTP协议详解 WEB入门 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资 ...
- 【转载】TCP /IP协议详解
首先,TCP/IP不是一个协议,而是一个协议族的统称. 里面包括了IP协议,IMCP协议,TCP协议,以及http.ftp.pop3协议等等. TCP/IP协议分层 提到协议分层,我们很容易联想到IS ...
- DNS协议详解
DNS协议详解 简介 DNS(Domain Name System)域名系统,主要实现的功能是将域名转换成ip地址的一个服务.它是由一个分层的DNS服务器实现的分布式数据库,同时.他也是一个使得主机能 ...
- HTTP 协议详解(转载)
原文: http://kb.cnblogs.com/page/130970/#httpmeessagestructe HTTP协议详解 当今web程序的开发技术真是百家争鸣,ASP.NET, PHP, ...
- Fiddldr 教程之:HTTP协议详解(转)
原文地址:http://www.cnblogs.com/TankXiao/archive/2012/02/13/2342672.html HTTP协议详解 当今web程序的开发技术真是百家争鸣,ASP ...
随机推荐
- python面向对象游戏练习:好人坏人手枪手榴弹
python面向对象游戏练习:好人坏人手枪手榴弹 主要是多态的练习,对象作为参数传给方法使用 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 ...
- 【Zookeeper】Re03 集群搭建
我这里采用的是模拟真实情况: 部署三台虚拟机Centos7 192.168.242.101 192.168.242.102 192.168.242.103 每台机器都安装Zookeeper且一致: / ...
- 【摘录】人形机器人和自动驾驶技术 —— 3D机器视觉技术
以下内容引自: https://www.eda365.com/forum.php?mod=viewthread&tid=744288 3D机器视觉技术分为两个部分,即3D重构技术和3D数据分析 ...
- python报错:ImportError: cannot import name 'Literal' from 'typing'
原因: Literal 只支持python3.8版本以上的环境,需要把python3.7升级到3.8版本以上. 参考: https://blog.csdn.net/yuhaix/article/det ...
- 【转载】 深入理解TensorFlow中的tf.metrics算子
原文地址: https://mp.weixin.qq.com/s/8I5Nvw4t2jT1NR9vIYT5XA ============================================ ...
- 惠普暗影精灵2pro挑电池和电源适配器
自己几年前买的暗影2pro前几个月坏掉了,无法充电,而且偶发性掉电,经过长时间研究发现该款电脑存在挑电池和电源适配器的问题. 相关资料: https://www.chinafix.com/thread ...
- POI1999 Store-keeper 题解
前言 题目链接:洛谷:SPOJ:hydro & bzoj. \(\Theta(nm)\) 的算法. 题意简述 在一个划分为 \(n \times m\) 个区域的二维仓库中,称有公共边的两个区 ...
- Apache DolphinScheduler(2.x和3.x版本) 本地环境搭建教程一览
在迅速变化的技术领域,本地环境的搭建和调试对于软件开发的效率和效果至关重要.本文将详细介绍如何为Apache DolphinScheduler搭建一个高效的本地开发环境,包括2.x和3.x版本的设置方 ...
- 利用系统IO读取磁盘上指定BMP图片的宽和高,以及BMP图片的大小, 并输出到终端,要求图片名称通过命令行传递
/************************************************* * * file name:GetBmpInfo.c * author :momolyl@126. ...
- Linux:移动当前目录的前N个文件到目标文件夹下
#移动当前目录的前N个文件到指定文件夹.其中一点代表的是当前目录.两点代表的是上一级目录.subfoleder1代表的是目标目录. mv `ls | head -N` ./subfolder1/ #这 ...