Итак, я знаю о спецификации USB 2.0, расположенной на сайте USB.org .
Я немного ленивый и нетерпеливый. Может кто-нибудь сказать мне, куда идти, чтобы узнать, что именно ожидается от моего периферийного устройства при подключении USB-кабеля?
Например, если мое периферийное устройство является принтером, как я могу сообщить компьютеру на другом конце, что принтер (с определенным описанием модели, я полагаю) только что был подключен? Чем в компьютере как драйвер принтера узнает, какой порт USB был подключен к принтеру?
Мое приложение на самом деле USB MIDI. Я также получил этот документ USB-MIDI , но мне не хватает более фундаментального протокола USB.
Просто для информации, я использую USB-чип FTDI FT220x, и он подключен к SPI ADSP-21479 SHARC. Теперь мы используем его просто для обмена текстовыми сообщениями, используя ПК (работающий с TeraTerm) в качестве «консоли» . У меня есть доступ к коду, который устанавливает порт SPI и подключается к чипу FTDI, но нет кода, который выполняет какие-либо начальные связи. Я не знаю, что делает FT220x при первом подключении к ПК.
Я не недоволен чтением и изучением, но я хотел бы знать, с чего начать чтение, и спецификация USB на 100 МБ слишком велика для цели, на которую можно стрелять. Искреннее спасибо всем за действенную помощь.
источник
Ответы:
USB имеет несколько уровней, которые описаны в спецификации USB 2.0 . Если вы знакомы с многоуровневой сетевой моделью OSI, вы можете думать об этом так:
Концептуально USB основан на потоках данных, называемых конечными точками , которые могут быть либо IN (для хоста), либо OUT (для хоста). Каждое устройство имеет конечную точку 0, которая используется для контроля и состояния. Устройство может иметь дополнительные конечные точки для данных приложения. Каждая конечная точка ведет себя как буфер FIFO.
Данные передаются на конечную точку как Bulk (например, TCP / IP, гарантированный, что каждый байт прибывает и в правильном порядке), или изохронные (как UDP / IP, гарантированно свежие, но могут отбрасывать пакеты). Существует вводящий в заблуждение тип передачи « Прерывание », который на самом деле просто опрашивается хостом.
USB 2.0 использует дифференциальную пару для связи данных. Я не буду вдаваться в подробности, так как это описано в главе 7 спецификации USB 2.0. Как правило, на схеме PCB мы рассматриваем это как дифференциальную пару согласованной длины и вставляем последовательные резисторы, требуемые любым физическим USB (физическим) Интерфейс) используется. Периферийное устройство USB использует резистор высокого значения на одной из линий D + или D-, чтобы сообщить хосту, что это высокоскоростное или низкоскоростное периферийное устройство.
Вскоре после того, как хост USB обнаруживает, что устройство присутствует, хост запрашивает группу дескрипторов с устройства. Об этом позаботится микросхема FTDI. Описания описаны в главе 9.5 . К ним относятся устройства Descriptor , дескриптор конфигурация , интерфейс дескрипторы , Endpoint дескрипторы , Струнные дескрипторы , может быть , даже HID Report дескрипторы .
Device Descriptor включает в себя USB VID (Vendor Identification) и PID номера (Идентификация продукта). Операционная система использует эту пару чисел, VID_PID, чтобы определить, какой драйвер устройства должен использоваться для этого устройства. Обратите внимание, что номер VID выдается при участии в форуме разработчиков USB, так что это своего рода проблема, если вы являетесь индивидуальным изобретателем.
Кроме того, есть драйвер класса HID (Human Interface Device), который обеспечивает несколько общих вводов для клавиатуры / мыши / и т. Д., А также любой общий ввод / вывод. Одним из преимуществ HID является то, что он не требует предоставления пользовательского драйвера устройства, но его пропускная способность несколько ограничена по сравнению с нестандартным драйвером массовых устройств. Существует целый другой документ спецификации о дескрипторах HID; и документ таблицы использования HID, в котором подробно описаны все кодовые номера, которые описывают различные функции, доступные на данном устройстве с интерфейсом человека.
Чип FTDI, такой как спецификация FT220X, обеспечивает «механизм последовательного интерфейса» USB (не путать с последовательным интерфейсом SPI или последовательным интерфейсом RS232). Это заботится о большинстве вещей низкого уровня, описанных в главах 6, 7 и 8.
FTDI использует EEPROM (дополнительный модуль на FT2232H, встроенный в FT220X) для хранения небольшого количества информации, которая входит в дескрипторы. Вы можете настроить значения VID / PID и предоставить пользовательские строки описания.
источник
Поведение и взаимодействие USB-партнеров (хоста и устройства) разбросано по спецификации USB. Лучший способ получить некоторые основания - это взглянуть на «структуру устройства», Глава 9, которая описывает возможные (обязательные) состояния устройства (Рисунок 9-1), и структуру Host (и Hub), в Главах 10 и 11. Игнорирование детали протокола (каналы / типы транзакций / абстрактные уровни протокола OSI, компоновка печатной платы и т. д.), лучшее понимание начального взаимодействия можно получить, изучив диаграмму состояния порта (рис. 11-10)
По сути, если кабель не подключен между хостом и устройством, порты хоста находятся в «Powered State» (VBUS включен), но «Disconnected». Провода D + и D- удерживаются на низком уровне с 15 тыс. Провалов.
Когда кабель подключен, VBUS переходит в устройство. Устройство распознает, что оно подключено, и сигнализирует о событии «подключения», потянув HIGH за один из проводов D, D +, если это устройство FS / HS, и D-, если это устройство LS.
Потяните за провода D +/- на определенном порте, что дает прерывание программному обеспечению хоста, сообщая об «изменении состояния порта». Программное обеспечение хоста (обычно ehci.sys) затем запускает последовательность «сброса порта» на этом конкретном порту. После успешного завершения «сброса USB-порта» хост-порт включен для связи через USB. Порт становится активным (пакеты пакетов начинают вытекать).
Используя протокол USB, хост назначает этому устройству уникальный адрес и читает «дескриптор устройства». Это запускает процесс «перечисления устройств». Дескриптор устройства содержит информацию о том, к какому классу устройства он принадлежит (HID, COM, MIDI, Printer и т. Д.), А также VID / PID этого конкретного устройства, а также кучу другой информации, см. Таблицу 9-8.
После получения класса устройства и VID / PID программное обеспечение хоста пытается сопоставить эту информацию в реестре устройства и загружает соответствующий драйвер DEVICE, либо общий, либо специфичный для поставщика (если он существует). Затем драйвер устройства завершает процесс перечисления, выбирая интерфейс устройства, заканчивая настройкой «конфигурация устройства». Очевидно, что вся связь USB распознается только за этим конкретным портом , даже если все пакеты транслируются на все разрешенные порты.
Выше приведена общая схема протокола USB-соединения. Пакетирование данных для любой конкретной цели (например, MIDI) - это отдельная история, и она обрабатывается либо на уровне приложения, либо на уровне драйвера устройства, если система получает соответствующий класс устройства. Чтобы получить собственную связь MIDI, устройство должно иметь этот класс в своем дескрипторе и следовать всем определениям класса MIDI .
источник