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个设备结构)。

大概的结构如下图:

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

0x30 USB通讯基础结构

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

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

0x40 总结

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

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

  1. STM32 usb 设备实现自动重枚举

    在开发USB设备时可能会经常遇到烧录程序后要重新拔插USB接口才能使USB设备正常工作,原因是因为重新烧录后,PC没有对USB设备进行重枚举,导致无法正常工作,解决方法很简单,我们只要在程序启动后第一 ...

  2. linux bios 禁用usb设备,当USB在UEFI / BIOS中工作时,为什么USB在Linux中不工作?

    作为背景,我刚刚用现代硬件制造了一台新机器,包括: AMD FX-8350 技嘉GA-990FXA-UD3主板 16GB RAM 英伟达GTX 650 Ti 金士顿固态硬盘 鉴于此,我尝试在SSD上安 ...

  3. Linux下的硬件驱动——USB设备

    想起当初对于破安卓手机,挂在系统上可是费了好些劲,今偶遇USB驱动开发,收集备用,哪天一生气,说不定也写一个linux下的手机驱动,类似于91手机助手的,也不用配置了. Linux下的硬件驱动--US ...

  4. WDF开发USB设备驱动教程(2)

    PDF全文下载:http://bbs.driverdevelop.com/read.php?tid-120461.html 3.2 获取描述符 上一小节认识了USB 的描述符后,这一节就来讲如何从 U ...

  5. xHCI1.1-USB设备的初始化

    USB设备的初始化 这节描述检测和初始化连接到xHC根集线器端口上的USB设备 无论连接的设备是Function还是集线器,设备的初始化进程都是一样的.一旦与一个外部集线器关联的管道被建立,集线器驱动 ...

  6. WDF开发USB设备驱动教程(5)

    五.设备控制 上一章结束后,我们已经完成了USB 设备的配置,完成了配置工作的 USB 设备,就已经具备了正常工作的能力.这一章中,我们讲解一些 USB 设备控制的内容.包括: Pipe的重置:设备的 ...

  7. 解系统禁用了usb服务器,解答win10系统在windows域中禁用usb设备的教程

    解答win10系统在windows域中禁用usb设备的教程? 很多朋友安装win10系统后,在使用的过程中会遇到对win10系统在windows域中禁用usb设备进行设置的情况,可能有很多用户还是不能 ...

  8. Linux下的硬件驱动——USB设备(上)(驱动配置部分)

    USB设备越来越多,而Linux在硬件配置上仍然没有做到完全即插即用,对于Linux怎样配置和使用他们,也越来越成为困扰我们的一大问题.本文着力从Linux系统下设备驱动的架构,去阐述怎样去使用和配置 ...

  9. Linux 设备 eth0 似乎不存在, 初始化操作将被延迟

    10:57:39 [root@server1 ~]# service network restart 关闭环回接口:                                           ...

最新文章

  1. centos 7 jenkins安装
  2. Spring利用JDBCTemplate实现批量插入和返回id
  3. 每日程序C语言49-猴子分桃子问题
  4. 金融系统中正确的金额计算及存储方式
  5. 在Gradle中为JPMS构建Java 6-8库
  6. saiku+kettle整合(六)olap操作
  7. 【C语言重点难点精讲】C语言内存管理
  8. js 二叉树图形_在线生成二叉树(基于EaselJS(canvas))
  9. 数据库事务必须具备的特性:ACID【转】
  10. 几种关系型数据库比较
  11. 基于java的随机森林算法_基于Spark实现随机森林代码
  12. VS 2012 No exports were found that match the constraint 解决办法
  13. informix php,连接到informix数据库 - PHP 方式
  14. 大学生数学竞赛(非数学类)经验
  15. 梦飞苍穹c语言答案,梦飞仙途-楔子一  决战苍穹之巅-汤圆创作
  16. 数据结构算法(2)--字符串匹配
  17. 为什么我加了过滤器然后就登不进去了_石英砂过滤器和活性炭过滤器应用区别...
  18. 用FileExplorer查看android手机中的数据库
  19. 全自动采集小说模板源码+送7条可用7大采集规则
  20. pdf文件过大,如何缩小的操作教程

热门文章

  1. No.77-HackTheBox-windows-Access-Walkthrough渗透学习
  2. 水平集图像分割序列——Order LBF模型
  3. 监控--Prometheus
  4. android获取sim卡手机号码,Android 读取SIM卡联系人
  5. 5-4中央处理器-控制器的功能和工作原理
  6. Menu G5-不错的跨框架菜单
  7. 操作系统-处理器调度算法
  8. 二进制、八进制、十进制、十六进制间相互转换
  9. 防火墙入侵与检测 day06 防火墙虚拟系统
  10. 03-ES索引库操作