Это целый карманные компьютеры. На них можно устанавливать сложные программы, ставить десктопы операционные системы и делать еще многое другое. Возможно кто-то не знает, что к этим устройствам еще можно подключать мыши, клавиатуры, 3G и Wi-Fi модемы и еще большое количество периферии.
Все это возможно при помощи вот такого USB OTG кабеля.
Но не всякое устройство поддерживает данный протокол. Для то чтобы узнать о его поддержке нужно почитать характеристики вашей модели. Там следует искать запись о наличии USB HOST. Но не всегда можно найти правильную и полную документацию. В таких случаях можно либо спросить на специализированном форуме, либо проверить самостоятельно, подключив через такой кабель мышку – на экране устройства должен будет появиться курсор. Если он появился, то устройство поддерживает USB HOST.
Host без питания
Но такой способ дает не 100% результат. Возможно, если мышка не определилась системой, то значит к переходнику нужно провести дополнительное питание. Так, например, было со всей серией устройств Motorola, которые поддерживали LapDock.
Эти гаджеты брали дополнительное питание от сети или от батареи этой экзотической док-станции. Поэтому для подключения к ним периферии без применения этого устройства нужно было модифицировать обычный USB OTG, добавив в цепь дополнительное питание. Чтобы не резать шнур, можно просто подключить периферию через активный хаб.
Активный хаб это что-то вроде тройника для USB, только с дополнительным питанием. Дело в том, что по стандарту порт USB компьютера выдает максимальный ток порядка 0,5 Ампер или 500 миллиампер. Такой силы тока может быть недостаточно для того чтобы «завести» довольно энергоемкую периферию. Так. к примеру, для подключения жесткого диска с Android устройству вам нужно взять , вставить в него активный хаб, хаб подключить в сеть питания и уже потом подключать жесткий диск.
Для чего мне это может понадобиться?
На самом деле сценариев просто огромное количество, но я постараюсь не акцентировать внимание на «экзотических» а объяснить на более приземленных примерах.
Наверняка все знают, что в последнее время все чаще стали выходить устройства без поддержки карт памяти. Вместо них производители оснащают свои устройства встроенной на 8, 16 или 32 гигабайта. Но устройства с 32 гигабайтами памяти стоят довольно дорого, а остальные не смогут обеспечить вам достаточно свободного места. Если кэш для игр и музыка могут спокойно разместиться на 16 гигабайтах (про 8 молчу уже – бесполезные устройства с таким объемом), то места для пары фильмов, а то и одно уже не хватит. В таком случае вас спасет USB HOST. Вы просто закидываете фильмы на обыкновенную флэшку и подключаете ее к телефону или планшету и смотрите в дороге любимые фильмы.
То же самое можно сделать и с жестким диском, но это уже не «походный» вариант, а более домашний, особенно если ваша медиатека расположена на внешнем жестком диске.
Также, если у вас планшет без поддержки 3G – можно это исправить, подключив к нему 3G модем и сидеть в интернете с помощью такой связки
Еще, если вспомнить сколько на Android вышло игр сам собой напрашивается вопрос подключения геймпада. И Android поддерживает подключение таких устройств, поэтому вы можете не мучиться с экранным управлением, а спокойно играть на приятных кнопка в любимые аркады на своем планшете.
Также, бывают ситуации, когда доступа к компьютеру нет (сломался он не вовремя) и нужно срочно набрать объемный текст, а под рукой только смартфон или планшет, а набирать его на сенсорной клавиатуре сродни мазохизму. Вот в такой ситуации вас и выручит поддержка USB HOST – вы просто подключаете мышь и клавиатуру и работаете с помощью полноразмерной клавиатуры. А если ваше устройство еще имеет HDMI выход, то вы и вовсе можете подключить к нему монитор и работать как за полноценным компьютером.
Ну и все-же экзотический вариант, из серии «просто попробовать» — подключение другого Android девайса.
И все-таки что мне для этого нужно?
Ну, во-первых, вам нужно Android устройство с поддержкой USB HOST. Дальше нужно обзавестись USB OTG кабелем и активным хабом, если вы желаете подключать энергоемкую периферию или ваш телефон по-другому не работает с хостом. Ну и конечно же сама периферия, которую вы собрались подключать.
Это что касается железной части. Еще, иногда бывает, что производитель программно блокирует данную возможность (что-то подобное наблюдается на Nexus 7 2013). В таком случае, если вы обычный пользователь – вам нужно искать на форумах (чаще всего это xda-developers) варианты решения этой проблемы. Обычно все обходится прошивкой модифицированного ядра или прошивкой альтернативной прошивки (CyanogenMod к примеру).
В общем, для каждого устройства свои нюансы, а их развелось такое количество, что в рамках одной статьи не описать. Но не отчаивайтесь – на тематических форумах все обычно «разжевано», особенно если модель устройства хоть немного популярна.
Вместо выводов
Настоятельно рекомендую, при выборе нового девайса включить данную опцию в перечень обязательных вещей, которые в нем должны быть, особенно если вы подбираете планшет. Даже если сейчас вы считаете это ненужной дополнительной опцией, то вполне возможно в какой-то определенной ситуации вы кардинально измените свою точку зрения.
В общем USB HOST – это очень интересная и полезная опция, которая не раз вас сможет выручить, особенно если вы студент, часто работаете с электронными документами или же часто пребываете в разъездах.
А еще это идеальное средство просмотра фильмов с флэшки, если лень вставать и ждать загрузки настольного компьютера.
Как вы уже наверняка знаете функция или технология USB OTG или USB On-The-Go является одним из важных изобретений, расширяющим преимущества старой спецификации USB. Эта технология может использоваться самими разными способами. В этой статье я открою вам 12 самых интересных секретов, как пользоваться OTG функцией на Андроид.
USB On-the-Go (USB OTG) позволяет смартфонам с интерфейсом USB выполнять роль хоста для подключенных к нему USB устройств. Что позволяет расширить функционал любого мобильного гаджета с поддержкой OTG. Самое известное расширение - двусторонний обмен данными с внешним накопителем типа флешки или портативного HDD. Кто-то резонно вспомнит другое применение - подключение к телевизору. Но о том, кабелем я расскажу вам в отдельной статье.
1. Зарядите от смартфона с поддержкой USB Host OTG другое устройство
Эту функцию с удовольствием оценит каждый пользователь Android. Ведь она позволяет заряжать смартфон от другого смартфона с функцией OTG, играющим роль USB хоста. Отличная технология, которая позволяет зарядить мобильное устройство в экстренных случаях.
2. Подключите портативный жесткий диск
К смартфону с поддержкой OTG через стандартный OTG кабель Вы можете присоединить портативный жесткий диск или любой другой внешний накопитель. Для этого просто соедините их между собой. Получить доступ к внешнему хранилищу данных и скопировать файлы на него крайне просто.
3. Подключите к смартфону с функцией OTG игровой контроллер
Если вы считаете, что играть в шутеры на Андроид-устройствах скучно и неудобно, то подключение внешнего игрового контроллера может кардинально изменить ситуацию. Используйте для подключения OTG кабель. В настоящее время большое количество мобильных игр для Андроид поддерживает внешние геймпады и подключить их к смартфону через OTG сможет каждый.
4. Подключите USB лампу
Скажите, вам бы понравилось, если ваш телефон в экстренных случаях сможет заменить светодиодную лампу? Думаю, да! Теперь это действительно возможно. OTG функция на Андроид позволяет подключить к USB интерфейсу LED светильник через тот же OTG кабель. Такую подсветку вы даже сможете использовать для фотосъемки ночью, если энергии встроенной вспышки будет недостаточно для освещения сцены.
5. Присоедините сетевой кабель LAN
А может у вас появилась нужда подключиться к широкополосному интернету напрямую, через сетевой кабель? Тогда купите адаптер LAN to USB и подключите его к USB интерфейсу с поддержкой OTG своего смартфона. Если по каким-то причинам вы не можете использовать беспроводный доступ к сети Интернет (нет подключения к WiFi или 3G сети), это решение спасет вас. Все что нужно - купите USB OTG порт и переходник на сетевой Ethernet интерфейс.
6. Передайте списки Контактов и Сообщения на другой телефон
С помощью приложения Samsung’s SmartSwitch или подобного софта вы можете передать все сообщения, журнал звонков и список контактов с вашего телефона на другой. Для это достаточно соединить оба устройства с помощью OTG кабеля. Помимо удобства и высокой скорости передачи данных этот способ позволит сэкономить заряд батареи. Отмечу, что устройством возможен лишь в одном случае - если оба гаджета поддерживают технологию OTG.
7. Присоедините клавиатуру или мышь
Вам не привычен стандартный способ навигации по интерфейсу Android устройства? Вы очень часто работает в мессенджерах WhatsApp и Facebook? Тогда вам будет удобнее работать с внешним устройством ввода, таким как клавиатура или мышь. И тут вам тоже будет кстати OTG функция на Андроид. Для вас не составит труда подключить к USB интерфейсу мышку или клавиатуру. Для этого подойдет стандартный OTG кабель. Более того, вы можете таким способом подключить и беспроводные устройства ввода, просто вставьте в OTG порт радиомодуль.
8. Присоедините внешнюю веб-камеру
Если вы являетесь фанатом цифровой фотографии, то возможность подключения внешней камеры к OTG порту Андроид устройства вас сильно порадует. Теперь не нужно подключать камеру к настольному компьютеру. Просто используйте возможности встроенной функции OTG.
9. Печатайте документы напрямую с Андроид телефона
Приложение PrintShare автоматически загрузит необходимые драйвера для подключения к USB порту принтера. Далее просто подключитесь через OTG кабель и распечатайте необходимый документ непосредственно со своего смартфона.
10. Жарко? Подключите USB вентилятор
Как известно, USB вентилятор отлично работает в паре с традиционным зарядным устройством. Напротив, вы могли наблюдать, что охлаждающие подставки для ноутбуков для питания вентиляторов часто подключаются к USB порту устройства. Для Андроид устройств это тоже возможно - просто подключите USB фан через O TG кабель.
11. Создавайте музыку на Андроид
Сегодня любой музыкант подтвердит, что большинство современных музыкальных инструментов (синтезаторы, гитары) можно подключить к компьютеру через MIDI интерфейс. Так вот, с приходом стандарта USB OTG появилась возможность подключить их и к вашему смартфону на платформе Android.
12. Запишите аудио через внешний микрофон
Эта функция пригодится многим, особенно создателям Youtube роликов. Любой смартфон с поддержкой OTG позволяет использовать внешний микрофон для записи голоса. Просто подключите микрофон к Андроиду через специальный OTG кабель и увеличите качество аудиодорожки в разы.
Как видите, существует множество способов использования OTG функции на Андроид, которые расширят возможности вашего мобильного устройства. Если я что-то упустил, пишите. Расширим список применения интерфейса с OTG вместе!
У каждой шины USB должен быть один (и только один!) хост — компьютер с контроллером USB. Однако понятие компьютер отнюдь не означает лишь привычные варианты настольных, напольных, портативных компьютеров. Компьютер — это сочетание процессора, памяти и периферийных устройств; в таком понимании в большинстве современных устройств присутствуют встроенные компьютеры. Если «интеллекта» этого компьютера и его возможностей диалога с пользователем оказывается достаточно, то он может взять на себя роль хоста USB. Такой вариант хоста рассматривается в последнем параграфе данной главы.
«Классический» хост USB делится на три основных уровня:
- интерфейс шины USB обеспечивает физический интерфейс и протокол шины. Интерфейс шины реализуется хост-контроллером, имеющим встроенный корневой хаб, обеспечивающий точки физического подключения к шине (гнезда USB типа «A»). Хост-контроллер отвечает за генерацию микрокадров. На аппаратном уровне хост-контроллер обменивается информацией с основной памятью компьютера, используя прямое управление шиной (bus-mastering) с целью минимизации нагрузки на центральный процессор;
- система USB, используя хост-контроллер(ы), транслирует клиентское «видение» обмена данными с устройствами — запросы IRP (I/O Request Packet — пакет запроса ввода/вывода) — в транзакции, выполняемые с реальными устройствами шины. Система отвечает и за распределение ресурсов USB — полосы пропускания и мощности источников питания (для устройств, питающихся от шины). Система состоит из трех основных частей:
- драйвер хост-контроллера — HCD (Host Controller Driver) — модуль, привязанный к конкретной модели контроллера, обеспечивающий абстрагирование драйвера USB и позволяющий в одну систему включать несколько разнотипных контроллеров;
- драйвер USB — USBD (USB Driver) — обеспечивает основной интерфейс (USBDI) между клиентами и устройствами USB. Интерфейс HCDI (Host Controller Driver Interface) между USBD и HCD спецификацией USB не регламентируется. Он определяется разработчиками ОС и должен поддерживаться разработчиками хост-контроллеров, желающих иметь поддержку своих изделий конкретными ОС. Клиенты не могут пользоваться интерфейсом HCDI; для них предназначен интерфейс USBDI. USBD обеспечивает механизм обмена в виде пакетов IRP, запрашивающих транспортировку данных по заданному каналу. Кроме того, USBD отвечает за некоторое абстрактное представление устройства USB клиенту, которое позволяет выполнять конфигурирование и управление состоянием устройств (включая и стандартное управление через конечную точку «0»). Реализация интерфейса USBDI определяется операционной системой; в спецификации USB излагаются только общие идеи;
- программное обеспечение хоста реализует функции, необходимые для функционирования системы USB в целом: обнаружение подключения и отключения устройств и выполнение соответствующих действий по этим событиям (загрузки требуемых драйверов), нумерацию устройств, распределение полосы пропускания и потребляемой мощности, управление состоянием энергопотребления и т. п.
- клиенты USB — программные элементы (приложения или системные компоненты), взаимодействующие с устройствами USB. Клиенты могут взаимодействовать с любыми устройствами (наборами их доступных конечных точек, входящих в выбранные интерфейсы), подключенными к системе USB. Однако система USB изолирует клиентов от непосредственного обмена с какими-либо портами (в пространстве ввода/вывода) или ячейками памяти, представляющими интерфейсную часть контроллера USB.
В совокупности уровни хоста предоставляют следующие возможности:
- обнаружение подключения и отсоединения устройств USB;
- манипулирование потоками управления между устройствами и хостом;
- манипулирование потоками данных;
- сбор статистики активности и состояний устройств;
- управление электрическим интерфейсом между хост-контроллером и устройствами USB, включая управление электропитанием.
Программная часть хоста в полном объеме реализуется операционной системой. До загрузки ОС может функционировать лишь усеченная часть ПО USB, поддерживающая только устройства, требующиеся для загрузки. Так, в BIOS современных системных плат имеется поддержка клавиатуры USB, реализующая функции сервиса Int 9h. После загрузки системы USB эта «дозагрузочная» поддержка игнорируется — система начинает работу с контроллером «с чистого листа», то есть со сброса и определения всех подключенных устройств. В спецификации PC’2001 выдвигается ряд требований к BIOS, в частности требование поддержки загрузки ОС с устройств USB.
Хост-контроллер является аппаратным посредником между устройствами USB и хостом. В настоящее время имеется три спецификации хост-контроллеров, каждой из которых соответствует свой комплект драйверов хост-части:
- UHC (Universal Host Controller) — универсальный хост-контроллер для шины USB 1.x, разработанный Intel;
- OHC (Open Host Controller) — «открытый» хост-контроллер для шины USB 1.x, разработанный Compaq, Microsoft и National Semiconductor;
- EHC (Enhanced Host Controller) — расширенный хост-контроллер для поддержки высокой скорости шины USB 2.0.
Все эти варианты контроллеров выполняют одни и те же задачи: организуют физические транзакции с устройствами по шине USB в соответствии с описаниями (дескрипторами) этих транзакций, помещенными в системное ОЗУ драйвером хост-контроллера. При этом транзакции разных типов обрабатываются по-разному. В плане обработки ошибок проще всего устроены изохронные транзакции, где ошибки не требуют повторов. Транзакции передач с гарантированной доставкой в случае ошибок требуют повторов до победного конца или признания неудачи (исчерпания допустимого числа повторов). С точки зрения планирования следует выделить периодические транзакции, которые должны выполняться строго по графику, остальные — как получится, и их ставят в очереди. Из-за особенностей планирования и возможных повторов порядок завершения обработки дескрипторов транзакций (успешных или нет) будет отличаться от порядка их помещения в память1, что прибавляет забот хост-контроллеру и его драйверу. Три варианта хостконтроллеров решают эти задачи по-разному и используют разные стратегии планирования транзакций, что иллюстрирует таблицы ниже.
Хост-контроллер UHC от Intel появился в микросхеме PIIX3 (мост PCI-ISA) чипсетов системных плат для процессоров Pentium и используется во многих последующих изделиях Intel. Это FS/LS хост-контроллер, который большую часть забот по планированию транзакций перекладывает на ПО, — драйвер контроллера UHC (UHCD). Интерфейс контроллера UHC описан в документе Universal Host Controller Interface (UHCI) Design Guide, версия 1.1 вышла в 1996 году.
Драйвер UHC формирует для хост-контроллера дескрипторы, называемые в UHCI «дескрипторами передач» (TD — Transfer Descriptor), на самом деле описывающие каждую шинную транзакцию. Напомним, что в терминах спецификации USB одна передача (transfer) может состоять из нескольких транзакций, а в управляющих передачах используется еще и свой тип транзакции для каждой фазы. Для транзакций передач с гарантированной доставкой дескрипторы TD приходится организовывать в очереди. Очереди нужны для таких передач, поскольку заранее не известно, сколько раз придется пытаться их исполнить. Продвижение очереди возможно только по успешному выполнению транзакции, находящейся в голове очереди, — это правило обеспечивает гарантированный порядок (в пределах своей очереди) доставки пакетов. Каждая очередь имеет свой заголовок (QH). Изохронные передачи исполняются всегда однократно (здесь нет гарантированной доставки), что упрощает их планирование. Драйвер размещает дескрипторы TD и QH в памяти и связывает их между собой в соответствии с планом выполнения транзакций в каждом кадре. Драйверу UHC приходится составлять детальное «расписание» для каждого будущего кадра, для чего используется список Frame List на 1024 кадра. Хост-контроллер обходит списки дескрипторов, начиная с точки, на которую указывает Frame List для текущего кадра, и выполняет соответствующие транзакции. Результат исполнения транзакции помечается в ее дескрипторе, отработанная транзакция помечается как «неактивная», и контроллер, встретив ее при очередном обходе, просто переходит к следующей. Драйвер должен периодически просматривать дескрипторы, извлекая уже отработанные и передавая результаты выполнения клиентскому драйверу. Логика работы контроллера подразумевает, что одному запросу ввода/вывода (IRP) от клиентского драйвера может соответствовать несколько «передач» — элементов очереди. Драйвер UHC разбивает запрос на транзакции и помещает дескрипторы этих транзакций в соответствующую очередь, а очередь включает в ближайшие планы. Драйвер отвечает за балансировку загрузки шины в каждом кадре, в частности, за гарантию предоставления не менее 10% полосы для транзакций управляющих передач. Планированием кадров также обеспечивается требуемая частота обращений к точкам периодических передач.
Контроллер UHC является активным устройством PCI (Bus-Master). Основное взаимодействие драйвера с хост-контроллером происходит с помощью дескрипторов, расположенных в памяти. Контроллер имеет регистры (в пространстве ввода/вывода), с помощью которых можно управлять его поведением: выполнять сброс, глобальную приостановку и пробуждение, подстраивать частоту кадров, управлять запросами прерываний, управлять портами встроенного корневого хаба. Контроллер позволяет работать в отладочном режиме, останавливаясь после выполнения каждой транзакции.
В процессе отработки плана контроллер считывает из памяти дескрипторы и данные, необходимые для начала транзакции. Как только в FIFO-буфер контроллера из памяти поступает информация, достаточная для начала транзакции, контроллер начинает транзакцию на шине USB. В процессе ее исполнения производится передача данных, после завершения контроллер модифицирует дескрипторы в памяти в соответствии с условиями завершения транзакции. В процессе отработки транзакции могут возникать ошибки переполнения или переопустошения FIFO-буфера, связанные с перегрузкой контроллера системной памяти или шины PCI. Эти серьезные ошибки инициируют аппаратные прерывания. В состав хостконтроллера входит и корневой хаб на 2 или более порта.
Прерывания от UHC могут инициироваться различными событиями, такими как выполнение транзакций (избранных), обнаружение приема короткого пакета, прием сигнала возобновления, или в результате ошибки. Прерываний по подключению-отключению устройств контроллер не вырабатывает.
В контроллере UHC имеется специальная поддержка традиционного интерфейса клавиатуры и мыши через контроллер 8042 — перехват обращений к портам 60h и 64h пространства ввода/вывода. При разрешенной эмуляции по обращениям ПО к этим портам UHC вызывает системное прерывание SMI (System Management Interrupt), обрабатывающееся в ПК на процессорах x86 в режиме SMM (System Management Mode), невидимо для обычных программ. Обработчик SMI, перехватывающий эти обращения, формирует последовательности действий, необходимые для их исполнения с помощью клавиатуры и (или) мыши USB. Единственное исключение делается при перехвате команд, управляющих вентилем GateA20, — вместо генерации SMI манипуляции этим вентилем выполняются аппаратно (как это давно делается и в 8042). Эта аппаратная поддержка включается установкой соответствующих параметров CMOS Setup.
Большое неудобство работы с UHC возникает из-за необходимости программного просмотра всех дескрипторов передач на предмет выявления завершенных. Дескрипторы завершенных передач необходимо программно извлекать из цепочек, сохраняя связанность элементов. Планирование транзакций (составление списков дескрипторов и заголовков) — тоже достаточно трудоемкая задача для драйвера. Очевидно, преследовалась цель упрощения аппаратных средств хост-контроллера. Однако это может обернуться зависимостью эффективной производительности шины USB от мощности и загрузки центрального процессора. Такой подход к организации ввода/вывода трудно назвать эффективным.
Драйвер в системной памяти создает список кадров Frame List, состоящий из 1024 элементов. Каждый элемент этого списка содержит 32-битный указатель на связанный список структур данных, по которым контроллер выполняет транзакции в данном кадре. Хост-контроллер имеет регистр базового адреса списка кадров, указывающий на начало списка. Текущий номер отрабатываемого элемента определяется десятью младшими битами счетчика кадров, находящегося в контроллере и инкрементируемого каждую миллисекунду. Период счета кадров можно немного варьировать, изменяя константу, занесенную в регистр модификации длительности кадра (SOF Modify Register), что обеспечивает возможность подстройки частоты кадров для синхронизации изохронных обменов.
Элемент списка кадров может указывать либо на дескриптор изохронной передачи TD (Transfer Descriptor), либо (если в данном кадре изохронный обмен не планируется) на заголовок очереди QH (Queue Head). Если в данном кадре вообще не планируются передачи, то в элементе устанавливается признак-«заглушка» T (Terminate, конец связанного списка, в данном случае — пустого). Еще раз напомним, что здесь слово «передача» (Transfer, согласно спецификации UHCI) употребляется в узком смысле — она соответствует одной транзакции (передаче не более одного пакета данных). Элемент (32-битное слово) имеет формат, приведенный на рисунке ниже. Поле FLLP (Frame List Link Pointer) — указатель на элемент; бит T — признак последнего элемента (при T = 1 указатель FLLP недействителен). Бит Q задает класс связанного элемента, на который указывает FLLP (0 — TD, 1 — QH).
Для каждого кадра из списка устанавливается своя цепочка дескрипторов изохронных передач (возможно и пустая), последний из этой цепочки должен ссылаться на цепочку заголовков очередей. Цепочки заголовков QH могут быть общими для группы кадров или даже для всех кадров списка. Общая идея построения очередей состоит в том, чтобы создавать свою очередь для каждого установленного канала (для всех сконфигурированных точек, кроме изохронных). «Дежурный» метод обслуживания — по горизонтали, тогда после выполнения транзакции с одной точкой контроллер перейдет к другой точке (другой очереди). Связывание TD и QH через указатели позволяет формировать произвольные конфигурации переходов от одной очереди к другой и даже делать петли — в последнем случае возможно, что с одной точкой в кадре успеют пройти несколько транзакций. Однако это нетипичный способ планирования. Если очередей много (установлено много каналов), то они распределяются по кадрам (из 1024-элементного списка) так, чтобы цепочка каждого кадра обязательно прошла по горизонтали до конца. Это можно спланировать, поскольку максимальное время для отработки одного элемента каждой очереди (как и изохронных транзакций) заранее известно (оно определяется типом передачи, максимальным размером пакета и скоростью устройства, что известно системе USB). При необходимости «горизонтальную справедливость» можно нарушить, задав вертикальный порядок обслуживания, — контроллер, успешно обработав из очереди передачу с признаком V = 1, перейдет к следующему дескриптору из этой же очереди, а не к следующей очереди.
Дескрипторы передач и заголовки очередей размещаются драйвером в ОЗУ по адресам, выровненным по границе параграфа, поскольку в качестве указателей используются лишь старшие 28 бит (биты используются для служебных признаков).
Дескриптор передачи (TD) состоит из 32 байтов, из которых хост-контроллер использует только первые четыре 32-битных слова DW0-DW3. Слова DW4-DW7 зарезервированы для использования драйвером UHC (для организации «сборки мусора» — повторного использования отработанных областей). Формат дескриптора передачи приведен на рисунке ниже. Серым цветом выделены поля, модифицируемые хост-контроллером.
В слове DW0 поле Link Pointer аналогично полю FLLP, а биты T и Q аналогичны одноименным битам элемента списка кадров. Бит V — метод обслуживания TD (1 — в глубину, 0 — в ширину).
Слово DW1 используется для управления и определения состояния выполнения передачи, модифицируется хост-контроллером. Поле ActLen — действительная длина переданных данных; поле Status — состояние выполнения передачи:
длина переданных данных; поле Status — состояние выполнения передачи:
- бит 23: Active — «надо исполнять», устанавливается драйвером, сбрасывается контроллером по успешному исполнению или исчерпанию лимита повторов;
- бит 22: Stalled — точка ответила пакетом STALL;
- бит 21: Data Buffer Error — ошибка буфера данных (переполнение или переопустошение FIFO при выполнении транзакции), транзакция остается активной (при переопустрошении контроллер генерирует пакет с ошибочным CRC, при переполнении не отвечает подтверждением);
- бит 20: Babble — при выполнении данной транзакции обнаружена «болтливость» устройства (оно отключается и устанавливается бит Stalled);
- бит 19: NAK — получение соответствующего ответа (в транзакции SETUP получение NAK устанавливает и признак ошибки тайм-аута);
- бит 18: CRC/Time Out Error — обнаружена ошибка передачи (CRC или таймаут);
- бит 17: Bitstuff Error — обнаружена ошибка вставки бит.
Биты используются для управления передачей. Бит IOC заказывает прерывание по исполнению (прерывание генерируется в конце кадра, даже если транзакция уже неактивна, выборка ее дескриптора вызовет прерывание). Бит ISO — признак изохронной передачи (указание не делать повторных попыток). Бит LS — признак LS-устройства, использовать преамбулу перед передачей. Поле C_ERR — счетчик повторных попыток, декрементируемый по каждой ошибке. Переход в 1 или 0 вызывает перевод дескриптора в неактивное состояние. Если драйвер устанавливает нулевое значение, то число повторов неограниченно. Бит SPD — детектор короткого пакета: если в транзакции IN, стоящей в очереди, успешно принято меньше данных, чем ожидалось, то в конце кадра вырабатывается условие прерывания.
В слове DW2 содержится информация для выполнения транзакции: Packet ID — тип используемого маркера IN (69h), OUT (E1h) или SETUP (2Dh); Device Address— адрес устройства USB; EndPt — номер и направление конечной точки. Бит D (Data Toggle) — состояние переключателя для передаваемого или посылаемого пакета. Поле MaxLength — длина передаваемых данных (максимальная длина принимаемых), 000 — 1 байт, 001 — 2, 3FF — 1024; 7FFh — 0 (пустой пакет). Допустимые значения до 4FFh — 1280 байт, теоретический предел емкости кадра. Значения 500-7FEh недопустимы, вызывают фатальную ошибку контроллера.
В слове DW3 содержится Buffer Pointer — указатель на буфер в ОЗУ, используемый для данных этой передачи.
Заголовок очереди (QH) связывает очереди друг с другом (по горизонтали) и ссылается на первый элемент (TD) данной очереди. Хост-контроллер использует два 32-битных слова (см. следующий рисунок). В поле QHLP (Queue Head Link Pointer) содержится указатель на следующий заголовок очереди (горизонтальная связка). В поле QELP (Queue Element Link Pointer) содержится указатель на элемент очереди (вертикальная связка). Признаки последнего элемента (T) и класс связанного элемента (Q) аналогичны одноименным признакам и классам в вышеприведенных структурах.
Дескриптор заголовка очереди создается драйвером; хост-контроллер модифицирует в памяти указатель QELP: успешно отработав транзакцию, контроллер берет из DW0 ее дескриптора указатель на следующий элемент и помещает его на место QELP в заголовке очереди. Таким образом, успешно отработанный TD удаляется из очереди. Когда удаляется последний TD, в QELP устанавливается признак пустой очереди (T). В случае неисправимой ошибки при отработке какого-то дескриптора в QELP также устанавливается «заглушка» T — поток с гарантированной доставкой не позволяет пропустить какую-либо транзакцию. Поле QELP может ссылаться как на TD (тривиальный вариант планирования), так и на QH — очередь сама может содержать очереди.
Регистровая модель UHC поясняется в таблице ниже, где представлены регистры, отображенные на пространство ввода/вывода. Кроме того, как всякое устройство PCI , контроллер UHC имеет регистры в конфигурационном пространстве, в которых, в частности, задаются коды класса (0Ch — контроллер последовательной шины), подкласса (03 — USB) и программного интерфейса (00) в классификации PCI SIG.