-
2021-12-12 22:03:51
USB协议详解第1 讲(核心概念通俗理解)
USB协议详解第2 讲(协议核心学习要点)
USB协议详解第3 讲(USB描述符-设备描述符)
USB协议详解第4 讲(USB描述符-标准配置描述符)
USB协议详解第5 讲(USB描述符-接口描述符)
USB协议详解第6 讲(USB描述符-端点描述符)
USB协议详解第7 讲(USB帧和微帧剖析)
USB协议详解第8 讲(USB描述符-字符串和语言ID描述符)
USB协议详解第9 讲(USB描述符-HID描述符)USB协议详解第10讲(USB描述符-报告描述符)
USB协议详解第11讲(USB描述符-总结)
USB协议详解第12讲(USB传输-初探)
USB协议详解第13讲(USB传输-控制传输及事务组成)
USB协议详解第14讲(USB传输-同步传输及事务组成)
USB协议详解第15讲(USB传输-批量传输及事务组成)
USB协议详解第16讲(USB传输-中断传输及事务组成)
USB协议详解第17讲(USB事务-总结)
USB协议详解第18讲(USB包-初探)
USB协议详解第19讲(USB包-包的组成及分类)
USB协议详解第20讲(USB包-帧首类包SOF)
USB协议详解第21讲(USB包-命令类包Token)
USB协议详解第22讲(USB包-数据类包DATA)
USB协议详解第23讲(USB包-握手类包Handshake)
USB协议详解第24讲(USB包-控制传输包结构)
USB协议详解第25讲(USB包-同步传输包结构)
USB协议详解第26讲(USB包-批量传输包结构)
USB协议详解第27讲(USB包-中断传输包结构)
USB协议详解第28讲(USB硬件原理图)
USB协议详解第29讲(USB设备状态)
USB协议详解第30讲(USB枚举)
————————————————
版权声明:本文为CSDN博主「一个早起的程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weiaipan1314/article/details/112123884其他内容
更多相关内容 -
Micrium_usb协议栈_ucusbd_ucusbh.zip
2021-03-09 15:58:03一个基于ucosiii的usb协议栈例程,可以在ucos操作系统上移植usb协议栈进行测试,usb协议栈源码在Micrium官方下载的,例程也是找的网上的,是STM32F4x的,希望给各位做个参考 -
USB2.0协议中文版.zip_usb_usb 2.0_usb协议中文版_协议中文
2022-07-14 03:33:46USB 2.0 协议中文版说明 便于代码平台移植 -
usb_32_20200716_0_USB协议_
2021-10-02 10:29:43该规范描述了协议定义,事务类型,总线管理以及设计和构建符合该规范的系统和外围设备所需的编程接口。 USB 3.2主要是对USB 3.1的性能增强,通过为USB Type-C电缆和连接器添加双通道支持,为固态驱动器和高清显示器... -
USB协议详解,USB协议详解,USB协议详解
2022-08-18 11:14:06USB协议详解 -
USB协议白皮书(英文版本).pdf
2021-09-18 11:52:25USB协议白皮书(英文版本).pdf -
USB协议规范1.1/2.0/3.0 英文高清完整PDF版
2014-10-04 19:12:53USB协议规范1.1--支持USB低速和全速规范(12Mbps) USB协议规范2.0--支持USB高速协议规范(480Mbps) USB协议规范3.0--支持USB超高速协议规范(5Gbps) 本资源包括USB 1.1、2.0以及3.0的协议规范文档。随着USB设备的... -
USB培训_Part1_协议_usb_usb协议_
2021-10-02 04:28:10USB使用讲解培训文档协议,第一部分篇,USB功能的详细讲解 -
USB协议浅析和USB设备设计简介
2020-10-26 19:53:06从实用的角度出发,对USB协议进行了简单的解释,并对实际设计USB设备时必须考虑的一些关键问题作了比较全面的讨论。 -
USB协议规范中文
2018-04-11 19:06:14USB2.0协议规范,中文文档,解压后DOC格式,适合驱动工程师 -
USB.zip_FPGA USB协议_FPGA USB_USB通信协议_usb
2022-07-15 16:56:00fpga的USB编程,用于借鉴USB协议的通信 -
USB协议官方文档
2017-11-01 23:26:05主要配合小编关于USB协议方面博文的一些官方资料,包含usb2.0,3.0的协议,usb存储介质方面用到的scsi,spc4协议,以及uvc协议文档等 -
深度剖析USB协议层
2018-10-30 21:39:42深度剖析USB协议层,需要的可以下载看看,希望对大家有用 -
Windows多点触摸USB协议_多点触摸HID报文
2017-04-20 13:40:55用于Windows触摸和基于笔的计算机的数字转换器驱动说明,触摸屏、多点触摸的USB协议,设备描述符,HID报文说明 -
深度剖析USB协议层.zip_深度剖析USB协议层
2022-07-15 02:31:03深度剖析USB协议层 -
USB协议基础篇
2020-12-29 08:39:181.2 USB协议版本 1.3 USB接口分类 1.4 PIPE 1.5 endpoint 1.6 管道通信方式 1.7 传输方式 1.7 逻辑设备 1.8 interface 1.9 class协议 1.10 host/device 二,USB框架/拓扑结构初次接触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
一种是message
。message
要求进出进出方向必须要求同一个管道,默认就使用ep0
作为message
管道1.7 传输方式
USB endpiont有四种类型,分别对应了不同的数据传输方式,分别为
control transfers控制传输
、interrupt transfers中断传输
、Bluk Data transfers批量传输
、Isochronous Data Tranfers等时传输
控制传输
通常用于配置设备,获取设备信息,发送命令到设备1.7 逻辑设备
逻辑设备就是一系列端点的组合,逻辑设备与主机之间的通信发生在一个主机的缓冲区和设备的一个端点之间。
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)
配置描述就是用来配置设备的,没错,就是这么简单。但是要记住一点:一个设备同一时刻只能有一种配置生效,而且要区分配置和设置的区别。还是来看一下配置描述符的内容
CONFIGURATION 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 协议保证来总有足够的带宽使它到达设备.
- BULK
块端点传送大量的数据. 这些端点常常比中断端点大(它们一次可持有更多的字符). 它们是普遍的, 对于需要传送不能有任何数据丢失的数据. 这些传送不被 USB 协议保证来一直使它在特定时间范围内完成. 如果总线上没有足够的空间来发送整个 BULK 报文, 它被分为多次传送到或者从设备. 这些端点普遍在打印机, 存储器, 和网络设备上.
- 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。
https://www.usb.org/defined-class-codes
class 包含
- class
- subclass
- 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
四,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主动读走。
下面是我的个人微信公众号,关注【一个早起的程序员】精彩系列文章每天不断。
-
USBProtocolAnalyzerLE-650H2(usb协议分析软件)v1.3.0官方安装免费版
2019-08-08 07:13:46USB Protocol Analyzer LE-650H2是一款非常简单易用的usb协议分析软件,该软件主要帮助开发人员分析usb连接设备的数据操作,安装后就可以查看usb硬件的各种活动数据了,并且可以列出完整的数据分析报告,,欢迎有... -
USB总线-USB协议简介(一)
2021-07-04 23:26:19USB总线就好像一条管道,管道里流过的东西只要符合USB协议,至于具体流的是什么东西,USB总线并不关心,可以是自来水,可以是污水,可以是天然气,也可以是石油。对应具体的设备上,只要是支持USB协议的设备,都可以...1.简介
USB是通用串行总线(Universal Serial Bus)的缩写。在USB总线出现之前,计算机与键盘、鼠标、扫描仪、打印机都使用专用的接口连接,不同设备的接口不能互用,扩展性很差,每次插拔设备都要关闭计算机,不支持热插拔,且通信速率很低。为了解决上述问题,USB总线诞生了。USB总线就好像一条管道,管道里流过的东西只要符合USB协议,至于具体流的是什么东西,USB总线并不关心,可以是自来水,可以是污水,可以是天然气,也可以是石油。对应具体的设备上,只要是支持USB协议的设备,都可以连接计算机,如USB键盘、USB鼠标、USB摄像头、USB音箱等。USB的出现简化了计算机与外围设备的连接,增强了扩展性,支持热插拔,且通信速度很快。
2.USB协议版本
从USB协议诞生至今,出现了多个USB协议版本,如USB1.0、USB1.1、USB2.0、USB3.0、USB3.1、USB3.2。最新的是USB4.0协议,可直连CPU的PCIe总线,最大速度可达40Gbps,使用Type-C接口,兼容DP视频协议、PD快充协议等,最高支持100W供电。
USB协议版本 速率称号 最大速率 电源 类型 推出时间 USB1.0 低速(Low-Speed) 1.5Mbps 5V/500mA 半双工 1996年1月 USB1.1 全速(Full-Speed) 12Mbps 5V/500mA 半双工 1998年9月 USB2.0 高速(High-Speed) 480Mbps 5V/500mA 半双工 2000年4月 USB3.0(USB3.2 Gen1) 超高速(SuperSpeed USB) 5Gbps 5V/900mA 全双工 2008年月11月 USB3.1(USB3.2 Gen2) SuperSpeed USB 10Gbps 10Gbps 20V/5A 全双工 2013年月7月 USB3.2(USB3.2 Gen2×2) SuperSpeed USB 20Gps 20Gbps 20V/5A dual-lane 2017年月9月 USB4.0(Gen3×2) ---- 40Gbps 100瓦 single-lane或dual-lane,兼容Thunderbolt3 2019年月8月 注:USB3.2推出时,USB-IF公布了新的命名规范,将USB3.0改名为USB3.2 Gen1,USB3.1改名为USB3.2 Gen2,而将能够使用两个USB Type-C Rx/Tx针脚的USB3.2改名为USB3.2 Gen2×2。
下图(未找到此图的源出处)是各个版本USB协议使用的标志及接口,USB3.2以后,只使用Type-C接口,包括图中未画出的USB4.0和Thunderbolt3。
下图是USB3.2协议使用的标志,此标志是USB-IF网站上最新的。
下图是USB4.0协议使用的标志,USB4.0使用Gen3 lane,single-lane可达到20Gps,dual-lane为40Gps。USB4™ 20Gbps使用single-lane,USB4™ 40Gbps使用dual-lane。3.USB总线特点
3.1.主从模式
USB是主从模式的总线,主机称为Host,从机(也称为设备)称为Device。从机与从机之间、主机与主机之间(不包括USB4.0),不能互联。每次通信都是由主机发起,从机不能主动发起通信,只能被动的应答主机的请求。USB3.0及以后的USB协议,主机也可以和集线器(Hub)通信。为了增加灵活性,又出现了USB OTG(On The Go),USB OTG支持主从切换,同一个设备,在不同场合下,可以在主机和从机之间切换。USB OTG线中增加了一根USB ID线,当USB ID线上拉时,处于从机(设备)模式,当USB ID线接地时,处于主机模式。
3.2.总线结构
如下图所示,USB总线呈现出树状的拓扑结构。树的根节点是USB Host控制器,连接在USB Host控制器上的是USB根集线器(Root Hub)。USB集线器(Hub)可以将一个USB接口扩展成多个USB接口,扩展出的USB接口又可以通过USB集线器(Hub)扩展,每个USB接口都可以接USB设备。集线器只能扩展出更多的USB接口,而不能扩展出更多的带宽,所有USB设备共享USB Host控制器的带宽,当有多个USB设备需要较大带宽时,可以考虑将他们接到不同USB Host控制器上的根集线器上,以避免带宽不足。
3.3.电气特性
下图是USB3.2线缆的示意图,同时兼容USB2.0。USB使用差分信号传输数据,下图中的D+和D-是一对差分线,SSTX+和SSTX-是一对差分线,SSRX+和SSRX-是一对差分线。USB2.0只有一对差分线,即下图中的D+、D-,因此USB2.0是半双工的,不能同时收发数据。USB3.2拥有两对差分线,即SSTX+和SSTX及SSRX+和SSRX,因此USB3.2是全双工的,可同时收发数据。USB3.2和USB2.0使用不同的差分线传输数据,两者互不干扰,可同时工作。USB3.2线缆中保留了USB2.0的数据传输通道,实现了对USB2.0的兼容。USB主机可通过VBUS线向设备供电,最大可输出20V/5A。GND是地线。
下图是USB3.2线缆的横截面示意图。红色Power线是VBUS,绿色和灰色UTP是D+和D-,青色的两对差分线是SSRX+、SSRX、SSTX+、SSTX。黑色是GND。除此之外,还有一些编织层和屏蔽层。
4.USB传输基础
4.1.传输类型
- 控制传输(Control Transaction)
控制传输用于配置设备、获取设备信息、发送命令到设备、获取设备的状态。每个USB设备都有端点0的控制端点,当USB设备插入到USB主机拓扑网络中时,USB主机就通过端点0与USB设备通信,对USB设备进行配置,便于后续的数据传输。USB协议保证控制传输有足够的带宽。控制传输可靠,时间有保证,但传输的数据量不大。如USB设备的枚举过程就采用的是控制传输。 - 中断传输(Interrupt Transaction)
当USB主机请求USB设备传输数据时,中断传输以一个固定的速率传送少量的数据。中断端点的数据传输方式为中断传输,数据传输可靠,实时性高,这里的中断并不是USB设备产生中断,而是USB主机每隔一个固定的时间主动查询USB设备是否有数据要传输,以轮询的方式提高实时性。如USB鼠标采用的是中断传输。 - 批量传输(Bulk Transaction)
批量传输用于传输大量数据。USB协议不保证这些数据传输可以在特定的时间内完成,但保证数据的准确性。如果总线上的带宽不足以发送整个批量包,则将数据拆分为多个包传输。批量传输数据可靠,但实时性较低。如USB硬盘、打印机等设备就采用的是批量传输方式。 - 等时传输(Isochronous Transaction)
等时传输也可以传输大量数据,但数据的可靠性无法保证。采用等时传输的USB设备更加注重保持一个恒定的数据传输速度,对数据的可靠性要求不高。如USB摄像头就使用的是等时传输方式。
4.2.传输要素
USB2.0主机控制器通过把时间在低速、全速模式下分成1毫秒宽的帧(frame),在高速模式下分成125微妙宽的微帧(microfranme),以此来管理传输。主机控制器将每个帧或微帧的一部分分配给各个传输。每个帧(或微帧)以带有时序参考的帧(Start-of-Frame,SOF)开始。超高速总线不使用SOF,但主机控制器仍可以在125微妙的总线时间内安排超高速传输。
USB传输可以安排在1个或多个帧或微帧中,每个传输包含多个事务,每个事务又进一步含有多个信息包(packets)。信息包必须在一个帧或微帧中传输完毕,不能跨帧或微帧。信息包分为4类,令牌类信息包确认事务类型,数据类信息包携带数据和状态代码,握手类信息包携带状态代码,最后一种是特殊类信息包。
USB传输由一个或多个事务(transaction)组成,这些事务可将数据载入端点或从端点取出。USB2.0事务开始于主机在总线上发送的令牌信息包(token packet)。令牌信息包含有目标端点号和方向。IN令牌信息包表示向端点请求数据信息包。OUT令牌信息包则是主机派发数据信息包的先行信息。除了数据,每个数据包还含有错误检查位和一个带有数据顺序值的信息包ID(PID)。许多事务还拥有握手信息包(handshake packet),数据的接收端用它来报告事务成功或失败。对于超高速传输事务,信息包类型和协议有所不同,但却含有相同的地址、错误检查和与数据相配合的数据顺序值。信息包类型 PID名字 取值(二进制) 传输类型 来源 说明 令牌 OUT 0001 全部 主机 IN事务中需要的设备和端点地址 令牌 IN 1001 全部 主机 IN事务中需要的设备和端点地址 令牌 SOF 0101 帧开始 主机 SOF标识符和帧号 令牌 SETUP 1101 控制 主机 用于Setup事务的设备和端点地址 数据 DATA0 0011 全部 主机、设备 数据交替或数据PID序列 数据 DATA1 1011 全部 主机、设备 数据交替或数据PID序列 数据 DATA2 0111 等时 主机、设备 数据PID序列 数据 MDATA 1111 等时、分割事务 主机、设备 数据PID序列 握手 ACK 0010 控制、批量、中断 主机、设备 接收端接收到正确的数据信息包 握手 NAK 1010 控制、批量、中断 设备 接收端不能接收数据,或者发送端无法发送数据或无数据要发送 握手 STALL 1110 控制、批量、中断 设备 控制请求不被支持或端点被停止 握手 NYET 0110 控制写、批量、OUT、分割事务 设备 正确的接收了数据信息包,但还没准备好接收下一个,或集线器还没有将数据信息包分割完成 特殊 PRE 1100 控制、中断 主机 主机发出的先行信号 特殊 ERR 1100 全部 集线器 由集线器返回的错误 特殊 SPLIT 1000 全部 主机 分割事务 特殊 PING 0100 控制写、批量、OUT 主机 PING测试 特殊 EXT 0000 无 主机 扩展,未使用 4.2.区别
在框架上,超高速是向后兼容USB2.0的,但是二者在协议上还是有一些重大的不同,主要区别如下:
- USB2.0的信息包分为令牌、数据和握手,超高速也是这三种类型,但是用法不同;超高速令牌包集成在头包和DPH中,各种类型的握手包都是TP包形式;对于OUT事务,令牌被合并在数据包中;对于IN事务,令牌被握手包代替
- USB2.0不支持突发(bursting)传输,超高速支持持续突发传输,一个微帧内最多可以传输16个信息包
- USB2.0是半双工(half-duplex)总线,超高速是全双工(dual-simplex)总线,支持同时收发数据
- USB2.0使用轮询模式,超高速使用异步通知方式
- USB2.0不支持流能力,超高速支持批量(bulk)端点的流(Stream)方式
- USB2.0在同步传输(isochronous)间隔中没有进入低功耗状态的机制,超高速则允许同步传输服务间隔中自动进入低功耗状态(不服务的时间段进入低功耗状态);超高速主机控制器在服务间隔前发送一个PING包到设备,以使设备在传输之前转变成活动状态
- USB2.0设备无法通知主机控制器自己在进入低耗电状态前可容忍的延迟时间(设备通知主机自己进入低功耗状态的最长延迟时间),超高速设备则提供可容忍的延迟时间(Latency Tolerance)消息
- USB2.0以固定的1ms(全速)/125us(高速)间隔传输帧/微帧。超高速设备可以发送间隔调整(Interval Adjustment)消息给主机,以调整帧间隔
- USB2.0电源管理总是主机导向(主机初始化)的;超高速链路两端都支持电源管理,因此不管何时需要空闲,需要退出,需要通信,每个链路能独立的进入低功耗状态
- USB2.0的信息包是广播方式,每个连接的设备解析每个信息包的地址、端点、方向信息来决定自己是否应该响应;超高速信息包有路由信息,HUB决定信息包要送达那个设备,只有一个例外,等时时间戳包(Isochronous Timestamp Packet,ITP)广播到每一个设备
参考资料
- Universal Serial Bus Specification Revision 2.0
- Universal Serial Bus 3.2 Specification
- USB开发大全 第四版
- 圈圈教你玩USB
- Linux那些事之我是USB
- https://blog.csdn.net/raynorxyx/article/details/82980066
- https://pc.poppur.com/peijian/8820.html
- 控制传输(Control Transaction)
-
USB协议大全
2017-02-28 12:22:26USB协议大全,开发USB硬件参考资料。 -
USB Type-C Spec R2.0_2_USB协议_USBtypeCspec_
2021-10-04 08:11:13本规范是对现有USB 2.0,USB 3.2,USB4和USB Power Delivery规范的补充。 它仅解决实现和支持USB Type-C插座,插头和电缆所需的元素。 -
USB2.0协议中文版.pdf
2020-10-28 19:10:21本章对应于USB2.0 协议第4 章。 USB(Universal Serial Bus)是一种支持热插拔的高速串行传输总线,它使用差分信号 来传输数据。在USB1.0 和USB1.1 版本中,只支持1.5Mb/s 的低速(low-speed)模式和12Mb/s 的全速... -
USB协议中英文版.rar
2020-03-29 09:04:19USB协议 usb2.0和usb3.0,压缩包中包括英文版的usb2.0协议,英文版的usb3.0协议和中文版的 usb2.0协议。适合于想深入了解usb的同学,欢迎下载学习。 -
USB协议简介
2019-03-04 21:41:191.USB协议简介 https://blog.csdn.net/songze_lee/article/details/77658094 2017年08月28日 23:20:16songze_lee阅读数:22978 版权声明:本文为博主原创文章,未经博主允许不得转载。 ...1.USB协议简介
https://blog.csdn.net/songze_lee/article/details/77658094
2017年08月28日 23:20:16 songze_lee 阅读数:22978
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/songze_lee/article/details/77658094
最近学习usb相关的知识,一直感觉入不了门,看《linux那些事儿之我是usb》,对usb协议也不是很熟悉,没能坚持看下去,直到看了《圈圈教你玩usb》一书,把自己的兴趣立马提了起来,大牛圈圈用51单片机实现了usb鼠标键盘等设备,让人非常佩服,51单片机自己还是很熟悉,大学玩了四年单片机,单片机来实现立马感觉亲切了许多,决定先从单片机入手学,后面再看linux那些事儿之我是usb,深入学习linux内核下usb,以下先介绍usb协议,内容整理来自usb spec、网络和圈圈书中,文中也大量引用STM32官方的USB2.0协议文档,欢迎批评指正。另外学习《圈圈教你玩usb》动手调试实现了单片机usb鼠标功能,源码在https://github.com/lisongze2016/mcu_project/tree/master/USB,源码中结合使用了linux kernel ch9.h中对描述符的结构体定义,对usb协议有了深入的理解。
USB(Universal Serial Bus)全称通用串口总线,USB为解决即插即用需求而诞生,支持热插拔。USB协议版本有USB1.0、USB1.1、USB2.0、USB3.1等,USB2.0目前比较常用,以下以2.0为主介绍。由于USB是主从模式的结构,设备与设备之间、主机与主机之间不能互连,为解决这个问题,扩大USB的应用范围,出现了USB OTG,全拼 ON The Go。USB OTG 同一个设备,在不同的场合下可行在主机和从机之间切换。1.1 USB特点:
USB1.0和USB1.1支持1.5Mb/s的低速模式和12Mb/bs的全速模式。在USB2.0以上支持480Mb/s的高速模式。应用如下:
1.2 USB设备供电方式:
USB设备有两种供电方式
自供电设备:设备从外部电源获取工作电压
总线供电设备:设备从VBUS(5v) 取电
对总线供电设备,区分低功耗和高功耗USB设备
低功耗总线供电设备:最大功耗不超过100mA
高功耗总线供电设备: 枚举时最大功耗不超过100mA,枚举完成配置结束后功耗不超过500mA
设备在枚举过程中,通过设备的配置描述符向主机报告它的供电配置(自供电/总线供电)以及它的功耗要求
如下 USB 配置描述符(以Joystick为例),后面具体介绍:1.3 USB总线信号:
USB使用的是差分传输模式,两个数据线D+和D-
差分信号1:D+ > VOH(min) (2.8V) 且D- < VOL(max)(0.3V)
差分信号0:D- > VOH and D+ < VOLJ状态(高电平):D+ 高,D- 低
K状态(低电平):D+低,D- 高
SEO状态:D+ 低,D- 高
Reset信号:D+ and D- < VOL for >= 10ms
主机在要和设备通信之前会发送Reset信号来把设备设置到默认的未配置状态。即主机拉低两根信号线(SE0状态)
并保持10ms
Idle状态:J状态数据发、送前后总线的状态
Suspend状态:3ms以上的J状态
SYNC: 3个KJ状态切换,后跟随2位时间的K状态(看到的波形变化是总线上发送0000 0001经过NRZI编码后的波形)Resume信号:20ms的K状态+低速EOP
主机在挂起设备后可通过翻转数据线上的极性并保持20ms来唤醒设备,并以低速EOP信号结尾
带远程唤醒功能的设备还可自己发起该唤醒信号;前提是设备已进入idle状态至少5ms,然后发出唤醒K信号,维持1ms到15ms并由主机在1ms内接管来继续驱动唤醒信号
SOP:从IDLE状态切换到K状态
EOP:持续2位时间的SE0信号,后跟随1位时间的J状态
Keep alive即低速EOP信号1.4 USB插入检测和速度检测:
主机通过设备在D+或D-上的1.5K上拉来检测设备的连接和断开事件,并由此判别设备的速度
主机先把高速设备检测为全速设备,然后再通过“Chirp序列”的总线握手机制来识别高速和全速设备
USB连接和断开连接:
设备连上主机时(连接)
当主机检测到某一个数据线电平拉高并保持了一段时间,就认为有设备连上来了
主机必需在驱动SE0状态以复位设备之前,立刻采样总线状态来判断设备的速度没有设备连上主机时(断开)
D+和D-数据线上的下拉电阻起作用,使得二者都在低电平;主机端看来就是个SE0状态;同样地,当数据线上的SE0状态持续一段时间了,就被主机认为是断开状态1.5 数据编解码和位填充
USB采用NRZI(非归零编码)对发送的数据包进行编码
输入数据0, 编码成“电平翻转”
输入数据1, 编码成“电平不变”
编码出来的序列,高电平:J状态;低电平:K状态位填充是为了保证发送的数据序列中有足够多的电平变化
填充的对象是(输入数据),即先填充再编码
数据流中每6个连续的“1”,就要插入1个“0”,从而保证编码
数据出现电平变化
接收方赋值解码NRZI码流,然后识别出填充位,并丢弃它们2. USB传输
一个传输有多个事务组成,一个事务由2/3个包组成。
传输又分为四种类型:批量传输、等时(同步)传输、中断传输、控制传输。
注意:USB传输数据先发数据低位再发高位数据2.1 包
包的组成:包的内容:
Packet分四大类: 命令 (Token) 、Packet 帧首 (Start of Frame) 、Packet 数据 (Data) 、Packet 握手 (Handshake) Packet
不同类型包,以上的组成部件有所不同
PID:
这里只用(PID0~4),PID4~7是PID0~4的取反,用来校验PID
PID1~0:01 令牌包、11 数据包、10 握手包、00 特殊包地址:
帧号:
数据:
CRC:
四种Packet类型之令牌包(Token Packet):
令牌包用来启动一次USB传输。
输出(OUT)令牌包:用来通知设备将要输出一个数据包
输入(IN)令牌包:用来通知设备返回一个数据包
建立(SETUP)令牌包:只用在控制传输中,和输出令牌包作用一样,也是通知设备将要输出一个数据包,两者区别在于:
SETUP令牌包后只使用DATA0数据包,且只能发送到设备的控制端点,并且设备必须要接收,而OUT令牌包没有这些限制例子:
四种Packet类型之SOF Packet
帧起始包:在每帧(或微帧)开始时发送,以广播的形式发送,所有USB全速设备和高速设备都可以接收到SOF包。例子:
0xA5:1010 0101:对应上面PID表可知是帧起始包
四种Packet类型之Data Packet例子:
四种Packet类型之Handshake Packet
例子:
2.2 事务
Transaction可以分成三类
Setup transaction:主机用来向设备发送控制命令
Data IN transaction:主机用来从设备读取数据
Data OUT transaction:主机用来向设备发送数据
Transaction的packet组成
Token packet:总是由主机发出
Data packet:包含此次transaction的数据负载
可选的Handshake packet
例子:2.3 传输
USB协议定义了四种传输类型:
批量(大容量数据)传输(Bulk Transfers): 非周期性,突发
大容量数据的通信,数据可以占用任意带宽,并容忍延迟 。如USB打印机、扫描仪、大容量储存设备等
中断传输(Interrupt Transfers): 周期性,低频率
允许有限延迟的通信 如人机接口设备(HID)中的鼠标、键盘、轨迹球等
等时(同步)传输(Isochronous Transfers): 周期性
持续性的传输,用于传输与时效相关的信息,并且在数据中保存时间戳的信息 ,如音频视频设备
控制传输(Control Transfers): 非周期性,突发
用于命令和状态的传输
2.3.1 批量传输
批量输出事务,(1)主机先发出一个OUT令牌包(包含设备地址,端点号),(2)然后再发送一个DATA包,这时地址和端点匹配的设备就会收下这个数据包,主机切换到接收模式,等待设备返回握手包,(3)设备解码令牌包,数据包都准确无误,并且有足够的缓冲区来保存数据后就会使用ACK/NYET握手包来应答主机(只有高速模式才有NYET握手包,他表示本次数据成功接收,但是没有能力接收下一次传输),如果没有足够的缓冲区来保存数据,就返回NAC,告诉主机目前没有缓冲区可用,主机会在稍后时间重新该批量传输事务。如果设备检查到数据正确,但端点处于挂起状态,返回STALL。如果检测到有错误(如校验错误,位填充错误),则不做任何响应,让主机等待超时。
批量输入事务,(1)主机首先发送一个IN令牌包(包含设备地址,端点号),(2)主机切换到接收数据状态等待设备返回数据。如果设备检测到错误,不做任何响应,主机等待超时。如果此时有地址和端点匹配的设备,并且没有检测到错误,则该设备作出反应:设备有数据需要返回,就将一个数据包放在总线上;如果没有数据需要返回,设备返回NAK响应主机;如果该端点处于挂起状态,设备返回STALL。如果主机收到设备发送的数据包并解码正确后,使用ACK握手包应答设备。如果主机检测到错误,则不做任何响应,设备会检测到超时。注意:USB协议规定,不允许主机使用NAK来拒绝接收数据包。主机收到NAK,知道设备暂时没有数据返回,主机会在稍后时间重新该批量输入事务。PING令牌包,它不发送数据,直到等待设备的握手包。
2.3.2 中断传输
中断传输是一种保证查询频率的传输。中断端点在端点描述符中要报告它的查询间隔,主机会保证在小于
这个时间间隔的范围内安排一次传输。2.3.3 等时传输
等时(同步)传输用在数据量大、对实时性要求高的场合,如音频设备,视频设备等,这些设备对数据的延迟很敏感。对于音频或视频设备数据的100%正确性要求不高,少量的数据错误是可以容忍的,主要是保证数据不能停顿,所以等时传输是不保证数据100%正确的。当数据错误时,不再重传操作。因此等时传输没有应答包,数据是否正确,由数据的CRC校验来确认。2.3.4 控制传输
控制传输可分为三个过程:(1)建立过程 (2)数据过程(可选) (3)状态过程
特性:
每个USB设备都必须有控制端点,支持控制传输来进行命令和状态的传输。USB主机驱动将通过控制传输与USB设备的控制端点通信,完成USB设备的枚举和配置
方向:
控制传输是双向的传输,必须有IN和OUT两个方向上的特定端点号的控制端点来完成两个方向上的控制传输
数据的拆分和数据传输完毕的判定
以高速设备的最大数据包长度64字节为例
要传输250字节,拆分成4个packet要传输正好256字节,通过最后一个0字节包告诉设备传输完成
各种传输特性比较
3. USB标准请求
3.1 USB标准请求的数据结构3.2 USB 设备枚举及描述符介绍
当一个USB设备插入主机后,会有以下活动:-
include/uapi/linux/usb/ch9.h
-
/* USB_DT_DEVICE: Device descriptor */
-
struct usb_device_descriptor {
-
__u8 bLength;
-
__u8 bDescriptorType;
-
__le16 bcdUSB;
-
__u8 bDeviceClass;
-
__u8 bDeviceSubClass;
-
__u8 bDeviceProtocol;
-
__u8 bMaxPacketSize0;
-
__le16 idVendor;
-
__le16 idProduct;
-
__le16 bcdDevice;
-
__u8 iManufacturer;
-
__u8 iProduct;
-
__u8 iSerialNumber;
-
__u8 bNumConfigurations;
-
} __attribute__ ((packed));
-
#define USB_DT_DEVICE_SIZE 18
-
struct usb_config_descriptor {
-
__u8 bLength;
-
__u8 bDescriptorType;
-
__le16 wTotalLength;
-
__u8 bNumInterfaces;
-
__u8 bConfigurationValue;
-
__u8 iConfiguration;
-
__u8 bmAttributes;
-
__u8 bMaxPower;
-
} __attribute__ ((packed));
-
#define USB_DT_CONFIG_SIZE 9
-
/* USB_DT_INTERFACE: Interface descriptor */
-
struct usb_interface_descriptor {
-
__u8 bLength;
-
__u8 bDescriptorType;
-
__u8 bInterfaceNumber;
-
__u8 bAlternateSetting;
-
__u8 bNumEndpoints;
-
__u8 bInterfaceClass;
-
__u8 bInterfaceSubClass;
-
__u8 bInterfaceProtocol;
-
__u8 iInterface;
-
} __attribute__ ((packed));
-
#define USB_DT_INTERFACE_SIZE 9
-
/* USB_DT_ENDPOINT: Endpoint descriptor */
-
struct usb_endpoint_descriptor {
-
__u8 bLength;
-
__u8 bDescriptorType;
-
__u8 bEndpointAddress;
-
__u8 bmAttributes;
-
__le16 wMaxPacketSize;
-
__u8 bInterval;
-
/* NOTE: these two are _only_ in audio endpoints. */
-
/* use USB_DT_ENDPOINT*_SIZE in bLength, not sizeof. */
-
__u8 bRefresh;
-
__u8 bSynchAddress;
-
} __attribute__ ((packed));
-
#define USB_DT_ENDPOINT_SIZE 7
-
#define USB_DT_ENDPOINT_AUDIO_SIZE 9 /* Audio extension */
-
/* USB_DT_STRING: String descriptor */
-
struct usb_string_descriptor {
-
__u8 bLength;
-
__u8 bDescriptorType;
-
__le16 wData[1]; /* UTF-16LE encoded */
-
} __attribute__ ((packed));
-
/* note that "string" zero is special, it holds language codes that
-
* the device supports, not Unicode characters.
-
*/
-
-
usb协议文件.rar
2021-09-09 14:44:16包括:HID1.1协议.pdf USB_LANGIDs.pdf USB1.1协议.pdf -
USB协议入门
2020-06-15 15:27:46文章目录USB是什么USB解决什么问题USB-OTGUSB的特点USB的拓扑结构USB的电气特性USB的插入检测机制USB描述符USB设备的枚举过程USB包结构和传输过程包的结构包的分类令牌包数据包握手包特殊包USB的四种传输类型USB事务... -
USB协议 - UVC标准协议规范(二)
2021-09-07 17:28:46USB协议-UVC标准协议规范(二)1.概述2.UVC功能特征2.1 Video Interface Class2.2 Video Interface subclass and Protocol2.3 UVC功能拓扑2.3.1 Unit单元2.3.1.1 SU(选择器单元)2.3.1.2 PU(处理单元)2.3.1.3 EU... -
USB协议架构及驱动架构
2017-02-06 18:00:20详细讲解了USB2.0协议架构及Linux Kernel USB驱动框架与实现,该文档是Linux USB学习者不可多得的一手资料。 -
USB协议以及USB HOST MSC类通信过程
2017-09-26 14:17:58该文章主要是讲解了USB协议的基础知识,包括域、包、事务、传输。USB HOST MSC类的通信过程,以及FAT32的基本知识。 -
USB通信协议——错误检查
2020-11-13 05:33:05因此,在稍前所介绍过,用来设计整合至USB数据交易协议的握手封包,可以确认出封包已经被成功地接收到。此外,涵盖错误检查位的USB封包也可使得接收器能确实地辨识所接收到的数据是否与传送出去的数据相符合。此外,... -
简单说说USB协议(一)
2019-07-31 22:09:08USB,通用串行总线,是一种计算机与外围设备进行数据交互的通信协议。 任何东西的出现都是有理可循的,在以前计算机刚兴起的时候,要连接一个新的设备,需要断电关闭计算机,连接好...USB协议采用主从工作模式,...