解决方案:拓宽分支,而不是深入分支

解决方案:拓宽分支,而不是深入分支

如果标题是 XY 问题的形式,请原谅我,但是:

我有一台 Windows 系统,上面挂着很多 USB 设备。(我是一名嵌入式开发人员,有很多客户,而且经常需要在一堆嵌入式设备上运行纵向测试。)我观察到以下现象:

我的默认 USB 设备组如下所示:

在此处输入图片描述

但在这种情况下,我的 OSBOT TinyCam 设备不可用。(“看起来另一个应用程序已经在使用相机。Windows 相机应用程序错误代码 0xA00F4243”)

如果我弹出(或者拔掉)任意四个 EDBG CMSIS-DAP 设备和/或 Atmel-ICE CMSIS-DAP 设备,TinyCam 就可以正常运行。

这让我想到了以下问题:

  • 系统在 USB 总线上可管理的设备数量是否有限制?
  • 我是否可以收集更多信息来更好地诊断问题?

此外,我不认为这是 OSBOT TinyCam 独有的。例如,如果我拔下所有 CMSIS-DAP USB 设备并插入 OSBOT TinyCam 并启动相机应用程序,相机工作正常。但是,如果我在插入 TinyCam 之后插入所有 CMSIS-DAP 设备,我的 Microchip IDE 将无法再访问所有 CMSIS-DAP 设备:

在此处输入图片描述

因此在这种情况下,“谁先到达那里”似乎有效,而其他人则被排除在外。

答案1

您可能遇到了 USB 根主机控制器在端点方面的限制。这是与您的操作系统无关的硬件限制。

每个 USB 设备最多可以定义 32 个端点(16 个输入和 16 个输出,但其中一个必须是控制端点),但大多数设备仅定义 2 个或 3 个端点(例如数据输入、数据输出和控制端点)。集线器本身也至少定义一个控制端点。每个 USB 控制器实现可能都有自己的层或端点限制。

就您而言,某些设备可能需要比其他设备更多的端点。您的 USB 根主控制器可能对其可支持的端点数量也有自己的限制。

要增加计算机支持的端点数量,您需要更多根 USB 主控制器。链接 USB 集线器不会增加更多端点,反而会减少端点数量,因为集线器本身会用尽根控制器的端点。

尽管 USB 规范允许一个根控制器上理论上拥有大量设备,但是 USB 控制器实现中固有的实际限制进一步将可能的最大数量限制在更低的水平。

检查 USB 设备上端点数量(以及其他所有东西)的工具是开源的 USB 设备树查看器。它可以显示设备使用的端点,但不显示根控制器的限制。

例如,这里显示了连接的 USB 磁盘的 3 个端点:

在此处输入图片描述

关于该主题的一些资料来源:

答案2

解决方案:拓宽分支,而不是深入分支

@harrymc 正确回答了问题:USB 拓扑“太深”,限制了端点的数量。

以前,我有四个 7 端口 USB 扩展器,“A”和“C”直接连接到 PC,“B”和“D”通过菊花链从“A”和“C”连接。

+-----+   +---------+   +---------+
|     |<=>|A        |<=>|B        |
|     |   +---------+   +---------+
|     |   +---------+   +---------+
| PC  |<=>|C        |<=>|D        |
+-----+   +---------+   +---------+

我重新配置了我的设置,以便“A”、“B”、“C”和“D”全部直接连接到 PC。

+-----+   +---------+
|     |<=>|A        |
|     |   +---------+
|     |   +---------+
|     |<=>|B        |
|     |   +---------+
|     |   +---------+
|     |<=>|C        |
|     |   +---------+
|     |   +---------+
| PC  |<=>|D        |
+-----+   +---------+

这将我的 USB 设备树的深度减少了一级,现在我可以同时支持我需要的所有设备。

相关内容