MyTetra Share
Делитесь знаниями!
Endpoints
Время создания: 08.02.2018 20:20
Раздел: Electronics - Theory - USB

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

Стандарт 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 стадий.

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

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

Стадия 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 сообщает состояние полного запроса, и меняется в зависимости от направления передачи. Функция всегда возвращает сообщение состояния.

Стадия 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 имеют следующие особенности:

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

Передачи 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)

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

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

Для изохронной конечной точки максимальный размер полезной нагрузки по данным указывается в дескрипторе конечной точки (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:

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

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


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

Bulk IN: когда хост готов принять данные bulk, он выдает токен IN. Если функция принимает токен IN с ошибкой, она игнорирует пакет. Если токен принят корректно, функция может ответить либо пакетом DATA (содержащим отправляемые данные bulk), либо пакетом stall, (показывающим, что конечная точка имеет ошибку), либо пакетом NAK (показывающим, что конечная точка в работе, но у нее пока нет данных для отправки).

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


Управление полосой пропускания

Хост отвечает за управление полосой пропускания шины. Это происходит при энумерации, и конфигурировании изохронных конечных точек и конечных точек interrupt через операции на шине. Спецификация накладывает ограничения на шину, которые разрешают выделение не более 90% всех фреймов для периодических передач (Interrupt или Isochronous) на шине full speed. На шине high speed это ограничение уменьшено - не более 80% микрофреймов можно выделить для периодических передач.

Таким образом, очевидно - если у Вас есть шина, очень нагруженная периодическими передачами, то оставшиеся 10% оставлены для передач управления (control transfers), и как только они будут распределены (обработаны), передачи bulk получат оставшуюся часть полосы.




















 
MyTetra Share v.0.53
Яндекс индекс цитирования