2016-12-02 2 views
0

Мне нужен эксперт по USB. У меня есть небольшое аппаратное обеспечение с MAX3421 как USB-хост. Я подключаю свой принтер, который изначально состоит из двух устройств: самого принтера и сканера. Оба устройства отображаются как отдельные устройства через встроенный концентратор. Устройства являются полноскоростными.Как связаться с устройствами за концентратором USB?

Я прочитал огромное руководство по USB 2.0 (http://www.usb.org/developers/docs/usb20_docs), где я искал способ связи через концентратор с устройствами позади, но в документации отсутствует эта важная деталь.

Я могу отправить команды в концентратор, как описано в главе 11.24.2, например, получить дескриптор концентратора, SET_FEATURE (Reset), который сбрасывает устройство на принтере, GET_STATUS (Port1), который корректно возвращает 4 байта с состояние порта 1 в концентраторе.

Но как получить, например, дескриптор устройства сканера?

Я назначил адрес устройства 1 концентратору и попытался связаться со сканером/принтером по адресу устройства 2 (предположим, что он может быть там), но MAX3421 отвечает ошибкой JERR при отправке GET_DESCRIPTOR (Device) на адрес устройства 2, хотя оба порта концентратора питаются и включаются после выполнения сброса.

Я много читал о токенах SPLIT, но они, похоже, используются только в высокоскоростных концентраторах. Но концентратор в моем принтере - Full-Speed.

В документации не говорится ни о каком месте, как это сделать. Где это задокументировано?

ответ

0

Нет ответа? Кажется, это сложный вопрос.

Тем временем я нашел ответ здесь: http://www.microchip.com/forums/m523103.aspx#523499

После отправки SET_FEATURE (Reset) к порту концентратора устройства, подключенного к этому порту появляется с адресом устройства 00 на шине USB. Тогда вы можете получить дескриптор устройства обычным способом и выполнить SET_ADDRESS на этом устройстве.

Спецификация USB определенно неполна.

+0

Команда SET_FEATURE (PORT_RESET) к нисходящему порту концентратора генерирует состояние переустановки USB на шине. По спецификациям USB любое USB-устройство, подключенное к этому порту, должно перезагрузить свой SIE (Serial Interface Engine) в состояние по умолчанию, которое сбрасывает адресный декодер на значение по умолчанию «00». Он называется «панель управления по умолчанию», все в спецификациях. Это то же самое состояние, что и «power-on». Из этого следует следующий алгоритм перечисления. –

0

Верно, что процесс перечисления устройств за порты USB (корневые порты или порты концентратора) не объясняется спецификациями USB 2.0 в условиях неспециалиста, но вся идея встроена во все государственные машины для DS (downstream)).

Изначально ВСЕ USB-порты отключены для связи. Единственной включенной функцией является статус «подключение порта». Если несколько устройств подключены к нескольким портам (либо сразу, либо при включении), связи USB еще не происходит. ВСЕ USB-устройства при включении питания настроены так, чтобы отвечать на адрес DEFAULT 00. Но поскольку ни один из портов не включен, никто ничего не реагирует.

Затем HOST затем переходит к каждому отдельному порту, который указывает «соединение», начиная с первого порта. Хост устанавливает порт в режим PORT_RESET, и подключенное устройство будет отвечать либо Chirp-K, либо ничем, либо изначально имеет D-pull, что указывает на то, что это устройство LS. Все остальные устройства по-прежнему находятся за отключенными портами и поэтому не видят активности.

После того, как первый конкретный порт получает правильное состояние скорости, порт становится включенным, и начинается соответствующий простаивающий трафик шины, за которым следует команда get_descriptor с использованием DEFAULT ADDRESS 00. Затем хост назначает нетривиальный адрес этому устройству SET_ADDRESS().С этого момента устройство будет отвечать только на этот назначенный адрес.

Затем хост разрешает следующий порт, где он показывает, что что-то прикреплено. Опять же, все другие неперечисленные устройства настроены на ответ на адрес 00, но только один свежий порт включен одновременно. Так как у первого устройства уже есть адрес, который отличается от значения по умолчанию 00, конфликт не происходит, первое устройство просто игнорирует трафик, адресованный по умолчанию для канала 00.

Процесс повторяется для второго устройства, сначала передавая сообщение по адресу 00 адрес, затем следующий доступный USB-адрес назначается второму устройству. И процесс повторяется для каждого порта, который показывает прикрепленный статус.

Ключевое слово, которое следует помнить, заключается в том, что порт USB не включен, если хост-контроллер не получает команду «port_reset» для корневых портов или отправляет SET_FEATURE (PORT_RESET) (или что-то в этом роде) в порты за соединенными и уже перечислимый центр.

+0

У вас есть ссылка на документацию для этого? – Elmue

+0

@Elmue, да, это место http://www.usb.org/developers/docs/ –

Смежные вопросы