Usb hs что это
Иллюстрированная проекция модели сетевого взаимодействия OSI на универсальную последовательную шину.
Три «замечательных» уровня стека USB
Меня не устроил вид стека USB, который можно встретить чаще всего на просторах сети:
Уровень шины, логический, функциональный… Это, конечно, замечательные абстракции, но они скорее для тех, кто собирается делать драйвер или прикладной софт для хоста. На стороне же микроконтроллера я ожидаю шаблонный конечный автомат, в узлы которого мы обычно встраиваем свой полезный код, и он сперва будет по всем законам жанра глючить. Или же глючить будет софт на хосте. Или драйвер. В любом случае кто-то будет глючить. В библиотеках МК тоже с наскока не разобраться. И вот я смотрю на трафик по шине USB анализатором, где происходящие события на незнакомом языке с тремя замечательными уровнями вообще не вяжутся. Интересно, это у меня от гриппозной лихорадки в голове такой диссонанс?
Если у читателя бывали сходные ощущения, предлагаю альтернативное, явившееся мне неожиданно ясно в перегретом мозгу видение стека USB, по мотивам любимой 7-уровневой модели OSI. Я ограничился пятью уровнями:
Я не хочу сказать, что весь софт и библиотеки уже сделаны или должны проектироваться, исходя из этой модели. Из инженерных соображений код c уровнями будет сильно перемешан. Но я хочу помочь тем, кто начинает своё знакомство с шиной USB, кто хочет понять протоколы обмена устройств и терминологию предметной области, подобраться поближе к готовым примерам, библиотекам и лучше ориентироваться в них. Эта модель не для загрузки в МК, но в ваши блестящие умы, дорогие друзья. А ваши золотые руки потом всё сами сделают, я не сомневаюсь:)
Итак, поехали, поправляйте, если увидите косяки. Это draft-версия, и если уже такое где-то было нарисовано, прошу простить, я не нашёл и потому скрутил сам. Думаю, картинка никуда не убежит, а я пока объясню почтенной публике, зачем вообще взялся за эту публикацию.
Свой первый баг из чужого кода я вытряхнул в конце девяностых, будучи студентом на подработках. Это был pppd под FreeBSD, который мы тогда прикрутили на модемный пул. Мотороловские модемы залипали в отбое, дозвониться никто не мог, линия пропадала зазря, и единственный оставшийся способ через PPP keep-alive почему-то глючил. Вот тогда я и выяснил, что pppd зачем-то ждёт шесть ответных байтов LCP вместо положенных четырёх. Почувствовал я себя тогда эдаким лихим жукотрясом из девяностых:-) При чём тут PPP? Просто он на USB похож: пакетный и двухточечный. Правда, в отличие от USB 2.0, полнодуплексный.
Как пройти в библиотеку?
Получив на GitHub любезно выложенный автором проект RHIDDemo для Em::Blocks, я начал портировать его в Keil (мой отладчик CoLink на базе FTDI; кто-нибудь, подскажите плагин от Coocox для Em::Blocks). Но никак не мог понять: где, чёрт возьми, автор раздобыл SPL 3.6.1 выпуска 2012г, если на сайте выложен 3.5.0 от 2011г? Я прошёл довольно скучный квест, который к моему удивлению привёл… прямо на готовый проект Custom HID для Keil в составе библиотеки USB FS 4.0.0. Лежит у всех на виду, как мышь под веником. Ну и ладно. Зато я раскурил, наконец, релизы STMicroelectronics, нашёл описание библиотеки USB FS STSW-STM32121 (UM0424) и пресёк попытки разработчика свести меня с ума. Вот скажите, это нормально подкладывать винтажный CMSIS 1.30 образца 2009г в набор SPL 3.5.0 выпуска 2011г, новый SPL 3.6.1 релиза 2012г прятать в USB-FS 4.0.0 релиза 2013г (подложив туда же и CMSIS 3.0.1 от 2012г), при том, что у них же выложена актуальная версия CMSIS 3.30 релиза 2014г? Кстати, в SPL 3.6.x для STM32F10X исправили пару багов с USART, касающихся сигналов о переполнении буфера. Спасибо, хоть release notes оставили…
HID vs SNMP
Итак, взявшись за STM32F103C8T6, я тоже решил слегка задвинуться по теме USB HID, уж больно хорошо абстракция USB HID укладывается в концепцию всяческих датчиков, сенсоров и прочих ШИМ-управляемых драйверов питания. Чем-то напомнило мне SNMP, только в сильно упрощённом виде: дескрипторы HID играют роль SNMP MIB. Когда устройство инициализируется хостом: «Привет, хост! Я кофеварка. У меня есть кнопка [старт], регуляторы [сливки], [сахар], датчики [остаток кофе], [остаток воды], [остаток сахара], [остаток сливок]. Подтягивай драйвера, дави на кнопку, кофейку попьём». Ничего не напоминает? Пример диалога по SNMP: «Ну, привет, управляющая станция с софтом за $100000. А я шасси коммутатора за $200000, и на мне сидят ещё 4 модуля по $100000 за штуку; в каждом ещё по 16 портов с неприличной скоростью, и всех функций тут просто не перечислить… спрашивай отдельно по каждому пункту; ах, да загрузка процессора такая-то, памяти столько-то…». И ещё на дюжину страниц в таком же духе.
Ещё одна замечательная схема
На просторах сети встретил ещё такую иллюстрацию (лежало в формате BMP, без шуток):
Сперва выглядит оптимистично. Наконец-то, стек в разобранном виде. Кадры, правда, обозначены неудачно: я бы нарисовал их вертикальными пунктирными линиями, а EOF — это просто пауза, реально данные не передаются. Но начинаем читать контекст и теряем понимаем истинный замысел автора (запутать нас):
Хост-контроллер интерфейса шины USB формирует кадры;
Кадры передаются последовательной передачей бит по методу NRZI.
каждый кадр состоит из наиболее приоритетных посылок, состав которых формирует драйвер хоста;
каждая передача состоит из одной или нескольких транзакций;
каждая транзакция состоит из пакетов;
каждый пакет состоит из идентификатора пакета, данных (если они есть) и контрольной суммы.
Вроде бы и нарисовано всё правильно, но по мере прочтения вопросов становится всё больше. Минимальная передаваемая структура данных по шине — это кадр или пакет? Вообще, это сверху вниз надо смотреть или наоборот? И что кодируется по методу NRZI — кадры, пакеты или просто весь битовый поток по шине? Из транзакций состоит посылка, передача, или, может быть, ценная бандероль какая?
Почему нельзя просто: хост группирует пакеты в транзакции и распределяет их по временным квантам, именуемым кадрами, чтобы давать приоритет критичным по времени данным (видео, аудио) исходя из текущей пропускной способности шины? Да, в USB есть нюансы с планированием передачи пакетов, я их пока не затрагиваю.
Моё видение стека USB
Хорошей документацией считаю упоминавшийся тут на хабре USB in a NutShell (ура, перевод), а также USB Made Simple. По ним я и собрал свою версию стека USB, нарисую её ещё раз.
Физический уровень
На физическом уровне используется набор электрических режимов дифференциальной пары проводников (вместе с землёй) для обозначения состояний, с помощью которых кодируется битовый поток по методу NRZI со вставкой битов (bit stuffing): здесь после шести идущих подряд «1» (ну захотелось передать, скажем, 0xffff) вставляется «0», чтобы приёмник подолгу не залипал в одном состоянии; приёмник узнает вставленный «0» и как данные не засчитает, это довольно распространённый приём в кодировании для лучшей автоподстройки частот. Пара проводов вместе с землёй даёт возможность сформировать, как минимум, четыре статических состояния (они обозначаются J, K, SE0, SE1). В USB 2.0 SE1 не используется, а три оставшихся дополнительно разыгрываются в динамике (с часами и переходами) для передачи ещё нескольких управляющих символов (границы пакетов, сброс, подключение/отключение, энергосбережение/выход). Хорошие иллюстрации есть в USB Made Simple, Part 3 — Data Flow.
Т.е. в итоге передаются данные в виде ноликов и единичек, плюс всякие управляющие символы, чтобы можно было из всей этой электродинамической кухни готовить нормальные пакеты данных.
(дополнено по просьбе читателей)
Пакетный уровень
На пакетном уровне между хостом и устройством передаются безадресные пакеты (пара устройств на полудуплексной линии может обойтись и без адресации). Пакет состоит из маркера SYNC для синхронизации тактов приёмника, последовательности байт и символа EOP. Длина пакета переменная, но оговаривается через верхние уровни стека. Первый байт называется Packet Identifier (PID), имеет простой избыточный формат для помехоустойчивости и пригоден для скармливания автомату следующего уровня (для сборки транзакций из пакетов). Пакеты с начинкой (длиннее одного байта PID) снабжаются контрольной суммой (короткой CRC5 или длинной CRC16, в зависимости от типа пакета). Анализатор протоколов должен, как минимум, показывать нам пакеты.
Уровень транзакций
На следующем уровне из пакетов собираются транзакции. Транзакция — это малый набор пакетов (в Full Speed USB 1, 2 или 3), следующих строго друг за другом, которыми (в полудуплексном режиме) хост обменивается с оконечной точкой (endpoint), и только с одной. Очень важно, что транзакцию открывает только хост, это специфика USB (нам в прошивке МК меньше мороки). На уровне транзакций можно говорить о канале (pipe) между хостом и одной из оконечных точек устройства, но я намеренно избегаю термина «канальный уровень» (Data Link) из модели OSI. Анализатор протоколов должен хотя бы декодировать транзакции.
Уровень передач
Поверх транзакций расположим уровень передач (transfers). Их в USB используется четыре типа: контрольные с оконечной точкой №0 (control transfers), передачи с прерываниями (interrupt transfers), изохронные (isochronous transfers) и крупноблочные передачи (bulk transfers). Последние три являются вариантами потоковых каналов (stream pipe), про которые я ещё скажу несколько слов. Этот уровень тоже должен отобразить хороший анализатор протоколов.
Прикладной уровень
Венчает стек, как обычно, прикладной уровень. Здесь происходят: установка адреса устройству хостом, рассказ устройства о себе на языке дескрипторов, команды хоста на выбор конфигурации (контрольные передачи), обмен данными с HID-устройствами (в примерах пока нашёл передачу с прерываниями, хочу попробовать контрольную), печать на принтере и сканирование, доступ к накопителю USB (крупноблочные), общение через гарнитуры и веб-камеры (изохронные) и многие другие замечательные вещи.
Последний штрих
Смотрим на трафик по USB
Итак, транзакция всегда инициируется хостом в отношении одной выбранной оконечной точки на устройстве (помимо специальной точки с номером 0, их может быть ещё до 15 штук на одном устройстве, например, комбинированная клавиатура с мышью, термометром, флэшкой, кофеваркой и кнопкой вызова сантехника заказа пиццы).
В случае приёма хостом данных с устройства последнее не может само открыть транзакцию, но может только дождаться нужного момента и поучаствовать в ней. Хост открывает транзакцию устройству пакетом с PID = IN (группа Token) и гарантирует на нужное время свободу шины, устройство вбрасывает пакет из группы Data, в зависимости от типа транзакции хост может подтвердить успех третьим пакетом из группы Handshake (ACK, NAK, STALL, NYET), транзакция закрыта.
При отправке данных на устройство (PID = OUT, группа Token) хост открывает транзакцию, отправляет пакет с данными (Data), также в зависимости от режима может принять пакет Handshake с подтверждением успешности транзакции.
По окончании транзакции всё вернётся на круги своя, устройство снова будет ждать управляющих пакетов от хоста.
Режимы передачи USB в примерах STM32 USB FS
DISCLAIMER
Дальше будут упоминаться примеры из той самой библиотеки UM0424 для работы с Full Speed USB от STMicroelectronics, но они рассчитаны под их родные демоплаты. Берите пример с автора Raja, проявляйте инженерную смекалку в адаптации проектов под свою демоплату.
По софту всё понятно: это примеры не для промышленного использования, там могут быть баги, некоторые части (типа таблицы ссылок в примере Mass storage) защищены патентом, и вы не имеете прав их использовать в коммерческом проекте. Но это ещё ничего, китайцы ухитряются потом продавать на рынке USB-изделия, у которых даже библиотечные VID и PID не удосужились поменять.
По железу, как я понял, надо начинать с кварца. У меня челябинский PinBoard II с кварцем 12Мгц (все библиотеки заточены под 8МГц), я менял умножитель ФАПЧ с 9 на 6 (ссылка с разъяснениями), иначе МК разгонится до 108МГц вместо 72МГц, а USB на 72МГц вместо положенных 48МГц вообще не поедет. Можно ещё сбавить обороты МК до 48МГц, поменяв делитель шины USB с полутора до единицы. Использовать внутренний генератор МК HSI спецы не любят: частота может слегка уплыть от нагрева, последствия для USB предсказать затрудняюсь. Ну и не забываем о периферии, конечно. Без флэш-памяти SPI/SDIO из примера Mass storage можно сделать разве что аналог /dev/null, но его ведь хрен отформатируешь:-)
Передачи с прерываниями
Эта разновидность (interrupt transfer) предназначена для обмена небольшими транзакциями, сходными с контрольными. Нет, устройство не может прерывать хоста, оно ждёт опроса, их частота и размеры пакетов оговариваются заранее в дескрипторе устройства. Хорошо подходят для всевозможных пультов, датчиков, сенсоров, мышек, светодиодов и прочих HID-кофеварок. Канал с прерываниями каждой точки однонаправленный.
Примеры: Custom HID, Joystick mouse, Virtual COM port
Передачи изохронные
Передачи крупноблочные
Что осталось нераскрытым
Я не имею цель сделать ещё один учебник по USB, их и без меня хватает, и там хорошо описаны: электрическая часть, подробности протоколов, работа с концентраторами, дескрипторный язык и уровень абстракции HID, проблемы с уникальностью VID/PID, USB 3.0 и многие другие замечательные возможности шины USB, как полезные нам, так и не очень. Айтишникам особо рекомендую экскурсию на тёмную сторону с обзором вражеских девайсов (флэшка с замаскированной HID-клавиатурой, которая будет делать страшные вещи).
Ссылки
P.S.
Читая публикации на хабре, посвящённые в той или иной степени микроэлектронике, я разглядел две инженерных касты, назовём их условно: Промэлектронщики и Айтишники. Это своего рода инженерный Инь и Ян, в каждом из нас есть доля того и другого.
Промэлектронщики имеют блестящие знания и навыки по железу, паяют радиодетали толщиной с волос левой рукой с закрытыми глазами (причём потом это работает). Взглянув на электронную схему, почти физически начинают ощущать все её токи с потенциалами, работают также и с силовыми схемами, и с (большими, быстрыми, опасными) промышленными изделиями. Подход к программированию МК соответствующий: он просто должен выдать нужные логические уровни на нужные ножки в нужное время, не столь важно каким способом. Консервативны в технологиях (не влезай — работает), тяжёлую периферию МК не особо жалуют. При обсуждении объектно-ориентированного программирования, информационной безопасности, гигантских проектов в миллион строк кода и всяких навороченных графических интерфейсов скучнеют. Вместо пакетно-ориентированной шины USB предпочитают потоковый режим USART, усиленный либо привычным RS-232, либо более брутальным RS-485 (последовательная шина для промышленных применений, до 10Мбит/с на 15м, до 100кБит/с на 1200м, до 32 устройств).
Айтишники воспитаны на понимании операционных систем, сетевой инфраструктуры и сложных взаимодействий, элита хорошо подкована в информационной безопасности и разбирается во всяких незримых способах проникновения в чужую систему. Некоторые при этом очень любят котиков (ну как их можно не любить? я, правда, не держу, не развожу и не готовлю:-). Многие любят свободу информации, ругать корпорации/правительства и побеждать силы природы усилием мысли. Паталогически ленивы, но обожают новые технологии и закрученные инженерные ребусы с дорогими игрушками (желательно решаемые на уровне софта или, в крайнем случае, перемычек). Отношения с паяльником настороженные: не спрашивайте у айтишника, любит ли он паяльник, может неправильно понять; лучше спросите, любит ли он паять электронные схемы.
К чему я? Мы просто видим этот мир по-разному… Ведь ядро Linux кроили такие же ребята, из модулей на С и ассемблерных вставок для конкретных платформ, и без холиваров вроде обошлись. По-настоящему серьёзный проект я вижу как многоядерную систему, сочетающую современнейшие МК с тяжёлой периферией, но не исключаю связки с классическими моделями типа AVR: ими можно обвесить какие-нибудь критичные быстровращающиеся острия технического прогресса. Если код проверенный годами, то почему нет?
Продолжим тему программирования обмена данными по шине USB.
Причём поработаем мы с аппаратной шиной USB HS контроллера, скорость которой в 40 раз больше, чем скорость шины USB FS, и составляет 480 мегабит в секунду.
В качестве подопытной платы мы будем использовать полюбившуюся многим плату STM32F746G-DISCOVERY, с которой мы уже очень много времени успешно и плодотворно работаем, и, надеюсь, ещё много будем работать для того, чтобы средства её оплаты были потрачены недаром. Данная плата в нашем случае хороша не только тем, что на ней установлен мощный микроконтроллер STM32F746NG и удобный дисплей для вывода оперативной информации, но и тем, что на её борту также присутствует микросхема USB3320C-EZK, преобразующая параллельный интерфейс USB HS ULPI в последовательный USB HS PHY, очень хорошо понятный нашей повседневной шине USB, которую мы постоянно используем. А как мы знаем, контроллер не имеет аппаратной шины USB HS PHY ввиду того, что в силу своих аппаратных характеристик он не может разогнаться до скорости передачи данных 480 Mbps. Если вдруг у вас под рукой не окажется подобной платы, то есть и альтернативные способы использования данной шины путём подсоединения к отладочной плате, не имеющей микросхемы-преобразователя, модуля с подобной микросхемой. Для подключения можно воспользоваться схемой подключения данной микросхемы в плате STM32F746G-DISCOVERY
В качестве устройства, которое мы будем подключать по шине USB HS PHY мы возьмём обычный чистый отформатированный в системе FAT32 FLASH-накопитель USB на 8 гигабайт и подключим его с помощью OTG-кабеля USB следующим образом
Как и в предыдущих занятиях по шине USB, мы не будем вдаваться в её аппаратную организацию в контроллере, так как она отнюдь непростая, поэтому поручим эту прерогативу библиотеке HAL и будем пользоваться её функционалом. А если уж что-то не заладится, то тогда и посмотрим Reference Manual.
Поэтому сразу приступим к проекту.
Так как нам пригодится дисплей для вывода некоторой оперативной информации, мы не будем создавать проект с нуля. а воспользуемся одним из наших предыдущих проектов, например, проектом урока 70 по выводу текста на дисплей с именем LTDC_TEXT и назовём его по наименованию урока — USB_HS_HOST_MSC_STANDALONE.
Прежде чем открывать проект в Cube MX, удалим из папки Src все файлы, которые писали не мы, а именно bsp_driver_sd.c, fatfs.c, stm32f7xx_hal_msp.c, stm32f7xx_it.c и system_stm32f7xx.c.
Аналогичным образом из папки Inc удалим файлы main.h, bsp_driver_sd.h, fatfs.h, ffconf.h, stm32f7xx_hal_conf.h и stm32f7xx_it.h.
Делается это в целях избежания ошибок при генерации кода, так как со времён урока 70 прошло очень немало времени и все библиотеки изменились коренным образом.
Откроем проект в проектогенераторе Cube MX, согласимся с миграцией в новую версию и сначала отключим библиотеку FATFS
Затем отключим SDMMC
Отключим RNG
В настройках FMC добавим ещё 2 банка
Включим USB OTG HS
Контакт ULPI DIR переопределим на ножку PC2
Включим USART1, так как основную информацию о ходе нашей программы мы будем всё же получать через данную шину и отображать её в терминальной программе на ПК
Здесь также переопределяем контакт TX на ножку PA9
Включим также USB Host
Также произведём его некоторые настройки
Включим FATFS
Изменим и здесь определённые настройки, так как мы будем работать с длинными именами
Ещё внесём некоторые изменения в настройки CORTEX_M7 в связи с тем, что мы добавили ещё 2 банка SDRAM
Сохраним настройки, сгенерируем проект для System Workbench, несмотря на предупреждение Cub MX по USB_HOST, и откроем его там. Установим уровень оптимизации в 1, а также уберём при наличии отладочные настройки.
Удалим весь код из пользовательской части бесконечного цикла функции main().
Продолжаем тему программирования шины USB, устройства Host (ведущего), класса MSC (Mass Storage Class) с использованием интерфейса HS (High Speed). Только проект мы будем на данном занятии уже разрабатывать для использования с операционной системой реального времени FREERTOS. При использовании данной системы будут свои тонкости. Поэтому такой урок было принято решение сделать.
В уроке 141 мы уже работали с данным интерфейсом, поэтому нам все равно будет проще, чем изучать всё с нуля.
В качестве подопытной платы мы по-прежнему будем использовать отладочную плату STM32F746G-DISCOVERY, а также тот же самый FLASH-накопитель на 8 гигабайт, которым мы пользовались в уроке 141
Поэтому многие участки кода будут использоваться из этого урока.
Тогда не будем медлить и сразу приступим к проекту.
Проект мы сделаем из проекта урока 111 с именем TASKS_QUEUES и назовём его USB_HS_HOST_MSC_FREERTOS.
Прежде чем открывать проект в Cube MX, удалим из папок Src и Inc все те файлы, которые создавали не мы, а также кроме файла main.c.
Теперь откроем проект в Cube MX и первым делом настроим FreeRTOS, так как в то время, когда мы изучали LWIP при взаимодействии с FREERTOS, мы многому научились.
Установим размер кучи ровно 32 килобайта и выберем другую схему распределения памяти
В разделе Tasks and Queues удалим задачу myTask02
Немного уменьшим стек для задачи по умолчанию
Добавим задачу для вывода строк на дисплей
Подключим остальные два банка памяти SDRAM в настройках FMC
Зайдём в настройки Cortex M7 и добавим туда данные банки в другой регион памяти
Включим шину USB HOST HS
Контакт ULPI DIR переопределим на ножку PC2
Включим USB Host
Также произведём его некоторые настройки, в которых кроме всего прочего увеличим стек на процесс
Включим библиотеку FATFS
Задействуем в ней поддержку длинных имён, а также увеличим максимальную величину сектора и увеличим максимальное количество одновременно открытых файлов
Прежде чем генерировать проект, в файле ff.h в папке репозитория «ДИСК:\Users\Имя пользователя\STM32Cube\Repository\STM32Cube_FW_F7_V1.12.0\Middlewares\Third_Party\FatFs\src» добавим некоторый код, с помощью которого отключим проверку повторных вхождений. У нас таких не ожидается, а с включенными почему-то не работает
Сгенерируем проект для System Workbench, несмотря на предупреждение Cube MX по USB_HOST, и откроем его там. Установим уровень оптимизации в 1, а также уберём при наличии отладочные настройки.
Также вот здесь установим галку, чтобы проект побыстрее собирался
Откроем файл main.c и удалим пользовательскую функцию TaskStringOut вместе с телом.
Также вместе с телом удалим и функцию Task01.
Удалим также глобальный идентификатор этой задачи вместе с идентификаторами остальных пользовательских задач
Удалим прототипы функций этих задач
void Task01( void const * argument);
void TaskStringOut( void const * argument);
Шина USB обеспечивает обмен данными между хост-компьютером и множеством периферийных устройств (ПУ). USB является единой централизованной аппаратно-программной системой массового обслуживания множества устройств и множества прикладных программных процессов. Связь программных процессов со всеми устройствами обеспечивает хост-контроллер с многоуровневой программной поддержкой. Этим USB существенно отличается от традиционных периферийных интерфейсов (портов LPT, COM, GAME, клавиатуры, мыши и т. п.), сравнение этих типов подключений приводится в таблице.
Таблица. Сравнение шины USB с традиционными периферийными интерфейсами
Традиционные интерфейсы (COM, LPT, Game…) | Шина USB |
Подключение каждого устройства в общем случае требует присутствия собственного контроллера (адаптера) 1 | Все устройства подключены через один хостконтроллер |
Каждый контроллер занимает свои ресурсы (области в пространстве памяти, ввода/вывода, а также запросы прерывания) | Ресурсы занимает только хост-контроллер |
Малое количество устройств, которые возможно одновременно подключить к компьютеру | Возможность подключения до 127 устройств |
Драйверы устройств могут обращаться непосредственно к контроллерам своих устройств, независимо друг от друга | Драйверы устройств обращаются только к общему драйверу хост-контроллера |
Независимость драйверов оборачивается непредсказуемостью результата одновременной работы с множеством устройств, отсутствием гарантий качества обслуживания (возможность задержек и уменьшения скорости передачи) для различных устройств | Централизованный планируемый обмен обеспечивает гарантии качества обслуживания, что позволяет передавать мультимедийные изохронные данные наряду с обычным асинхронным обменом |
Разнообразие интерфейсов, разъемов и кабелей, специфичных для каждого типа устройств | Единый удобный и дешевый интерфейс для подключения устройств всех типов. Возможность выбора скорости работы устройства (1,5–15–480 Мбит/с) в зависимости от потребности |
Отсутствие встроенных средств обнаружения подключения/отключения и идентификации устройств, сложность поддержки PnP | Возможность «горячего» подключения/отключения устройств, полная поддержка PnP, динамическое конфигурирование |
Отсутствие средств контроля ошибок | Встроенные средства обеспечения надежной передачи данных |
Отсутствие штатного питания устройств | Возможность питания устройств от шины, а также наличие средств управления энергопотреблением |
1 — Возможностью подключения к одному контроллеру множества устройств обладает и шина SCSI, но ее параллельный интерфейс по сравнению с USB слишком дорог, громоздок и более ограничен в топологии.
Основные понятия
Архитектура USB допускает четыре базовых типа передач данных между хостом и периферийными устройствами:
Аппаратная часть USB включает:
- периферийные устройства USB, несущие полезные функции (USB-functions);
- хост-контроллер (Host Controller), обеспечивающий связь шины с центром компьютера, объединенный с корневым хабом (Root Hub), обеспечивающим точки подключения устройств USB. Существует два варианта хост-контроллеров USB 1.x — UHC (Universal Host Controller) и OHC (Open Host Controller), поддерживающие скорости FS/LS; высокую скорость шины USB 2.0 (HS и только) поддерживает EHC (Enhanced Host Controller);
- хабы USB (USB Hubs), обеспечивающие дополнительные точки подключения устройств;
- кабели USB, соединяющие устройства с хабами.
Программная часть USB включает:
- клиентское ПО (CSw, Client Software) — драйверы устройств USB, обеспечивающие доступ к устройствам со стороны прикладного ПО. Эти драйверы взаимодействуют с устройствами только через программный интерфейс с общим драйвером USB (USBD). Непосредственного обращения к каким-либо регистрам аппаратных средств драйверы устройств USB не выполняют;
- драйвер USB (USBD, USB Driver), «заведующий» всеми USB-устройствами системы, их нумерацией, конфигурированием, предоставлением служб, распределением пропускной способности шины, мощности питания и т. п.;
- драйвер хост-контроллера (HCD, Host Controller Driver), преобразующий запросы ввода/вывода в структуры данных, размещенные в коммуникационной области оперативной памяти, и обращающийся к регистрам хост-контроллера. Хост-контроллер выполняет физические транзакции, руководствуясь этими структурами данных.
Драйверы USBD и HCD составляют хост-часть ПО USB; спецификация USB очерчивает круг их задач, но не описывает интерфейс между ними. Физическое устройство USB должно иметь интерфейс USB, обеспечивающий полную поддержку протокола USB, выполнение стандартных операций (конфигурирование и сброс) и предоставление информации, описывающей устройство. Физические устройства USB могут быть комбинированными (compound devices): включать в себя несколько устройств-функций, подключенных к внутреннему хабу, а также предоставлять своим внутренним хабом дополнительные внешние точки подключения.
Работой всех устройств шины USB управляет хост-контроллер (host controller), являющийся программно-аппаратной подсистемой хост-компьютера. Хост-контроллер является интеллектуальным устройством шины PCI или составной частью «южного» хаба (моста) системной платы, интенсивно взаимодействующим с оперативной памятью.
Физическая топология шины USB — многоярусная звезда (см. рисунок, а). Ее вершиной является хост-контроллер, объединенный с корневым хабом (root hub). Хаб является устройством-разветвителем, он может служить и источником питания для подключенных к нему устройств. К каждому порту хаба может непосредственно подключаться периферийное устройство или промежуточный хаб; шина допускает до пяти уровней (ярусов) каскадирования хабов (не считая корневого). Поскольку комбинированные устройства содержат внутри себя хаб, их подключение к хабу пятого яруса уже недопустимо. Каждый промежуточный хаб имеет несколько нисходящих (downstream) портов для подключения периферийных устройств (или нижележащих хабов) и один восходящий (upstream) порт для подключения к корневому хабу или нисходящему порту вышестоящего хаба.
Логическая топология USB — звезда. Хабы (включая корневой) создают иллюзию непосредственного подключения каждого логического устройства к хост-контроллеру (см. рисунок ниже, б). В этой звезде устанавливаются сугубо подчиненные отношения по системе опроса-ответа: хост-контроллер по своей инициативе передает данные к выбранному устройству или принимает их. Устройство по своей инициативе передавать данные не может; непосредственные передачи данных между устройствами невозможны. Устройство по своей инициативе может лишь сигнализировать о «пробуждении» (wakeup), для чего используется специальная сигнализация, но не передача данных.
Физический интерфейс USB прост и изящен. Конструкция кабелей и коннекторов USB не дает возможности ошибиться при подключении устройств (см. рисунок ниже, а и б). Для распознавания разъема USB на корпусе устройства ставится стандартное символическое обозначение (см. рисунок ниже, в). Гнезда типа «A» устанавливаются только на нисходящих портах хабов, вилки типа «A» — на шнурах периферийных устройств или восходящих портов хабов. Гнезда и вилки типа «B» используются только для шнуров, отсоединяемых от периферийных устройств и восходящих портов хабов (от «мелких» устройств — мышей, клавиатур и т. п. кабели, как правило, не отсоединяются). Для малогабаритных устройств имеются разъемы mini-B, а для поддержки OTG (On-the-Go) имеются и вилки mini-A, и розетки miniAB. Хабы и устройства обеспечивают возможность «горячего» подключения и отключения с сигнализацией об этих событиях хосту.
При планировании соединений следует учитывать способ питания устройств: устройства, питающиеся от шины, как правило, подключают к хабам, питающимся от сети. К хабам, питающимся от шины, подключают лишь маломощные устройства — так, к клавиатуре USB, содержащей внутри себя хаб, подключают мышь USB и другие устройства-указатели (трекбол, планшет).
Логическое устройство USB представляет собой набор независимых конечных точек (Endpoint, EP), с которыми хост-контроллер (и клиентское ПО) обменивается информацией. Каждому логическому устройству USB (как функции, так и хабу) конфигурационная часть ПО хоста назначает свой адрес (1–127), уникальный на данной шине USB. Каждая конечная точка логического устройства идентифицируется своим номером (0–15) и направлением передачи (IN — передача к хосту, OUT — от хоста). Точки IN4 и OUT4, к примеру, представляют собой разные конечные точки, с которыми могут общаться даже модули клиентского ПО. Набор конечных точек зависит от устройства, но всякое устройство USB обязательно имеет двунаправленную конечную точку 0 (EP0), через которую осуществляется его общее управление. Для прикладных целей используются конечные точки с номерами 1–15 (1–2 для низкоскоростных устройств). Адрес устройства, номер и направление конечной точки однозначно идентифицируют приемник или источник информации при обмене хост-контроллера с устройствами USB. Каждая конечная точка имеет набор характеристик, описывающих поддерживаемый тип передачи данных (изохронные данные, массивы, прерывания, управляющие передачи), размер пакета, требования к частоте обслуживания.
Устройство может выполнять несколько различных функциональных задач: например, привод CD-ROM может обеспечивать проигрывание аудиодисков и работать как устройство хранения данных. Для решения каждой задачи в устройстве определяется интерфейс — набор конечных точек, предназначенных для выполнения данной задачи, и правила их использования. Таким образом, каждое устройство должно обеспечивать один или несколько интерфейсов. Наличие нескольких интерфейсов позволяет нескольким драйверам, каждый из которых обращается только к своему интерфейсу (представляющему часть устройства USB), работать с одним и тем же устройством USB. Каждый интерфейс может иметь один или несколько альтернативных вариантов (альтернативных установок — alternate settings), из которых в данный момент активным может быть только один. Варианты различаются наборами (возможно, и характеристиками) используемых конечных точек.
Набор одновременно поддерживаемых интерфейсов составляет конфигурацию устройства. Устройство может иметь одну или несколько возможных конфигураций, из которых на этапе конфигурирования хост выбирает одну, делая ее активной. От выбранной конфигурации зависит доступная функциональность, и зачастую — потребляемая мощность. Пока устройству не назначен номер выбранной конфигурации, оно не может функционировать в прикладном смысле и ток потребления от шины не должен превышать 100 мА. Хост выбирает конфигурацию исходя из доступности всех ресурсов, затребованных данной конфигурацией, включая и ток потребления от шины.
Модель передачи данных
Каждая единица клиентского ПО (обычно представляемая драйвером) связывается с одним интерфейсом своего устройства (функции) монопольно и независимо (см. рисунок ниже). Связи на этом рисунке обозначают коммуникационные каналы (communication pipes), которые устанавливаются между драйверами устройств и их конечными точками. Каналы устанавливаются только с конечными точками устройств, относящимися к выбранным (из альтернативных) вариантам интерфейсов активной конфигурации. Другие конечные точки недоступны.
AVR микроконтроллеры XMEGA – рекомендации по проектированию USB устройств
- Соответствие стандарту USB2.0
- Целостность сигнала
- Потребляемая мощность
- Обратное напряжение
- Пусковый ток - Электромагнитная совместимость (EMC/EMI)
- Рекомендации по проектированию печатной платы
- Типовые схемы питания
Микроконтроллеры семейства AVR XMEGA компании ATMEL позволяют легко реализовать USB интерфейс. Однако, для проектирования устройств, полностью соответствующих спецификации USB, следует ознакомиться с некоторыми вопросами.
- Соответствие электрическим требованиям USB 2.0 full speed и low speed
- EFTB (импульсные и переходные помехи)
- Электромагнитная совместимость
USB: Universal Serial Bus | – Универсальная последовательная шина |
USB IF: USB Implementation Forum | – некоммерческая организация, продвигающая протокол USB |
FS: USB Full Speed | – полноскоростной режим (12 Мбит/с) |
LS: USB Low Speed | – низкоскоростной режим (1.5 Мбит/с) |
HS: USB High Speed | – высокоскоростной режим (480 Мбит/с) |
PCB: Printed Circuit Board | – печатная плата |
EFTB: Electrical Fast Transient Burst | – импульсные и переходные помехи |
DP or D+: Data Plus differential line | – дифференциальная линия Data Plus |
DM or D-: Data Minus differential line | – дифференциальная линия Data Minus |
DFLL: Digital Frequency Locked Loop | – цифровая автоподстройка частоты |
BOM: Bill Of Materials | – спецификация материалов и компонентов |
3. Общие требования к аппаратной реализации USB интерфейса
USB интерфейс включает дифференциальную пару линий данных (DP и DM) и линии шины питания (VBUS и GND).
Напряжение VBUS составляет 5 В и используется, при необходимости, для питания присоединяемых устройств.
Напряжение дифференциальной пары (DP/DM) для полноскоростных (FS) и низкоскоростных (LS) устройств составляет 3.3 В, в то время как для высокоскоростных (HS) устройств необходимо более низкое напряжение. В этом документе не рассматривается режим HS, так как в архитектуре XMEGA реализованы только FS и LS модули USB. Напряжение дифференциальной пары 3.3 В в режимах FS и LS находится в диапазоне напряжения питания микроконтроллеров XMEGA. Соответственно, для работы USB модуля, напряжение питания микроконтроллера должно составлять 3.3 В.
3.1. Схемы питания
В соответствии со спецификацией USB протокола, USB устройства делятся на две категории по методу питания — устройства с питанием от собственного источника (self-powered) и устройства с питанием от шины USB (bus-powered).
3.1.1 Устройства с собственным источником питания
Устройства, работающие от собственного источника питания ни при каких режимах работы не допускают потребление тока с шины USB интерфейса.
3.1.2. Устройства с питанием от шины USB
Устройства с питанием от шины USB используют в качестве источника питания 5-вольтовую линию VBUS шины USB интерфейса. Максимально допустимый ток потребления определяется режимом работы USB интерфейса.
3.1.2.1 Режим приостановки (Suspend Mode)
В любой момент времени хост контроллер USB может принять решение о переходе в экономичный режим (режим сна или ожидания) с целью снижения потребляемой мощности. Общий ток потребления устройства в этом режиме не должен превышать 2.5 мА.
- уменьшить количество подключений к шине питания
- минимизировать или полностью отключить питание светодиодов
- снизить мощность потребления внешних компонентов (используя сигналы выбора микросхемы (CS) и перехода в малопотребляющий режим, а также отключением неиспользуемых источников питания)
Примечание: При расчете тока потребления в экономичном режиме, обратите внимание, что линии DP и DM шины USB должны оставаться в активном состоянии.
3.1.2.2 Рабочий режим (Operating Mode)
Максимальное значение тока, которое USB устройство может потреблять от линии VBUS, определяется типом устройства и его состоянием. Не допускается потребление тока более 100 мА до полной инициализации (enumeration process) устройства. Максимально допустимый ток потребления устройства устанавливается в процессе его инициализации. Ток нагрузки устанавливается в диапазоне 0. 100 мА для устройств с низким потреблением (low-power) и 0. 500 мА для устройств с высоким потреблением (high-power) мощности.
3.1.3. Пусковый ток
В спецификации USB 2.0 указано: «максимальная емкость (СRPB), которая может быть подключена к выходному концу кабеля параллельно с одной модульной нагрузкой 100 мА (one unit load) составляет 10 мкФ. Эта емкость представляет собой шунтирующий конденсатор, подключенный к линии VBUS в устройстве, плюс все паразитные емкости между источником питания и устройством». Таким образом, максимальная емкость, которая может быть подключена к линии VBUS не может превышать 10 мкФ, что составляет примерно 50 мкКл.
Из документов USB IF: «Пусковый ток измеряется в течении 100 мсек после момента подключения. Подключение определяется, как момент соединения клемм VBUS и «земля» вилки и розетки. Все случаи превышения тока сверх 100 мА в течении 100 мсек рассматриваются как части процесса возникновения пускового тока. Процесс пускового тока делится на участки. Участком называется интервал в котором ток превышает 100 мА в течение не менее 100 мксек. Таких участков во время 100 мсек может быть несколько. Соответствие или несоответствие определяется по региону с максимальным зарядом»
Рисунок 3.1. Измерение тока подключения
3.1.4. Обратное напряжение
Устройства с собственным источником питания (self-powered) могут функционировать неподключенными к шине USB или не использовать USB интерфейс. В спецификации USB сказано, что на линиях DP, DM или VBUS не должно быть никакого напряжения, пока устройство не подключено к шине USB. Следовательно, устройство с автономным питанием должно иметь механизм определения состояния подключения к шине (через контроль сигнала VBUS) для исключения некорректного подключения подтягивающих резисторов к линиям DP и DM.
3.2. Целостность сигнала.
Электрические требования полноскоростного режима работы USB (full-speed) требуют применения некоторых мер для обеспечения целостности сигнала.
Низкое качество сигнала может привести к неправильному функционированию USB устройства и несовместимости с требованиями USB.
Во время проведения сертификации, качество USB сигнала измеряется с помощью «глазковой» диаграммы. На рисунке 3.2 показаны правильная (соответствующая USB) и неправильная «глазковые» диаграммы. Одними из причин низкого качества сигнала могут быть неправильное проектирование печатной платы или несогласование волновых сопротивлений дифференциальных линий USB.
3.2.1. «Разводка» печатной платы USB.
- для уменьшения отражений, волновое сопротивление дифференциальной пары должно быть согласовано
- дорожки дифференциальной пары на печатной плате должны быть одинаковыми и иметь одинаковую длину, количество переходных отверстий и т.д.
- дорожки должны быть размещены максимально параллельно с минимальным количеством поворотов и переходных отверстий.
Рисунок 3.3. Типовая схема печатной платы USB.
На рисунке: Разъем USB, RC – фильтр между экраном и землей, ограничитель перенапряжений, дифференциальная пара USB
3.2.2. Выбор источника тактового сигнала.
- внешний кварцевый резонатор и встроенный ФАПЧ
- встроенный RC – генератор
Наиболее удобным способом является использование встроенного RC – генератора на 32 МГц, настроенного на 48 МГц. Для достижения точности в 0,25%, встроенный RC – генератор должен быть откалиброван с использованием встроенного цифрового ФАПЧ. Это решение позволяет снизить стоимость покупных компонентов (не требуется внешний кварцевый резонатор)
Примечание: USB модуль микроконтроллеров AVR ATXMEGA требует, чтобы частота контроллера составляла, как минимум, 12 МГц для возможности приема/передачи данных. Убедитесь, что системная частота микроконтроллера (system clock) составляет, как минимум 12 МГц при использовании модуля USB. Эта частота может быть выключена при переводе USB в режим приостановки.
3.3 Подключение к шине.
3.3.1. Типы соединителей.
USB устройство может быть подключено к USB хосту с использованием кабеля с вилкой (captive cable) или USB – кабеля и установленного коннектора.
USB спецификация определяет, что USB устройство может иметь один и только один из ниже перечисленных разъемов:
Применяйте экранированный кабель при использовании кабеля с вилкой (captive cable) в режиме FS и не превышайте длину кабеля 1,5 метра в режиме LS.
3.3.2. Защита от электростатических разрядов
USB устройства могут использоваться без защиты от влияния внешней среды и могут подвергнуться действию разрядов статического электричества.
Несмотря на встроенные в микроконтроллеры ATXMEGA средства защиты от электростатических разрядов рекомендуется усилить защиту линий DP, DM и VBUS используя предназначенные для этого ограничители перенапряжений. Для того, чтобы сократить путь разряда и снизить влияние разряда на всю систему эти ограничители должны быть расположены максимально близко от разъема USB интерфейса.
Рисунок 3.4. Типовая схема защиты от разрядов статического электричества.
На рисунке: ограничители перенапряжений
Ограничители перенапряжений могут быть как дискретными компонентами, так и специализированными интегральными схемами защиты USB интерфейса.
3.3.3. Электромагнитная совместимость.
Следует обратить внимание на подключение экрана USB FS кабеля к плате устройства. Особое внимание должно быть уделено соединению между землей платы и экраном кабеля и коннектора. Непосредственное подключение экрана к земле платы создаст прямое соединение с земли платы на экран кабеля и превратит USB кабель в антенну. Для уменьшения антенного эффекта кабеля USB рекомендуется производить подключение экрана кабеля к земле платы через RC фильтр, как показано на рисунке 3.5. Типовые значения: R = 1 МОм, С = 4.7 нФ.
Рисунок 3.5. Типовая схема соединения экрана и земли платы.
На рисунке: экран кабеля и коннектора, RC-фильтр между землей и экраном, земля платы
4. Типовые USB решения на базе микроконтроллеров XMEGA.
- имеются встроенные согласующие резисторы
- имеются встроенные подтягивающие резисторы
- не требуется внешний кварцевый резонатор, так как микроконтроллеры XMEGA позволяют реализовывать полноскоростные (FS) и низкоскоростные (LS) соединения с использованием внутреннего RC генератора.
4.1. Требования к источнику питания
Рабочее напряжение дифференциальной пары USB, как правило, составляет 3.3 В, соответственно микроконтроллер должен работать при напряжении питания VCC = 3.3 В.
4.2. Питание от шины USB (bus-powered).
При проектировании USB устройств с питанием от шины USB, управление питанием является очень важным. Микроконтроллеры XMEGA имеют много энергосберегающих режимов работы для достижения минимального потребления мощности. Тем не менее, следует внимательно подойти к вопросу выбора внешних компонентов. В соответствии с вышеизложенным, устройства с питанием от шины используют 5-вольтовую линию VBUS для питания всего подключенного устройства. Для формирования напряжения питания 3.3 В для микроконтроллера следует применять регулятор с низком падением напряжения. При выборе регулятора убедитесь, что ток покоя не будет занимать существенную часть всего потребления в 2.5 мА в режиме приостановки.
Рисунок 4.1. Схема соединений при питании от шины USB.
4.3. Обнаружение сигнала VBUS при работе от собственного источника питания.
Устройства с автономным питанием должны иметь возможность обнаружения сигнала VBUS для определения состояния соединения. Для этого можно использовать резисторный делитель напряжения.
Рисунок 4.2. Схема соединений при автономном питании.
За последние годы, USB стал стандартным и простым в использовании интерфейсом. Микроконтроллеры XMEGA представляют собой эффективное решение для встраивания USB в различные приложения. Однако проектирование устройств, которые полностью соответствуют спецификации USB требуют внимательного отношения к некоторым вопросам. В таблице 5.1 приведены технические вопросы и их возможные решения.
Запросы, пакеты и транзакции
Запросы, пакеты и транзакции
Для передачи или приема данных клиентское ПО посылает к каналу пакет запроса ввода/вывода — IRP (Input/Output Request Packet) и ждет уведомления о завершении его отработки. Формат IRP определяется реализацией драйвера USBD в конкретной ОС. В IRP имеются только сведения о запросе (местоположение буфера передаваемых данных в оперативной памяти и длина передачи); от свойств конкретного текущего подключения (скорость, допустимый размер пакета) драйвер устройства абстрагируется. Отработкой запроса в виде транзакций на шине USB занимается драйвер USBD; при необходимости он разбивает на части длинные запросы (пакеты), пригодные для передачи за одну транзакцию. Транзакция на шине USB — это последовательность обмена пакетами между хостом и ПУ, в ходе которой может быть передан или принят один пакет данных (возможны транзакции, в которых данные не передаются). Отработка запроса считается завершенной, когда успешно выполняются все связанные с ним транзакции. «Временные трудности», встречающиеся при их выполнении (неготовность к обмену данными), до сведения клиентского драйвера не доводятся — ему остается только ждать завершения обменов (или выхода по тайм-ауту). Однако устройство может сигнализировать о серьезных ошибках (ответом STALL), что приводит к аварийному завершению запроса, о чем уведомляется клиентский драйвер. В этом случае отбрасываются и все последующие запросы к данному каналу. Возобновление работы с данным каналом возможно лишь после явного уведомления об обработке ошибочной ситуации, которое драйвер устройства делает с помощью специального запроса (тоже вызова USBD).
Длинные запросы разбиваются на транзакции так, чтобы использовать максимальный размер пакета. Последний пакет с остатком может оказаться короче максимального размера. Хост-контроллер имеет средства обнаружения приема от устройства «неполновесного» пакета, размер которого меньше ожидаемого. В запросе IRP указывается, следует ли особым образом реагировать на это событие. Особая реакция может быть двоякой:
- считать короткий пакет разделителем, указывающим на конец блока данных. При этом данный IRP завершается нормально и исполняются следующие запросы к данному каналу;
- считать короткий пакет признаком ошибки, по которому канал останавливается (все его последующие ожидающие запросы сбрасываются).
При передаче массивов использование укороченных пакетов в качестве разделителей наиболее естественно. Таким образом, например, в одном из вариантов протоколов для устройств хранения данных укороченные пакеты известной длины используются в качестве управляющих.
Кадры и микрокадры
Хост организует обмены с устройствами согласно своему плану распределения ресурсов. Для этого хост-контроллер циклически с периодом 1 мс формирует кадры (frames), в которые укладываются все запланированные транзакции (cм. рисунок ниже). Каждый кадр начинается с посылки пакета-маркера SOF (Start Of Frame), который является синхронизирующим сигналом для изохронных устройств, а также для хабов. Кадры нумеруются последовательно, в маркере SOF передаются 11 младших бит номера кадра. В режиме HS каждый кадр делится на 8 микрокадров, и пакеты SOF передаются в начале каждого микрокадра (с периодом 125 мкс). При этом во всех восьми микрокадрах SOF несет один и тот же номер кадра; новое значение номера кадра передается в нулевом микрокадре. В каждом микрокадре может быть выполнено несколько транзакций, их допустимое число зависит от скорости, длины поля данных каждой из них, а также от задержек, вносимых кабелями, хабами и устройствами. Все транзакции кадров должны быть завершены до начала интервала времени EOF (End of Frame). Период (частота) генерации микрокадров может немного варьироваться с помощью специального регистра хост-контроллера, что позволяет подстраивать частоту для изохронных передач.
Кадрирование используется и для обеспечения живучести шины. В конце каждого микрокадра выделяется интервал времени EOF (End Of Frame), на время которого хабы запрещают передачу по направлению к контроллеру. Если хаб обнаружит, что с какого-то порта в это время ведется передача данных (к хосту), этот порт отключается, изолируя «болтливое» устройство, о чем информируется USBD.
Счетчик микрокадров в хост-контроллере используется как источник индекса при обращении к таблице дескрипторов кадров. Обычно драйвер USB составляет таблицу дескрипторов для 1024 последовательных кадров1, к которой он обращается циклически. С помощью этих дескрипторов хост планирует загрузку кадров так, чтобы кроме запланированных изохронных транзакций и прерываний в них всегда находилось место для транзакций управления. Свободное время кадров может заполняться передачами массивов. Спецификация USB позволяет занимать под периодические транзакции (изохронные и прерывания) до 90% пропускной способности шины, то есть времени в каждом микрокадре.
Каналы
Коммуникационные каналы USB разделяются на два типа:
С каналами связаны характеристики, соответствующие конечной точке (полоса пропускания, тип сервиса, размер буфера и т. п.). Каналы организуются при конфигурировании устройств USB. Полоса пропускания шины делится между всеми установленными каналами. Выделенная полоса закрепляется за каналом, и если установление нового канала требует такой полосы, которая не вписывается в уже существующее распределение, запрос на выделение канала отвергается.
Каналы различаются и по назначению:
Интерфейс устройства, с которым работает клиентский драйвер, представляет собой связку клиентских каналов (pipe’s bundle). Для этих каналов драйверы устройств являются единственными источниками и потребителями передаваемых данных.
Читайте также: