Лекция
Это продолжение увлекательной статьи про 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 Full и High Speed. Устройство Low Speed отличается подключением резистора 1,5к к D− вместо D+.
Осциллограмма пакета 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).
Помимо адресации физически подключенных устройств, 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 стека устройства.
Спецификация 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 не соответствовали инверсии первых четырех битов, то Вы были бы правы.
У большинства функций есть серия буферов, обычно 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)
Стандарт USB определяет 4 типа конечных точек/передач:
Передачи Control
Управляющие передачи (control transfer) обычно используются для команд и операций получения состояния. Основная настройка устройства USB со всеми функциями энумерации происходит с использованием передач control. Это обычно быстрые, случайные по времени пакеты, инициированные хостом, которые имеют наилучший приоритет по доставке (best effort). Максимально допустимая длина полезной нагрузки (payload, или размер пакета) управляющей передачи полноскоростных (full-speed) устройств USB составляет 8, 16, 32 или 64 байта; для высокоскоростных (high-speed) устройств этот размер составляет 64 байта, и для низкоскоростных (low-speed) устройств это 8 байт (только 8 байт, и никаких других вариантов).
У передач control могут быть до 3 стадий.
Стадия data stage имеет два различных сценария, в зависимости от направления передачи данных.
Сценарий IN: когда хост готов принять данные control data, он выпускает IN Token. Если функция получает IN token с ошибкой, например PID не соответствует инверитрованным битам PID, то она игнорирует пакет. Если токен принят успешно, устройство может либо ответить пакетом DATA, содержащим отправляемые control data, либо stall packet, индицирующий ошибку конечной точки, либо пакет NAK, показывающий хосту, что конечная точка работает, но пока не имеет данных для отправки.
Сценарий OUT: когда хосту нужно передать устройству пакет с управляющими данными (control data packet), он выпускает OUT token, за которым идет пакет, содержащий control data в качестве полезной нагрузки. Если любая часть – или OUT token, или data packet ошибочны, функция игнорирует пакет. Если буфер конечной точки пуст, она заполняет буфер данными и передает ACK, информирующий хост о том, что данные получены успешно. Если буфер конечной точки не пуст, поскольку идет обработка предыдущего пакета, функция отвечает NAK. Однако, если у оконечной точки была ошибка, и ее бит останова (halt bit) был установлен, она возвращает STALL.
Стадия status stage также имеет два различных сценария, в зависимости от направления передачи данных.
Сценарий IN: если хост отправил токен (токены) IN token(s) во время стадии data stage для приема данных, хост должен подтвердить успешный прием данных. Это делается путем отправки токена OUT, за которым идет пакет data нулевой длины. Функция может теперь сообщить свой статус на стадии handshaking. ACK указывает на то, что функция завершила команду и готова к приему следующей команды. Если во время обработки этой команды произошла ошибка, функция выдает STALL. Однако если пока продолжается обработка команды, функция выдает NAK, указывающий хосту повторить позже стадию status stage.
Сценарий OUT: если хост отправил токен (токены) OUT на стадии data stage – чтобы отправить данные, функция подтверждает успешный прием данных отправкой пакета нулевой длины в ответ на токен IN. Однако если произошла ошибка, функция должна выдать STALL, или если пока обрабатываются данные, должна выдать NAK, указывая хосту повторить позже status phase.
Передачи 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 имеют следующие особенности:
Передачи Interrupt обычно непериодические, когда USB устройство "инициирует" связь, требующую ограниченного времени ожидания. Запрос на «прерывание» ставится устройством USB в очередь, пока компьютер не опросит устройство USB с целью получения данных.
Максимальная полезная нагрузка для low-speed устройств - 8 байт.
Максимальная полезная нагрузка для full-speed устройств - 64 байта.
Максимальная полезная нагрузка для high-speed устройств - 1024 байта.
На диаграмме показан формат транзакций 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)
Изохронные передачи происходят периодически и продолжительное время. Они обычно содержат информацию, привязанную ко времени (чувствительную к времени доставки), например аудио или видео потоки. Если произойдет задержка или повторная передача данных в аудио потоке, то Вы должны в результате получить искаженный звук. Дополнительная неприятность – может пропасть синхронизация звука. Однако выпадение пакетов или фреймов могут случаться постоянно снова и снова, и это будет менее заметно для слушателя. Изохронные передачи обеспечивают:
Для изохронной конечной точки максимальный размер полезной нагрузки по данным указывается в дескрипторе конечной точки (endpoint descriptor). Этот размер может быть максимум до 1023 байт для full speed и до 1024 байт для high speed. Поскольку максимальный размер полезной нагрузки влияет на требование к шине по полосе пропускания, следует внимательно отнестись к его выбору. Если Вы используете большую полезную нагрузку, то может оказаться хорошим выбором задать серию альтернативных интерфейсов (alternative interfaces) с различными изохронными размерами полезной нагрузки. Если во время энумерации хост не может предоставить Вашей изохронной конечной точке привилегированную полосу из-за ограничений полосы пропускания, то у него еще будут другие варианты полосы вместо того, чтобы потерпеть неудачу полностью. Данные, посылаемые через изохронную конечную точку, могут быть меньше предварительно оговоренного размера, и могут измениться по длине от транзакции к транзакции.
На диаграмме показан формат изохронных транзакций IN и OUT. Изохронные транзакции не имеют стадии установления связи (рукопожатия, handshaking stage) и не могут сообщать об ошибках или событиях STALL/HALT.
Передачи Bulk
Bulk-передачи можно использовать для большого объема быстропередаваемых данных. В качестве примера можно привести задание по выводу на печать, посланное в принтер, или изображение, сгенерированное от сканера. Bulk-передачи предоставляют коррекцию ошибок полезной нагрузки с помощью поля CRC16 и механизмы детектирования ошибок и повторной передачи, гарантирующие отсутствие ошибок в передаваемых или принятых данных.
Bulk-передачи будут использовать остаточную полосу пропускания шины после того, как все другие транзакции были распределены. Если шина занята данными isochronous и/или interrupt, то данные bulk могут прередаваться через шину медленно. Следовательно, передачи Bulk должны использоваться только для интенсивных коммуникаций с негарантированным временем доставки. Особенности передачи Bulk:
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 интерфейса и
Комментарии
Оставить комментарий
Операционные системы и системное программировние
Термины: Операционные системы и системное программировние