真的有“USB通信协议”吗?

sme*_*eeb 25 linux usb linux-device-driver

根据维基百科,USB:

定义总线中使用的电缆、连接器和通信协议,用于计算机和电子设备之间的连接、通信和供电

但是真的有“USB通信协议”吗?我的理解是:

  1. 您将 USB 设备连接到机器(例如,Ubuntu 或任何类型的 Linux)
  2. Linux 找到该设备的设备驱动程序(不知何故 -如果你知道的话,奖金!)并加载它
  3. 该设备现在连接在 /dev/theDevice
  4. 用户空间应用程序现在可以读/写,/dev/theDevice驱动程序处理底层设备/硬件的低级 IO

对我来说,这个流程中没有任何地方出现“USB 通信协议”。如果我的理解是正确的,USB 只是 PC 和设备之间的电缆和电气连接。

我在这里错了吗?USB 是否真的实现了某种强调上述流程的低级协议?如果是这样,它是什么以及它在 30,000 英尺的视野中如何工作?

Red*_*ick 48

是的,请参阅USB 协议

据我了解,USB 规范定义了一组复杂的分层协议和设备配置文件。

例如,USB 设备可以符合大容量存储、键盘(或人机接口设备等)等高级模板,并由通用设备驱动程序管理。一些 USB 设备可以在较低级别进行通信,以便操作系统低级别 USB 支持可以识别需要特定于设备的更高级别驱动程序。


pro*_*tdp 31

问题:是否有正在运行的低级 USB 通信协议?它是什么?

回答:

是的,USB 规范包括USB 协议,该协议定义了在位级别上使用总线的方式。这将是作为高级协议(即大容量存储、HID 等)基础的“低级”协议。

有关 USB 协议如何工作的详细信息,此OSDev wiki很有帮助。这是另一个有趣的描述,使用序列图来描述每个 USB 协议的各种数据事务。

附加问题:Linux 如何找到并加载该设备的设备驱动程序?

奖金答案:

'在 Linux 上,当使用支持 USB 的内核时,由于 USB 规范,将通过硬件内核检测到正在工作的 USB 设备。在硬件方面,检测由 USB 主机控制器完成。然后在内核中,主机控制器驱动程序接管并将线路上的低级位转换为 USB 协议格式的信息。然后,此信息会填充到内核中的 USB 核心驱动程序中。

我转述了这篇优秀的Opensourceforu 文章,它对您在 Linux 上下文中的问题有更多的细节和清晰度。

  • 我希望“奖金问题”对您来说意味着“赏金”。 (7认同)

rei*_*rab 14

与几乎所有其他类型的通信接口一样,USB 被实现为协议. 该堆栈中所有或多种类型的设备通用的级别由 USB 标准本身定义,这既可以实现兼容性又可以防止每个设备进行冗余协议设计。此外,协议的每一层都抽象出下一层不需要担心的细节。因此,当您实际编写特定于设备的层时,您只需要通用的“发送”和“接收”函数将数据从端点 A 发送到端点 B。作为设备设计者,您不必关心这是怎么发生的。此外,协议栈中的较低级别可以更改实现,只要它们向其上层公开一个公共接口即可。这样,当协议栈的一部分发生变化时,协议栈的其余部分不一定要发生变化。哪个协议正在堆栈的某个较低级别使用。一般而言,在发送消息时,堆栈中的每个连续层都会将下一个最高层产生的消息封装在其自己的有效载荷字段中。当收到消息时,每一层都会剥离与该层相关的部分,并将其有效载荷转发到堆栈上的下一个适当层。这不仅适用于 USB,而且适用于几乎所有通信总线。例如,TCP/IP/以太网堆栈可能是其中最常用的。给定层通常负责的任务在模型中进行了描述,例如OSI 模型

在 USB 中,有一个定义电压状态/时序等的物理层协议。在电线上以及如何解释它们。该协议显然需要成为 USB 标准本身的一部分,而不是特定于给定设备(特别是因为主机无法知道将要插入给定 USB 端口的设备类型。)

接下来是总线管理协议,用于描述谁可以在总线上通话。这在 OSI 模型中称为媒体访问层。在 USB 中,这一层几乎可以概括为“设备可以在主机告诉它这样做时进行传输”,因此 USB 中的这一层没有特别复杂的协议。

接下来,有一个标准协议来描述数据包以及它应该如何从发送方路由到接收方。该层还需要成为 USB 标准本身的一部分,以便在主机实际知道特定类型的设备之前进行初始通信,以发现已连接的设备类型。除了每个设备在这一层都有一个特定的 ID 之外,USB 中还有一个端点 ID 的概念。这允许任何给定的设备具有多个 USB 端点,这些端点由标准 USB 堆栈多路复用和解复用,这与标准 TCP/IP 堆栈对套接字进行多路复用和解复用的方式非常相似。应用程序可以将这些端点中的每一个视为单独的数据流。

最后,还有为设备本身定义的协议。请注意,实际上有一些常见的预先设计的包含在常见用例的 USB 标准中,例如大容量存储设备、鼠标、键盘等,因此每个设备制造商都不必重新发明车轮。但是,更复杂的设备可以在这一层自由设计自己的自定义协议。对于给定传输,该层的输出作为前一层数据包的有效载荷传递。请注意,对于足够复杂的设备,协议的特定于设备的部分本身可能被划分为多个独立的层,但较低的层不必知道或关心这一点。他们只需要知道他们需要将一组给定的字节从主机传递到特定的设备端点或从特定的设备端点传递到主机。同样,层之间的标准接口允许关注点分离,因此一层不必关心另一层的内部工作,而只关心它应该传递给或期望从紧接其上的层接收的特定数据或在它下面的堆栈中。


MSa*_*ers 9

实际上有一组相关的通信协议进行交互。

在最底层,有一个协议描述了如何通过串行连接发送字节数据包。这对于所有 USB 设备都是通用的(但 USB2 和 USB3 之间有所不同)。

发送的第一个数据包中的一个要求设备描述自己。为防止出现先有鸡还是先有蛋的问题,所有 USB 设备的识别协议都是相同的。操作系统可以使用此标识加载正确的驱动程序。

在另一个层面上,USB 是一种总线,这意味着多个设备必须共享带宽。这意味着有一个协议告诉每个设备什么时候可以说话,什么时候不能。由于所有 USB 设备都必须遵守这一点,因此使用通用协议来安排这一点。

最后,许多简单的 USB 设备都非常简单,以至于有描述整类设备(鼠标、键盘、存储、以太网适配器等)的附加协议。大多数设备支持零个或一个这些功能协议。


O.M*_*.Y. 5

或许部分答案在于“通信协议”一词的定义范围内。转到您所做的相同来源(维基百科),您会找到有用的信息,例如:

  • 为了进行通信,必须就协议达成一致。
  • 通信系统使用定义明确的格式(协议)来交换消息。
  • 协议必须定义通信的语法、语义和同步。
  • 因此,协议可以作为硬件、软件或两者来实现。

一种简单的思考方式是,协议是一种预先定义和商定的做某事的方式,在这种情况下,某事是如何将数据移入和移出 USB 连接的设备。在硬件方面,每个引脚都有一个预定义的电压电平和使用协议,每种类型的设备每个引脚都有一个预定义的使用协议,每个数据包都有一个预定义的语法和数据格式。还有一个通信握手协议。总的来说,这些都是使用 USB 设备的标准集合的所有部分,也就是 USB 协议USB 实施者论坛的成员决定(即,设计、提议、辩论、修订并最终同意)

所以,是的,有一个USB协议,或者更正确地存在一些预先定义并在USB协议约定小号不同的USB用途。