docs: update doc

This commit is contained in:
sakumisu
2024-08-21 20:04:18 +08:00
parent f0fc75179e
commit 43dc854b4d
11 changed files with 83 additions and 182 deletions

View File

@@ -0,0 +1,24 @@
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但是部分代码实现还是按照一个包进行等于没用这也是速度低的一个原因
什么是 ZLP
-------------
ZLP顾名思义零长度数据包是 USB 设备在数据传输结束时,如果数据长度正好是最大包长度的整数倍,那么就会发送一个 ZLP 数据包,用来告诉主机数据传输结束。
当我们发送或者接收的时候,如果没有相关的协议告诉我们接收或者发送的长度,这种情况下我们就需要 ZLP 功能。
.. caution:: ZLP 功能仅限于 CONTROL 和 BULK 传输
比如 cdc acm本身是没有协议的所以我们发送需要 ZLP接收也需要 ZLP但是又由于 PC 的 USB 主机驱动默认 **接收不开 ZLP**, 因此,我们 **接收的长度必须设置为 EP MPS**,通常为 64 或者 512
而如果接收的数据不设置成 EP MPS ,就会带来数据接收不完成的问题,比如设置成 2048,如果主机发送的是 512/1025/1536则 USB IP 不会进入完成状态,因为完成的条件是数据等于 2048 或者最后一个包是短包。
再比如 MSC MSC 的逻辑是 CMD + DATA + STATUS 的流程CMD 阶段包含了要接收或者发送的数据长度,所以不需要 ZLP 功能。