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

USB协议简介「建议收藏」

作者头像
全栈程序员站长
发布于 2022-09-13 02:22:37
发布于 2022-09-13 02:22:37
2.5K10
代码可运行
举报
运行总次数: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 删除。

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

评论
登录后参与评论
1 条评论
热度
最新
作者 您好请问 2、镜像制作net use z: \\服务端IP\share "123" / 我输入回车后显示找不到网络路径 然后在请问net use z:中的这个z: 是什么作用
作者 您好请问 2、镜像制作net use z: \\服务端IP\share "123" / 我输入回车后显示找不到网络路径 然后在请问net use z:中的这个z: 是什么作用
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
harbor搭建详解(仓库阁楼搭建效果图)
Docker容器应用的开发和运行离不开可靠的镜像管理,虽然Docker官方也提供了公共的镜像仓库,但是从安全和效率等方面考虑,部署私有环境内的Registry也是非常必要的。Harbor是由VMware公司开源的企业级的Docker Registry管理项目,它包括权限管理(RBAC)、LDAP、日志审核、管理界面、自我注册、镜像复制和中文支持等功能
全栈程序员站长
2022/08/02
6450
harbor搭建详解(仓库阁楼搭建效果图)
基于gitlab ci构建devops平台
devops的概念很多,理解也很多。我的理解,它属于软件工程范畴。它定义了一种理念,基于这种理念,能够快速的开发,交付软件及成果物。各个团队直接在这个体系中,高效的沟通,协作等。
暮雨
2018/10/11
4.7K2
基于gitlab ci构建devops平台
企业级Docker镜像仓库Harbor部署与使用
在实际生产运维中,往往需要把镜像发布到几十、上百台或更多的节点上。这时单台Docker主机上镜像已无法满足,项目越来越多,镜像就越来越多,都放到一台Docker主机上是不行的,我们需要一个像Git仓库一样系统来统一管理镜像。这里介绍的是一个企业级镜像仓库Harbor,将作为我们容器云平台的镜像仓库中心。
星哥玩云
2022/07/28
8840
企业级Docker镜像仓库Harbor部署与使用
Docker镜像仓库Harbor之搭建及配置
哎_小羊
2018/01/02
6.6K0
Docker镜像仓库Harbor之搭建及配置
企业实战(6)修改Harbor镜像仓库默认存储路径
Docker与Docker Engine部署:https://blog.csdn.net/qq_44895681/article/details/105540702
非著名运维
2022/06/22
1.2K0
企业实战(6)修改Harbor镜像仓库默认存储路径
搭建 Harbor 私有镜像仓库
什么是 Harbor? ---- harbor 是 VMware 公司开源的企业级 DockerRegistry 项目,项目地址为 https://github.com/vmware/harbor。其目标是帮助用户迅速搭建一个企业级的 Docker registry 服务。它以 Docker 公司开源的 registry 为基础,提供了管理UI,基于角色的访问控制(Role Based Access Control),AD/LDAP集成、以及审计日志(Auditlogging) 等企业用户需求的功能,同时还
keepyan
2018/12/13
1.8K0
搭建 Harbor 私有镜像仓库
这就是你日日夜夜想要的docker!!!---------Harbor私有仓库
是多个容器同时跑起来的服务 所以必须要装docker compose Harbor是VMware公司的开源级的企业级DockerRegistry(仓库)项目,项目地址为 https://github.com/vmware/harbor. Harbor的目标是帮助用户迅速搭建一个企业级的DockerRegistry服务。 Harbor以docker公司开源的registry为基础,提供了管理UI,基于角色的访问控制(Role Based Access Control),AD/LDAP集成,以及审计日志(Auditlogging)等企业用户需求的功能,同时还原生支持中文。 Harbor的每个组件都是以Docker容器的形式构建的,使用docker-compose来对它进行部署。用于部署Harbor的docker-compose模板位于/usr/local/bin/harbor/docker-compose.yml(自定义)
不吃小白菜
2020/09/25
1.4K0
这就是你日日夜夜想要的docker!!!---------Harbor私有仓库
docker-企业级镜像仓库harbor
 Habor是由VMWare公司开源的容器镜像仓库。事实上,Habor是在Docker Registry上进行了相应的企业级扩展,从而获得了更加广泛的应用,这些新的企业级特性包括:管理用户界面,基于角色的访问控制,AD/LDAP集成以及审计日志等,足以满足基本企业需求。
yuezhimi
2020/09/30
5730
docker-企业级镜像仓库harbor
基于 Distribution / Harbor 部署 Docker 私有镜像仓库
Docker 在 2015 年推出了 Distribution 项目,即 Docker Registry 2。相比于 Old Registry,Registry 2 使用 Go 实现,在安全性、性能方面均有大幅改进。Registry 设计了全新的 Rest API,并且在 Image 存储格式等方面不再兼容于 Old Registry。如果你要与Registry2 交互,你的 Docker 版本至少要是 Docker 1.6。
iMike
2019/06/02
2.9K0
docker基础:私库系列:再探Harbor:(4) https方式的私库管理
在前面的介绍中,缺省使用了http的方式,而考虑安全的角度,容器的仓库在生产环境中往往被设定为https的方式,而harbor将这些证书的创建和设定都进行了简单的集成,这篇文章来看一下在harbor下如何使用https的方式。
全栈程序员站长
2022/09/09
3100
企业级Docker Registry开源工具Harbor的介绍以及使用指南
#Harbor 的简介以及基本架构 Harbor简介 基本架构 Harbor安装和配置指导 Harbor 可以使用以下三种方式进行安装部署: 在线安装: 使用者可以直接从docker hub上下载harbor的官方镜像。 离线安装: 使用者需要下载源码包,并进行自己构建images。源码包比较大 Virtual Appliance: 一般使用这种方式在第三方平台搭建一个私有仓库作为平台的组建比如vsphere等,需要下载OVA 版本的Harbor. 官方下载页面 请点击我 . 需要安装Ha
BGBiao
2018/02/26
8710
第一章 Docker入门基础
MySQL使用过程中的环境变量 Num|Env Variable| Description —-|—-|—- 1|MYSQL_ROOT_PASSWORD|root用户的密码 2|MYSQL_DATABASE|创建一个数据库 3|MYSQL_USER,MYSQL_PASSWORD|创建一个用户以及用户密码 4|MYSQL_ALLOW_EMPTY_PASSWORD|允许空密码
公众号: 云原生生态圈
2021/11/15
6820
Docker 私有仓库搭建
在 Docker 中,当我们执行 docker pull xxx 的时候 ,它实际上是从 registry.hub.docker.com 这个地址去查找,这就是Docker公司为我们提供的公共仓库。在工作中,我们不可能把企业项目push到公有仓库进行管理。所以为了更好的管理镜像,Docker不仅提供了一个中央仓库,同时也允许我们搭建本地私有仓库。这一篇介绍registry、harbor两种私有仓库搭建。
程序员果果
2019/05/28
1.9K0
[原创]harbor自建网桥和办公网段冲突一例
https://github.com/vmware/harbor/issues/1403
追马
2020/07/02
1.4K0
搭建个私有docker镜像仓库
但是这个私有仓不能满足我们的需求,生产线上万一该私有仓服务器故障,其他服务器也无法接管。再者,也没有页面可以便于管理。
我的小碗汤
2018/10/18
2.9K0
搭建个私有docker镜像仓库
Docker login Harbor报错解决:Error response from daemon: Get https:..
 docker-compose down -v:停止并移除整个project的所有services
非著名运维
2022/06/22
4.2K0
手把手带你部署Docker私有镜像仓库Harbor v2.3.2
 Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker Distribution。作为一个企业级私有Registry服务器,Harbor提供了更好的性能和安全。提升用户使用Registry构建和运行环境传输镜像的效率。Harbor支持安装在多个Registry节点的镜像资源复制,镜像全部保存在私有Registry中, 确保数据和知识产权在公司内部网络中管控。另外,Harbor也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。
非著名运维
2022/06/22
1.4K0
手把手带你部署Docker私有镜像仓库Harbor v2.3.2
企业级Docker私有仓库之Harbor部署(http)
部署环境 Centos7.3 x64 docker-ce-17.06.0 docker-compose-1.15.0 Python-2.7.5(系统默认) Docker及Docker-compose安装 yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce
程序员同行者
2018/06/22
1K0
性能环境之docker操作指南7(全网最全)
Harbor 的所有组件都在 Dcoker 中部署,所以 Harbor 可使用 Docker Compose 快速部署。 harbor共有六个容器组成:
高楼Zee
2019/07/17
5930
性能环境之docker操作指南7(全网最全)
DockerHub访问慢怎么破?自建个企业级镜像仓库试试!
Harbor是一款开源的Docker镜像仓库服务,在Github上目前有13.4k+Star。提供了基于角色的镜像访问机制,可以保护你的镜像安全。
macrozheng
2020/12/21
1.3K0
DockerHub访问慢怎么破?自建个企业级镜像仓库试试!
推荐阅读
相关推荐
harbor搭建详解(仓库阁楼搭建效果图)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验