关于 USB 的详细信息 - 到目前为止还没有运气

Posted

技术标签:

【中文标题】关于 USB 的详细信息 - 到目前为止还没有运气【英文标题】:Details on USB- no luck so far 【发布时间】:2013-07-14 19:22:36 【问题描述】:

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


这是我所知道的:

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

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

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

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


我不知道的:

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

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

驱动程序是如何工作的?

其他的...


谢谢!

【问题讨论】:

@phileaton 感谢您的帮助!但是,我真的很想知道幕后发生了什么。 【参考方案1】:

识别

每个设备都有一个(唯一的)供应商和产品 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 在同一天发布,作为报复(我假设)并试图纠正缺乏更新内容并保护用户群。它支持同步或异步传输。

hid.h

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

一些不错的资源

Understanding HID Descriptors

Control Message Transfer Documentation(非常好的链接 IMO)

Rolling Your Own HID Descriptor

Good Visual of HID Reports for Transfers

Great List of bmRequestType constants(你需要这个或类似的)

A simple terminal app for speaking with DigiSpark using libusbx and libusb-0.1

我知道这不是您正在寻找的,但也许它会让您开始!

【讨论】:

哇 phileaton ...这是一个很好的答案。它会让我开始,感谢您帮助我解决我的问题! 2018 年更新:Libusbx 被合并回 libusb-1.0,我相信这是该库的唯一维护版本。 libusb.info是目前唯一的官方网站。似乎 libusb-1.0 是 USB 编程的首选库。 Libusbx 不再维护。您应该改用 libusb。 还有hiddev github.com/torvalds/linux/blob/master/Documentation/hid/… 所有链接都坏了【参考方案2】:

本网站概述了 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/

【讨论】:

以上是关于关于 USB 的详细信息 - 到目前为止还没有运气的主要内容,如果未能解决你的问题,请参考以下文章

开始/结束外观转换的不平衡调用

Mac OS X Snow Leopard 上的 MOD_WSGI 困难

JSON 到 HTML 表格代码

完整日历,如何隐藏时间列并按顺序列出事件

如何在行内的元素之间给出间距

从 Python(熊猫)中的日期列获取周开始日期(星期一)?