初次接触USB的同学,可能会被里面各种名词给搞晕,下面就来梳理一下这些知识,希望能帮助大家理解USB。

一,从最常见的名词说起

1.1 什么是USB

这个我就不多解释了,直译就是通用串行总线。再不明白的就百度。

1.2 USB协议版本

  • USB 1.0/1.1(low/full speed),传输速率最大为12Mbps

  • USB 2.0(high speed),传输速率最大480Mbps

  • USB 3.0(super speed),传输速率最大5Gbps

协议版本向下兼容

1.3 USB接口分类

  • Type A,即使我们电脑上的那种接口。

  • Type B,不太常见,比较方正的T型接口,有的嵌入式开发板会用。

  • Type C,现在开始流行起来了,最大的好处就是可以盲插,而不用区分正反。

  • Micro/mini,手机上比较常见。

不管哪种接口,用的线都是4根,只是形状不同而已。

1.4 PIPE

usb通信的最基本形式是通过USB设备里的endpoint,而主机和endpoit之间的数据传输就是通过pipe

1.5 endpoint

端点是有方向的,主机到从机成为out端点,从机到主机成为in端点。从这个说明看出端点是单方向的。(除了0端点)

1.6 管道通信方式

pipe中的数据通信方式有两种,一种是stream一种是messagemessage要求进出进出方向必须要求同一个管道,默认就使用ep0作为message管道。message要求进出进出方向必须要求同一个管道,默认就使用ep0作为message管道

1.7 传输方式

USB endpiont有四种类型,分别对应了不同的数据传输方式,分别为control transfers控制传输interrupt transfers中断传输Bluk Data transfers批量传输Isochronous Data Tranfers等时传输

控制传输通常用于配置设备,获取设备信息,发送命令到设备

1.7 逻辑设备

逻辑设备就是一系列端点的组合,逻辑设备与主机之间的通信发生在一个主机的缓冲区和设备的一个端点之间。

举个例子,如果你有一个 USB 存储设备,当你将文件从电脑复制到设备时,数据会从主机的缓冲区通过 USB 总线传输到设备的 OUT 端点,然后存储在设备的存储介质上。

1.8 interface

一个逻辑设备可能包含若干个接口,每个接口包含1个或多个端点。每个接口表示一种功能。一个接口对应一个驱动程序。例如usb扬声器就包含一个键盘接口和一个音频流接口

1.9 class协议

USB协议中除了定义一些通用软硬件电气特性,还包含各种各样的class协议,用来为不同的功能定义各自的标准接口和具体总线上的数据交互内容和格式。例如u盘的Mass storage class、通用数据交换CDC class

1.10 host/device

二,USB框架/拓扑结构



USB架构中, hub负责检测设备的连接和断开,利用其中断IN端点(Interrupt IN Endpoint)来向主机(Host)报告。在系统启动时,主机轮询它的根hub(Root Hub)的状态看是否有设备(包括子hub和子hub上的设备)连接。

三. 重要概念

3.1 描述符(description)

谈到USB描述符,不得不说USB最强悍的地方就在这里。一个口可以插很多的设备,可以插U盘、上网卡、音频设备、还有的是复合设备,一个设备插上后可以虚拟出多个设备出来

主设备之所以能区分不同的从设备,靠的就是描述符。 于是USB协议里就规定了各种不同的USB描述符。让我们先看一下USB协议里四大描述符之间的关系

+------设备描述符
+----------配置描述符1
+----------接口描述符1
+----------端点描述符1
+----------端点描述符2
+....
+----------接口描述符2
+----------端点描述符1
+....
+....
+----------配置描述符2
+----------接口描述符1
+----------端点描述符1
+----------端点描述符2
+....
+....
+....

3.1.1 设备描述(device description)

故名思意用来描述USB设备的,一个设备只有一个设备描述符,包含了设备类型、设备遵循的协议、厂商ID、产品id、序列号等,一个完整的设备描述符如下:

DEVICE DESCRIPTOR
bLength: 18
bDescriptorType: 0x01 (DEVICE)
bcdUSB: 0x0200
bDeviceClass: Vendor Specific (0xff)
bDeviceSubClass: 255
bDeviceProtocol: 255
bMaxPacketSize0: 64
idVendor: Marvell Semiconductor, Inc. (0x1286)
idProduct: Unknown (0x812a)
bcdDevice: 0x0000
iManufacturer: 3
iProduct: 2
iSerialNumber: 0
bNumConfigurations: 1

3.1.2 配置描述符(configrue description)

配置描述就是用来配置设备的,没错,就是这么简单。但是要记住一点:一个设备同一时刻只能有一种配置生效,而且要区分配置和设置的区别。还是来看一下配置描述符的内容

ONFIGURATION DESCRIPTOR
bLength: 9
bDescriptorType: 0x02 (CONFIGURATION)
wTotalLength: 121
bNumInterfaces: 4
bConfigurationValue: 1
iConfiguration: 0
Configuration bmAttributes: 0xc0 SELF-POWERED NO REMOTE-WAKEUP
1... .... = Must be 1: Must be 1 for USB 1.1 and higher
.1.. .... = Self-Powered: This device is SELF-POWERED
..0. .... = Remote Wakeup: This device does NOT support remote wakeup
bMaxPower: 250 (500mA)

3.1.3 接口描述符(interface description)

一个interface就代表一个设备。USB interface用来处理一类 USB 逻辑连接, 例如一个鼠标, 一个键盘, 或者一个音频流. 一些 USB 设备有多个接口。也就是复合设备,例如一个 USB 扬声器可能有 2 个接口: 一个 USB 键盘给按钮和一个 USB 音频流。

INTERFACE DESCRIPTOR (2.0): class Vendor Specific
bLength: 9
bDescriptorType: 0x04 (INTERFACE)
bInterfaceNumber: 2
bAlternateSetting: 0
bNumEndpoints: 2
bInterfaceClass: Vendor Specific (0xff)
bInterfaceSubClass: 0x00
bInterfaceProtocol: 0x00
iInterface: 8

一个interface包含多个endpoint

3.1.4 端点描述符(endpoint description)

USB通信的基本物理单位,一个endpiont只能承载一个方向的数据。endpiont分为如下几种:

  • CONTROL

控制端点被用来允许对 USB 设备的不同部分存取. 通常用作配置设备, 获取关于设备的信息, 发送命令到设备, 或者获取关于设备的状态报告. 这些端点在尺寸上常常较小.每个 USB 设备有一个控制端点称为"端点 0", 被 USB CORE用来在插入时配置设备. 这些传送由 USB 协议保证来总有足够的带宽使它到达设备.

  • INTERRUPT

中断端点传送小量的数据, 以固定的速率在每次 USB 主请求设备数据时. 这些端点对 USB 键盘和鼠标来说是主要的传送方法. 它们还用来传送数据到 USB 设备来控制设备, 但通常不用来传送大量数据. 这些传送由 USB 协议保证来总有足够的带宽使它到达设备.

  • ISOCHRONOUS

同步端点也传送大量数据, 但是这个数据常常不被保证它完成. 这些端点用在可以处理数据丢失的设备中, 并且更多依赖于保持持续的数据流. 实时数据收集, 例如音频和视频设备, 一直都使用这些端点.

BULK端点描述符数据内容如下:

ENDPOINT DESCRIPTOR
bLength: 7
bDescriptorType: 0x05 (ENDPOINT)
bEndpointAddress: 0x86 IN Endpoint:6
1... .... = Direction: IN Endpoint
.... 0110 = Endpoint Number: 0x6
bmAttributes: 0x02
.... ..10 = Transfertype: Bulk-Transfer (0x2)
wMaxPacketSize: 512
.... ..10 0000 0000 = Maximum Packet Size: 512
bInterval: 0

3.2 class

class用来描述设备属于哪种设备,例如音频、键盘、U盘等。设备通过class来确认和加载相应的驱动。class分为device class 和interface class。具体的class值以及含义,参考define class

Defined Class Codes | USB-IF

class 包含

  1. class
  2. subclass
  3. protocol

组合在一起,用来指出设备具体功能。

device class举例

DEVICE DESCRIPTOR
bLength: 18
bDescriptorType: 0x01 (DEVICE)
bcdUSB: 0x0200
bDeviceClass: Miscellaneous (0xef)
bDeviceSubClass: 2
bDeviceProtocol: 1 (Interface Association Descriptor)
bMaxPacketSize0: 64
idVendor: Marvell Semiconductor, Inc. (0x1286)
idProduct: Unknown (0x4e31)
bcdDevice: 0x0100
iManufacturer: 1
iProduct: 2
iSerialNumber: 3
bNumConfigurations: 1

interface class举例

INTERFACE DESCRIPTOR (1.0): class CDC-Data
bLength: 9
bDescriptorType: 0x04 (INTERFACE)
bInterfaceNumber: 1
bAlternateSetting: 0
bNumEndpoints: 2
bInterfaceClass: CDC-Data (0x0a)
bInterfaceSubClass: 0x00
bInterfaceProtocol: No class specific protocol required (0x00)
iInterface: 5

class值如图下所示:





四,USB数据传输过程



4.1 基本概念

  • 一个【传输(Transfer)】(控制、批量、中断、等时):由多个【事务(Transaction)】组成
  • 一个【事务(Transaction)】(IN、OUT、SETUP):由一多个【Packet】组成。

USB数据在【主机软件】与【USB设备特定的端点】间被传输。【主机软件】与【USB设备特定的端点】间的关联叫做【pipes】。一个USB设备可以有多个管道(pipes)。

4.2 枚举

  • 上电状态(usb device插入host)插入host后,host的每个hub对应端口上都有供电,连接着的设备就进入供电状态

  • host检测到device插入

hub通过检测USB总线空闲时的差分线的高低电压来判断所连接设备的速度类型,当host发来Get_Port_Status请求时,hub就可以将此设备的速度类型信息回复给host。USB 2.0规范要求速度检测要先于复位(Reset)操作。

根据是D+还是D-被拉高来判断到底是什么设备(全速/低速)插入端口。如下图。



  • Host了解连接的设备hub通过检测USB总线空闲(Idle)时差分线的高低电压来判断所连接设备的速度类型

  • host复位设备(不是正的复位设备,是复位USB通信)hub通过驱动数据线到复位状态(D+和D-全为低电平 ),并持续至少10ms

  • 主机发送Get_Descriptor请求获取默认管道的最大包长度默认管道(Default Pipe)在设备一端来看就是端点0。主机此时发送的请求是默认地址0,端点0,设备描述符的第8字节代表设备端点0的最大包大小

  • 设置地址主机给设备分配一个地址,在完成这次传输之后,设备进入地址状态(Address state),之后就启用新地址继续与主机通信。

  • 获取设备配置主机获取设备的信息

枚举就是从设备读取一些信息,知道设备是什么样的设备,如何进行通信,这样主机就可以根据这些信息来加载合适的驱动程序。调试USB设备,很重要的一点就是USB的枚举过程,只要枚举成功了,那么就已经成功大半了。

一旦获悉有新设备连接上来,主机就会发送一系列的请求(Resqusts)给设备所挂载到的hub,再由hub建立起一条连接主机(Host)和设备(Device)之间的通信通道。然后主机以控制传输(Control Transfer)的方式,通过端点0(Endpoint 0)对设备发送各种请求,设备收到主机发来的请求后回复相应的信息,进行枚举(Enumerate)操作。所有的USB设备必须支持标准请求(StandardRequests),控制传输方式(Control Transfer)和端点0(Endpoint 0)。

在讲解枚举之前,先大概说说USB的一种传输模式——控制传输。这种传输在USB中是非常重要的,它要保证数据的正确性,在设备的枚举过程中都是使用控制传输的。

控制传输分为三个阶段:①建立阶段。②数据阶段。③确认阶段。

建立(setup)阶段:都是由USB主机发起,它是一个setup数据包,里面包含一些数据请求的命令以及一些数据。如果建立阶段是输入请求,那么数据阶段就要输入数据;如果建立阶段是输出请求,那么数据阶段就要输出数据。如果在数据阶段,即便不需要传送数据,也要发一个0长度的数据包。数据阶段过后就是确认阶段。确认阶段刚好跟数据阶段相反,如果是输入请求,则它是一个输出数据包;如果是输出请求,则它是一个输入数据包。

确认阶段用来确认数据的正确传输。

4.3 数据传输

usb host与usbfunction之间采用的是一种“非对称”的传输,也就是说,无论usb接受数据还是发送数据,都是由usb host首先发起。

首先,主机发第1个packet给从机,声明数据传送方向,数据传输地址,数据传输类型。其次,主机发第2个至第n个packet载有实际数据最后,从机返回一个packet是一个ACK包,报告数据传输的结果,比如接受出错或成功等信息,这样主机就可以借此了解到这次传输情况,从而有可能来作出相应措施如决定是否重发。

控制传输一个Usb的控制式传输分为两个或三个阶段进行传输:setup stage,data stage(视情况而定),status stage。 首先发起setup,之后发起以data0为起始的setup data,最后usb function回应ack结束一次交互。



数据传输USB除了EP0外,其它的EP都是有方向的,如果从机有数据要上发,先放到对应的EP的buf中,最迟等一个frame就会被host主动读走。

USB协议基础篇的更多相关文章

  1. USB协议基础知识笔记

    usb协议 功能层: 控制传输.中断传输.块传输(批量传输).同步传输 设备层:管理USB设备.分配地址.读取设备描述符 总线接口层:采用NRZI编码-反向非归零编码(0将前一个电平翻转,1不翻转) ...

  2. USB协议基础知识

    ref : https://blog.csdn.net/u010142953/article/details/82627591 USB 基本知识  USB的重要关键概念:  1. 端点:位于USB设备 ...

  3. WebSocket协议-基础篇

    本篇文章主要讲述以下几点: WebSocket协议出现的背景 WebSocket与HTTP WebSocket API WebSocket协议出现的背景 我们在上网过程中经常用到的是HTTP和HTTP ...

  4. HTTP协议基础篇(帮助理解)

    用uml 来描述一个功能是怎样按照时间的顺序完成的 实际的需求(配置网站/配置虚拟主机) 步骤 (1) 打开 apache/conf/httpd.conf 文件 (2)找到hosts文件 c:/win ...

  5. java基础篇---HTTP协议

    java基础篇---HTTP协议   HTTP协议一直是自己的薄弱点,也没抽太多时间去看这方面的内容,今天兴致来了就在网上搜了下关于http协议,发现有园友写了一篇非常好的博文,博文地址:(http: ...

  6. bt协议详解 基础篇(下)

    bt协议详解 基础篇(下) 最近开发了一个免费教程的网站,产生了仔细了解bt协议的想法,所以写了这一篇文章,后续还会写一些关于搜索和索引的东西,都是在开发这个网站的过程中学习到的技术,敬请期待. 1 ...

  7. bt协议详解 基础篇(上)

    bt协议详解 基础篇(上) 最近开发了一个免费教程的网站,产生了仔细了解bt协议的想法,所以写了这一篇文章,后续还会写一些关于搜索和索引的东西,都是在开发这个网站的过程中学习到的技术,敬请期待. 1 ...

  8. USB概述及协议基础

    USB概述及协议基础 USB的拓扑结构 USB是一种主从结构的系统.主机叫做Host,从机叫做Device(也叫做设备). 通常所说的主机具有一个或者多个USB主控制器(host controller ...

  9. USB协议[转]_基本上涵盖了所有最基础的USB协议相关知识。

    背景: 需要使用到USB协议,我一直尝试着去强记这个流程,现在看来,其实不用.看多了,把这个过程具象出来,就牢牢记住了. 正文: 正文转自:http://fangjian0518.blog.163.c ...

  10. 转战物联网·基础篇09-选择MQTT协议还是CoAP协议

      前面章节介绍过,MQTT协议和CoAP协议都是物联网中比较流行的协议,都对传输量做了很大的精简,传输开销小,以适应物理网的网络环境.   XMPP协议也有人说是适合物联网通信的,但它是基于XML, ...

随机推荐

  1. 神经网络之卷积篇:详解计算机视觉(Computer vision)

    详解计算机视觉 计算机视觉是一个飞速发展的一个领域,这多亏了深度学习.深度学习与计算机视觉可以帮助汽车,查明周围的行人和汽车,并帮助汽车避开它们.还使得人脸识别技术变得更加效率和精准,即将能够体验到或 ...

  2. Jmeter察看结果树中文乱码的处理方法

    1.接口执行成功后,在察看结果树返回的Response信息显示中文乱码 2.处理方法: 到jmeter安装目录找到\bin\jmeter.properties文件.右键记事本打开文件定位到这行代码 & ...

  3. 【Spring Data JPA】09 多表关系 Part2 多对多关系操作

    环境搭建: 用户类: package cn.echo42.domain; import javax.persistence.*; import java.util.HashSet; import ja ...

  4. 人形机器人的AI技术 —— 将一个大问题拆解为若干个小问题

    前文: 人形机器人 -- Figure 01机器人亮相 | OpenAI多模态能力加持 | 与人类流畅对话交互 | 具身智能的GPT-4时刻 所需的AI技术: 人形机器人的软件层面其实有: 视觉模块/ ...

  5. python报错:pyglet.canvas.xlib.NoSuchDisplayException: Cannot connect to "None"

    运行python代码报错: 问题发现: 问题其实十分的狗血,这个代码是在服务器上运行的,运行之前其实并没有看具体的代码情况,git clone 下载下来就直接运行了,原来这个代码需要进行图片绘制,说直 ...

  6. python进程绑定CPU的意义

    1. 绑定CPU后对计算密集型的任务可能会一定程度上提升运算性能:(小幅度的性能提升,甚至小幅度落后,总之就是差别不大) 对比1代码A: import os from multiprocessing ...

  7. YouTube上的很多时视频就是有问题的,还经常不允许评论,妥妥的双标网站

    过多的事情不说了,这些个外国反华势力的网站真是无时无刻的不在视频中加私货,你想评论吧他还能判断你的个人价值观来预估你的评价倾向然后禁止你评价,十分的气人.要是立场不够坚定的人真的是很容易被带偏,像这种 ...

  8. 单链表-18个基本操作代码实现C语言

    单链表-18个基本操作代码实现C语言 原文地址:https://www.cnblogs.com/actanble/p/6713434.html 无更改,仅复现 运行后如图,运行软件dev-C++,系统 ...

  9. springcloud config坑系列一之Connection pool shut down on "zuul.host.*" property change

    在使用springcloud config自动刷新功能难免会踩到一些坑,下面来介绍下 在生成中经常需要动态刷新配置,只需要增加@RefreshScope,并且执行手动刷新链接/actuator/ref ...

  10. 如何查看mongodb的索引命中率

    如何查看mongodb的索引命中率 一.背景 现在mongodb使用率很高,经常会遇到查询慢时,就会创建索引,而有时候索引命中率又不高,下面来介绍下测试环境下如何查看索引命中率 二.方案 1.首先查看 ...