如何与 USB 集线器后面的设备通信?

How to communicate with the devices behind a USB hub?

我需要一位 USB 专家。我有一个带有 MAX3421 作为 USB 主机的小硬件。我连接内部由两个设备组成的打印机:打印机本身和扫描仪。两者都通过内置集线器作为单独的设备公开。这些设备是全速的。

我已经阅读了庞大的 USB 2.0 手册 (http://www.usb.org/developers/docs/usb20_docs),我在其中搜索了如何通过集线器与后面的设备进行通信的方式,但是文档缺少这个重要的细节。

我可以按照第 11.24.2 章中的描述向集线器发送命令,例如获取集线器描述符,SET_FEATURE(重置)重置打印机中的设备,GET_STATUS(端口 1) returns 正确地将 4 个字节与集线器中端口 1 的状态相匹配。

但是我如何获取例如扫描仪的设备描述符?

我已将设备地址 1 分配给集线器并尝试与设备地址 2 上的 scanner/printer 通信(假设它可能在那里)但是当我发送 GET_DESCRIPTOR(设备)到设备地址 2,尽管在执行重置后两个集线器端口都已通电并启用。

我已经阅读了很多关于 SPLIT 代币的文章,但它们似乎只用于高速集线器。但是我打印机中的集线器是全速的。

文档在任何地方都没有说明如何做到这一点。 这记录在哪里?

无人接听?好像是一道难题。

同时我在这里找到了答案: http://www.microchip.com/forums/m523103.aspx#523499

向集线器上的端口发送 SET_FEATURE(重置)后,连接到该端口的设备在 USB 总线上显示为 设备地址 00。 然后你可以按照通常的方式获取设备描述符并对这个设备执行SET_ADDRESS。

USB 规范确实不完整。

在 USB 2.0 规范中没有通俗易懂地解释 USB 端口(根端口或集线器端口)背后的设备枚举过程在某种程度上是正确的,但整个想法都嵌入到 DS 的所有状态机中(下游)端口行为。

最初,所有 USB 端口都被禁用以进行通信。唯一启用的功能是 "port connect" 状态。如果将多个设备插入多个端口(同时插入或在通电时插入),则 USB 通信尚未发生。所有 USB 设备在上电时都设计为响应默认地址 00。但是由于尚未启用任何端口,因此没有人响应任何内容。

然后 HOST 从第一个端口开始转到指示 "connection" 的每个单独端口。主机将端口设置为 PORT_RESET 模式,连接的设备将使用 Chirp-K 或什么都不响应,或者它最初有 D- 拉动,表明它是 LS 设备。所有其他设备仍处于禁用端口之后,因此看不到 activity.

在第一个特定端口获得正确的速度状态后,端口被启用,相应的空闲总线流量开始,随后是使用默认地址 00 的 get_descriptor 命令。然后主机分配一个非平凡的地址通过 SET_ADDRESS() 添加到此设备。从这一点开始,设备将只响应这个特定的分配地址。

然后主机启用下一个端口,它显示有东西已连接。同样,所有其他未枚举的设备都设置为响应 00 地址,但一次只启用一个新端口。由于第一个设备已经有一个不同于默认 00 的地址,因此不会发生冲突,第一个设备只是忽略寻址到默认管道 00 的流量。

对第二个设备重复该过程,首先通过在 00 地址进行通信,然后将下一个可用的 USB 地址分配给第二个设备。并且对显示连接状态的每个端口重复该过程。

要记住的关键字是 USB 端口不是 "enabled",除非主机控制器收到命令 "port_reset" 到根端口,或发送 SET_FEATURE(PORT_RESET ) (或类似的东西)到已连接且已枚举的集线器后面的端口。