根据维基百科, USB:
定义用于计算机和电子设备之间连接、通信和供电的总线中使用的电缆、连接器和通信协议
但真的有“USB 吗”通信协议“? 我的理解就是它:
- 将 USB 设备连接到机器(例如 Ubuntu 或任何类型的 Linux)
- Linux 找到该设备的设备驱动程序(不知何故 -奖金如果你知道的话!)并加载它
- 设备现已连接
/dev/theDevice
- 用户空间应用程序现在可以读取/写入,
/dev/theDevice
并且驱动程序处理底层设备/硬件的低级 IO
对我来说,此流程中没有出现“USB 通信协议”。如果我的理解正确,USB 只是 PC 和设备之间的电缆和电气连接。
我错了吗?USB 是否真的实现了某种强调上述流程的低级协议?如果是这样,它是什么?它在 30,000 英尺的视野下如何工作?
答案1
是的,明白USB 协议
据我了解,USB 规范定义了一组复杂的分层协议和设备配置文件。
例如,USB 设备可以符合大容量存储、键盘(或人机接口设备等)等高级模板,并由通用设备驱动程序管理。一些 USB 设备可以在较低级别进行通信,这样操作系统的低级 USB 支持就可以识别出需要特定于设备的高级驱动程序。
答案2
问题:是否存在运行的低级 USB 通信协议?它是什么?
回答:
是的,USB 规范包括USB 协议它定义了总线在位层面的使用方式。这将是“低级”协议,它是高级协议(即大容量存储、HID 等)的基础。
有关 USB 协议如何工作的详细信息,请参见OSDev 维基很有帮助。下面是另一个有趣的描述使用序列图描述每个 USB 协议的各种数据交易。
附加问题:Linux 如何查找并加载该设备的设备驱动程序?
奖金回答:
在 Linux 上使用支持 USB 的内核时,将通过硬件和核心由于 USB 规范。在硬件方面,检测由 USB 主机控制器完成。然后在内核中,主机控制器驱动程序接管并将线路上的低级位转换为 USB 协议格式的信息。然后,此信息将填充到内核中的 USB 核心驱动程序中。'
我转述自这篇优秀的Opensourceforu 文章,其中对您的 Linux 环境中的问题有更详细和更清晰的解释。
答案3
与几乎所有其他类型的通信接口一样,USB 是作为一种协议实现的堆。此堆栈中所有或多种设备所共有的级别由 USB 标准本身定义,这既实现了兼容性,又防止了每个设备进行冗余协议设计。此外,协议的每一层都抽象出了下一层不需要担心的细节。因此,当您实际编写设备特定层时,您只需要通用的“发送”和“接收”函数即可将数据从端点 A 发送到端点 B。作为设备设计者,您不必关心这是如何发生的。此外,协议堆栈中的较低级别可以更改实现,只要它们向其上方的层公开一个通用接口即可。这样,当协议堆栈的一部分发生变化时,堆栈的其余部分不一定必须更改。理想情况下,堆栈较高级别的协议甚至不必关心确切的哪个协议正在堆栈的某个较低级别使用。一般来说,堆栈下的每个连续层都会在发送消息时将下一最高层生成的消息封装在其自己的有效负载字段中。收到消息时,每层都会剥离与该层相关的部分,并将其有效负载转发到堆栈上下一个适当的层。这不仅适用于 USB,而且适用于几乎所有通信总线。例如,TCP/IP/以太网堆栈可能是其中最常用的。给定层通常负责的任务在模型中描述,例如OSI 模型。
在 USB 中,有一个物理层协议,它定义线路上的电压状态/时序/等以及应如何解释它们。该协议显然需要成为 USB 标准本身的一部分,而不是特定于特定设备(特别是因为主机无法知道即将插入给定 USB 端口的设备类型。)
接下来是总线管理协议,用于描述谁可以在何时在总线上通话。这在 OSI 模型中称为媒体访问层。在 USB 中,这一层可以概括为“当主机告诉设备传输数据时,设备可以传输数据”,因此 USB 中这一层没有特别复杂的协议。
接下来,有一个标准协议描述数据包以及如何将其从发送方路由到接收方。这一层也需要成为 USB 标准本身的一部分,以便在主机实际知道特定类型的设备之前进行初始通信以发现已连接的设备类型。除了每个设备在这一层都有特定的 ID 之外,USB 中还有端点 ID 的概念。这允许任何给定设备具有多个 USB 端点,这些端点由标准 USB 堆栈进行多路复用和解复用,就像套接字由标准 TCP/IP 堆栈进行多路复用和解复用一样。应用程序可以将这些端点中的每一个视为单独的数据流。
最后,还有为设备本身定义的协议。请注意,USB 标准中实际上包含一些常见的预先设计的协议,用于常见用例,例如大容量存储设备、鼠标、键盘等,这样每个设备制造商就不必重新发明轮子了。但是,更复杂的设备可以自由地在此层设计自己的自定义协议。给定传输的此层输出作为上一层数据包的有效负载传递。请注意,对于足够复杂的设备,协议的设备特定部分本身可以分为多个独立的层,但较低级别不必知道或关心这一点。他们只需要知道他们需要将一组给定的字节从主机传递到特定的设备端点或从特定的设备端点传递到主机。同样,在层之间使用标准接口可以分离关注点,因此一个层不必关心另一个层的内部工作,而只需关心它应该传递给或期望从堆栈中紧挨着它的上层或下层接收的特定数据。
答案4
也许部分答案在于“通信协议“。访问与您相同的来源(维基百科),您将找到有用的信息,例如:
- 为了进行沟通,必须达成协议。
- 通信系统使用明确定义的格式(协议)来交换消息。
- 协议必须定义通信的语法、语义和同步。
- 因此,协议可以作为硬件、软件或两者来实现。
一个简单的思考方式是协议是预先定义并商定的做某事的方式,在这种情况下某物是如何将数据移入和移出 USB 连接设备。从硬件角度来看,每个别针具有预定义的电压水平和使用协议,每种类型的设备都有预定义的使用协议每个别针,并且每个数据包具有预定义的语法和数据格式。此外,还有通信握手协议。总的来说,这些都是使用 USB 设备的标准集合的一部分,又称USB 协议由委员会成员决定(即设计、提出、辩论、修改并最终同意)USB 实施者论坛
是的,是USB 协议,或者更准确地说是一系列预定义和约定的 USB 协议s适用于不同的 USB 用途。