我有一个随机的扬声器,我想为它开发一个驱动程序,这样我就可以向文件系统报告统计信息、电池等dev
。但是,我很难找到扬声器的供应商和设备 ID,以便将其与驱动程序正确关联。
我什至不知道制造商是谁,我的 Linux 机器也检测不到它(lsusb
和其他实用程序),T&G 的扬声器看起来和我的一模一样,但我的有不同的标志(橙色花),不是T&G的一个。
每台设备是否都有与之关联的供应商和产品 ID?
如果是这样,如果您不知道您的设备并且您的机器无法识别它,您如何找到它?
是否有可能通过我的扬声器的 USB 端口向我的机器报告电池和其他统计数据,我认为它应该与 USB 卡一起使用?
每个通过 USB 通信的设备都有一个 VID(供应商 ID)和 PID(产品 ID)。供应商 ID 是通过 USB 实施者论坛 (USB.org) 获得的,这或多或少保证了其唯一性。
当您插入 USB 设备时,您应该会在 的输出中看到它
dmesg
,即使该设备不受支持也是如此。我还没有见过不这样显示的USB设备。另一种方法是,该设备根本不通过 USB 进行通信,而仅使用 USB 连接器进行充电。
每个“USB 设备”都有一个供应商 ID 和产品 ID。但是,我们必须注意“USB 设备”的含义。并非所有带有 USB 端口的东西都是“USB 设备”。
首先,USB 主机不被视为“设备”。原则上(暂时忽略 USB C)主机应该有 A 连接器,设备应该有 B 连接器,而能够充当两者的设备应该有 AB 连接器。在实践中,这一点常常被忽略。
其次,很多东西只是将 USB 连接器用作充电的电源端口,根本不充当 USB 主机或设备。
如果它没有出现在 lsusb 中,它几乎可以肯定不是 USB 设备。
USB C 进一步混淆了水域,连接器可用于主机、设备和“双重角色设备”(既可以充当主机又可以充当设备的东西)。
在最简单的层面上,仅在设备模式下运行的 C 端口可以使用“CC”引脚上的电阻来指示这一事实。固定主机端口稍微复杂一些,因为除非在另一端连接了设备,否则它们不应该提供电源,但仍然相对简单。IIRC 双角色端口应该在充当主机端口和充当设备端口之间快速来回切换。
然而,USB C 也可以选择在“CC”引脚上使用主动协商。这可用于协商更高的功率级别,协商以与数据相反的方向传输功率,甚至协商使用 USB 以外的协议。
每个 USB 设备都必须使用一个在 VID 和 PID 字段中包含 16 位值的数据包来标识自己。鉴于可能有超过 65,535 个生产 USB 设备的实体,不可能所有生产 USB 设备的实体都具有与之关联的唯一 VID。
在许多情况下,USB 控制器芯片供应商允许配置其设备报告,使用该芯片的设备将使用供应商特定的名称进行编程,但制造商的默认 VID/PID 组合。这将允许供应商提供的驱动程序无需修改即可与设备一起工作,但将要求软件检查设备名称以确定它应该尝试与哪些设备通信。
回到 1990 年代,当开发 USB 时,使用 16 位 VID/PID 可能几乎是有意义的,但供应商和产品的数量意味着它们如今对于它们的预期用途来说少得可怜。
其他人已经提到
dmesg
在枚举完成后报告连接的 USB 设备的 VID/PID。dmesg
还可以报告无法枚举 USB 设备的错误。例如,在 Ubuntu 18.04 下只是尝试插入一个 USB 2 设备,它没有出现在
lsusb
. 检查时dmesg
出现以下错误:断开并重新连接 USB 设备,这次设备出现在输出中
lsusb
并dmesg
报告了 VID/PID: