diff options
| author | sakumisu <[email protected]> | 2026-01-30 22:10:34 +0800 |
|---|---|---|
| committer | sakumisu <[email protected]> | 2026-01-30 23:16:00 +0800 |
| commit | eaefb8ed21ed23f732e8b608ed7948e6b71ab0d8 (patch) | |
| tree | 427acdc61cd9bbe9a03f500bfa604a425ed3b1e4 /docs/source/usb | |
| parent | 76b3720445f5b2396f3cd7dfdbecc277cafc76e7 (diff) | |
docs: update docs and add english version
Signed-off-by: sakumisu <[email protected]>
Diffstat (limited to 'docs/source/usb')
41 files changed, 0 insertions, 433 deletions
diff --git a/docs/source/usb/img/1.png b/docs/source/usb/img/1.png Binary files differdeleted file mode 100644 index e85ddf7a..00000000 --- a/docs/source/usb/img/1.png +++ /dev/null diff --git a/docs/source/usb/img/10.png b/docs/source/usb/img/10.png Binary files differdeleted file mode 100644 index bb57645e..00000000 --- a/docs/source/usb/img/10.png +++ /dev/null diff --git a/docs/source/usb/img/11.png b/docs/source/usb/img/11.png Binary files differdeleted file mode 100644 index 11056e33..00000000 --- a/docs/source/usb/img/11.png +++ /dev/null diff --git a/docs/source/usb/img/12.png b/docs/source/usb/img/12.png Binary files differdeleted file mode 100644 index 4149d81e..00000000 --- a/docs/source/usb/img/12.png +++ /dev/null diff --git a/docs/source/usb/img/13.png b/docs/source/usb/img/13.png Binary files differdeleted file mode 100644 index 29a544b2..00000000 --- a/docs/source/usb/img/13.png +++ /dev/null diff --git a/docs/source/usb/img/14.png b/docs/source/usb/img/14.png Binary files differdeleted file mode 100644 index 8ca094a4..00000000 --- a/docs/source/usb/img/14.png +++ /dev/null diff --git a/docs/source/usb/img/15.png b/docs/source/usb/img/15.png Binary files differdeleted file mode 100644 index eba7b89b..00000000 --- a/docs/source/usb/img/15.png +++ /dev/null diff --git a/docs/source/usb/img/16.png b/docs/source/usb/img/16.png Binary files differdeleted file mode 100644 index 259336ca..00000000 --- a/docs/source/usb/img/16.png +++ /dev/null diff --git a/docs/source/usb/img/17.png b/docs/source/usb/img/17.png Binary files differdeleted file mode 100644 index c42de390..00000000 --- a/docs/source/usb/img/17.png +++ /dev/null diff --git a/docs/source/usb/img/18.png b/docs/source/usb/img/18.png Binary files differdeleted file mode 100644 index f08b6354..00000000 --- a/docs/source/usb/img/18.png +++ /dev/null diff --git a/docs/source/usb/img/19.png b/docs/source/usb/img/19.png Binary files differdeleted file mode 100644 index 2e6eb9ce..00000000 --- a/docs/source/usb/img/19.png +++ /dev/null diff --git a/docs/source/usb/img/2.png b/docs/source/usb/img/2.png Binary files differdeleted file mode 100644 index 5b4f5f20..00000000 --- a/docs/source/usb/img/2.png +++ /dev/null diff --git a/docs/source/usb/img/20.png b/docs/source/usb/img/20.png Binary files differdeleted file mode 100644 index a44898a8..00000000 --- a/docs/source/usb/img/20.png +++ /dev/null diff --git a/docs/source/usb/img/21.png b/docs/source/usb/img/21.png Binary files differdeleted file mode 100644 index 7aa81e95..00000000 --- a/docs/source/usb/img/21.png +++ /dev/null diff --git a/docs/source/usb/img/22.png b/docs/source/usb/img/22.png Binary files differdeleted file mode 100644 index 370d39f9..00000000 --- a/docs/source/usb/img/22.png +++ /dev/null diff --git a/docs/source/usb/img/23.png b/docs/source/usb/img/23.png Binary files differdeleted file mode 100644 index e08db16e..00000000 --- a/docs/source/usb/img/23.png +++ /dev/null diff --git a/docs/source/usb/img/24.png b/docs/source/usb/img/24.png Binary files differdeleted file mode 100644 index fec98d49..00000000 --- a/docs/source/usb/img/24.png +++ /dev/null diff --git a/docs/source/usb/img/25.png b/docs/source/usb/img/25.png Binary files differdeleted file mode 100644 index 9bcaf151..00000000 --- a/docs/source/usb/img/25.png +++ /dev/null diff --git a/docs/source/usb/img/26.png b/docs/source/usb/img/26.png Binary files differdeleted file mode 100644 index d439b7c4..00000000 --- a/docs/source/usb/img/26.png +++ /dev/null diff --git a/docs/source/usb/img/27.png b/docs/source/usb/img/27.png Binary files differdeleted file mode 100644 index 1047da1b..00000000 --- a/docs/source/usb/img/27.png +++ /dev/null diff --git a/docs/source/usb/img/28.png b/docs/source/usb/img/28.png Binary files differdeleted file mode 100644 index 95b760c5..00000000 --- a/docs/source/usb/img/28.png +++ /dev/null diff --git a/docs/source/usb/img/29.png b/docs/source/usb/img/29.png Binary files differdeleted file mode 100644 index 09538d16..00000000 --- a/docs/source/usb/img/29.png +++ /dev/null diff --git a/docs/source/usb/img/3.png b/docs/source/usb/img/3.png Binary files differdeleted file mode 100644 index b8ef0823..00000000 --- a/docs/source/usb/img/3.png +++ /dev/null diff --git a/docs/source/usb/img/30.png b/docs/source/usb/img/30.png Binary files differdeleted file mode 100644 index d3014f95..00000000 --- a/docs/source/usb/img/30.png +++ /dev/null diff --git a/docs/source/usb/img/4.png b/docs/source/usb/img/4.png Binary files differdeleted file mode 100644 index f80c5366..00000000 --- a/docs/source/usb/img/4.png +++ /dev/null diff --git a/docs/source/usb/img/5.png b/docs/source/usb/img/5.png Binary files differdeleted file mode 100644 index ec6a4ba2..00000000 --- a/docs/source/usb/img/5.png +++ /dev/null diff --git a/docs/source/usb/img/6.png b/docs/source/usb/img/6.png Binary files differdeleted file mode 100644 index 2d280398..00000000 --- a/docs/source/usb/img/6.png +++ /dev/null diff --git a/docs/source/usb/img/7.png b/docs/source/usb/img/7.png Binary files differdeleted file mode 100644 index e7562f11..00000000 --- a/docs/source/usb/img/7.png +++ /dev/null diff --git a/docs/source/usb/img/8.png b/docs/source/usb/img/8.png Binary files differdeleted file mode 100644 index a4ac6ad4..00000000 --- a/docs/source/usb/img/8.png +++ /dev/null diff --git a/docs/source/usb/img/9.png b/docs/source/usb/img/9.png Binary files differdeleted file mode 100644 index a8b5b2a3..00000000 --- a/docs/source/usb/img/9.png +++ /dev/null diff --git a/docs/source/usb/img/overview1.png b/docs/source/usb/img/overview1.png Binary files differdeleted file mode 100644 index fbaf5a19..00000000 --- a/docs/source/usb/img/overview1.png +++ /dev/null diff --git a/docs/source/usb/img/overview2.png b/docs/source/usb/img/overview2.png Binary files differdeleted file mode 100644 index c8b3b779..00000000 --- a/docs/source/usb/img/overview2.png +++ /dev/null diff --git a/docs/source/usb/img/usb_enum.png b/docs/source/usb/img/usb_enum.png Binary files differdeleted file mode 100644 index 01c67c15..00000000 --- a/docs/source/usb/img/usb_enum.png +++ /dev/null diff --git a/docs/source/usb/img/usb_request.png b/docs/source/usb/img/usb_request.png Binary files differdeleted file mode 100644 index bb9f2637..00000000 --- a/docs/source/usb/img/usb_request.png +++ /dev/null diff --git a/docs/source/usb/img/usbstruct.png b/docs/source/usb/img/usbstruct.png Binary files differdeleted file mode 100644 index bd062ca3..00000000 --- a/docs/source/usb/img/usbstruct.png +++ /dev/null diff --git a/docs/source/usb/usb2.0_basic.rst b/docs/source/usb/usb2.0_basic.rst deleted file mode 100644 index 1c2b599e..00000000 --- a/docs/source/usb/usb2.0_basic.rst +++ /dev/null @@ -1,296 +0,0 @@ -USB 基本概念(2.0 为主) -=========================== - -本文主要对 USB 官方手册 `usb2.0.pdf <https://www.usb.org/document-library/usb-20-specification>`_ 中提供的第五章、第七章、第八章、第九章进行讲解。 -如果是初学 usb 的同学,推荐先不要看本节,而是将示例 demo 能够跑通了,熟悉了使用,再来看。 - -简介 ---------- - -USB 是什么?干什么用的?有什么优点?这些大家可以百度,我就不提了。主要先说 USB 的接口和速度根据不同的 USB 版本的分类,如图所示: - -.. figure:: img/overview1.png - -其次是 USB 需要满足的电平标准,有了电平标准后,下面说的信号状态就可以进行分类了。USB2.0 和 USB3.0 支持的电压范围和最大电流如下: - -.. figure:: img/overview2.png - -USB 信号状态 ------------------ - -首先我们需要了解的是 USB 的电气特性中的 Signaling Level,也就是信号状态。USB 主要是靠 D+ 和 D- 来实现不同的信号状态,然后进行通信。官方手册 7.1.7 中列举出了低速、全速和高速时的信号状态对应的 D+ 和 D- 需要满足的要求。 - -.. figure:: img/1.png -.. figure:: img/2.png -.. figure:: img/3.png - -- **差分 0 和差分 1**: 这两个状态用于通过 USB 进行的通用数据通信。当 D+线为高电平、 D-线为低电平时,该状态为差分 1。当 D+线为低电平、 D-线为高电平时,该状态为差分 0。 -- **J 状态和 K 状态**: 除了差分信号外, USB 规范还定义了其他两个差分状态: J 状态和 K 状态。它们的定义由设备速度决定。在全速和高速设备上, J 状态为差分 1 而 K 状态是差分 0。在低速设备上,该情况则相反。 -- **单端 0( SE0)**: 在 D+和 D-均为低电平时所发生的状态。该状态表示一个复位、断连或数据包的结束。 -- **单端 1( SE1)**: 在 D+和 D-均为高电平时发生的状态。不会故意生成该状态,并且不能在 USB 设计中出现。 -- **闲置**: 必须在发送一个数据包的前后发生的状态。如果一个数据线为低电平,而另一个数据线为高电平,则表示闲置状态。高电平和低电平的定义由设备的速度决定。在全速设备上,闲置状态是指 D+为高电平、 D-为低电平。在低速设备上,该情况则相反。 -- **恢复**: 用于使设备从挂起状态唤醒。通过发送一个 K 状态实现该操作。 -- **数据包的开始( SOP)**: 当 D+和 D-线从闲置状态转换到 K 状态时,将在开始低速或全速数据包前发生。 -- **数据包的结束( EOP)**: 在低速或全速数据包结束时发生。当 SE0 状态持续两位时间(后面的内容将介绍位时间)以及 J 状态持续 1 位时间时,将发生 EOP。 -- **复位**: 在 SE0 状态持续 10 ms 时发生。在 SE0 至少持续 2.5 ms 后,该设备会复位,并开始进入复位状态。 -- **保持活动( Keep Alive)**: 在低速设备中使用的信号。低速设备缺少了一个帧起始数据包(用于防止挂起状态)。每次经过 1 ms,它们都会使用一个 EOP 来防止设备进入挂起状态。 - -.. note::这里需要注意的一点就是, J K状态和差分0/1,对于低速来说,和全速/高速是相反的。 - -下面我们通过一个波形,来区分这些信号状态: - -.. figure:: img/4.png - -- 第一个红框,可以看出是一个数据包的开始,并且假设这是一个全速设备,那么D+ 为高,D- 为低,是一个闲置状态。 -- 第二个红框,D+为低,D- 为高,说明是一个 K 状态,由 闲置转 K 状态说明他是一个 SOP。 -- 第三个红框开始表示数据,表示 JKJKJKJKJK。 -- 第四个红框表示 SE0 ,因为D+和 D-均为低电平。 -- 第五个红框,而 SE0 持续了一段时间后,变成了 D+高,D- 低,说明他是一个 J 状态,从 SE0 切换成 J 状态,说明他是一个 EOP。 - -USB 速度识别 ---------------------- - -USB 的速度是如何判定的? 这个见手册 7.1.5.1。USB 的速度检测主要是靠 D+ 和 D-线上拉 1.5K决定,如果 D+上拉1.5k,则该设备为全速设备,如果 D-上拉1.5k,则为低速设备。而高速设备初始是以一个全速设备的身份出现,和全速设备一样,D+线上有一个1.5k的上拉电阻。USB2.0的hub把它当作一个全速设备,之后,hub 和设备通过一系列握手信号确认双方的身份,最终判定该设备为高速设备。 - -.. figure:: img/5.png - -USB 连接与断开检测 ---------------------- - -那么 当我们的设备插上 USB 主机时,主机是如何知道有设备插入或者拔出呢?手册 7.1.7.3 给出了答案,如图所示: - -.. figure:: img/6.png -.. figure:: img/7.png - -首先是连接检测,主机检测到某一个数据线电平拉高保持了一段时间,就认为有设备连接上来了。低速设备连接时,主机会检测到D-线被拉高,全速/高速设备连接时,主机会检测到D+线被拉高。 -而断开检测,则是主机端D+、D-数据线上的下拉电阻起作用,断开后使得二者都在低电平;当低电平持续 TDDIS 时间就会被主机认为是断开状态。上图中,TDDIS在2到2.5us之间。 - -USB 电源 ---------------------- - -作为 USB 电源时, USB 设备可被划分为两种设备类型:总线供电和自供电。 - -- 总线供电是 USB 设计的一个优势。由于设备通过总线供电,因此不需要使用笨重的内部或外部电源,它仍能够维持自身操作。总线可由主机或集线器供电。使用某个总线供电的设备时,用户将设备配置为某种状态前必须考虑其功耗。 -- 自供电设备通过使用外部电源(如直流电源适配器或电池)为自己供电。自供电设备在进行设计的过程中需要考虑到一些注意事项。 USB 规范要求自供电设备一直监控自己的 VBUS 线。 VBUS 不存在的时间内,设备必须断开提供给 D+/D-线上的上拉电阻的电源,从而防止向主机或集线器供电。 否则,会导致 USB 合规性测试发生失败。但是自供电集线器能够从总线获得最多 100 mA 的电流。 - -USB 设备状态 ---------------------- - -在 USB 插上主机的那一刻, USB 设备本身的设备状态是会变化的。而这个设备状态,后面如果学习到枚举过程,可以知道,其实这段变化描述的就是枚举过程。这部分见手册 9.1.1。 - -.. figure:: img/9.png - -- 连接状态: 当将某个设备插入到主机/集线器,但主机/集线器不给 VBUS 线供电时,会出现这种状态。它通常在集线器检测到一个过流事件时出现。虽然仍连接着设备,但主机移除了供给它的电源。 -- 供电: 某个设备被连接到 USB 上并得到供电,但仍未接收到一个复位请求。 -- 默认: 某个设备被连接到 USB 上、得到供电,并且由主机进行了复位。这时,设备没有任何设备地址。 设备会响应地址 0。 -- 地址: 某个设备被连接到 USB、得到供电、被复位,并且有一个唯一的地址。但是设备仍未得到配置。 -- 配置: 设备已经连接到 USB、得到供电、被复位、具有唯一的地址、得到配置,但尚未进入挂起状态。此时,总线供电设备能够消耗超过 100 mA 的电流。 -- 挂起: 如上面所述,设备已经建立好了连接,并且得到配置,但在 3 ms 时间内不会进行任意总线操作。 - -翻译成中文图就是: - -.. figure:: img/10.png - -USB 编码与位填充 ---------------------- - -首先,USB 的数据是串行发送的,就像 UART、I2C、SPI 等等,连续的01 信号只通过一根数据线发送给接受者。但是因为发送者和接收者运行的频率不一样,信号的同步就是个问题,比如,接受者接收到了一个持续一段时间的低电平,无法得知这究竟是代表了 5 个 0 还是 1000 个 0。一个解决办法,就是在传输数据信号的同时,附加一个时钟信号,用来同步两端的传输,接受者在时钟信号的辅助下对数据信号采样,就可以正确解析出发送的数据了,比如 I2C 就是这样做的,SDA 来传输数据,SCL 来传输同步时钟: - -.. figure:: img/11.png - -虽然这样解决了问题,但是却需要附加一根时钟信号线来传输时钟。因为USB没有时钟信号,有没有不需要附加的时钟信号,也能保持两端的同步呢? -有的,这就是 RZ 编码(Return-to-zero Code),也叫做归零编码。 - -RZ 编码(Return-to-zero Code) -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -RZ 编码(Return-to-zero Code),也叫做归零编码。在 RZ 编码中,正电平代表逻辑 1,负电平代表逻辑 0,并且,每传输完一位数据,信号返回到零电平,也就是说,信号线上会出现 3 种电平:正电平、负电平、零电平。 - -.. figure:: img/12.png - -从图上就可以看出来,因为每位传输之后都要归零,所以接受者只要在信号归零后采样即可,这样就不在需要单独的时钟信号。实际上, RZ 编码就是相当于把时钟信号用归零编码在了数据之内。这样的信号也叫做自同步(self-clocking)信号。 -这样虽然省了时钟数据线,但是还是有缺点的,因为在 RZ 编码中,大部分的数据带宽,都用来传输“归零”而浪费掉了。 - -NRZ 编码(Non-return-to-zero Code) -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -去掉这个归零步骤,NRZ 编码(Non-return-to-zero Code)就出现了,和 RZ 的区别就是 NRZ 是不需要归零的。 - -.. figure:: img/13.png - -NRZI 编码(Non-Return-to-Zero Inverted Code) -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -NRZI 编码(Non-Return-to-Zero Inverted Code)和 NRZ 的区别就是 NRZI 用信号的翻转代表一个逻辑,信号保持不变代表另外一个逻辑。这个见手册 7.1.8。 - -.. figure:: img/14.png - -如图所示,可以得出一个简单的记忆方式:遇到 0 的边沿电平就翻转,遇到 1 的边沿则不变。 - -位填充(bit-stuffing) -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -但是,这样还是会有一个问题,就是虽然接受者可以主动和发送者的频率匹配,但是两者之间总会有误差。假如数据信号是 1000 个逻辑 1,经过 USB 的 NRZI 编码之后,就是很长一段没有变化的电平,在这种情况下,即使接受者的频率和发送者相差千分之一,就会造成把数据采样成 1001 个或者 999 个 1了。 -USB 对这个问题的解决办法,就是强制插 0,也就是(位填充)bit-stuffing,如果要传输的数据中有 6个连续的 1,发送前就会在第 6 个 1 后面强制插入一个 0,让发送的信号强制出现翻转,从而强制接受者进行频率调整。 -接受者只要删除 6 个连续 1 之后的 0,就可以恢复原始的数据了。这部分见手册 7.1.9。 - -.. figure:: img/15.png -.. figure:: img/16.png -.. figure:: img/17.png - -在数据被NRZI编码之前,在数据流中每六个连续的1之后插入一个0,以强制NRZI数据流中的过渡,这使接收器逻辑至少每七位有一次数据转换,以保证数据和时钟的锁定。比特填充是从同步模式开始启用。结束同步模式的数据 "一 "被算作是序列中的第一个 "一"。序列中的第一个。除了高速EOP期间,发射器的位填充总是被强制执行。如果需要按照 -位填充规则的要求,零位将被插入,即使它是数据包结束(EOP)信号前的最后一位。接收器必须对NRZI数据进行解码,识别填充位,并将其丢弃。 - -.. caution:: 以下内容可以用一张图概括,了解即可,没有必要死记硬背 - -.. figure:: img/usbstruct.png - -USB 字段(域) ---------------------- - -USB 字段构成了 USB 通信中最基本也是最小的单元,后面的包、事务,最根本都是由字段构成,而字段又是由比特构成。字段部分见手册 8.1。 - -.. note:: USB 的比特先行模式是按照 LSB 先行原则。 - -同步字段 -^^^^^^^^^^^^^^^^^^^^^^^^ - -在 USB 系统中,主机和设备不是共享一个时钟,这使得接收方没办法准确知道发送方什么时候发送数据,尽管能检测到SOP,但是远远不够,所有这个时候就需要同步字段,使得接收方和发送方收发过程中保持同步,所以任何一个包都要以同步字段开始。同步字段0x01,经过编码以后就是01010100B。 - -.. figure:: img/18.png - -包标识符字段 -^^^^^^^^^^^^^^^^^^^^^^^^ - -PID 由一个四位数据包类型字段和一个四位校验字段组成,占用 8 个bit,如图所示。 PID指示数据包的类型,并通过推断,数据包的格式和应用于数据包的错误检测类型包。 PID的四位校验字段是通过执行分组类型字段的一个补码来生成,从而确保PID的可靠解码,以便正确解释分组的其余部分,如果四个PID校验位不是它们各自的分组标识符位的补码,则存在PID错误。 - -.. figure:: img/19.png - -既然是 4个比特,说明了 PID 类型可以分为16种,从16种中,又细分成4类:令牌 PID,数据 PID,握手 PID 和特殊 PID。 - -.. figure:: img/20.png - -地址字段 -^^^^^^^^^^^^^^^^^^^^^^^^ - -地址字段又分为设备地址字段和端点地址字段,其中设备地址字段占用 7 个bit,除去0 地址,主机可以分配的地址有 127个。 - -.. figure:: img/21.png - -端点地址字段占用 4个 bit,总共可以提供 16 个端点。 - -.. figure:: img/22.png - -帧号字段 -^^^^^^^^^^^^^^^^^^^^^^^^ - -帧号字段占用 11 个bit,主机每发出一个帧,帧号都会加1,如图所示。而高速设备中,帧中又包含微帧,1帧=8微帧,微帧则是加0.1。关于帧和微帧的概念,后续补充。 - -.. figure:: img/23.png - -数据字段 -^^^^^^^^^^^^^^^^^^^^^^^^ - -根据传输类型不同,数据字段中的数据长度也是不定的,从 0-1024不等。 - -.. figure:: img/24.png - -CRC 字段 -^^^^^^^^^^^^^^^^^^^^^^^^ - -循环冗余校验(CRC)用于保护令牌和数据包中的所有非PID字段。PID不包含在包含CRC的分组的CRC校验中。 在执行比特填充之前,在发送器中的各个字段上生成所有CRC。 类似地,在去除填充位之后,在接收器中对CRC进行解码。令牌和数据包CRC为所有单比特和双比特错误提供100%的覆盖。 CRC失败被认为表示一个或多个受保护字段已损坏并导致接收器忽略这些字段,并且在大多数情况下,忽略整个数据包。 - -.. figure:: img/24.png - -- 令牌CRC - -为令牌提供五位CRC字段,并覆盖IN,SETUP和OUT令牌的ADDR和ENDP字段或SOF令牌的时间戳字段。 PING和SPLIT特殊令牌还包括一个五位CRC字段。 - -生成多项式为: G(X)= X^5 + X^2 + 1 -表示该多项式的二进制位模式是00101B。 如果接收到所有令牌位而没有错误,则接收器处的五位校验和将为01100B。 - -- 数据CRC - -数据CRC是应用于数据分组的数据字段的16位多项式。 - -生成多项式是:G(X)= X^16 + X^15 + X^2 + 1 -表示该多项式的二进制位模式是1000000000000101B。 如果没有错误地接收到所有数据和CRC位,则16位校验和将为1000000000001101B。 - -USB 包 ---------------------- - -包由字段组成,根据 PID 类型,包分为四大类:令牌包、数据包、握手包、特殊包。此节内容见官方 8.4.1。 - -.. figure:: img/25.png - -算上 SOP,则如图,组成一个完整的包。 - -.. figure:: img/26.png - -令牌包 -^^^^^^^^^^^^^^^^^^^^^^^^ - -令牌包分为:SETUP、IN、OUT、SOF,其中 SETUP、IN、OUT的字段组成一样,如图: - -.. figure:: img/27.png - -- PID 字段:定义了数据传输方向为USB主机到USB设备。 -- ADDR 字段:指明了USB设备地址。 -- ENDP 字段:指明了接收数据的端点号。 -- CRC 字段:用于ADDR字段和ENDP字段进行循环冗余校验。 - -SOF 包的字段组成,如图: - -.. figure:: img/28.png - -- PID 字段:定义了数据传输方向为USB主机到USB设备。 -- 帧号 字段:指明了USB传输的帧号,其11位。 -- CRC 字段:用于ADDR字段和ENDP字段进行循环冗余校验。 - -数据包 -^^^^^^^^^^^^^^^^^^^^^^^^ - -.. figure:: img/29.png - -- PID 字段:用于指明不同的数据包类型。支持 4 种数据包,分别为: DATAO 、 DATA1 、DATA2 和MDATA。 -- 数据 字段:其中包含了传输的数据。其数据的大小根据数据传输类吧和川户需要而定。根据 USB 协议的规定,对于低速 USB 数据传输, 最大长度为8字节对于全速SB 数据传输,其最大长度为 1023 字节;对于高速 USB 数据传输,数据最大长度为 1024 。 -- CRC 字段:这里使用 16 位的循环冗余校验来对数据字段进行保护。 - -握手包 -^^^^^^^^^^^^^^^^^^^^^^^^ - -握手包由8位的PID构成,用于数据传输的末位报告本次数据传输的状成。握手包之后使是整个事务处理的结束信号EOP. - -.. figure:: img/30.png - -特殊包 -^^^^^^^^^^^^^^^^^^^^^^^^ - -USB 事务 ---------------------- - -USB 常用事务共有三种:SETUP、IN、OUT,除了控制传输使用三个事务,其他传输都使用两个事务。特殊事务则是不携带数据的事务。 - -SETUP 事务 -^^^^^^^^^^^^^^^^^^^^^^^^ - -IN 事务 -^^^^^^^^^^^^^^^^^^^^^^^^ - -OUT 事务 -^^^^^^^^^^^^^^^^^^^^^^^^ - -特殊事务 -^^^^^^^^^^^^^^^^^^^^^^^^ - -USB 传输 ---------------------- - -控制传输 -^^^^^^^^^^^^^^^^^^^^^^^^ - -批量传输 -^^^^^^^^^^^^^^^^^^^^^^^^ - -中断传输 -^^^^^^^^^^^^^^^^^^^^^^^^ - -同步传输 -^^^^^^^^^^^^^^^^^^^^^^^^
\ No newline at end of file diff --git a/docs/source/usb/usb3.0_basic.rst b/docs/source/usb/usb3.0_basic.rst deleted file mode 100644 index 1dbbd815..00000000 --- a/docs/source/usb/usb3.0_basic.rst +++ /dev/null @@ -1,33 +0,0 @@ -USB 基本概念(3.0 为主) -=========================== - - -简介 ------------- - - - -与 USB 2.0 相同和不同点 --------------------------- - - -Link Layer --------------------- - -LCW -^^^^^^^^^^ - -Protocol Layer --------------------- - -LMP -^^^^^^^^^^^^^^^^^^^^^^^^ - -TP -^^^^^^^^^^^^^^^^^^^^^^^^ - -DP -^^^^^^^^^^^^^^^^^^^^^^^^ - -ITP -^^^^^^^^^^^^^^^^^^^^^^^^
\ No newline at end of file diff --git a/docs/source/usb/usb_desc.rst b/docs/source/usb/usb_desc.rst deleted file mode 100644 index f0bcc7fe..00000000 --- a/docs/source/usb/usb_desc.rst +++ /dev/null @@ -1,37 +0,0 @@ -USB 描述符 -=========================== - -本节参考官方 usb2.0 pdf 9.5 节即可。 - -设备描述符 ---------------------- - -配置描述符 ---------------------- - -接口描述符 ---------------------- - -端点描述符 ---------------------- - -字符串描述符 ---------------------- - -接口关联描述符 ---------------------- - -设备限定描述符 ---------------------- - -其他速度描述符 ---------------------- - -BOS 描述符 ---------------------- - -超高速端点伴随描述符 ---------------------- - -增加型超高速同步端点伴随描述符 -------------------------------- diff --git a/docs/source/usb/usb_enum.rst b/docs/source/usb/usb_enum.rst deleted file mode 100644 index 1434424f..00000000 --- a/docs/source/usb/usb_enum.rst +++ /dev/null @@ -1,22 +0,0 @@ -USB 枚举 -=========================== - -当我们了解了 usb 设备请求以后,就可以来学习下 USB 设备的整个枚举过程了,看看是如何枚举出一个串口、鼠标、u盘等设备了。枚举过程中主机会发送设备请求来获取相关信息(也就是描述符),具体发送哪些,参考下图。 - -.. figure:: img/usb_enum.png - -- 首先设备接上 USB 线,然后插上电脑 -- 设备插上以后上电,处于供电状态 -- 主机通过 D+/D- 识别到设备插入 -- 对设备进行复位 -- 主机发送 **获取设备描述符请求** -- 可选的复位操作 -- 主机发送 **设置设备地址请求** -- 主机发送 **获取配置描述符请求**,可能会获取多次,无所谓 -- 主机发送 **获取字符串描述符请求**,正常会获取3个字符串,如果后面的描述符中指定了字符串,则继续获取指定的字符串 -- 主机发送 **获取设备限定描述符请求**,用来获取在设备工作在其他速度上的请求,如果设备只能工作在全速模式,则必须回复 stall,并且协议栈中一定会打印该请求告诉你此命令设备不支持。 -- 主机发送 **设置配置请求**,对设备的端点进行配置,通常是根据端点描述符中的配置进行设置。 -- 到此标准的设备请求结束 -- 主机根据接口描述符加载对应支持的 class 驱动,如果主机不支持,则会提示该设备找不到驱动 -- 加载完成以后,开始执行该 class 相关的请求 -- 最终进行 class 的数据流传输
\ No newline at end of file diff --git a/docs/source/usb/usb_ext.rst b/docs/source/usb/usb_ext.rst deleted file mode 100644 index 86b87a53..00000000 --- a/docs/source/usb/usb_ext.rst +++ /dev/null @@ -1,39 +0,0 @@ -.. _usb_ext: - -USB 知识点拓展 -=========================== - -什么是分包 -------------- - -由于 USB 协议中规定了每个包的最大长度,所以当我们发送的数据长度超过了最大包长度时,就需要分包发送,这就是分包。比如 ep mps 为 64,数据长度为 129,则 USB 会按照 64 + 64 + 1 的形式传输。 -而对于 USB IP 来说,分包分为软件分包和硬件分包,软件分包就是用户代码自行分包,这种 ip 一般都使用 FIFO 来进行,因为 FIFO 深度是有限的;第二种 -则是使用硬件分包,这种 USB IP 一般带 DMA 或者描述符 DMA 功能,那么这种 IP 的效率无疑是最高的,cherryusb 中充分利用了这点,使得 USB 速度能够达到最高。 - -对于软件分包来说,一次发送的长度即使是 16K, **内部也是通过软件分包的,在这种情况下,发送长度的多少不会对速度有任何提升**。 -对于硬件分包来说,发送的长度会影响速度,因为硬件分包是通过 DMA 来进行的, **一次发送的长度越大,DMA 的效率就越高,速度也就越快**。(当然,其他协议栈虽然使用了 dma,但是部分代码实现还是按照一个包进行,等于没用,这也是速度低的一个原因) - -什么是短包 ----------------- - -在上面我们讲了分包之后,短包就是分包的最后一个包(并且长度小于 EP MPS).比如发送 129 字节的数据,那么 USB 会按照 64 + 64 + 1 的形式传输,最后一个包是1个字节,这1个字节就是短包。 - -什么是 ZLP -------------- - -ZLP,顾名思义,零长度数据包,也就是数据长度为0 的短包。是 USB 设备在数据传输结束时,如果数据长度正好是最大包长度的整数倍,那么就需要发送一个 ZLP 数据包,用来告诉对方数据传输结束。 - -.. caution:: ZLP 功能仅限于 CONTROL 和 BULK 传输 - -什么时候算中断完成 --------------------- - -从机接收:接收的长度与设置的长度相等;接收的最后一个包为短包。 -从机发送:发送的长度与设置的长度相等,如果发送的长度是 EP MPS 的整数倍, **通常** 需要再发送一个 ZLP(仅限 control 和 bulk 传输)。 - -.. note:: 对于从机接收,并且是 bulk 传输,接收长度通常设计为 EP MPS,以下三种情况可以修改为多个 EP MPS: 固定长度;自定义协议并携带长度(例如 MSC); 主机手动发送 ZLP 或者短包(例如 RNDIS) - -.. note:: 对于从机发送,并且是 bulk 传输,发送长度没有限制,但是如果是 EP MPS 整数倍,通常需要发送 ZLP。自定义协议则不需要发送 ZLP,例如 MSC。 - -主机接收:同从机接收 -主机发送:发送的长度与设置的长度相等 diff --git a/docs/source/usb/usb_request.rst b/docs/source/usb/usb_request.rst deleted file mode 100644 index 8e42565d..00000000 --- a/docs/source/usb/usb_request.rst +++ /dev/null @@ -1,6 +0,0 @@ -USB 设备请求 -=========================== - -本节参考官方 usb2.0 pdf 9.3、9.4 节即可。 - -.. figure:: img/usb_request.png |
