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硬件协议又臭又长,绝大部分的设备硬件与链路层都已经在芯片内部以控制器的结构体现了(做到芯片内部),实际上用户其实可以不怎么关心这些细节。
所有的物理接口在逻辑上的结构

0x20 USB链接架构

当前USB架构按照链接方式主要有三种,其中统一的是由一个虚拟的核心USB root设备(这里一般指电脑或者是其他的中心控制设备)链接一个基础的多端口USB HUB,从用户眼中查看到就是电脑、平板、单块开发板内的USB端口们。

随后一般链接方式有三种:

  1. 使用一个统一的HUB进行链接,HUB仅作为数据转化的结构,不存在与主机视角中,仅为数据中转使用。但是实际会占用部分空间。
  2. 复合类设备链接:使用一个设备,模拟一些特别的设备,使用单个设备声明多个设备类的方式使主机识别为复合类设备。这个设备可以虚拟理论上无限的设备,实际上会受到设备描述符与当前设备的端口的限制,最多可以虚拟5~7个设备的结构。至于为什么下文会有详解。
  3. 组合设备链接:设一个设备,可以虚拟一个HUB,并由这个HUB链接当前的多个虚拟设备,则使用这个虚拟HUB可以真正的复数使用理论上无限制的设备(当然前提是USB协议完全支持,USB协议暂时支持255个设备结构)。

大概的结构如下图:
image20220327212950044.png

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

0x30 USB通讯基础结构

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

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

image20220327230107009.png

0x40 总结

上文主要简单的说明了USB的基础结构,分别是基础的物理连接结构、逻辑链接架构、简单的分层逻辑。下面笔者会简述应用层的基础。


标题:记:USB设备的初始化、操作、实现——前导
作者:GreenDream
地址:HTTPS://greendreamer.work/articles/2022/03/28/1648480729829.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!