【图解USB】USB 之CDC 设备枚举过程详解

来源:公众号【鱼鹰谈单片机】

作者:鱼鹰Osprey

ID   :emOsprey

上篇笔记,大家了解了一些枚举相关的概念,本篇笔记将详述 CDC 设备枚举过程,让大家对整体的枚举过程有个概念。

为了更好到理解并分析接下来的通信流程,鱼鹰首先介绍标准请求和描述符。

上篇笔记了解了标准请求和描述符是怎么回事,但还不够,还需要更细节的东西。

首先从标准请求的8字说起:

第一字节:位图请求信息。

D7 代表了接下来传输的数据是从主机到从机,还是从机到主机的。我们知道枚举过程使用控制传输,有三个阶段,如果有数据阶段,那么这个阶段的DATA数据是由主机发出还是由从机发出,就看这个位的值了。

当然了,因为每一次事务都有令牌包存在,所以IN令牌后的数据一定是由从机发出的,但是标准请求的这个位可以让从机做好发送数据或者接收数据的准备。

D6~D5:代表了请求类型。

请求类型代表本次请求属于什么类型的请求。目前有三类,标准、类、厂商。标准请求主要有:

除了标准请求,还有类请求,比如 CDC 类,用到了三种类请求:

SET_LINE_CODING(0x20)          设置串口波特率、起始位、停止位、流控等信息

GET_LINE_CODING(0x21)        获取串口波特率、起始位、停止位、流控等信息

SET_CONTROL_LINE_STATE(0x22)用于设置串口的状态

厂商请求一般不会用于标准设备,CDC 类就没有用到(如果需要的话,应该也是能发出的)。

D4~D0:代表了请求类型。

因为请求的内容可能是面向设备,也可能面向接口、端点,所以这个域确定了本次请求面向的对象,这样设备可以根据请求的对象作相应的措施。

第二字节:bRequest:请求代码,即上面的几种请求代码,每个请求都会有请求代码,代表了具体请求。

第三四字节:wValue:这个双字节主要根据bReuest来确定含义,比如如果是获取描述符(GET_DESCRIPTOR),而描述符有很多种,比如设备描述符、字符串描述符、配置描述符,那么到底主机要获取什么描述符?就看这个双字的高字节了。如果高字节为 1,代表获取设备描述符,高字节为 2,代表获取配置描述符。

总之这个值的具体含义需要根据请求代码来确定,而每一种请求代码都会明确规定wValue具体含义。

第五六字节:wIndex:这个值和上面一样,也是需要请求代码来确定含义的。比如在获取产品序列号字符串时,这个值代表了语言 ID,告诉从机需要返回什么哪种字符串,当值为0x0409时代表英语。

第七八字节:wLenth:这个值代表接下来主机会发送或者需要接收字节长度。

一般来说,主机会根据需要在接下来的数据阶段获取或发送指定长度数据,主机发送的数据因为是由主机控制的,所以可以很容易确定这个值,但是因为主机并不清楚从机到底有多少数据会返回,所以这个值可能会比实际的更大。

比如第一次获取设备描述符时,因为主机不清楚这个描述符多长,一般会比实际的描述符长度更大,所以如果从机没有足够的数据返回,那么只要返回从机能返回的最大数据即可;

但是如果主机请求返回的数据比从机实际的数据短,那么从机就按照主机的要求来就行,不必把自己所有的数据返回。

以上就是标准请求的内容。设备返回的描述符通用格式比较简单:

第一字节:描述符总长度(包括本字节)

第二字节:描述符类型(对应标准请求wValue的高字节)

其余字节就代表了这个描述符的具体内容了,每种描述的具体内格式都不相同,需要根据实际的描述符确定,比如:

bcdUSB 代表 USB 版本号,比如 0x0110,代表 USB 1.1 版本(bcd编码,即写成十六进制时的版本号),这样主机就知道这个设备只支持全速 12 Mbit/s 那么关于关于高速的请求qualifier(wValue 高字节为6)就不用发送到该设备了,因为发送给设备也肯定会被回复 STALL,那么主机就没必要浪费这个带宽了。

但是如果你这里写成 0x0200,那么这个设备可能是全速的,也可能是高速的,那么主机就会发送请求来询问是否支持高速,如果设备不支持,回复的描述符设置为0即可。

接下来的三个字节根据设备属于什么类别来确定,比如 CDC 类,这三个值分别为 0x02 ,0x00,0x00。

bMaxPacketSize0 确定了端点0的数据包大小,主机可以据此知道设备的传输能力,进而控制传输数据包的大小,不然主机一次发送的数据包太大,那么从机可能无法正确接收。

idVendor 由 USB-IF 分配,这个值确定了这个设备属于哪个厂家的产品。比如 0xC251,代表了KEIL,只要主机看到了这个代号,就知道这个设备由哪个厂家生产的了,因为这个在USB-IF中挂了号,大家都可以从网上查到。

和必须购买的 idVendor 不同却类似的是,iProduct 是由厂家自己定义的,可以根据这个来确定这个设备属于哪个产品。

这个USB设备更新到哪一个版本了?通过bcdDevice 即可确定,也是bcd 编码。

iManufacture 代表厂商的字符串序号,一般都是 1,这样当主机需要获取厂商的字符串,只要在wValue 的低字节为设置为 1,那么从机就知道该发送什么字符串给主机了。

iProject 代表产品字符串序号,一般为2。

iSerialNumber 代表产品序列字符串序号,一般为3。

为什么从 1 开始编号,而不是从 0 开始呢,这是因为如果设备没有这个字符串的话,可以设置该值为 0,这样主机就知道没有这个字符串,也就不会主动获取这个字符串。

当然了,即使你告诉了主机有这个字符串存在,主机也是按照需求来获取的,不一定会把所有的字符串描述符都获取回来。

iNumConfigurations 代表了设备有多少种配置,前面说过,设备可能会在不同时刻的功能表现不一样,那么可以通过该值确定这个设备有多少种配置,一般而言这个值是1,即只有一种配置。毕竟复合设备可以同时满足多功能的要求,没必要使用多种配置来达到多种功能的要求。

以上就是设备描述符的具体含义,其他描述符比如配置描述符、接口描述符、端点描述符等就自行看鱼鹰给的资料理解即可,只要找到对应描述符的格式说明,分析代码中的描述符数据也不是那么难的事情。

接下来鱼鹰介绍枚举总体流程。

主机在对设备复位后,首先会请求获取设备描述符。这个描述符一般为18个字节,但是主机一开始并不知道这个描述符多大(虽然一般是18,但万一不是呢),所以一般主机会以更大的请求长度来获取,而从机根据实际长度18字节返回即可。

现在我们从多个维度看看这次交互的数据情况:

从传输事务的角度看:

从包的角度看:

从DATA内容看:

主机发送数据:80 06 00 01 00 00 40 00

从机回复数据:

从D+、D-数据线电平变化的角度:

主机发送(建立阶段):

从机回复(数据阶段):

状态阶段:

现在把整个枚举过程大概图解一遍(其他请求交互的具体情况请看鱼鹰提供的资料):

数据流截取(鱼鹰提供的《CDC设备完整数据通信.txt》):

EmbeddedOsprey
关注 关注
  • 3
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
usb驱动开发之USB协议枚举过程详解
亚亚图雷的专栏
09-08 5020
本文把usb枚举过程通过文字、程序和图形三种形式描述出来,并形成对照。 一  枚举过程之文字描述          •主机集线器监视着每个端口的信号电压,当有新设备接入时便可觉察。(集线器端口的两根信号线的每一根都有15kΩ的下拉电阻,而每一个设备在D+都有一个1.5kΩ的上拉电阻。当用USB线将PC和设备接通后,设备的上拉电阻使信号线的电位升高,因此被主机集线器检测到。)    • 连接
图解USBUSBCDC 设备枚举过程详解.pdf
02-10
USB CDC枚举过程详解USB (Universal Serial Bus) 是一种通用串行接口,用于连接计算机系统和其他设备,如打印机、鼠标、键盘等。在USB通信中,CDC(Communication Device Class)是一种特定的设备类,它允许...
USB CDC虚拟串口复合设备
ai5945fei的博客
11-22 7768
CDC包含一个控制接口和一个数据接口 1、控制接口 必要的有CM功能描述符和接口绑定描述符(IAD/Union) 在我电脑上测试控制接口的中断端点也可以不需要,及控制接口端点数量可以为0 1.1、ACM功能描述符: 在虚拟串口中,控制接口需要处理ACM 功能描述符。如下是一个ACM描述符,描述了虚拟串口的一些类特定请求,比如可以设置和获取的串口的波特率、停止位等等。 参考:STM32 之 USB 虚拟串口_rannar的博客-CSDN博客_stm32 虚拟串...
USB枚举图解USB设备枚举图解
04-17
很详细的关于USB设备枚举图解 USB设备枚举图解
6. USB:CDC_ACM设备(虚拟串口)
Ender_LJY的博客
05-06 2467
文章以实现cdc_acm设备为demo进行了虚拟串口的测试,并通过demo解析了整个驱动框架的核心,以及中断处理和请求处理。整个中断的设计是非常合理的,以及请求的处理,但是设备类下的文件实现需要用户自己实现,也可以基于demo进行修改。比如描述符和设备类功能接口下函数。以及通信框架。cdc_acm的框架相对其他的设备类来说比较复杂,但是可以从这个设备类入手,方便我们后续在此基础上改写为HID键盘设备和WINUSB通用串行总线设备
图解USBUSBCDC 设备枚举过程详解(2)
EmbeddedOsprey
10-08 1506
来源:公众号【鱼鹰谈单片机】作者:鱼鹰OspreyID :emOsprey虽然鱼鹰提供的资料已经把图解资料分享出来了(Osprey文件夹),但因为这个系列就是图解系列,所以还是把 C...
图解USBUSBCDC 程序结构(完结篇)
EmbeddedOsprey
10-08 4576
来源:公众号【鱼鹰谈单片机】作者:鱼鹰OspreyID :emOsprey本篇介绍整个例程的结构和程序流程。Github 里面有一个仓库CMSIS-DAP(https://githu...
详解Java虚拟机
厚积薄发
10-29 9917
JAVA虚拟机
自动化测试之-测试用例设计方法总结
weixin_30950887的博客
08-01 590
黑盒、白盒、接口测试一系列用例设计方法。 黑盒测试用例设计方法包括等价类划分法、边界值分析法、错误推测法、因果图法、判定表驱动法、正交试验设计法、功能图法、场景图法等。 (一)等价类划分法 定义:等价类划分法是把所有可能输入的数据,即程序的输入域划分策划国内若干部分(子集),然后从每一个子集中选取少数具有代表性的数据作为测试用例。方法是一种重要的、常用的黑盒测试用例设计方法。 等价类是指某...
测试用例设计方法
weixin_30482181的博客
02-21 1472
本篇由本人整理黑盒、白盒、接口测试一系列用例设计方法。 黑盒测试用例设计方法包括等价类划分法、边界值分析法、错误推测法、因果图法、判定表驱动法、正交试验设计法、功能图法、场景图法等。 (一)等价类划分法 定义:等价类划分法是把所有可能输入的数据,即程序的输入域划分策划国内若干部分(子集),然后从每一个子集中选取少数具有代表性的数据作为测试用例。方法是一种重要的、常用的黑盒测试用例设计方法。 ...
图解USBUSBCDC 程序结构(完结篇).pdf
02-10
USBCDC程序结构详解USB CDC(Communication Device Class)是一种通用串行总线(USB设备类,用于实现通信接口设备,如调制解调器、网络适配器等。CDC允许USB设备通过标准的控制管道(Endpoint 0)与主机...
图解USB协议之一_枚举过程
12-05
详细的图文解释USB枚举过程,本文属于USB协议入门总结的文章
usb枚举过程详解
11-09
USB枚举过程USB设备与主机进行通信的关键步骤,它涉及到设备的初始化、识别和配置。USB设备在连接到主机后,必须经过枚举才能被系统识别并正常使用。以下是对USB枚举过程的详细解析: 1. **连接设备**:首先,USB...
USB枚举过程图解详解
02-26
### USB枚举过程图解详解 #### 一、引言 在现代电子设备中,USB(通用串行总线)接口已经成为最常用的连接标准之一。无论是数据传输还是电源供应,USB都发挥着至关重要的作用。而在USB设备与主机之间建立通信之前...
测试用例设计方法--白盒+黑盒--转载自https://www.cnblogs.com/molrang/p/6420918.html
u013976938的专栏
08-26 1330
目录 测试用例设计方法 (一)等价类划分法 划分标准: 划分方法: 实例1:三角形问题 (二)边界值分析法 定义: 与等价类区别: 分析方法: 常见边界值: 边界值分析: 转化为测试用例: 实例1,批阅试卷 实例2,三角形的边界问题分析测试用例 实例3,NextDate函数边界值分析测试用例 (三)错误推测法 (四)因果图法 1.因果图介绍 2...
golang 接口
m0_70982551的博客
07-24 964
接口定义了一组方法,这些方法没有具体的实现。接口类型的变量可以存储任何实现了这些方法的类型的值。// 更多方法...在Go语言中,接口值是指存储了实现某个接口的具体类型值的变量。接口值由两部分组成:1.动态类型:这是接口值当前存储的实际类型。2.动态值:这是实际存储的值,该值必须实现了接口中定义的所有方法。
Swagger使用Map接受参数时,页面如何显示具体参数及说
最新发布
a1058926697的博客
07-26 518
后端使用Map接受参数,要求在swagger页面上显示具体的参数名称、类型及说明。当Map接受参数数量少时,可以使用Swagger自带的注解。自定义注解 @ApiGlobalModel。编写处理注解对应的插件。
图解usb协议分析usb枚举过程
08-02
USB(Universal Serial Bus)是一种用于连接电脑和外部设备的标准接口,它有自己的通信协议。USB枚举是指在插入USB设备时,计算机系统自动检测并识别该设备过程。 首先,当我们将USB设备插入计算机的USB端口时,计算机会发送一个复位信号给USB设备,以便设备知道计算机已经察觉到它的存在。USB设备在接收到复位信号后会执行一些初始化操作,并返回一个握手信号给计算机。 接下来,计算机会发送一个叫作Get Descriptor的命令给USB设备,这个命令的作用是要求USB设备返回一些描述该设备的信息,比如设备的厂商ID、产品ID、设备类别等。USB设备收到这个命令后会返回这些信息给计算机。 然后,计算机会发送一个Set Configuration的命令给USB设备,这个命令的目的是告诉USB设备要使用哪种配置,因为有些USB设备可以有多种不同的配置。USB设备在接收到Set Configuration命令后会根据配置来进行初始化,并返回一个确认信号给计算机。 最后,计算机会发送一些其他的命令给USB设备,比如读取和写入数据的命令,以及其他特定的设备命令,这些命令的具体内容取决于USB设备的功能和应用。 通过上述的过程USB设备和计算机建立起了通信链接,USB设备可以向计算机提供相应的功能和服务。USB枚举过程中的各个步骤确保了设备和计算机之间的正常通信和数据传输。 总结来说,USB枚举过程是计算机通过一系列的命令向USB设备发出请求,USB设备根据这些请求进行相应的操作,并返回相应的结果给计算机,以实现设备和计算机之间的通信和数据传输。这个过程USB协议中非常重要的一部分,保证了USB设备的插拔即用的特性。
写文章

热门文章

  • STM32固件升级详解(BootLoader) 49927
  • 运算符 % 的妙用 15346
  • C语言之#error/#warning 13308
  • 鱼鹰:探究 USB2.0 的真实传输速度是多少? 11754
  • 一文看懂队列(FIFO) 11747

分类专栏

  • vscode 1篇
  • shell 1篇
  • Windows 1篇
  • 工具 1篇
  • si 1篇
  • 源码工具 1篇
  • 24440
  • 树莓派
  • qemu
  • Python
  • rt-thread
  • 私密
  • 生活 1篇
  • 个人信息
  • C语言 16篇
  • 系统 1篇
  • uCOS II 6篇
  • 无线通信 1篇
  • 传输协议
  • STM32 16篇
  • 调试 4篇
  • csdn
  • 译文 4篇
  • 单片机 3篇
  • 数据结构 1篇
  • KEIL 11篇
  • ADC 1篇
  • git 5篇
  • linux 16篇

最新评论

  • 不用工具,合并 bootloader 和 APP 文件就是这么简单!

    邵明亚: Build Output 有没有提示“bash: cannot set terminal process group (-1): Inappropriate ioctl for device”?

  • 谈谈看门狗优先级

    YannnnR: 升级过程中手动喂狗可以解决不

  • 不用工具,合并 bootloader 和 APP 文件就是这么简单!

    鱼子酱没芥末: 是不是把bootloader的复制到APP后面也可以

  • 谈谈看门狗优先级

    Carpe diem.: 你好,想请问下,如果有一个用于固件升级的task,它的优先级比空闲任务高,在升级task运行时,空闲任务的看门狗可能来不及喂狗,有没有一种保护机制,解决这种问题呢

  • 本跳转程序靠bug运行,请不要优化

    无敌小金刚223: 感谢 出现了一模一样的问题 您的帖子省去了我挠头发的时间

最新文章

  • 终端显示太单调?拷贝没有进度条?来试试这些技巧
  • 只是简单采个ADC,你让我看这么多资料?
  • 百兆网速根本不够用啊
2024年11篇
2023年15篇
2022年18篇
2021年45篇
2020年61篇
2019年42篇
2018年7篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值

深圳SEO优化公司佛山外贸网站关键词优化教程邯郸家装行业网站优化推广有用吗罗湖网站排名优化哪家好昆明网站优化了解君创网络志鸿优化网站上不去赣州网站推广优化外包承德seo网站优化双成际网站关键词seo优化日照品牌网站优化济宁正宗网站优化费用优化公司网站全靠它易速达山东济南网站优化时间江苏怎么优化网站网站地图优化网站怎么优化适合火25星推云安企业网站seo优化枣庄如何优化网站网站关键词优化公司收费嘉定区网站优化定制方案锦州网站优化水城县网站优化营销湖北电子网站优化大全网站优化关键词布局网站优化管理丰泽区离石网站优化哪家好江干区百度网站优化平台网站推广优化方法有哪些优化网站文章的方法好的网站优化培训学校清港网站优化费用歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化