
Извините, если заголовок имеет форму XY-задачи, но:
У меня есть система Windows с большим количеством USB-устройств, подключенных к ней. (Я разработчик встраиваемых систем с кучей клиентов, и мне часто приходится проводить лонгитюдные тесты на куче встраиваемых устройств.) Я наблюдаю следующее явление:
Мой набор USB-устройств по умолчанию выглядит так:
Однако в этом случае мое устройство OSBOT TinyCam недоступно. («Похоже, что другое приложение уже использует камеру. Код ошибки приложения «Камера» Windows 0xA00F4243»)
Если я извлекаю (или просто отключаю) ЛЮБЫЕ четыре устройства EDBG CMSIS-DAP и/или устройства Atmel-ICE CMSIS-DAP, TinyCam работает нормально.
Что приводит меня к вопросам:
- Существует ли ограничение на количество устройств, которыми система может управлять по шине USB?
- Могу ли я собрать дополнительную информацию, чтобы лучше диагностировать проблему?
Кроме того, я не думаю, что это относится только к OSBOT TinyCam. Например, если я отключу все USB-устройства CMSIS-DAP, подключу OSBOT TinyCam и запущу приложение Camera, камера будет работать нормально. Но если я подключу все устройства CMSIS-DAP ПОСЛЕ подключения TinyCam, то мой Microchip IDE больше не сможет получить доступ ко всем устройствам CMSIS-DAP:
Таким образом, в данном случае получается, что «кто первый придет», тот и работает, а остальные исключаются.
решение1
Возможно, вы столкнулись с ограничением вашего корневого хост-контроллера USB в отношении конечных точек. Это аппаратное ограничение, которое не связано с вашей операционной системой.
Каждое USB-устройство может определять до 32 конечных точек (16 входов и 16 выходов, хотя одна из них должна быть конечной точкой управления), но большинство устройств определяют только 2 или 3 конечные точки (например, вход данных, выход данных и конечную точку управления). Сами концентраторы также определяют по крайней мере одну конечную точку управления. Каждая реализация USB-контроллера может иметь свои собственные ограничения по уровню или конечной точке.
В вашем случае некоторые из ваших устройств могут потребовать больше конечных точек, чем другие. Ваш корневой хост-контроллер USB также может иметь свой собственный предел на количество поддерживаемых конечных точек.
Чтобы увеличить количество поддерживаемых вашим компьютером конечных точек, вам нужно больше корневых USB-хост-контроллеров. Цепочка USB-концентраторов не добавляет больше конечных точек, а скорее уменьшает их количество, поскольку сами концентраторы используют конечные точки из корневого контроллера.
Хотя спецификация USB допускает огромное теоретическое количество устройств на одном корневом контроллере, практические ограничения, присущие реализации контроллеров USB, еще больше ограничивают возможный максимум до гораздо меньшего числа.
Инструмент для проверки количества конечных точек (и всего остального) на ваших USB-устройствах — это инструмент с открытым исходным кодом Просмотрщик дерева USB-устройств. Он может отображать конечные точки, используемые устройством, но не отображает ограничение для корневого контроллера.
Например, здесь показаны 3 конечные точки для подключенного USB-диска:
Некоторые источники по теме:
решение2
Решение: ветка широкая, а не глубокая
@harrymc Правильно ответил на вопрос: топология USB была «слишком глубокой», что ограничивало количество конечных точек.
Раньше у меня было четыре 7-портовых USB-расширителя, «A» и «C» были подключены напрямую к ПК, «B» и «D» были последовательно подключены к «A» и «C».
+-----+ +---------+ +---------+
| |<=>|A |<=>|B |
| | +---------+ +---------+
| | +---------+ +---------+
| PC |<=>|C |<=>|D |
+-----+ +---------+ +---------+
Я перенастроил свою установку так, чтобы «A», «B», «C» и «D» были подключены напрямую к ПК.
+-----+ +---------+
| |<=>|A |
| | +---------+
| | +---------+
| |<=>|B |
| | +---------+
| | +---------+
| |<=>|C |
| | +---------+
| | +---------+
| PC |<=>|D |
+-----+ +---------+
Это уменьшило глубину моего дерева USB-устройств на один уровень, и теперь я могу поддерживать все необходимые мне устройства одновременно.