MyTetra Share
Делитесь знаниями!
Запросы USB
Время создания: 15.02.2018 12:52
Раздел: Electronics - Theory - USB

[Глава 6: запросы USB]

Пакет Setup

Любое устройство USB должно ответить на пакеты установки (setup) по каналу по умолчанию (default pipe, конечная точка 0). Пакеты setup используются для обнаружения и конфигурирования устройства, и выполняют общие функции, такие как установка адреса устройства USB, запрос описателя устройства или проверка состояния конечной точки.

USB-совместимый хост предполагает, что все запросы будут обработаны в пределах максимального периода 5 секунд. Также определены более строгие лимиты времени для определенных запросов:

  • Standard Device request (стандартный запрос к устройству) без стадии данных должен быть завершен в течение 50 мс.
  • Standard Device request со стадией данных должен начать передавать данные не позже чем через 500 мс после запроса.
  • Каждый пакет данных должен быть отправлен в течение 500 мс после успешного завершения передачи предыдущего пакета. Стадия состояния должна быть завершена в течение 50 мс после передачи последнего пакета данных.

  • Команда SetAddress (которая содержит фазу данных) должна быть обработана и вернуть статус в течение 50 мс. Устройство тогда имеет 2 мс, чтобы изменить адрес прежде, чем будет послан следующий запрос.

Эти периоды времени ожидания являются весьма приемлемыми для даже самого медленного из устройств, но могут быть ограничением во время отладки. Невозможно обеспечить 50 мс для многих отладочных символов, отправляемых на скорости 9600 bps через асинхронный последовательный порт, или во внутрисхемных отладчиках/эмуляторах при выполнении программы по шагам или при остановке по точке останова для просмотра внутренних регистров и переменных. Поэтому USB требует специальной техники отладки в отличие от других проектов на микроконтроллерах.

Бегло просматривая XP DDK, я заметил, что Host Controller Driver теперь имеет команду USBUSER_OP_SEND_ONE_PACKET, которая прокомментирована так:"Это API используется для реализации 'пошаговой отладки' в инструменте разработки транзакций USB (USB transaction development tool)." Такой инструмент еще не был выпущен. Мы можем только надеяться, что скоро его увидим.

Каждый запрос начинается с пакета Setup длиной 8 байт, который имеет следующий формат:


Смещ.

Поле

Размер

Значение

Описание

0

bmRequestType

1

Набор битов (BitMap)

D7 направление передачи фазы данных
0 = хост передает в устройство
1 = устройство передает на хост
D6..5 тип
0 = Standard
1 = Class
2 = Vendor
3 = зарезервировано
D4..0 получатель
0 = устройство
1 = интерфейс
2 = конечная точка
3 = другое
4..31 = зарезервировано

1

bRequest

1

Значение

Запрос

2

wValue

2

Значение

Значение

4

wIndex

2

Индекс или смещение

Индекс

6

wLength

2

Счетчик

Если это фаза данных, то количество байт данных для передачи

Поле bmRequestType определит направление запроса, тип запроса и назначенного получателя. Поле bRequest определит делаемый запрос. Поле bmRequestType анализируется, и выполнение ответвляется на несколько обработчиков, таких как Standard Device request handler (стандартный обработчик запроса устройства), Standard Interface request handler (стандартный обработчик запроса интерфейса), Standard Endpoint request handler (стандартный обработчик запроса конечной точки), Class Device request handler (классовый обработчик запроса устройства) и т. п. То, как Вы проанализируете пакет setup, зависит только от Ваших предпочтений. Кто-то еще может захотеть сначала анализировать bRequest и потом определить тип запроса и его получателя на основании каждого запроса.

Стандартные запросы являются общими для всех устройств USB и подробно рассмотрены далее. Классовые запросы являются общими для классов драйверов. Например, все устройства, относящиеся к классу HID, будут иметь единый набор запросов, специфичных для класса. Они будут отличаться от запросов устройства, относящегося к классу communication или относящегося к классу mass storage.

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

Общие запросы могут быть перенаправлены на различных получателей, и в зависимости от конкретного получателя выполнять разные функции. Например, стандартный запрос GetStatus может быть направлен на устройство, интерфейс или конечную точку. Когда он направлен на устройство, он возвращает флаги, показывающие статус удаленного пробуждения (remote wakeup), и является ли устройство самопитаемым. Однако тот же запрос, направленный к интерфейсу, всегда вернет 0, или если запрос будет направлен на конечную точку, то он вернет состояние флага halt (флаг останова) для конечной точки.

Поля wValue и wIndex позволяют передавать параметры вместе с запросом, а поле wLength используется для указания количества байт, которые должны быть переданы на фазе данных.

Примечание переводчика: иногда поля wValue и wIndex применяют для передачи данных без участия специальной фазы данных (в поле wLength указывают 0), в этом случае можно передать не больше 4 байт. Пример использования таких управляющих запросов для передачи данных в обе стороны можно найти в примере hid-custom-rq из библиотеки V-USB (http://ru.wikipedia.org/wiki/V-USB), или в статье «V-USB и libusb: обмен с устройством USB HID с помощью управляющих сообщений (USB control messages)» http://microsin.ru/content/view/1084/44/.




Стандартные запросы

Секция 9.4 спецификации USB подробно описывают запросы "Standard Device", которые необходимо реализовать для каждого устройства USB. Стандарт предоставляет одну таблицу, группирующую запросы. Приняв во внимание, что большинство firmware анализирует пакет setup packet по получателю, мы можем разбить запросы на основе получателя для более простой обработки и реализации.

Стандартные запросы к устройству

В настоящий момент имеется 8 стандартных запросов к устройству.


bmRequestType

bRequest

wValue

wIndex

wLength

Data

1000 0000b

GET_STATUS (0x00)

0

0

2

Статус устройства

0000 0000b

CLEAR_FEATURE (0x01)

Селектор фичи

0

0

Нет

0000 0000b

SET_FEATURE (0x03)

Селектор фичи

0

0

Нет

0000 0000b

SET_ADDRESS (0x05)

Адрес устройства

0

0

Нет

1000 0000b

GET_DESCRIPTOR (0x06)

Тип дескриптора и индекс

0 или ID языка

Длина дескриптора

Дескриптор

0000 0000b

SET_DESCRIPTOR (0x07)

Тип дескриптора и индекс

0 или ID языка

Длина дескриптора

Дескриптор

1000 0000b

GET_CONFIGURATION (0x08)

0

0

1

Значение конфигурации

0000 0000b

SET_CONFIGURATION (0x09)

Configuration Value

0

0

Нет

  • Запрос  Get Status, направленный на устройство, вернет 2 байта на стадии данных в следующем формате:


D15

D14

D13

D12

D11

D10

D9

D8

D7

D6

D5

D4

D3

D2

D1

D0

Зарезервировано

Remote Wakeup

Self Powered

  • Если бит D0 (Self Powered) установлен, то это указывает на самопитаемое устройство (у устройства имеется собственный источник питания, и оно ничего не потребляет от шины USB), а если очищен, то устройство bus powered (питается от провода Vbus шины USB). Если бит D1 установлен, то у устройства разрешена возможность удаленного пробуждения хоста от спячки или приостановки (Remote Wakeup). Бит remote wakeup может быть изменен запросами SetFeature и ClearFeature с селектором фичи равным DEVICE_REMOTE_WAKEUP (0x01)
  • Запросы Clear Feature и Set Feature могут использоваться для сброса или установки булевых (boolean) фич. Когда получатель – устройство, то возможны только два селектора фичи DEVICE_REMOTE_WAKEUP и TEST_MODE. Режим тестирования позволяет устройству выдавать (показывать) некоторые условия. Они позже были документированы в Ревизии 2.0 спецификации USB.
  • Запрос Set Address используется во время энумерации для того, чтобы назначить уникальный адрес устройству USB. Адрес указывается в поле wValue и может принимать значение не более 127. Этот запрос уникален тем, что устройство не меняет свой адрес, пока не завершится стадия статуса (см. Control Transfers). Все другие запросы должны выполниться до стадии статуса.
  • Запросы Set Descriptor/Get Descriptor используются для возврата дескриптора, указанного в wValue. Запрос для дескриптора конфигурации вернет дескриптор устройства и все дескрипторы интерфейса и конечной точки в одном запросе. Endpoint Descriptors (дескрипторы конечной точки) не могут быть запрошены напрямую запросами GetDescriptor/SetDescriptor. Interface Descriptors (дескрипторы интерфейса) не могут быть запрошены напрямую запросами GetDescriptor/SetDescriptor. String Descriptors (строковые дескрипторы) включают Language ID (идентификатор языка) в поле wIndex – для поддержки нескольких языков.
  • Запросы Get Configuration/Set Configuration используются для запроса или установки текущей конфигурации устройства. В случае запроса Get Configuration будет возвращен байт на стадии данных, показывающий статус устройства. Нулевая величина показывает, что устройство не сконфигурировано, и ненулевое значение показывает, что устройство сконфигурировано. Set Configuration используется для разрешения (enable) устройства. Этот запрос должен содержать величину поля bConfigurationValue желаемого configuration descriptor (дескриптора конфигурации) в младшем байте wValue – для выбора разрешаемой конфигурации.


Стандартные запросы к интерфейсу

Спецификация в настоящий момент задает 5 стандартных запросов к интерфейсу, показанные в таблице ниже. Что интересно - только два запроса делают что-нибудь понятное.


bmRequestType

bRequest

wValue

wIndex

wLength

Data

1000 0001b

GET_STATUS (0x00)

0

Интерфейс

2

Состояние интерфейса

0000 0001b

CLEAR_FEATURE (0x01)

Селектор фичи

Интерфейс

0

Нет

0000 0001b

SET_FEATURE (0x03)

Селектор фичи

Интерфейс

0

Нет

1000 0001b

GET_INTERFACE (0x0A)

0

Интерфейс

1

Альтернативный интерфейс

0000 0001b

SET_INTERFACE (0x0B)

Альтернативная установка

Интерфейс

0

Нет

  • Поле wIndex используется для указания ссылки на нужный интерфейс для запросов, направленных к интерфейсу. Формат поля следующий:


D15

D14

D13

D12

D11

D10

D9

D8

D7

D6

D5

D4

D3

D2

D1

D0

Зарезервировано

Номер интерфейса

  • Запрос Get Status используется для возврата статуса (состояния интерфейса). Такой запрос к интерфейсу должен возвратить два байта 0x00, 0x00 (оба байта зарезервированы для использования в будущем).
  • Запросы Clear Feature и Set Feature могут использоваться для очистки и сброса булевых фич. Когда назначенный получатель – интерфейс, спецификация USB ревизии 2 не указывает конкретных фич интерфейса.
  • Запросы Get Interface и Set Interface получают и устанавливают Alternative Interface (альтернативный интерфейс), который более подробно описан Interface Descriptor (дескриптором интерфейса).


Стандартные запросы к конечной точке

Запросы Standard Endpoint бывают 4-х видов, перечисленных в таблице ниже.


bmRequestType

bRequest

wValue

Windex

wLength

Data

1000 0010b

GET_STATUS (0x00)

0

Конечная точка

2

Состояние конечной точки

0000 0010b

CLEAR_FEATURE (0x01)

Селектор фичи

Конечная точка

0

Нет

0000 0010b

SET_FEATURE (0x03)

Селектор фичи

Конечная точка

0

Нет

1000 0010b

SYNCH_FRAME (0x0С)

0

Конечная точка

2

Номер фрейма

  • Поле wIndex в запросах к конечной точке используется для указания целевой конечной точки и направления запросов. Формат поля следующий:


D15

D14

D13

D12

D11

D10

D9

D8

D7

D6

D5

D4

D3

D2

D1

D0

Зарезервировано

Dir
(направление)

Зарезервировано

Номер конечной точки

  • Запрос Get Status возвращает 2 байта, в которых возвращается статус конечной точки (пока только бит Halted/Stalled, т. е. бит приостановки). Формат двух возвращаемых байт показан ниже:


D15

D14

D13

D12

D11

D10

D9

D8

D7

D6

D5

D4

D3

D2

D1

D0

Зарезервировано

Halt

  • Запрос Clear Feature и Set Feature используется для установки фич конечной точки. Стандарт в настоящее время определяет один селектор фичи конечной точки ENDPOINT_HALT (0x00), который позволяет хосту приостановить и очистить конечную точку. Только оконечным точкам, кроме заданной по умолчанию конечной точки (конечная точка 0) рекомендуют иметь эти функциональные возможности.
  • Запрос Synch Frame используется, чтобы сообщить о кадре синхронизации конечной точки.


Здесь (да и у автора USB in a nutshell) ВРОДЕ неправильно указаны коды для стандартных запросов к интерфейсу конечной точки. SET_INTERFACE(0 x11) SYNCH_FRAME(0x12). Должно SET_INTERFACE(11 или 0x0B) SYNCH_FRAME(12 или 0x0C).

- исправил в таблицах (c) phara





Так же в этом разделе:
 
MyTetra Share v.0.53
Яндекс индекс цитирования