usb 传输协议

article/2025/9/21 8:07:46

USB,是英文Universal Serial Bus(通用串行总线)、支持设备的即插即用和热插拔功能。在1994年底由英特尔、IBM、Microsoft等公司联合提出的,在此之前PC的接口杂乱,扩展能力差,热拔插不支持等。USB正是为了解决速度,扩展能力,易用性等而出现的,本文阐述了usb 协议的特点及其四种传输模式。

1. usb的特点

在这里插入图片描述

USB 接口有4根线,两根电源及两根信号,Standard A类型的接口定义 如下
一般的排列方式是:红白绿黑从左到右
红色-USB电源: 标有-VCC、Power、5V、5VSB字样
绿色-USB数据线:(正)-DATA+、USBD+、PD+、USBDT+
白色-USB数据线:(负)-DATA-、USBD-、PD-、USBDT+
黑色-地线: GND、Ground

1.1 Usb的四层描述符

USB协议采取主从模式,从设备端没有主动通知USB主机端的能力,从机插入后,主机控制器根据协议,获取设备描述符及驱动匹配。
每个usb设备可以有一个或多个配置(config),不同的配置的体现即不同的组合接口。
接口(interface)是一个逻辑概念,接口之间通常是隔离的,互相不干扰。
端点(endpoint)是usb设备的唯一可识别部分,也是host和device之间的通信流的终点。它是一个host或device上的一个数据缓冲区,用来存放和发送usb的各种数据。每个端点都是一个单一连接,支持一个方向的数据流(in: device→host)(out: host→device)。
端点0:所有的usb设备都要拥有端点0,该端点用于对一个逻辑设备进行配置。端点0支持控制传输,且总是在设备接入和上电时就进行配置。
一个设备通常有一个或多个配置;
一个配置通常有一个或多个接口;
一个接口通常有一个或多个端点。
在这里插入图片描述

》设备描述符
/* USB_DT_DEVICE: Device descriptor /
struct usb_device_descriptor {
__u8 bLength; //本结构体大小
__u8 bDescriptorType; //描述符类型
__le16 bcdUSB; //usb版本号 200->USB2.0
__u8 bDeviceClass; //设备类
__u8 bDeviceSubClass; //设备类子类
__u8 bDeviceProtocol; //设备协议,以上三点都是USB官方定义
__u8 bMaxPacketSize0; //端点0最大包大小
__le16 idVendor; //厂家id
__le16 idProduct; //产品id
__le16 bcdDevice; //设备出厂编号
__u8 iManufacturer; //设备厂商字符串索引
__u8 iProduct; //产品描述
__u8 iSerialNumber; //设备序列号字符串索引
__u8 bNumConfigurations; //配置的个数
} attribute ((packed));
》配置描述符
/
USB_DT_CONFIG: Config descriptor /
struct usb_config_descriptor {
__u8 bLength; //自身长度
__u8 bDescriptorType;//描述符类型(0x02)
__le16 wTotalLength; //该配置下,信息的总长度
__u8 bNumInterfaces; //接口的个数
__u8 bConfigurationValue; //Set_Configuration命令所需要的参数值
__u8 iConfiguration; //描述该配置的字符串的索引值
__u8 bmAttributes;//供电模式的选择
__u8 bMaxPower;//设备从总线提取的最大电流
} attribute ((packed));
》接口描述符
/
USB_DT_INTERFACE: Interface descriptor */
struct usb_interface_descriptor {
__u8 bLength;
__u8 bDescriptorType;//接口描述符的类型编号(0x04)
__u8 bInterfaceNumber; //该接口的编号
__u8 bAlternateSetting; //备用的接口描述符编号
__u8 bNumEndpoints; //该接口使用的端点数,不包括端点0
__u8 bInterfaceClass; //接口类
__u8 bInterfaceSubClass; //子类
__u8 bInterfaceProtocol; //协议
__u8 iInterface;//描述该接口的字符串索引值
} attribute ((packed));

》端点描述符
/* USB_DT_ENDPOINT: Endpoint descriptor */
struct usb_endpoint_descriptor {
__u8 bLength;//端点描述符字节数大小(7个字节)
__u8 bDescriptorType;//端点描述符类型编号(0x05)
__u8 bEndpointAddress; //端点地址及输入输出属性
__u8 bmAttributes; //属性,包含端点的传输类型,控制,中断…
__le16 wMaxPacketSize; //端点收、发的最大包大小
__u8 bInterval; //主机查询端点的时间间隔
__u8 bRefresh;
__u8 bSynchAddress;
} attribute ((packed));

1.2 USB 结构及通信形式

USB总线是一个单主方式的实现,是一种轮询方式的总线,为树形拓扑结构。协议规定所有的数据传输都必须由主机发起,host controller初始化所有的数据传输,各种设备紧紧围绕在主机周围。

在这里插入图片描述

USB通信最基本的形式是通过USB设备里一个叫endpoint的端点(可以理解为硬件寄存器或者buff),而主机和endpoint之间的数据传输是通过pipe,pipe通信有两种,一种是stream,另一种是message,协议中规定:message管道要求从它那儿过的数据必须具有一定的格式,message管道必须对应两个相同号码的端点,一个用来in,一个用来out,咱们的缺省管道就是message管道,当然,与缺省管道对应的端点0就必须是两个具有同样端点号0的端点。
在这里插入图片描述

一个USB逻辑设备就是一系列端点(endpoint)的集合,它与主机之间的通信发生在主机上的一个缓冲区和设备上的一个端点之间,通过管道来传输数据。管道的一端是主机上的一个缓冲区,另一端是设备上的端点 ,构成一个通信信道。

2. USB 四种通信方式

USB endpoint有四种类型,分别对应了四种不同的数据传输方式。它们是控制传输(Control Transfers),中断传输(Interrupt Data Transfers),批量传输(Bulk Data Transfers),等时传输(Isochronous Data Transfers)。其中批量传输、等时传输和中断传输每传输一次数据都是一个事务;控制传输包括三个过程,建立过程和状态过程分别是一个事务,数据过程则可能包含多个事务。从usb设备端来看,也可以把端点分为四种类型为控制端点、中断端点、批量端点、等时端点。USB传输数据先发数据低位(LSB),再发高位数据(MSB)

2.1 控制传输

控制传输用来控制对USB设备不同部分的访问,通常用于配置设备,获取设备信息,发送命令到设备,或者获取设备的状态报告。总之就是用来传送控制信息的,每个USB设备都会有一个endpoint 0的控制端点,内核里的USB core使用它在设备插入时进行设备的配置,它会一种等待着USB core发送控制命令。
控制传输分为三个过程:

建立过程使用一个建立事务。建立事务是一个输出数据包的过程,需要注意的点有:
• 首先是令牌包,建立过程使用SETUP令牌包;
• 其次是数据包类型,SETUP只能使用DATA0包;
• 最后是握手,设备只能采用ACK来应答(错了的情况不应答),不能使用NAK或者STALL来应答,即设备必须要接受建立事务的数据。
在这里插入图片描述

数据过程是可选的,即一个控制传输可能没有数据过程。如果有,一个数据过程可以包含一个或多个数据事务,需要注意的是:
• 首先所有的数据事务必须是同一个方向的(在控制读传输中,数据过程中的所有数据事务都必须是输入的;在控制写传输中,数据过程中的所有数据都必须是输出的);
• 其次,一旦数据传输方向改变,就会认为进入到状态过程,状态过程的第一个数据包必须是DATA1包;
• 最后,每次争取传输一个数据包后就在DATA0和DATA1之间交换。
在这里插入图片描述

控制传输的Status阶段是序列中的最后一个事务,状态阶段由前一阶段的数据流方向改变描绘,并始终使用DATA1 PID。
获取设备描述符为控制传输,由5个事务组成,分别是SETUP、IN、IN、IN、OUT,具体过程如下:
在这里插入图片描述

2.2 批量传输

批事务量
{In/Out Data Packet
@令牌包(In/Out token)
@数据包 (In/Out data)
@握手包 (Out/In ack)
}
批量传输用来传输大量的数据,确保没有数据丢失,并不保证在特定的时间内完成。U盘使用的就是批量传输,咱们用它备份数据时需要确保数据不能丢,而且也不能指望它能在一个固定的比较快的时间内拷贝完。
• 批量输出(批量写)时, Out Token→Out Data→ACK/NYET/NAK/STALL,其中ACK代表接收正常,且可以接收下次传输;NYET代表本次数据成功接收,但没能力接收下一次传输;NAK表示没有足够的缓冲区来保存数据;STALL表示数据接收,但是端点处于挂起状态。
• 批量输入(批量读)时,In Token→In Data→ACK /NAK/STALL,与批量写不同,主机发送In令牌包后,若设备检测到错误,则不做任何响应,主机等待超时。若设备没有检测到地址端点等错误,但是设备又没有数据需要返回,那么设备就会返回NAK直接响应主机;若改端点处于挂起状态,返回STALL给主机;若主机正确接收到数据后,主机返回ACK应答设备,同样的,主机检测到错误则不做出响应,设备检测超时。USB协议规定,不允许主机使用NAK拒绝接收数据包。

2.3 中断传输

中断事务
{In/Out Data Packet
@令牌包(In/Out token)
@数据包(In/Out data)
@握手包(Out/In ack)
}
中断传输是一种保证查询频率的传输,用来以一个固定的速率传送少量的数据。中断端点在端点描述符中要报告它的查询时间,主机会保证在小于这个事件间隔的范围内安排一次传输,USB键盘和USB鼠标使用的就是这种方式,USB的触摸屏也是,传输的数据包含了坐标信息。。
中断传输不是由设备主动的发出一个设备请求,而是由主机保证不大于某个时间间隔内安排一次传输。中断传输通常用在数据量不大,但是对时间要求较严格的设备。中断传输也可以用来不停的检查某个状态,当条件满足后再用批量传输,除了对端点查询的策略上不一样之外,中断传输和批量传输的结构基本上是一样的。

2.4 等时传输

等时事务
{In/Out Data Packet
@令牌包(In/Out token)
@数据包 (In/Out data)
}
等时传输使用等时事务(Isochronous Transactions)来传输数据。同样用来传输大量的数据,但并不保证数据是否到达,以稳定的速率发送和接收实时的信息,对传送延迟非常敏感。用在数据量大、对实时性要求高的场合,例如音频设备、视屏设备等,这些设备对数据延时敏感,期望能够有个比较稳定的数据流。对音频或者视屏设备来说,对数据的100%正确要求不高,少量数据的错误还是能够容忍的,主要是要保证不能停顿;所以等时传输是不保证数据100%正确的。当数据错误时,并不能进行重传操作。因此等时传输也就没有应答包,并不进行重传操作。数据是否正确,可以由数据包的CRC校验来确认。至于出错的数据如何处理,是由软件来决定的。
控制传输
{Setup Packet(建立阶段)
@令牌包(setup token)-(out) @数据包(Setup data) -(out) @握手包(ack) - (in)
}
{In/Out Data Packet(可选数阶段据)
@(令牌包(In/Out token) @数据包(In/Out data) @握手包(Out/In ack)
}
{Out/In Stautus Packet(状态阶段)
@(令牌包(Out/In token) @数据包(Out/In data) @握手包( In/Out ack)
}


http://chatgpt.dhexx.cn/article/DP7Tybdg.shtml

相关文章

USB协议(1)USB基础知识

USB(Universal Serial Bus)是通用串行总线的缩写,它是连接计算机系统与外部设备的一种串口总线标准,也是一种输入输出接口的技术规范,被广泛地应用于个人电脑和移动设备等信息通讯产品,并扩展至摄影器材、数…

linux免费的内网穿透

参考:https://www.cpolar.com/blog/how-to-install-cpolar-under-android-termux-hyper-terminal 下载包:https://www.cpolar.com/download 由于我的linux版本是装在安卓手机上的Alpine linux,所以下载的是如下图版本 下载后使用xftp工具上传到服务器&…

钉钉内网穿透 免费内网穿透工具 让你的电脑成为web服务器

什么是内网穿透? 就是让你个人电脑内建立的网站,在外网可以访问,例如你的手机,其他电脑等。 例如你在电脑部署了一个web服务器,你在浏览器访问127.0.0.1可以打开这个网站,但是你用手机访问127.0.0.1却打不…

免费的内网穿透(钉钉)

1.简介 阿里钉钉提供的免费内网穿透,是基于ngrok 的,可以实现 Http 穿透,可以将我们本地服务暴露给外部访问,可以用作我们调试一些回调接口,或者共享一些文件。 优点:网速快,估计是台带宽为100…

免费 内网穿透工具 实测好用

花生壳:已卸载 免费的版本根本不支持http协议,只支持TCP。 星空内网穿透:已卸载 需要注册账号 需要加入QQ群 需要实名认证,填写身份证号 钉钉内网穿透: 没试验,只记录在此 Utools中的内网穿透&#x…

推荐一款真正永久免费的内网穿透

神卓互联内网穿透,是一款真正的永久免费的内网穿透,每月不限流量、访问地址固定不变。 目录 1. 安装神卓互联内网穿透工具 神卓互联内网穿透客户端 控制台-界面清洁-一目了然 2.添加本地web项目-创建映射规则 3.神卓互联-增加通道检测功能&#xff0…

(不打广告)推荐这款永久免费内网穿透软件-神卓互联

内网穿透是一种将内部网络中的应用程序公开到公共网络上的技术。在许多情况下,由于网络安全限制或配置问题,内部网络中的应用程序可能无法通过公共网络访问。这时,内网穿透技术就可以解决这个问题,使得我们可以在没有公共 IP 地址…

内网穿透工具(全免费)

文章目录 前言一、NATAPP是什么?二、使用步骤1.访问官网注册2.客户端下载3 登录,配置参数1 登录,购买免费隧道2 配置参数3 根据authtoken 运行 natapp.exe 4 试试效果 总结 前言 平时开发微信公众号,小程序, 或者给他人演示项目等,难免会遇到需要开通外网的情况,作…

无需设置路由器,无需公网ip 实现永久免费内网穿透

用网云穿在 N1 盒子上实现 Openwrt 的内网穿透 软路由器情况 N1(已经刷入 Armbian) 中使用 docker 创建 Openwrt 容器作为旁路由。 我的内网 ip 信息 内网 IP 因人而异,以下是我自己的设置 Armbian:192.168.123.2 Openwrt:192.168.123.10 思路 N1 的 Armbian 中部…

如何免费使用内网穿透

背景: 疫情期间公司不能上班,工作又不能落下,所以只能选择在家办公~;公司的部分网站是内网的,所以得想办法内网穿透。经过众多对比后选择了小蝴蝶内网穿透! 网址: www.npsvip.com 准备工作&…

永久免费的内网穿透

名称:DPFRP内网穿透 注册赠送30000GB流量,流量用完还可以用! 官网:frpc.cc 官网:fwqcz.com 1.打开官方网,注册账号 2.登录账号 3.个人中心 4.创建隧道 5.下载客户端 6.修改frpc.ini文件 在配置文件页面选择你刚才创建的服务器隧道,复制配…

钉钉免费实现内网穿透

场景: 有时候开发者想把私有电脑作为服务器,需要把开发机电脑上的项目暴露到公网,方便远程访问和调试,这时候就需要使用内网穿透,这里介绍一下阿里巴巴旗下钉钉内网穿透工具的使用 一、下载钉钉穿透工具,官…

【免费内网穿透】公网环境下,Windows系统远程桌面控制树莓派

系列文章 【免费内网穿透】公网环境下,Windows系统远程桌面控制树莓派【无需公网IP】为远程桌面树莓派配置固定的公网TCP端口地址 远程桌面控制树莓派,我们可以用xrdp协议来实现,它内部使用的是windows远程桌面的协议。我们只需要在树莓派上…

【群晖NAS】真·免费内网穿透方案 及踩坑合集

一.介绍 一篇科普贴,帮助那些刚入门NAS的朋友尽量避免踩坑。因为本人实践了其中几种穿透方案,也积攒了一些经验,跟大家分享一下。 在这里想说一句,现在网上充斥着各种《内网穿透方案对比》,可以负责任地说一下&#xf…

永久免费内网穿透不限制速度

市面上的免费内网穿透大都有格式各样的限制,什么限制流量啊,每个月要签到打卡啊,还有更改域名地址等,只有神卓互联内网穿透是永久免费没有限制的,白嫖也可以。 这篇文章分享了3个方案,按照性能和综合指标排…

简单免费内网穿透教程,利用树莓派实现低成本建站 无需公网

很多人都想试试自己建站玩一玩 (比如博客、自建网盘、远程下载等),但家里宽带没公网 IP,特意买台服务器又显得浪费。那么有没成本小、可玩性高、又能长期稳定使用的方案呢? 其实,免费的内网穿透工具 (如网云穿) 树莓派&#xff…

免费内网穿透工具之HTTP穿透

内网穿透工具之HTTP穿透 免费的内网穿透工具 首先在GitHub上面将 项目拉取到本地 git clone https://github.com/open-dingtalk/pierced.git可以看到提供了三种环境下的内网穿透 启动工具,执行命令“./ding -config./ding.cfg -subdomain域名前缀 端口”&#xf…

Ngrok免费实现内网穿透

1、使用场景 让本地局域网的跑的应用可以被外网访问 2、常用内网穿透工具 能实现内网穿透的工具也挺多,下面列出了几个 Ngrok 一个通过任何NAT或防火墙为您的本地主机服务器提供即时访问、安全的URL的命令。类似花生壳,分为服务端和客户端&#xff0…

分享一个免费内网穿透工具

首先,进到首页https://natapp.cn/,点击免费注册 然后,进行登录,是这个页面 点击,购买隧道,选择免费型,直接点击免费购买 然后点击我的隧道,点击配置 填写以下信息,其它不…

免费内网穿透方案——ZeroTier+OpenWRT

关于免费内网穿透方案的研究 一直以来在研究一些关于内网穿透的方案,都是一些很不靠谱的营销文章。索性很长一段时间就没了兴趣做这件事情,偶然的机会听到了ZeroTier,居然让我有种发现新大陆的喜悦。可能真的一分钱都不需要花就能搞定内网穿…