Интерфейс USB. Часть 1. Основы
В настоящий момент один из самых популярных интерфейсов — это безусловно USB. Девайсов, которые его используют, просто огромное количество. Это и мышки, и клавиатуры, и принтеры, и сотовые телефоны, и много чего ещё. В отличии от стремительно исчезающего RS-232, USB встречается во всех современных компьютерах, ноутбуках, телефонах… так что, если мы хотим создавать действительно универсальные девайсы, придётся нам этот интерфейс изучать. Вот прямо сейчас и начнём, а заодно, по ходу изучения, попытаемся сами посоздавать каких-нибудь USB-девайсов.
Итак, USB (universal serial bus) — универсальная последовательная шина. Большинство USB-устройств соответствуют спецификациям 1.1 и 2.0. В спецификации 1.1 определены две скорости передачи информации: LS (low speed) — низкая скорость, 1,5 Мбит/с и FS (full speed) — полная скорость, 12 Мбит/с. В редакции 2.0 к ним добавлена ещё и высокая скорость HS (high speed), 480 Мбит/с. Не так давно вышла ещё спецификация — 3.0, но устройства, поддерживающие этот стандарт, пока не очень распространены, поэтому и бог с ней.
Физические устройства на шине USB бывают трёх типов: хост-контроллер, хаб и конечное устройство.
Хост-контроллер — это главный управляющий шиной USB. Именно он обеспечивает связь устройств, подключенных к шине, с компьютером (с ОС и с клиентским ПО). Любые сеансы обмена данными может начинать только хост-контроллер, остальные устройства молчат в тряпочку, пока хост-контроллер к ним не обратится.
Контроллер взаимодействует с ОС через драйвер хост-контроллера (HCD — host controller driver). Этот драйвер привязан к конкретной модели хост-контроллера. Только он знает какие данные, в какие регистры и в каком порядке пихать в хост-контроллер, а также откуда какие данные брать, чтобы хост-контроллер сделал то, чего от него хотят.
Со стороны ОС шиной USB управляет ещё один драйвер — USBD (universal serial bus driver). Ему совершенно пофиг, как там конкретно реализован хост-контроллер и где у него какие регистры (для этого есть HCD), USBD решает общие (неспецифические для конкретного хост-контроллера) вопросы: взаимодействие с клиентским ПО, нумерация устройств на шине, их конфигурирование, распределение питания и пропускной способности шины и так далее. Это, можно сказать, своеобразный диспетчер, который осуществляет общий контроль над шиной и её взаимодействие с внешним миром (с клиентским ПО).
Хост-контроллер — птица гордая и пугливая, поэтому непосредственно ни с кем из подданных он не разговаривает. Для общения с подданными у него есть специальные помощники — хабы (их ещё иногда называют концентраторами).
Хабы — это устройства, которые позволяют физически подключить устройства USB к шине. Они предоставляют порты для подключения, ретранслируют трафик от хост-контроллера к конечным устройствам и обратно, отслеживают состояние и физически управляют электропитанием портов. У хабов есть один восходящий (upstream) порт, — это тот порт, который подключен по направлению к хост-контроллеру, и несколько нисходящих (downstream) портов, — это порты, к которым подключаются конечные устройства. Хабы можно каскадировать, подключая к нисходящему порту хаба ещё один хаб. Самый главный хаб, интегрированный с хост-контроллером, называется корневым хабом (он же — корневой концентратор или root hub).
Другими словами можно сказать, что у хаба есть две основных задачи: 1) создать хост-контроллеру иллюзию, что он непосредственно разговаривает с подключенным к хабу устройством; 2) наблюдать за своим сегментом шины (за девайсами, подключенными к нисходящим портам), сообщать «наверх» обо всех изменениях и, если надо, — подключать и отключать питание портов.
Конечные устройства — это все те полезные устройства, которые мы подключаем к шине USB (флэшки, принтеры, мышки и т.д.)
Нужно сказать, что физические устройства и логические устройства — это не всегда одно и тоже. Существуют, например, такие конечные устройства (называемые составными — compound devices), которые содержат внутри себя хаб, к которому подключено ещё несколько устройств. Несмотря на то, что в этом случае хаб и все, подключенные к нему устройства, запакованы в один корпус, с точки зрения логики шины это будут совершенно разные устройства.
Для логических конечных устройств обычно используют термин «функции». Таким образом, с точки зрения логики шины, устройства на ней можно разделить на хабы и функции (и неважно, запакованы ли они в один корпус или нет). Каждое логическое устройство на шине имеет уникальный адрес (1-127), присваеваемый ему хостом при подключении.
Исходя из описанного выше, получается, что физическая топология шины USB — дерево (ну, потому что хабы можно каскадировать), а логическая топология — звезда, центром которой является хост-контроллер. Физическая и логическая топологии шины USB показаны на рисунке ниже.
Идём дальше. Что же вообще представляет собой логическое устройство USB (как хабы, так и функции)?
Логическое устройство представляет собой набор так называемых конечных точек (endpoints или просто EP). Физически, конечные точки — это просто разные буферы в логическом устройстве USB, через которые происходит обмен данными с хостом. Логичный вопрос — а зачем нам иметь несколько буферов? Ну, просто потому что удобно для разных задач иметь разные буферы. Устройство же у нас может выполнять параллельно несколько разных задач. (Минимум две — отслеживать команды управления от хоста и делать что-то полезное.) У этих разных задач могут могут быть разные степени важности, требования к надёжности, своевременности и скорости доставки данных и, наконец, источники и потребители пересылаемой информации также могут быть разные (источником и потребителем полезной инфы обычно является клиентский драйвер, в то же время всякая управляющая инфа ему обычно нафиг не нужна).
Поскольку для решения описанных выше проблем недостаточно иметь просто разные буферы для разной передаваемой информации, то в дополнение к этому придумали ещё кое-что.
Во-первых, придумали 4 различных типа передач. Для каждой конечной точки должно быть определено, каким из этих типов передач с ней нужно общаться. Типы передач в USB существуют следующие:
- изохронные передачи (isochronous transfers). Они предназначены для передачи потоковых данных в реальном времени. Такие передачи гарантируют время доставки, но не гарантируют, что все данные будут доставлены. Если во время передачи происходит ошибка, то данные просто теряются. Кроме того, для передач такого типа должно быть предварительно согласовано, какую часть пропускной способности шины эта передача будет занимать. Изохронные передачи имеют наивысший приоритет и имеют право занять до 90% пропускной способности канала. Передачи этого типа используются, например, для видеокамер, или колонок. Никого ведь не устроит, если звук в колонках будет лагать. Лучше уж потерять часть данных, но слушать песню не рывками, а непрерывно.
- прерывания (interrupts). Этот тип предназначен для спонтанных небольших сообщений, но с гарантированным временем обслуживания и гарантированной доставкой. Примером может служить USB клавиатура. Мы можем нажать на кнопку в любой момент (может 3 часа не нажимали, а может так и заклацали клавой каждую секунду). Пока мы спим за компом — и передавать ничего не надо. Но как только мы всё же щелканули по кнопкам — будьте любезны, сообщите об этом куда следует и желательно побыстрее.
- передача массивов данных (bulk data transfers). Для этого типа нет никаких гарантий по скорости, единственное в чём можно быть уверенным — что данные дойдут в целости и сохранности (когда-нибудь, гы-гы). Такие передачи имеют самый низкий приоритет, но зато им ничего не надо согласововать, — сколько останется свободной от других типов передач ширины канала — столько они и займут. Не останется вообще — будут ждать, когда канал освободится. Такие передачи можно использовать для обмена данными с устройствами, которым некуда спешить, например, с принтерами. Представьте, что вы отправили на печать USB-принтеру фотку и одновременно слушаете музыку в USB-колонках. Согласитесь ли вы, чтобы фотка напечаталась на 3 секунды раньше, но при этом начал лагать звук в колонках? Вероятнее всего нет, так ведь. Пусть лучше данные принтеру передаются медленнее, но зато музыка играет непрерывно, без всяких дёрганий.
- управляющие передачи (control transfers). Это передачи типа запрос-ответ. С помощью них передаются комады управления устройствами. Тут важна не только безошибочная передача, но и получение ответа о результатах выполнения команды. Кроме того, поскольку эти передачи являются служебными, то им гарантировано 10% пропускной способности канала.
Вернёмся к нашим конечным точкам. Для того, чтобы отличить одну точку от другой, — конечные точки, должны иметь уникальный номер. Но это не всё. Кроме номера, каждая конечная точка имеет ещё и направление. IN — если точка предназначена для передачи данных хосту, OUT — если точка предназначена для приёма данных от хоста. Точки с одинаковыми номерами, но с разными направлениями передачи данных — это разные с точки зрения логики шины конечные точки.
Единственное исключение — конечная точка EP0. У неё вообще особый статус. Она является служебной и предназначена для общего управления устройством (конфигурирование, настройка и т.д.). Кроме того, эта конечная точка двунаправленная и она должна обязательно присутствовать в любом USB-устройстве.
Исходя из всего вышеописанного, для идентификации какой-то конечной точки на шине, нам нужно знать адрес устройства, к которому относится конечная точка, её номер в устройстве и направление передачи данных через эту точку.
Поскольку устройство не всегда делает абсолютно всё на что оно только способно, да и способов решения одной и той же задачи оно может иметь несколько, то обычно нет необходимости задействовать абсолютно все конечные точки. Поэтому придумали такие понятия, как интерфейс, конфигурация и альтернативные установки. Интерфейс объединяет конечные точки, предназначенные для решения какой-либо одной задачи. Наборы используемых одновременно интерфейсов называются конфигурациями. Альтернативные установки позволяют включать или отключать какие-то входящие в конфигурацию конечные точки, в зависимости от способа решения задач для которых предназначена эта конфигурация.
Самих конфигураций и альтернативных установок у каждой из этих конфигураций для одного логического устройства может существовать несколько, но в каждый момент времени только один из этих наборов может быть активен. Причём хост должен знать, какой именно набор активен и в соответствии с этим обеспечивать связь с входящими в этот набор конечными точками. Остальные конечные точки, не входящие в активный набор, не будут доступны для связи.
Поясню, что значит «обеспечивать связь с конечными точками». Для связи клиентского ПО с каждой активной конечной точкой хост создаёт коммуникационный канал (communication pipe). Клиентское ПО, которое хочет пообщаться с конечной точкой, должно отправить к соответствующему каналу пакет запроса ввода/вывода (IRP — input/output request packet) и ждать уведомления о завершении его обработки. В IRP указывается только адрес буфера, куда надо складывать или откуда брать данные и длина передачи. Всё остальное за вас сделает хост и обслуживающие его драйвера (USBD и HCD)
В зависимости от типа передач, используемых в канале, коммуникационные каналы делятся на два типа: потоковые (streaming pipes) и каналы сообщений (message pipes).
Коммуникационный канал к точке EP0 является служебным и называется основной канал сообщений (default pipe, control pipe 0). Владельцем основных каналов сообщений всех подключенных устройств является драйвер USBD, поскольку, как мы уже говорили, через EP0 осуществляется конфигурирование и настройка устройства.
На этом, пожалуй, с основами закончим и в следующей статье попробуем более детально рассмотреть механизм передачи данных по интерфейсу USB.
Русские Блоги
Нулевые знания USB
USB — это метод передачи данных, это также шина данных, и это одна из самых сложных шин. Чтобы
На оборудовании он подключается с помощью вилки. С одной стороны вилка, а с другой розетка. Например, гнездо на ПК — это гнездовой соединитель, а устройство USB использует штекерный соединитель для подключения к ПК. Чтобы
В настоящее время существует три типа аппаратных интерфейсов USB. Тип, используемый на обычных компьютерах, называется Type; исходный интерфейс, использовавшийся в эпоху обычных телефонов Nokia, — Mini USB; и текущий Micro USB, используемый телефонами Android.
Host
USB — это передача данных по всей шине, управляемой хостом. На одной шине USB может быть только один хост. Чтобы
OTG
Режим On The Go, представленный в USB2.0, предлагает новую концепцию, называемую протоколом согласования хоста (протокол согласования хоста), которая позволяет двум устройствам обсуждать, кто идет Когда Host.
Дополнительные сведения о USB см. На официальном веб-сайте USB и в следующей статье:
http://www.crifan.com/files/doc/docbook/usb_basic/release/html/usb_basic.html
Концепция USB HOST / DEVICE / OTG:
Контроллер OTG может использоваться как хост или как устройство.Роль контроллера обычно определяется уровнем USB ID. Полные аппаратные сигналы контроллера USB2.0 OTG следующие:

USB_ID: Входной сигнал, определяемый протоколом USB OTG, используемый для определения роли по умолчанию (хост или устройство) устройства, подключенного к порту USB. USB_ID подтянут по умолчанию и находится в состоянии устройства.Если вы хотите, чтобы контроллер переходил в состояние хоста, вам необходимо подключить порт mini-A или порт micro-A, чтобы замкнуть USB_ID на землю.
Его также можно принудительно переключить с помощью программного обеспечения, через управление
/sys/bus/platform/drivers/usb20_otg/force_usb_mode
реализация, может иметь следующие три значения:
0: определяется аппаратно, а именно USB ID
1: обязательный режим хоста
2: обязательный режим устройства
Разница между режимом HOST и режимом OTG
Разница между OTG и HOST заключается в том, что HOST поддерживает немного больше устройств, но для реализации передачи данных необходимо соответствующее подключение интерфейса подчиненного устройства, в то время как передача OTG удобна и может передаваться без интерфейса подчиненного устройства на другие машины.
Как работает USB OTG
Наиболее важным расширением дополнительной спецификации OTG к USB 2.0 является более энергоэффективное управление питанием, позволяющее устройству работать как в режиме хоста, так и в режиме периферии. Существует два типа устройств OTG: устройства OTG двойного назначения (устройство Dualrole) и периферийные устройства OTG (устройство Peripheralonly OTG). Устройство OTG двойного назначения полностью соответствует спецификации USB 2.0. В то же время оно также предоставляет ограниченные возможности хоста и сокет MiniAB, поддерживает протокол согласования хоста (HNP) и поддерживает протокол запроса транзакции, как периферийное устройство OTG. (Протокол запроса сеанса, SRP). При работе в качестве хоста устройство OTG двойного назначения может обеспечивать ток 8 мА на шине, в то время как предыдущий стандартный хост должен обеспечивать ток от 100 до 500 мА.
Когда два устройства OTG двойного назначения соединены вместе, они могут поочередно работать как хост и подчиненное устройство.Эта функция совместима с существующей моделью структуры хоста / периферии со спецификацией USB. Хост OTG отвечает за инициализацию задач передачи данных, таких как сброс шины, получение различных дескрипторов USB и настройка устройств. После завершения этих конфигураций два устройства OTG могут передавать информацию в форме ведущего и ведомого соответственно.Процесс обмена ролями ведущий-ведомый между двумя устройствами определяется протоколом передачи узла (HNP).
1.1 Начальные функции хоста (Adevice) и подчиненного (Bdevice)
Начальная функция устройства реализуется путем определения соединителя. OTG определяет карманный разъем под названием MiniAB, который можно напрямую подключать к разъемам MiniA или MiniB. MiniAB имеет контактный штырь, подтянутый к клемме питания, а штекер MiniA имеет ID (R <10 Ом), подключенный к земле. Штекер Mini B имеет открытый контакт ID (R> 100 кОм), подключенный к земле. Когда два устройства OTG соединены вместе, контакт ID на стороне штекера MiniA будет вводить состояние «0», контакт ID на стороне штекера MiniB равен «1», а устройство OTG с идентификатором 0 по умолчанию является хостом (Adevice). , Устройство OTG с ID 1 по умолчанию является подчиненным (устройство B). Рисунок 1 иллюстрирует сказанное выше.
1.2 Протокол запроса сеанса (SRP)
Этот протокол позволяет устройству Adevice (которое может питаться от батареи) экономить энергопотребление, отключая Vbus, когда шина не используется, а также предоставляет возможность Bdevice запускать действия шины. Любое устройство, включая ПК или портативный компьютер, может реагировать на SRP; любое устройство B, включая стандартное периферийное USB-устройство, может запускать SRP; требуется устройство с двойным функционалом как для запуска SRP, так и для ответа на SRP.
1.3 Протокол согласования хоста (HNP)
HNP — это протокол, используемый для преобразования между Adevice и Bdevice master / slave (фактически, изменение направления кабеля). Результат обмена функциями ведущий / ведомый показан в следующем процессе:
(1) Используйте подтягивающий резистор, чтобы отправить сигнал ведомому устройству.
(2) Устройство может установить функцию «HNP Enable» на Bdevice.
(3) Bdevice отключен и поднят.
(4) ADevice подключено к подтягивающему резистору, что указывает на то, что Adevice является подчиненным.
(5) Устройство подает питание на Vbus.
(6) Bdevice обнаруживает подтягивание Adevice.
(7) Сбросить / перечислить / использовать устройство.
1.4 Драйвер
В отличие от хостов ПК, портативные устройства не имеют удобного способа и достаточного места для загрузки новых драйверов. Поэтому спецификация OTG требует, чтобы каждое устройство OTG двойного назначения имело список поддерживаемых периферийных целевых устройств OTG, который включает такую информацию, как тип устройства и производитель.
В отличие от ПК, стек драйверов устройства двойного назначения OTG состоит из стека хоста USB и стека устройств USB, чтобы удовлетворить потребности этих двух методов работы. Драйвер OTG решает, использовать ли стек хоста USB или стек устройств USB, в зависимости от разницы в разъемах или наличия рабочего режима устройства переключения NHP.
Когда устройство двойного назначения OTG работает в режиме хоста, работает стек хоста USB. Драйвер хост-контроллера отвечает за обмен данными между стеком хоста USB и конечной точкой оборудования, драйвер USB перечисляет и сохраняет информацию об устройствах, а драйвер класса хоста целевого периферийного устройства поддерживает устройства в списке целевых устройств. Драйвер класса хоста предоставляется производителем чипа. В то же время OTG предоставляет общий драйвер класса хоста (который может быть изменен для неуниверсальных устройств).
Когда устройство двойного назначения OTG работает в ведомом режиме, стек USB-устройств работает. Драйвер контроллера устройства отвечает за обмен данными между стеком USB-устройства и конечной точкой оборудования. Уровень протокола USB отвечает за обработку спецификации протокола USB. Функция драйвера устройства зависит от функции устройства двойного назначения (например, цифровых камер, запоминающих устройств, принтеров). Подождите).
Драйвер OTG отвечает за обработку преобразования рабочего режима устройства OTG двойного назначения. В то же время он также может возвращать результат (например, поддерживает ли устройство HNP) и обрабатывать ошибки шины. Программа прикладного уровня запускает или завершает транзакцию передачи через драйвер OTG и обменивается данными с аппаратным уровнем через стек хоста USB или стек устройств.
1.5 Модель потока данных
Хост и устройство OTG разделены на три разных уровня: функциональный уровень, уровень USB-устройства и уровень интерфейса USB, как показано на рисунке 2.
Уровень интерфейса USB обеспечивает физическое соединение для хоста OTG и устройства OTG.Программное обеспечение системы USB использует хост-контроллер для управления передачей данных между хостом и устройством USB. По сравнению с хост-контроллером системное программное обеспечение USB занимается передачей данных и взаимодействием между клиентом и устройством с точки зрения клиента. Уровень USB-устройства обеспечивает используемое логическое устройство для программного обеспечения хост-системы USB. Хост реализует свои различные функции через клиентское программное обеспечение, которое соответствует его функциям.
Устройства OTG, как и предыдущие устройства USB, имеют два канала: канал потока данных и канал сообщения. Канал потока данных не имеет определенного результата, а канал сообщения имеет фиксированную структуру. Однако каждый канал имеет определенную полосу пропускания, тип передачи, направление передачи и размер буфера. Устройство с автономным питанием настроено с каналом управления по умолчанию и предоставляет такую информацию, как конфигурация и состояние устройства.
Один вопрос и один ответ:
1. Что такое USB OTG?
USB OTG — это дополнительная спецификация для USB 2.0.
2. Какое расширение USB OTG для USB 2.0 является наиболее важным?
Более энергосберегающее управление питанием и позволяет устройству работать в двух формах: хост и периферийное устройство.
3. В USB2.0 определены три типа: HOST (хост), Device, HUB.
OTG добавляет два новых устройства: устройство с двумя ролями, устройство OTG только для периферийных устройств (периферийное устройство OTG).
4. В USB 2.0 определены три пары разъемов (вилка и розетка): Standard-A (хост), Standard-B (периферийное устройство), Mini-B (меньшее Периферийные устройства)
Новый разъем OTG: Mini-A
Новые сокеты OTG: Mini-A и Mini-AB (с одновременной поддержкой вилок Mini-A или Mini-B)
Цвет пластика внутри вилки и розетки: Mini-A — белый, Mini-B — черный, а Mini-AB — серый.
5. В USB 2.0 определены два кабеля: от стандарта A до стандарта B, от стандарта A до Mini-B.
Два типа кабелей, добавленных OTG: Mini-A — Standard-B, Mini-A — Mini-B.
6. Двухролевое устройство OTG (двухролевое устройство) должно иметь:
1) Ограниченные возможности хоста
2) Может использоваться как полноскоростное периферийное устройство (дополнительный высокоскоростной режим)
3) Может использоваться в качестве полноскоростного хоста (необязательный низкоскоростной или высокоскоростной режим)
3) Список целевых устройств и драйверов OTG.
4) Поддержка SRP, HNP
5) Одна розетка Mini-AB
6) Токовый выход не менее 8 мА на VBUS
7) Как общаться с пользователями
7. Периферийное устройство OTG (периферийное устройство OTG):
1. Это обычное периферийное устройство USB.
2. Поддержка SRP
3. Разъем Mini-B (Mini-AB использовать нельзя)
8. Как реализовать Android USB может обнаруживать дополнительное устройство и отправлять хост-устройство одновременно
Для usb-связи мы должны сначала выяснить, какая сторона HOST, а какая SLAVE
Например, если ваш телефон Android используется в качестве хоста, для получения подчиненного устройства используйте UsbDevice для представления подчиненного устройства.
Если ваш телефон Android является подчиненным, вам нужно получить хост, используйте UsbAccessory для представления хоста
5. Типы передачи данных
USB поддерживает как однонаправленные, так и двунаправленные режимы связи. Передача данных производится между ПО хоста и конечной точкой устройства. Устройство может иметь несколько конечных точек, связь с каждой из них (канал) устанавливается независимо.
Архитектура USB допускает четыре базовых типа передачи данных:
* Управляющие посылки (Control Transfers), используемые для конфигурирования во время подключения и в процессе работы для управления устройствами. Протокол обеспечивает гарантированную доставку данных. Длина поля данных управляющей посылки не превышает 64 байт на полной скорости и 8 байт на низкой.
* Сплошные передачи (Bulk Data Transfers) сравнительно больших пакетов без жестких требований ко времени доставки. Передачи занимают всю свободную полосу пропускания шины. Пакеты имеют поле данных размером 8, 16, 32 или 64 байт. Приоритет этих передач самый низкий, они могут приостанавливаться при большой загрузке шины. Допускаются только на полной скорости передачи.
* Прерывания (Interrupt) — короткие (до 64 байт на полной скорости, до 8 байт на низкой) передачи типа вводимых символов или координат. Прерывания имеют спонтанный характер и должны обслуживаться не медленнее, чем того требует устройство. Предел времени обслуживания устанавливается в диапазоне 1-255 мс для полной скорости и 10-255 мс — для низкой.
* Изохронные передачи (Isochronous Transfers) — непрерывные передачи в реальном времени, занимающие предварительно согласованную часть пропускной способности шины и имеющие заданную задержку доставки. В случае обнаружения ошибки изохронные данные передаются без повтора — недействительные пакеты игнорируются. Пример — цифровая передача голоса. Пропускная способность определяется требованиями к качеству передачи, а задержка доставки может быть критичной, например, при реализации телеконференций.
Полоса пропускания шины делится между всеми установленными каналами. Выделенная полоса закрепляется за каналом, и если установление нового канала требует такой полосы, которая не вписывается в уже существующее распределение, запрос на выделение канала отвергается.
Архитектура USВ предусматривает внутреннюю буферизацию всех устройств, причем чем большей полосы пропускания требует устройство, тем больше должен быть его буфер. USB должна обеспечивать обмен с такой скоростью, чтобы задержка данных в устройстве, вызванная буферизацией, не превышала нескольких миллисекунд.
Изохронные передачи классифицируются по способу синхронизации конечных точек — источников или получателей данных — с системой: различают асинхронный, синхронный и адаптивный классы устройств, каждому из которых соответствует свой тип канала USB.
Взаимодействие хост-контроллера USB и устройств USB (ликбез).

Взаимодействие хост-контроллера USB и устройств USB (ликбез).
Хост-контроллер USB (рис.1) в чипсете обычно интегрируется с корневым хабом (root hub), обеспечивающим одну или несколько точек подключения называемых портами. Контроллер USB, входящий в состав чипсетов многих современных системных плат, обычно (как минимум) имеет встроенный двухпортовый хаб.
Распределение пропускной способности шины между подключенными устройствами планируется хост-контроллером и реализуется им с помощью посылки маркеров. Шина позволяет подключать, конфигурировать, использовать и отключать устройства во время работы хоста и самих устройств – динамическое (или «горячее») подключение и отключение.
Хост-контроллер USB выполняет следующие функции:
— обнаружение подключения и отсоединения устройств USB;
— манипулирование потоком управления между устройствами и хостом;
— управление потоками данных;
— сбор информации о состоянии и статистики;
— обеспечение энергосбережения подключенными устройствами.

Рис. 1. Пример блок-схемы хост-контроллера USB.
Системное программное обеспечение ( C ПО) хост-контроллера USB управляет взаимодействием между устройствами и их программным обеспечением функционирующим на хост- компьютере обеспечивая следующие функции:
— асинхронные передачи данных;
— нумерация и конфигурация устройств;
— изохронные передачи данных;
— информация об управлении устройствами и шиной.
По возможности, СПО USB в этих областях использует существующее системное ПО хост-компьютера – например, Advanced Power Management (АРМ) для управления энергопотреблением устройств USB и др.. USB имеет развитую систему управления энергопотреблением. Хост-компьютер может иметь собственную систему управления энергопотреблением (power management system), к которой логически подключается и одноименная система USB. Программное обеспечение USB взаимодействует с этой системой, поддерживая такие системные события, как приостанов (SUSPEND) или восстановление (RESUME). Кроме того, устройства USB могут сами являться источниками событий, отрабатываемых системой управления энергопотреблением.
Хост-контроллер и устройство USB могут осуществлять обмен информацией используя различные допустимые для устройства параметры обмена. С точки зрения передачи данных, устройство по отношению к хост-контроллеру может иметь множество интерфейсов (точек), каждому из которых соответствует конкретная аппаратная часть устройства, представляющая хост-контроллеру конкретную функцию устройства. Кроме того, интерфейс в конфигурации может иметь альтернативные наборы характеристик, смена наборов поддерживается протоколом. Для согласования характеристик устанавливаемого канала с характеристиками, используемого устройством интерфейса обмена данными (точки), взаимно согласуются следующие параметры:
— требуемая частота доступа к шине и допустимые задержки обслуживания;
— требуемая полоса пропускания канала;
— требования к обработке ошибок;
— максимальные размеры передаваемых и принимаемых пакетов;
— тип обмена (управление, сплошной, изохронный и прерывания;
— направление обмена (для сплошного и изохронного обмена).
Каждое устройство в своем составе обязательно имеет схемы поддерживающие начальный интерфейс обмена (конечную точку с номером 0), используемый для инициализации и общего управления логическим устройством, а также опроса его состояния. Этот начальный интерфейс (точка 0) всегда сконфигурирован при включении питания и подключении устройства к шине и поддерживает передачи типа «управление».
Кроме нулевой точки, периферийные устройства могут иметь дополнительные, поддерживаемые их аппаратурой, интерфейсы обмена (точки), собственно и реализующие полезные обмены данными (низкоскоростные устройства могут иметь максимум две дополнительных точки, полноскоростные устройства – до 16 точек ввода и 16 точек вывода. Все эти точки не могут быть использованы до их конфигурирования то есть до установления согласованного с ними канала.
По каналу между хост-контроллером и конечной точкой устройства могут передаваться две разновидности информации — потоки (stream) и сообщения (message).
Поток доставляет данные от одного конца канала к другому, он всегда однонаправленный. Один и тот же номер конечной точки может использоваться для двух поточных каналов – ввода и вывода. Поток может использовать следующие типы обмена: сплошной, изохронный и прерывания. Доставка всегда идет в порядке «первый вошел – первым вышел», с точки зрения интерфейса USB данные потока неструктурированы.
В отличие от потоков сообщения имеют формат, определенный спецификацией USB. Обмен сообщениями происходит следующим образом: хост-контроллер посылает запрос к конечной точке, после которого передается (или принимается) пакет сообщения, за которым следует пакет с информацией состояния конечной точки. Последующее сообщение нормально не может быть послано раньше обработки предыдущего, но при отработке ошибок возможен и сброс необслуженных сообщений. Двусторонний обмен сообщениями адресуется к одному и тому же номеру конечной точки. Для доставки сообщений используется только обмен типа «управление».
С каналами связаны характеристики, соответствующие требованиям конечной точки (полоса пропускания, тип сервиса размер буфера и т. п.). Каналы организуются при конфигурировании устройств USB. Только дин канал сообщений, по которому передается информация конфигурирования, управления и состояния, обязательно существует для каждого включенного устройства.
В USB в отличие от других шинных архитектур концентраторы передают пакеты от корня без полного их получения, что обеспечивается возможность «горячего» подключения устройств без отключения системы. Можно подключить новое устройство или концентратор, или наоборот, отключить ставшее ненужным оборудование без необходимости перезагрузки системы. При обнаружении на шине нового устройства концентратор оповещает об этом корневой концентратор. Затем система опрашивает вновь подключенное устройство о возможностях и потребностях и конфигурирует его. Вдобавок при этом загружаются необходимые драйверы, так что новым устройством можно пользоваться немедленно. Таким образом USB поддерживает подключение и отключение устройств в процессе работы. Конфигурация устройств шины является постоянным процессом, отслеживающим динамические изменения физической топологии (рис.2). Все устройства USB подключаются через порты хабов. Хабы определяют подключение и отключение устройств к своим портам и сообщают состояние портов в ответ на запрос от контроллера. Хост разрешает работу порта и адресуется к устройству через канал управления, используя нулевой адрес – USB Default Address. Все устройства адресуются этим адресом при начальном подключении или после сброса.

Хост определяет, является новое подключенное устройство хабом или периферийным устройством, и назначает ему уникальный адрес USB. Хост устанавливает с этим устройством канал управления (control pipe), используя назначенный адрес и нулевой номер точки назначения. Если новое устройство является хабом, хост определяет подключенные к нему устройства, назначает им адреса и устанавливает каналы. Если новое устройство USB является периферийным устройством, уведомление о подключении передается диспетчером USB заинтересованному программному обеспечению.
Когда устройство отключается, хаб автоматически запрещает соответствующий порт и сообщает об отключении контроллеру, который удаляет сведения о данном устройстве из всех структур данных. Если отключается хаб, то процесс удаления выполняется для всех подключенных к нему устройств. Если отключается периферийное устройство, уведомление посылается заинтересованному ПО.
