Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >USB协议简介「建议收藏」

USB协议简介「建议收藏」

作者头像
全栈程序员站长
发布于 2022-09-13 02:22:37
发布于 2022-09-13 02:22:37
2.5K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

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+ < VOL

J状态(高电平):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设备插入主机后,会有以下活动:

代码语言:javascript
代码运行次数:0
运行
复制
  1. include/uapi/linux/usb/ch9.h
  2. /* USB_DT_DEVICE: Device descriptor */
  3. struct usb_device_descriptor {
  4. __u8 bLength;
  5. __u8 bDescriptorType;
  6. __le16 bcdUSB;
  7. __u8 bDeviceClass;
  8. __u8 bDeviceSubClass;
  9. __u8 bDeviceProtocol;
  10. __u8 bMaxPacketSize0;
  11. __le16 idVendor;
  12. __le16 idProduct;
  13. __le16 bcdDevice;
  14. __u8 iManufacturer;
  15. __u8 iProduct;
  16. __u8 iSerialNumber;
  17. __u8 bNumConfigurations;
  18. } __attribute__ ((packed));
  19. #define USB_DT_DEVICE_SIZE 18
代码语言:javascript
代码运行次数:0
运行
复制
  1. struct usb_config_descriptor {
  2. __u8 bLength;
  3. __u8 bDescriptorType;
  4. __le16 wTotalLength;
  5. __u8 bNumInterfaces;
  6. __u8 bConfigurationValue;
  7. __u8 iConfiguration;
  8. __u8 bmAttributes;
  9. __u8 bMaxPower;
  10. } __attribute__ ((packed));
  11. #define USB_DT_CONFIG_SIZE 9
代码语言:javascript
代码运行次数:0
运行
复制
  1. /* USB_DT_INTERFACE: Interface descriptor */
  2. struct usb_interface_descriptor {
  3. __u8 bLength;
  4. __u8 bDescriptorType;
  5. __u8 bInterfaceNumber;
  6. __u8 bAlternateSetting;
  7. __u8 bNumEndpoints;
  8. __u8 bInterfaceClass;
  9. __u8 bInterfaceSubClass;
  10. __u8 bInterfaceProtocol;
  11. __u8 iInterface;
  12. } __attribute__ ((packed));
  13. #define USB_DT_INTERFACE_SIZE 9
代码语言:javascript
代码运行次数:0
运行
复制
  1. /* USB_DT_ENDPOINT: Endpoint descriptor */
  2. struct usb_endpoint_descriptor {
  3. __u8 bLength;
  4. __u8 bDescriptorType;
  5. __u8 bEndpointAddress;
  6. __u8 bmAttributes;
  7. __le16 wMaxPacketSize;
  8. __u8 bInterval;
  9. /* NOTE: these two are _only_ in audio endpoints. */
  10. /* use USB_DT_ENDPOINT*_SIZE in bLength, not sizeof. */
  11. __u8 bRefresh;
  12. __u8 bSynchAddress;
  13. } __attribute__ ((packed));
  14. #define USB_DT_ENDPOINT_SIZE 7
  15. #define USB_DT_ENDPOINT_AUDIO_SIZE 9 /* Audio extension */
代码语言:javascript
代码运行次数:0
运行
复制
  1. /* USB_DT_STRING: String descriptor */
  2. struct usb_string_descriptor {
  3. __u8 bLength;
  4. __u8 bDescriptorType;
  5. __le16 wData[1]; /* UTF-16LE encoded */
  6. } __attribute__ ((packed));
  7. /* note that "string" zero is special, it holds language codes that
  8. * the device supports, not Unicode characters.
  9. */

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/148940.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
带你遨游USB世界
USB的全称是Universal Serial Bus,通用串行总线。它的出现主要是为了简化个人计算机与外围设备的连接,增加易用性。USB支持热插拔,并且是即插即用的,另外,它还具有很强的可扩展性,传输速度也很快,这些特性使支持USB接口的电子设备更易用、更大众化。
233333
2020/07/21
2.8K0
带你遨游USB世界
第4章_USB 设备编程
USB 本身是一个很庞大、复杂的体系, 本课程的重点在于工业互联, USB 是其中的一个 小小知识点。本章课程的目的在于:能理解 USB 的一些概念,能使用 USB 传输数据。 4.2~4.5 节, 介绍 USB 概念;4.6~4.7 节,移植 USBX 实现 USB 串口功能。
韦东山
2024/06/29
3390
第4章_USB 设备编程
USB 协议核心概念与实践
USB,全称是 Universal Serial Bus,即通用串行总线,既是一个针对电缆和连接器的工业标准,也指代其中使用的连接协议。本文不会过多介绍标准中的细节,而是从软件工程师的角度出发,介绍一些重要的基本概念,以及实际的主机和从机应用。最后作为实际案例,从 USB 协议实现的角度分析了checkm8漏洞的成因。
evilpan
2023/02/12
1.8K0
USB 协议核心概念与实践
13.USB驱动
问1. 既然还没有"驱动程序",为何能知道是"android phone" 答1. windows里已经有了USB的总线驱动程序,接入USB设备后,是"总线驱动程序"知道你是"android phone" 提示你安装的是"设备驱动程序" USB总线驱动程序负责:识别USB设备, 给USB设备找到对应的驱动程序
嵌入式与Linux那些事
2021/05/20
2.2K0
Linux驱动开发: USB驱动开发
USB是连接计算机系统与外部设备的一种串口总线标准,也是一种输入输出接口的技术规范,被广泛地应用于个人电脑和移动设备等信息通讯产品,USB就是简写,中文叫通用串行总线。最早出现在1995年,伴随着奔腾机发展而来。自微软在Windows 98中加入对USB接口的支持后,USB接口才推广开来,USB设备也日渐增多,如数码相机、摄像头、扫描仪、游戏杆、打印机、键盘、鼠标等等,其中应用最广的就是摄像头和U盘了。
DS小龙哥
2022/01/12
71.5K0
Linux驱动开发: USB驱动开发
单片机外围模块漫谈之四,USB总线基本概念。
USB设备现在是用的非常普遍的一种接口了,它即插即用的特性给人们带来了很大的方便。在嵌入式的应用中, USB经常被用来作为与上位机通信的接口,还用来通过U盘存储数据等。USB按通讯速度可分为低速,全速和高速设备。在我们的应用中,低速和全速是最为普遍的,在此我们对USB从物理层到协议层做一个简要的介绍。高速USB的原理是一样的,在理解了低速和全速设备的工作原理后再去理解高速设备就比较简单了,在此我们暂不讨论。
用户2366192
2021/05/31
8510
USB协议基本知识[通俗易懂]
USB 基本知识 USB的重要关键概念: 1、 端点:位于USB设备或主机上的一个数据缓冲区,用来存放和发送USB的各种数据,每一个端点都有惟一的确定地址,有不同的传输特性(如输入端点、输出端点、配置端点、批量传输端点) 2、 帧:时间概念,在USB中,一帧就是1MS,它是一个独立的单元,包含了一系列总线动作,USB将1帧分为好几份,每一份中是一个USB的传输动作。 3、upstream、downstream(上行、下行):设备到主机为上行,主机到设备为下行
全栈程序员站长
2022/07/02
3.6K0
USB协议基本知识[通俗易懂]
原创 Paper | USB设备开发:从入门到实践指南(一)
在使用 Google 搜索相关学习资料的过程中,搜到一本书——《圈圈教你玩 USB》,在阅读中发现需要购买相关硬件设备。
Seebug漏洞平台
2024/03/04
2.2K0
原创 Paper | USB设备开发:从入门到实践指南(一)
USB总线-USB协议简介(一)
USB是通用串行总线(Universal Serial Bus)的缩写。在USB总线出现之前,计算机与键盘、鼠标、扫描仪、打印机都使用专用的接口连接,不同设备的接口不能互用,扩展性很差,每次插拔设备都要关闭计算机,不支持热插拔,且通信速率很低。为了解决上述问题,USB总线诞生了。USB总线就好像一条管道,管道里流过的东西只要符合USB协议,至于具体流的是什么东西,USB总线并不关心,可以是自来水,可以是污水,可以是天然气,也可以是石油。对应具体的设备上,只要是支持USB协议的设备,都可以连接计算机,如USB键盘、USB鼠标、USB摄像头、USB音箱等。USB的出现简化了计算机与外围设备的连接,增强了扩展性,支持热插拔,且通信速度很快。
233333
2022/12/05
6.6K0
USB总线-USB协议简介(一)
usb协议开发_基于事件驱动的架构
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说usb协议开发_基于事件驱动的架构,希望能够帮助大家进步!!!
Java架构师必看
2022/06/15
2.1K0
usb协议开发_基于事件驱动的架构
19.Linux-USB总线驱动分析
本文总结了USB总线驱动程序的实现原理和流程。首先介绍了USB总线驱动程序的基本概念和作用,然后详细阐述了USB总线驱动程序的实现流程,包括设备加载、设备初始化、设备配置、设备接口、端点、读写请求、中断和轮询机制。最后对USB总线驱动程序中涉及到的几个重要概念进行了详细说明。通过本文的总结,可以更好地理解USB总线驱动程序的实现原理和流程,为后续的USB驱动开发打下坚实的基础。
诺谦
2018/01/03
9.1K0
19.Linux-USB总线驱动分析
USB技术浅析
《带你遨游USB世界》中,我们已经初步介绍了USB的整体架构,本文将从以下几个方面继续介绍USB的内容。
233333
2020/07/21
2.9K0
USB技术浅析
【专业技术】USB体系结构
近来基于MSC类协议做了一个模拟U盘实现USB读写功能的项目,看到一个对USB框架讲得不错的文章,这里转载过来,方便需要的人看看。当然USB协议是一个很庞大的工程,这篇只是一个提纲契领的作用,如要深入研究还是需要认真学习相关协议。 USB总线接口层:物理连接、电气信号环境、信息包传输机制;主机一方由USB主控制器和根集线器组成,而USB方则由设备中的USB接口组成。 USB设备层:由主机方的USB系统软件和设备方的USB设备逻辑视图组成。 USB功能层:代表客户软件和一个给定的设备功能接口之间的关系。 US
程序员互动联盟
2018/03/14
1.3K0
USB 电气信号
USB Hub、USB 设备,也分为低速、全速、高速三种类型。一个 USB 设备,可能兼容【低速、全速】,可能兼容【全速、高速】,但是不会同时兼容低速、高速。
Jasonangel
2023/08/22
4590
USB 电气信号
硬件笔记(8)----USB学习笔记5
如前面所述,当某个设备被连接到 USB 主机上,该设备会向主机提供其功能和电源要求。通常,设备会通过一个描述符表格(其固件的一部分)来提供这些信息。描述符表格是数据的结构化序列,描述了设备信息;这些值由开发人员定义。所有描述符表格都具有一个标准信息,用于介绍设备属性和电源要求。如果某个设计满足指定 USB 设备类别的要求,则该 USB 设备必须具备的其他描述符信息都将包含在设备描述符结构中。附录 A 包含一个 PSoC USB 的全功能设备描述符的示例。如果您正在阅读或创建您自己的描述符,那么请注意,传输数据字段时,优先传输最低有效位。许多参数的长度均为 2个字节。请确保先发送低字节,然后再发送高字节。
小火柴棒
2019/07/02
1.8K0
USB 描述符和 USB 枚举
Host 使用控制传输来识别设备、设置设备地址、启动设备的某些特性,对于控制传输,它首先发出"setup 事务",如下:
Jasonangel
2023/08/22
7690
USB 描述符和 USB 枚举
浅谈总线通信机制----USB学习指南与总结
众所周知,USB别看就只有四条线,但只是对于眼睛看到的来讲,确实它的构造就很简单。
杨源鑫
2019/07/04
1.3K0
浅谈总线通信机制----USB学习指南与总结
USB协议详解
一个transfer(传输)由一个或多个transaction(事务)构成,一个transaction(事务)由一个或多个packet(包)构成,一个packet(包)由一个或多个sync(域)构成。
全栈程序员站长
2022/09/07
2.2K0
USB协议详解
USB通信协议深入理解
https://blog.csdn.net/g200407331/article/details/51682597/
233333
2022/05/10
1.1K0
linux usb端点
端点在实际的USB通讯过程种的具体作用与含义十分重要,但是有些难以理解,自己整理一些知识作为备忘。
233333
2022/10/04
10.5K0
linux usb端点
相关推荐
带你遨游USB世界
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验