USB细节-迄今为止没有运气

11

我长时间以来一直在寻找有关USB协议和电缆如何工作的详细描述,但没有成功。我正在寻找详细但不过于复杂的USB软件和硬件方面的工作原理解释。您可以提供链接和解释。我已经没有任何想法了,所以如果您能帮助我就太好了。


这是我所知道的:

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

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

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

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


我不知道的:

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

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

驱动程序是如何工作的?

其他所有内容...


谢谢!


@phileaton 感谢您的帮助!不过,我真的很想知道幕后发生了什么。 - Blue Ice
2个回答

26

识别

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

HID描述符

HID描述符的目的实际上是为了摆脱驱动程序。HID描述符是一种通用的描述设备的方式,因此您不需要为每个系统/架构等制作驱动程序。(与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不兼容。我认为这是出于报复和试图纠正缺乏更新内容并保留用户群体而发布的,支持同步或异步传输。

hid.h

最后,还有hid库。这是建立在libusb之上的另一层抽象。但老实说,我认为它非常令人困惑,并且只增加了不必要的开销。

一些好资源

理解HID描述符

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

自定义HID描述符

HID报告传输的良好可视化效果

bmRequestType常量的绝佳列表(您将需要这个或类似的内容)

使用libusbx和libusb-0.1与DigiSpark通信的简单终端应用程序

我知道这不完全是你要找的,但也许可以帮助你入门!


哇,phileaton...这是一个很好的答案。它会让我有所启发,谢谢你帮我澄清我的问题! - Blue Ice
2018年更新:Libusbx已经合并回到libusb-1.0中,后者现在是这个库的唯一维护版本。https://libusb.info/目前是唯一的官方网站。看起来libusb-1.0是USB编程的首选库。 - Jochem Kuijpers
Libusbx不再维护。您应该使用libusb代替。 - neo
这里也有hiddev https://github.com/torvalds/linux/blob/master/Documentation/hid/hiddev.txt。 - Zixradoom
所有链接都已失效。 - D Left Adjoint to U

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/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接