记:USB设备的初始化、操作、实现——前导

0x00 前言与吐槽

笔者最近在搞USB(需要使用几乎达到USB枚举上线的操作/(ㄒoㄒ)/~~),因为本身嵌入式的芯片限制,这里主要使用USB2.0搭载USB1.1总线。这里主要使用了如下功能:

  • CDC(communications device class)接口搭载
  • VCP(Virtual serial port)
  • TMC(Test & Measurement Class)
  • MSC(mass storage DEVICE class)接口
  • HOST下的MSC(mass storage HOST class)接口
  • HID(human interface class)接口与手柄协议

本文以USB2.0结构为主体,讲述从底层机制到上层协议的构架。本文为简述USB2.0的设计思想与相关的连接线、协议结构。

写在前面的吐槽(不想看可以跳过)

当然,笔者在USB使用的时候,发现中文互联网搜索中,对于USB相关的文章洗稿与扯不到点子上的比比皆是。不知道作者出于什么原因这样做,但是结果自然就是笔者找到官方文档查看到底怎么搞,不得不说也算是因祸得福了。

这么长时间,笔者大部分时间都在检索网上文章,修改自己的标识符,到后面直接完全无法调试,那些文章作者关键部分一句话带过,导致笔者吃了很大的亏,甚至写的标识符都是互相矛盾的,可笑的是文章除了署名以外都是一样的文本,不知道他们的源头从何而来。

比如他们提到了多设备无法服用0端口,但是其实可以复用,以及一些端口在某些时刻无法使用。以及将当前的标识符设置,也是一笔带过,丢下一个可能他们自己都不知道能不能使用的结构。

顺便说一句,看了USB相关结构才知道,国内(中国大陆)对于这种协议的标准化制定完全是缺席的状态,虽然有很多类似中国人的名称结构,但是基本上都是欧美日韩以及中国台湾的工业大厂,笔者也是希望各位大厂尽量加油,标准化制定才是话语权的大头。

0x10 USB物理结构

当前的USB使用了多设备差分总线结构,看过笔者之前CAN总线系列的笔友们应该很熟悉这种差分总线结构了。但是USB对于当前的信号频率更高,代价就是无法实现很长的传输距离。当然,这个也有其低压导致线阻不能太大的情况。

四根线的D+、D-就是信号走线,一般USB-IF建议还是要走差分,但是笔者一开始就不准备使用USB2.0的480M,而是USB1.1的12M,所以就比较随便的差分走线即可。

USB的基础协议结构是完全的主从模式的总线结构,主要是类似树状的结构。结构主要是由一个主机(可以是任何设备,只要是主动发送的设备都可以作为主设备),多个从机与设备组成。原则上,系统不允许出现两个或者以上的主机。建议笔友们不要这样尝试。一个系统的端口原则上也只能挂载一个主要设备,这里主要是因为当前设备最多可以得到200mA左右的供电电流,而且差分总线协议下的USB还是需要一个HUB端口进行多级挂载。如果设备自带供电系统,则可以忽略电流限制。

其实所有的设备的连接在主从机眼中都是这个样子了,因为USB硬件协议又臭又长,绝大部分的设备硬件与链路层都已经在芯片内部以控制器的结构体现了(做到芯片内部),实际上用户其实可以不怎么关心这些细节。

image20220327212950044.png

当前的设备主要由设备描述符的结构限制,其实笔者越研究设备描述符越发现其确实是个方便且易于维护的结构,但是因为其历史局限性,设备局限性也很大。这种结构可以吸取作为现有自适应协议的设定。

0x30 USB通讯基础结构

作为一个成熟的商用通讯的结构,USB将链路层与相关的应用层分离开来,绝大多数的链路层工作基本上都被加入到了USB控制器结构内,也就是直接做到了芯片内部,因为通讯的基础链路层及其复杂,所以这里笔者作为简单的介绍,后期会详细的说明。

基本的插入会使当前USB的核心根设备接收到一个出发信号,起始Reset信号开始,核心判断当前设备是默认设备还是中继设备,随后进入实际的控制链接,设置与获取当前的USB设备结构。当然,如果设备当前直接接入,则所有的通讯在当前主机无法查看,就算是抓包工具也只是作用在内核外部的结构(内核已经在应用层了),不会获取到链路层的数据。所以笔者后面会先讲解应用层,后面再说链路层。

记:USB设备的初始化、操作、实现——前导 微信公众号 记:USB设备的初始化、操作、实现——前导 被遗忘过的账号,文章随缘发布

来源:GreenDreamer

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年3月2日
下一篇 2022年3月2日

相关推荐