10

很长一段时间以来,我一直在寻找有关 USB 协议和电缆如何工作的详细说明,但没有成功。我正在寻找关于 USB 的软件和硬件方面如何工作的详细但不过分复杂的解释。链接和解释将不胜感激。我真的没有想法了,所以如果你能帮助我,那就太好了。


这是我所知道的:

USB 硬件带有 4 条线路 - 5V 电源、地线和 2 条全双工线路。

连接时,设备可以要求指定数量的电流。

与传统的串行连接相比,USB 的传输速度相当快。

连接时,设备将向主机输出描述自身的描述符。这些描述符也将用于数据。


我不知道的是:

C/C++ 程序如何直接写入 USB 端口?它会写入端口中的地址吗?

某些设备如何将自己描述为 HID?

驱动程序如何工作?

其他一切...


谢谢!

4

2 回答 2

22

鉴别

每个设备都有一个(唯一的)供应商和产品 ID。这些由 usb.org 提供(出售)以识别设备。您可以使用 libusbx 之类的库来枚举所有连接的设备,然后选择具有您要查找的供应商和产品 ID 的设备。

HID 描述符

HID 描述符的目的实际上是取消驱动程序。HID 描述符是描述设备的通用方式,因此您无需在每个系统/架构/etc/ 的驱动程序上浪费时间。(与 JVM 相同的概念。)

报告

您将使用输入、输出或功能报告来读取或写入您的设备。您在输入或功能报告上向您的设备发送一个流。我相信这通常是 8 个字节。其中只有一个是您要编写的单个字符。HID 描述符包含整理报告所需的所有信息。尽管我正在努力寻找相关链接来澄清这一点。

潜在图书馆

为了保持开放的心态,这里列出了我熟悉的所有库以及一些关于它们的信息。

libusb-0.1

首先是 libusb-0.1。我相信这曾经是许多 Linux 内核和 Windows 的首选并内置于其中。它非常易于使用,并且有很多文档。但是,所有者从未更新,并且多年未编辑。它仅支持同步传输。(如果发生错误,程序可以在等待传输时无限等待。)

libusbx

接下来是 libusbx。这是今天大多数人的建议,我同意。它是由那些对 libusb-0.1 的所有者感到沮丧的人发布的。该代码更轻量级、最新,重要的是不需要像 libusb-0.1 和 libusb-1.0 那样的 root 权限(稍后讨论)。它支持同步或异步传输。

libusb-1.0

然后是 libusb-1.0。这是多年来对 libusb-0.1 的第一次更新。它与 libusb-0.1 不兼容。这与 libusbx 在同一天发布,作为报复(我假设)并试图纠正缺乏更新内容并保护用户群。它支持同步或异步传输。

隐藏.h

最后,还有隐藏库。这是建立在 libusb 之上的另一个抽象层。但老实说,我认为这真的很令人困惑,而且它只会增加不必要的开销。

一些好的资源

了解 HID 描述符

控制消息传输文档(非常好的链接 IMO)

滚动你自己的 HID 描述符

用于传输的 HID 报告的良好视觉效果

bmRequestType 常量列表(你需要这个或类似的)

一个使用 libusbx 和 libusb-0.1 与 DigiSpark 对话的简单终端应用程序

我知道这不是您正在寻找的东西,但也许它会让您入门!

于 2013-07-16T14:39:43.410 回答
0

该网站对 USB 设备的工作原理进行了总体概述: https ://www.beyondlogic.org/usbnutshell/usb1.shtml

特定部分从您还不知道的关于 USB 的事情列表中给出了答案。

例如,要了解 USB 设备如何识别自己,请阅读 USB 描述符: https ://www.beyondlogic.org/usbnutshell/usb5.shtml#DeviceDescriptors

要了解 C/C++ 程序如何与 USB 设备通信,请参阅使用libusb库的示例: https ://github.com/libusb/libusb/tree/master/examples

要了解 USB 驱动程序的工作原理,请参阅 Bootlin 的教程: https ://bootlin.com/blog/usb-slides/

于 2022-02-05T10:42:56.977 回答