Вам бонус- начислено 1 монета за дневную активность. Сейчас у вас 1 монета

Глава 4: Типы конечных точек (Endpoint Types ) - Все

Лекция



Это продолжение увлекательной статьи про usb.

...

class="thumb tright" style="clear: right; float: right; width: auto; margin: 0.5em 0px 1.3em 1.4em; color: rgb(32, 33, 34); font-family: sans-serif; font-size: 14px;">

Все о USB  , Программирование  USB интерфейса и работа с  USB  периферии для программистов
Дифференциальная линия связи в виде витой пары проводов с импедансом 90 Ом

Все о USB  , Программирование  USB интерфейса и работа с  USB  периферии для программистов

Схемотехника портов USB Full и High Speed. Устройство Low Speed отличается подключением резистора 1,5к к D− вместо D+.

Все о USB  , Программирование  USB интерфейса и работа с  USB  периферии для программистов

Осциллограмма пакета NACK для Full Speed устройства

Упрощенная электрическая схема USB-соединения показана на рисунке. Когда к хосту никто не подключен, обе сигнальные линии D+ и D− подтянуты резисторами 15 кОм к минусу питания. При подключении устройства одна из линий подтягивается к +3,3 В через резистор 1,5 кОм. Устройства Low Speed подтягивают линию D−, а устройства Full Speed — D+. Таким образом хост определяет факт подключения и тип подключенного устройства. Устройства High Speed в момент подключения работают как Full Speed, переключаясь в высокоскоростной режим после обмена визитками.

Состояние дифпары, определенное резисторами подтяжки, в спецификации именуется Idle. То же состояние при включенном драйвере обозначается буквой J. Противоположное ему состояние — буквой K. Замыкание обеих линий на минус именуется Single Ended 0, сокращенно SE0; замыкание на плюс — SE1.

Данные кодируются по методу NRZI (Non-return-to-zero inverted). По этому методу каждому нулевому биту входных данных соответствует изменение состояния дифпары (J→K или K→J), а при единице изменения нет. Чтобы исключить потерю синхронизации на длительных единичных последовательностях, применяют битстаффинг, то есть принудительно вставляют в поток данных ноль на каждые 6 единиц подряд.

Состояние шины SE0 дольше 10 мс трактуется устройством как сброс (Reset) и требует от устройства реинициализации USB-стека. Состояние Idle дольше 3 мс подряд трактуется устройством как останов шины (Suspend) и формально требует от устройства самоограничения в потреблении электроэнергии от шины USB. Выход из Suspend происходит либо по возобновлению активности хоста, либо устройство может при необходимости подать специальный сигнал Resume. Сигнал Resume состоит из состояния K на несколько миллисекунд, завершаемое последовательностью SE0,SE0,J, где каждое состояние длится один битовый интервал согласно скоростному режиму устройства.

Структура пакетов

Обмен происходит короткими пакетами. Каждый пакет начинается с последовательности Start of Packet, для Low и Full Speed это KJKJKJKK. Далее всегда идет специальный идентификатор пакета PID (англ. Packet IDentifier), указывающий на тип пакета. Всего имеется 16 разных типов пакетов, поэтому PID имеет размерность 4 бита. Однако для надежности значение этого поля дублируется в инверсном виде, поэтому длина поля PID в пакете 8 бит. Заканчивается пакет последовательностью End of Packet: SE0,SE0,J. Минимальный межпакетный интервал ~0,1 мкс (для Full Speed).

В зависимости от типа пакета, между PID и EoP может содержаться ряд других полей с параметрами пакета и/или данными. Все эти поля (включая PID) передаются младшим битом вперед (LSB first).

Типы пакетов USB представлены в таблице:

Тип Значение PID (старшим битом вперед) Передаваемый байт (младшим битом вперед) Имя Описание
Зарезервировано 0000 0000 1111
Token 0001 1000 0111 OUT Хост уведомляет устройство, что следующий пакет будет содержать данные от хоста к устройству
1001 1001 0110 IN Хост уведомляет устройство, что готов принять от устройства пакет с данными
0101 1010 0101 SOF Пакет, отмечающий начало временно́го фрейма или микрофрейма.
1101 1011 0100 SETUP Хост уведомляет устройство, что следующий пакет будет содержать конфигурационные данные от хоста к устройству
1000 0001 1110 SPLIT USB High Speed разделенная передача
0100 0010 1101 PING Проверка возможности приема данных устройством (USB High Speed)
Special 1100 0011 1100 PRE Уведомление хабу, что следующая транзакция будет осуществляться в режиме Low Speed
Handshake ERR Ошибка разделенной передачи (USB High Speed)
0010 0100 1011 ACK Подтверждение приема пакета с данными
1010 0101 1010 NACK Неготовность обслужить предыдущий пакет, пакет игнорируется
0110 0110 1001 NYET Данные еще не готовы (USB High Speed)
1110 0111 1000 STALL Предыдущий пакет обратился к несуществующему или выключенному функционалу
Data 0011 1100 0011 DATA0 Четный пакет с данными
1011 1101 0010 DATA1 Нечетный пакет с данными
0111 1110 0001 DATA2 Пакет данных для высокоскоростной изохронной передачи (USB High Speed)
1111 1111 0000 MDATA Пакет данных для высокоскоростной изохронной передачи (USB High Speed)

Пакеты типа IN, OUT, SETUP являются заголовками многопакетной транзакции с обменом данными. Они содержат поля адреса устройства и номера конечной точки (Endpoint) в устройстве, с которым будет обмен данными в этой транзакции. Целостность пакетов удостоверяет поле CRC5.

Пакеты типа DATA содержат поле данных и поле контроля целостности данных CRC16. Стандарт ограничивает максимальную разрешенную длину данных: 8 байт для несконфигурированных устройств, 64 байта для устройств Low Speed, 1023 байта для устройств Full Speed и 1024 байта для устройств High Speed. Устройство может установить свою максимальную длину данных, меньшую разрешенной. Хост обязан поддерживать максимальную разрешенную длину данных. При обычном обмене пакеты с данными чередуются как «четный-нечетный».

Пакеты типа ACK, NACK, STALL завершают транзакцию, сообщая о (не)успешности текущей транзакции. Не содержат дополнительные поля.

Адрес

USB является сетью, то есть к одному хосту может подключаться несколько устройств. Каждому устройству в процессе начального конфигурирования в момент подключения назначается уникальный адрес. Размерность адреса 7 бит, нулевое значение зарезервировано — соответственно, к одному хосту может подключаться до 127 устройств. Поле адреса содержат только те пакеты, что начинают транзакцию (IN, OUT, SETUP).

Endpoint

Помимо адресации физически подключенных устройств, USB предлагает логическую адресацию внутри устройства. Логическая адресация позволяет разделить потоки данных по разному функционалу внутри одного устройства. Например, клавиатура с тачпадом может иметь один канал данных для нажатий клавиш, а другой — для данных тачпада. В стеке TCP/IP имеется прямая аналогия конечной точки — порты.

Поле «endpoint» имеет размерность 4 бита, то есть возможны до 16 точек. Каждая точка может независимо работать как приемная и как передающая, поэтому иногда их насчитывают 32. Поле «endpoint» является частью адресации в сети USB и содержится только в тех же пакетах, где есть адрес (IN, OUT, SETUP). В момент подключения в рамках начального конфигурирования устройство обязано передать хосту информацию о задействованных точках и их назначении. Эта информация должна согласовываться с соответствующими каналами данных программного драйвера устройства у хоста. Обращение к незадействованной точке вызывает ответ STALL. Пакеты SETUP могут приходить только на нулевой endpoint.

Временны́е фреймы

Спецификация USB содержит понятия временны́х фреймов и микрофреймов. Для Low Speed устройств каждую миллисекунду хост передает сигнал Keep Alive, состоящий из последовательности End of Packet. Для Full Speed устройств каждую миллисекунду хост передает специальный пакет SOF (Start of Frame), отмечающий начало очередного фрейма. Для High Speed этот пакет передается каждые 125 мкс; такой период называется микрофрейм. Спецификация USB требует, чтобы поддерживалось такое планирование транзакций и пакетов, чтобы периодичность рассылки SOF не нарушалась.

Принципы обмена данными

Обмен данными происходит так называемыми транзакциями — неразрывными последовательностями из нескольких пакетов. Инициатором обмена всегда является хост. Он передает короткий пакет (token), уведомляющий о начале новой транзакции. В этом пакете-токене хост указывает направление транзакции (IN или OUT), адрес устройства и номер endpoint. Например, токен OUT означает, что немедленно за токеном последует пакет с данными от хоста к устройству (DATA0 или DATA1). Пакетов с данными может быть несколько в одной транзакции, если каждый из них имеет максимально допустимую для этого устройства длину данных. Окончание пересылки данных определяется по длине пакета, не равной максимальной. Как только приходит укороченный пакет, устройство немедленно передает ответный пакет-подтверждение (handshake), например ACK (все успешно принято), NACK (не смог принять: например, переполнен входной буфер), STALL (данные адресованы отключенному endpoint). Все пакеты в транзакции передаются практически слитно, максимальная пауза между пакетами не должна превышать ~1 мкс (для Full Speed), иначе транзакция будет признана ошибочной.

Аналогично происходит передача данных от устройства к хосту. Хост инициирует передачу токеном IN. Если устройство не имеет готовых данных для передачи, то отвечает NACK и транзакция заканчивается. Если данные готовы, устройство начинает передавать пакеты DATA0/DATA1. Принцип окончания передачи аналогичен: неполная длина пакета с данными. Получив неполный пакет, хост отвечает устройству пакетом-подтверждением ACK.

Транзакция с токеном SETUP полностью аналогична транзакции OUT, отличия лишь в логике восприятия данных устройством: это параметры соединения, которые управляют работой USB стека устройства.

Control, Interrupt, Bulk, Isochronous

Спецификация USB предоставляет несколько методов обмена данными. Каждому включенному endpoint должен быть сопоставлен какой-либо из методов. Control, Interrupt и Bulk используют протокол обмена с подтверждениями, описанный чуть выше. Метод bulk позволяет хосту свободно обмениваться данными с устройством по своему усмотрению. Метод control аналогичен bulk, но обменивается с устройством только специальными данными, управляющими работой USB-протокола в соответствии со спецификацией (в рамках транзакций типа SETUP). Поскольку периферийные устройства не могут инициировать обмен, то для передачи внезапно возникающих у устройства данных придумали метод interrupt, который позволяет опрашивать устройство с заданным периодом. Метод interrupt широко применяется для опроса клавиатур и мышек. Особняком стоит метод isochronous, позволяющий зарезервировать часть полосы пропускания USB-шины для таких данных, как аудио или видео. Isochronous не поддерживает контроля целостности передачи (пакеты ACK и NACK не передаются), а значит, не предусмотрены повторы в случае ошибок: неверно принятые данные пропадают.

Инициализация устройств

В момент подключения хост запрашивает у устройства ряд стандартизованных сведений (дескрипторов), на основании которых принимает решение, как с этим устройством работать. Дескрипторы содержат сведения о производителе и типе устройства, на основании которых хост подбирает программный драйвер. Таблицы дескрипторов и назначение полей подробно описаны в главе 9 спецификации USB.

После этого хост производит смену скорости (если устройство High Speed) и назначает устройству адрес.

Отладка и сертификация

Для отладки протоколов и контроля соответствия стандарту разработчиками устройств могут использоваться различные инструменты, позволяющие наблюдать процессы обмена на шине[44][45]. Эти инструменты могут быть чисто программными, извлекающими события шины из драйверов USB компьютера. Однако такие инструменты не показывают аппаратно обрабатываемые либо ошибочные сигналы в шине. Для всеобъемлющего независимого контроля используются специализированные аппаратные сканеры и анализаторы протоколов. Использование аппаратного анализатора рекомендуется USB консорциумом для прохождения сертификации и при подготовке выпуска приборов в серийное производство.

Формально для получения права на размещение логотипов USB на продукции необходима ее сертификация на соответствие стандарту. Организация USB-IF предлагает услуги по сертификации USB-устройств, а также поддерживает перечень сторонних сертифицирующих лабораторий[46].

Функции USB

Когда мы представляем себе устройство USB, мы думаем о нем как о периферийном устройстве USB, но устройство USB могло означать USB трансивер, используемый в хосте или периферии, USB хаб или микросхему контроллера хоста, или периферийное устройство USB. Поэтому стандарт ссылается на функции USB, которые можно видеть как USB устройства, которые обеспечивают определенный функционал наподобие принтера, Zip-драйва, сканера, модема или другой периферии.

Сейчас мы уже должны знать ряд понятий, составляющих пакет USB. Нет? Вы уже забыли, сколько бит входит в поле PID? Не будьте слишком обеспокоены этим. К счастью, большинство функций USB уже в кремнии (специальных чипах) получают обработку низких уровней протокола USB (до слоя транзакций, который мы рассмотрим в следующей главе). Мы рассматриваем информацию о низких слоях протокола USB потому, что большинство контроллеров функций USB сообщают об ошибках, таких как PID Encoding Error. Не рассмотрев бегло низкий уровень, можно было бы спросить, что означает PID Encoding Error? Если бы Вы предположили, что последние четыре бита PID не соответствовали инверсии первых четырех битов, то Вы были бы правы.

Все о USB  , Программирование  USB интерфейса и работа с  USB  периферии для программистов

У большинства функций есть серия буферов, обычно 8 байт длиной. Каждый буфер будет принадлежать конечной точке (endpoint) - EP0 IN, EP0 OUT и т. п.. Например, хост отправляет запрос дескриптора устройства (device descriptor request). Функция аппаратно прочитает пакет setup и определит из поля адреса, предназначен ли пакет именно ей, и если да, то скопирует полезную нагрузку (payload) последующего пакета данных в соответствующий буфер конечной точки, заданный величиной в поле endpoint токена setup. Также отправится пакет handshake для подтверждения приема байта и сгенерируется внутреннее прерывание в микроконтроллере для соответствующей конечной точки, обозначающее, что пакет был принят. Все это делается обычно в «железе» (аппаратуре чипа контроллера USB устройства).

Программное обеспечение (firmware микроконтроллера) получит прерывание, в котором оно должно прочитать содержимое буфера конечной точки и проанализировать запрос на дескриптор устройства (parse device descriptor request).

Конечные точки (endpoints)

Конечные точки могут быть описаны как источники или приемники данных. Поскольку шина является хосториентированной, конечные точки оказываются в конце канала связи, на функции USB. Например, на уровне программного обеспечения Ваш драйвер устройства может отправлять пакет в конечную точку EP1 устройства. Так как данные поступают от хоста, они попадут в OUT буфер EP1. Ваше firmware теперь может не спеша прочитать эти данные. Если устройство хочет вернуть данные, функция не может просто записать их на шину, так как шина полностью управляется хостом. Поэтому firmware помещает данные в буфер EP1 IN, и эти данные находятся в буфере до тех пор, пока хост не отправит пакет IN, которым он запрашивает данные конечной точки. Конечные точки можно также рассматривать как интерфейс между железом функции устройства и firmware, работающем на функции устройства.
Все устройства должны поддерживать конечную точку 0. Это конечная точка, которая принимает все управляющие запросы и запросы статуса во время энумерации и в течение всего времени, когда устройство остается работоспособным на шине.

Потоки, или каналы (Pipes, дословно - трубы)

Когда устройство отправляет и принимает данные через несколько конечных точек, клиентское программное обеспечение передает данные через потоки. Поток – логическое соединение между хостом и конечной точкой (точками). Потоки также имеют набор параметров – тип передачи (Control, Bulk, Iso или Interrupt), направление потока данных и максимальные размеры пакета/буфера. Например, поток по умолчанию – двунаправленный поток, составленный из IN конечной точки 0 и OUT конечной точки 0 с типом передачи control.
USB определяет два типа потоков (pipes)

  • Stream Pipes не имеют предопределенного USB формата, поэтому Вы можете послать данные любого типа через stream pipe и восстановить данные на другом конце. Потоки данных последовательны и имеют предопределенную направленность – IN или OUT. Stream pipes поддерживают типы передач bulk, isochronous и interrupt. Stream pipes могут управляться либо от хоста, либо от устройства.
  • Message Pipes имеют предопределенный USB формат. Они управляются хостом, инициируются запросом, отправляемым от хоста. Данные пересылаются в нужном направлении, заданном в запросе. Таким образом, message pipes позволяют передавать данные в обоих направлениях, но поддерживают только передачи control.

Глава 4: Типы конечных точек (Endpoint Types )

Стандарт USB определяет 4 типа конечных точек/передач:

  • Control
  • Interrupt
  • Isochronous
  • Bulk

Передачи Control

Управляющие передачи (control transfer) обычно используются для команд и операций получения состояния. Основная настройка устройства USB со всеми функциями энумерации происходит с использованием передач control. Это обычно быстрые, случайные по времени пакеты, инициированные хостом, которые имеют наилучший приоритет по доставке (best effort). Максимально допустимая длина полезной нагрузки (payload, или размер пакета) управляющей передачи полноскоростных (full-speed) устройств USB составляет 8, 16, 32 или 64 байта; для высокоскоростных (high-speed) устройств этот размер составляет 64 байта, и для низкоскоростных (low-speed) устройств это 8 байт (только 8 байт, и никаких других вариантов).

У передач control могут быть до 3 стадий.

  • Setup Stage – стадия установки, определяет, куда посылаются данные. Состоит из трех пакетов. Токен setup отправляется первым, он содержит адрес и номер конечной точки. Пакет данных (data packet) отправляется следующим, и всегда имеет тип PID data0 и включает setup packet, который детализирует тип запроса. Мы позже подробно рассмотрим setup packet. Последний пакет из трех – рукопожатие (handshake), используемое для подтверждения успешности приема или для сообщения об ошибке. Если функция успешно приняла setup data (CRC, PID и т. п. в порядке), она отвечает рукопожатием (handshake) ACK, иначе игнорирует данные, не отправляя пакет handshake. Функция не может послать пакетамы STALL или NAK в ответ на пакет setup.

Все о USB  , Программирование  USB интерфейса и работа с  USB  периферии для программистов

  • Data Stage – эта стадия необязательна. Она состоит из одной или нескольких передач IN или OUT. Запрос setup показывает, сколько данных будет передаваться на этой стадии. Если количество данных превышает максимальный размер пакета, данные будут переданы в нескольких передачах, каждая из которых (за исключением последней) имеет размер максимального пакета.

Стадия data stage имеет два различных сценария, в зависимости от направления передачи данных.

Сценарий IN: когда хост готов принять данные control data, он выпускает IN Token. Если функция получает IN token с ошибкой, например PID не соответствует инверитрованным битам PID, то она игнорирует пакет. Если токен принят успешно, устройство может либо ответить пакетом DATA, содержащим отправляемые control data, либо stall packet, индицирующий ошибку конечной точки, либо пакет NAK, показывающий хосту, что конечная точка работает, но пока не имеет данных для отправки.

Все о USB  , Программирование  USB интерфейса и работа с  USB  периферии для программистов

Сценарий OUT: когда хосту нужно передать устройству пакет с управляющими данными (control data packet), он выпускает OUT token, за которым идет пакет, содержащий control data в качестве полезной нагрузки. Если любая часть – или OUT token, или data packet ошибочны, функция игнорирует пакет. Если буфер конечной точки пуст, она заполняет буфер данными и передает ACK, информирующий хост о том, что данные получены успешно. Если буфер конечной точки не пуст, поскольку идет обработка предыдущего пакета, функция отвечает NAK. Однако, если у оконечной точки была ошибка, и ее бит останова (halt bit) был установлен, она возвращает STALL.

  • Status Stage сообщает состояние полного запроса, и меняется в зависимости от направления передачи. Функция всегда возвращает сообщение состояния.

Стадия status stage также имеет два различных сценария, в зависимости от направления передачи данных.

Сценарий IN: если хост отправил токен (токены) IN token(s) во время стадии data stage для приема данных, хост должен подтвердить успешный прием данных. Это делается путем отправки токена OUT, за которым идет пакет data нулевой длины. Функция может теперь сообщить свой статус на стадии handshaking. ACK указывает на то, что функция завершила команду и готова к приему следующей команды. Если во время обработки этой команды произошла ошибка, функция выдает STALL. Однако если пока продолжается обработка команды, функция выдает NAK, указывающий хосту повторить позже стадию status stage.

Все о USB  , Программирование  USB интерфейса и работа с  USB  периферии для программистов

Сценарий OUT: если хост отправил токен (токены) OUT на стадии data stage – чтобы отправить данные, функция подтверждает успешный прием данных отправкой пакета нулевой длины в ответ на токен IN. Однако если произошла ошибка, функция должна выдать STALL, или если пока обрабатываются данные, должна выдать NAK, указывая хосту повторить позже status phase.

Все о USB  , Программирование  USB интерфейса и работа с  USB  периферии для программистов

Передачи Control: общий обзор

Теперь, как все это совмещается? Например, хост хочет запросить дескриптор устройства во время энумерации. Пакеты, которые посылают, будут следующими.

Хост отправляет токен Setup, говорящий функции, что следующий пакет будет пакет Setup. Поле адреса будет содержать адрес устройства, от которого главный компьютер просит дескриптор. Номер конечной точки должен быть 0, что указывает канал по умолчанию (default pipe). Затем хост отправит пакет DATA0. Он будет содержать 8 байт полезной нагрузки, которая будет являться запросом Device Descriptor Request, описанным в Главе 9 спецификации USB. Функция USB подтверждает пакет setup, что он был прочитан корректно, без ошибок. Если пакет принят с ошибкой, устройство просто игнорирует этот пакет. Хост должен отправить пакет позже заново, после короткой задержки.


1. Токен Setup
Sync PID ADDR ENDP CRC5 EOP Адрес и номер конечной точки
2. Пакет Data0 Sync PID Data0 CRC16 EOP Device Descriptor Request
3. Ack Handshake Sync PID EOP Устройство подтверждает Setup Packet

Три вышеуказанных пакета представляют из себя первую транзакцию USB. Теперь устройство USB будет декодировать 8 принятых байт, и определять по ним, что это device descriptor request (запрос на дескриптор устройства). После этого устройство попытается отправить Device Descriptor, что произойдет в следующей транзакции USB.


1. Токен In
Sync PID ADDR ENDP CRC5 EOP Адрес и номер конечной точки
2. Пакет Data1 Sync PID Data1 CRC16 EOP Первые 8 байт дескриптора устройства
3. Ack Handshake Sync PID EOP Хост подтверждает пакет
1. Токен In Sync PID ADDR ENDP CRC5 EOP Адрес и номер конечной точки
2. Пакет Data0 Sync PID Data0 CRC16 EOP Последние 4 байта + Padding
3. Ack Handshake Sync PID EOP Хост подтверждает пакет

В этом случае мы подразумеваем, что максимальный размер полезной нагрузки 8 байт. Хост отправляет токен IN, чем говорит устройству, что он может теперь отправить данные для этой конечной точки. Поскольку максимальный размер пакета 8 байт, мы должны для отправки разделить 12 байт дескриптора устройства на кусочки. Каждый кусочек должен быть размером по 8 байт, за исключением последней транзакции. Хост подтверждает каждый пакет, который мы посылаем ему.

Как только дескриптор устройства отправлен, начинается транзакция статуса. Если транзакции были успешны, хост отправляет пакет нулевой длины, показывающий, что полная транзакция была успешна. Функция отвечает на это пакетом нулевой длины, индицирующим ее состояние (status).


1. Токен Out
Sync PID ADDR ENDP CRC5 EOP Адрес и номер конечной точки
2. Пакет Data1 Sync PID Data1 CRC16 EOP Пакет нулевой длины
3. Ack Handshake Sync PID EOP Устройство подтверждает всю транзакцию целиком

Передачи Interrupt

Любой, кто имел дело с запросами на прерывание у микроконтроллеров, знает, что прерывания генерируются устройством (в микроконтроллере). Однако под управлением USB, если устройство требует внимания хоста, оно должно ждать, пока хост его не опросит, чтобы понять, что устройство нуждается в срочном обмене данными! Передачи Interrupt имеют следующие особенности:

  • Гарантированная латентность (latency)
  • Однонаправленный поток канала
  • Определение ошибок и последующая повторная попытка передачи.

Передачи Interrupt обычно непериодические, когда USB устройство "инициирует" связь, требующую ограниченного времени ожидания. Запрос на «прерывание» ставится устройством USB в очередь, пока компьютер не опросит устройство USB с целью получения данных.

Максимальная полезная нагрузка для low-speed устройств - 8 байт.
Максимальная полезная нагрузка для full-speed устройств - 64 байта.
Максимальная полезная нагрузка для high-speed устройств - 1024 байта.

Все о USB  , Программирование  USB интерфейса и работа с  USB  периферии для программистов

На диаграмме показан формат транзакций Interrupt IN и Interrupt OUT.

Interrupt IN: хост периодически опрашивает конечную точку interrupt. Скорость опроса указана в описателе конечной точки (endpoint descriptor), который мы рассмотрим позже. Каждый опрос сопровождается отправкой хостом токена IN. Если токен IN испорчен, функция игнорирует пакет, и продолжает мониторинг шины в ожидании новых токенов.

Если interrupt поставлено в очередь устройством USB, функция отправит пакет data, содержащий данные, соответствующие interrupt при приеме токена IN. После успешного приема хостом, хост возвратит ACK. Однако, если данные были испорчены, хост не вернет status. Условие прерывания не присутствовало, когда главный компьютер опросил оконечную точку прерывания токеном IN, но функция ответила о своем состоянии NAK. Если на этой конечной точке произошла ошибка, то в ответ на токен IN будет отправлен STALL.

Interrupt OUT: когда хост хочет отправить устройству данные interrupt, он выдает токен OUT, за которым идет пакет data, содержащий данные interrupt. Если любая часть - токен OUT или пакет data ошибочны, функция игнорирует пакет. Если буфер конечной точки функции был пуст, и функция вывела данные в буфер конечной точки, она выдает ACK, информируя хост об успешно принятых данных. Если буфер конечной точки не пуст (еще идет обработка предыдущего пакета), то функция выдает NAK. Однако, если ошибка произошла с конечной точкой и ее бит останова был установлен, то функция выдает STALL.

Изохронные передачи (Isochronous Transfers)

Изохронные передачи происходят периодически и продолжительное время. Они обычно содержат информацию, привязанную ко времени (чувствительную к времени доставки), например аудио или видео потоки. Если произойдет задержка или повторная передача данных в аудио потоке, то Вы должны в результате получить искаженный звук. Дополнительная неприятность – может пропасть синхронизация звука. Однако выпадение пакетов или фреймов могут случаться постоянно снова и снова, и это будет менее заметно для слушателя. Изохронные передачи обеспечивают:

  • Гарантированное выделение полосы пропускания шины USB.
  • Ограниченную латентность.
  • Однонаправленный поток канала.
  • Детектирование ошибок с помощью CRC, но без гарантии доставки (нет повторов при ошибках).
  • Работают только на скоростях Full speed и high speed.
  • Нет переключения данных.

Для изохронной конечной точки максимальный размер полезной нагрузки по данным указывается в дескрипторе конечной точки (endpoint descriptor). Этот размер может быть максимум до 1023 байт для full speed и до 1024 байт для high speed. Поскольку максимальный размер полезной нагрузки влияет на требование к шине по полосе пропускания, следует внимательно отнестись к его выбору. Если Вы используете большую полезную нагрузку, то может оказаться хорошим выбором задать серию альтернативных интерфейсов (alternative interfaces) с различными изохронными размерами полезной нагрузки. Если во время энумерации хост не может предоставить Вашей изохронной конечной точке привилегированную полосу из-за ограничений полосы пропускания, то у него еще будут другие варианты полосы вместо того, чтобы потерпеть неудачу полностью. Данные, посылаемые через изохронную конечную точку, могут быть меньше предварительно оговоренного размера, и могут измениться по длине от транзакции к транзакции.

Все о USB  , Программирование  USB интерфейса и работа с  USB  периферии для программистов

На диаграмме показан формат изохронных транзакций IN и OUT. Изохронные транзакции не имеют стадии установления связи (рукопожатия, handshaking stage) и не могут сообщать об ошибках или событиях STALL/HALT.

Передачи Bulk

Bulk-передачи можно использовать для большого объема быстропередаваемых данных. В качестве примера можно привести задание по выводу на печать, посланное в принтер, или изображение, сгенерированное от сканера. Bulk-передачи предоставляют коррекцию ошибок полезной нагрузки с помощью поля CRC16 и механизмы детектирования ошибок и повторной передачи, гарантирующие отсутствие ошибок в передаваемых или принятых данных.
Bulk-передачи будут использовать остаточную полосу пропускания шины после того, как все другие транзакции были распределены. Если шина занята данными isochronous и/или interrupt, то данные bulk могут прередаваться через шину медленно. Следовательно, передачи Bulk должны использоваться только для интенсивных коммуникаций с негарантированным временем доставки. Особенности передачи Bulk:

  • Используются для передачи большого объема данных на высокой скорости за короткое время.
  • Детектирование ошибок с помощью CRC, с гарантией доставки.
  • Не гарантируется полоса пропускания или минимальная задержка (минимальная латентность).
  • Однонаправленный поток данных канала.
  • Работает только на скоростях Full speed и high speed.

Bulk-передачи поддерживаются только full speed и high speed устройствами. Для конечных точек full speed максимальный размер пакета bulk бывает 8, 16, 32 или 64 байта длиной. Для конечных точек high speed, максимальный размер пакета может до 512 байт длиной. Если полезная нагрузка данных меньше максимального размера пакета, она не должна быть дополнена нулями. Bulk-передачу считают законченной, когда она передала точное количество

продолжение следует...

Продолжение:


Часть 1 Все о USB , Программирование USB интерфейса и работа с USB периферии для программистов
Часть 2 Цоколевки разъема и кабеля - Все о USB , Программирование
Часть 3 Глава 4: Типы конечных точек (Endpoint Types ) - Все
Часть 4 Глава 5: Дескрипторы USB - Все о USB , Программирование
Часть 5 Глава 7 : обычный (Generic) драйвер USB - Все о
Часть 6 Термины - Все о USB , Программирование USB интерфейса и

создано: 2020-06-24
обновлено: 2024-11-12
81



Рейтиг 9 of 10. count vote: 2
Вы довольны ?:


Поделиться:

Найди готовое или заработай

С нашими удобными сервисами без комиссии*

Как это работает? | Узнать цену?

Найти исполнителя
$0 / весь год.
  • У вас есть задание, но нет времени его делать
  • Вы хотите найти профессионала для выплнения задания
  • Возможно примерение функции гаранта на сделку
  • Приорететная поддержка
  • идеально подходит для студентов, у которых нет времени для решения заданий
Готовое решение
$0 / весь год.
  • Вы можите продать(исполнителем) или купить(заказчиком) готовое решение
  • Вам предоставят готовое решение
  • Будет предоставлено в минимальные сроки т.к. задание уже готовое
  • Вы получите базовую гарантию 8 дней
  • Вы можете заработать на материалах
  • подходит как для студентов так и для преподавателей
Я исполнитель
$0 / весь год.
  • Вы профессионал своего дела
  • У вас есть опыт и желание зарабатывать
  • Вы хотите помочь в решении задач или написании работ
  • Возможно примерение функции гаранта на сделку
  • подходит для опытных студентов так и для преподавателей

Комментарии


Оставить комментарий
Если у вас есть какое-либо предложение, идея, благодарность или комментарий, не стесняйтесь писать. Мы очень ценим отзывы и рады услышать ваше мнение.
To reply

Операционные системы и системное программировние

Термины: Операционные системы и системное программировние