Запросы
В терминологии USB, команды, которые посылает хост USB устройству, называются запросами или requests по-английски. Для передачи запросов используется канал управления. В подавляющем большинстве случаев для при.ма запросов используется нулевая конечная точка. Но стандартом допускается существование нескольких точек управления. По умолчанию все запросы управления принимаются нулевой конечной точкой. Запросы могут менять конфигурацию и некоторые свойства USB устройства, запрашивать служебную информацию. В примере программы, который был привед.н, хост посылает специальный запрос USB устройству на получение строкового дескриптора от USB устройства. В ответ USB устройство, возвращает строковый дескриптор.
Стандартом USB, определен набор запросов, которые должно обрабатывать любое USB устройство. Эти запросы называются стандартными запросами и всего их 11, каждому стандартному запросу присвоен номер. Стандартом предусмотрена возможность создания разработчиком своих собственных запросов. А для USB устройств относящихся к стандартизованным классам, например мышь USB, кроме стандартных запросов, имеется своя система запросов, которую рассматривать не будем, но о существовании которой знать надо. Средствами библиотеки libusb, можно посылать любой запрос USB устройству.
Для подачи запроса USB устройству, используется механизм управляющих передач - это последовательность обмена пакетами, похожая на рассмотренные ранее транзакции, но только сложнее. Кратко рассмотрим стандартные запросы.
Запрос GET_DESCRIPTOR (06h) позволяет хосту получить дескриптор устройства, конфигурации, конечной точки или строки. Во время процесса энумерации, хост получает сведения о USB устройстве с помощью этого запроса.
Запрос SET_DESCRIPTOR (07h), позволяет добавить новый дескриптор или расширить имеющийся.
Запрос SET_ADDRESS (05h), присваивает адрес USB устройству. Каждое USB устройство имеет уникальный адрес на шине. Адрес назначает хост, в процессе энумерации.
Запрос SET_FEATURE (03h), позволяет установить значение свойства или состояния. Данные не возвращаются. Запрос может быть адресован устройству, интерфейсу или конечной точке. Адресовав запрос к конечной точке можно перевести е. в блокированное состояние. Конечная точка, находящаяся в блокированном состоянии, на попытки обращения хоста, отвечает пакетом STALL.
Хост может перейти в режим с пониженным энергопотреблением (suspended mode ), а USB устройство может выводить хост из этого состояния специальной сигнализацией на шине. Это свойство USB устройства называется – удал.нное пробуждение (remote wakeup). Специальным запросом SET_FEATURE, можно дать возможность USB устройству пробуждать хост.
Запрос CLEAR_FEATURE (01h), позволяет сбросить значение свойства или состояния. Запрос аналогичен запросу SET_FEATURE и противоположен по действию. Этим запросом выводится из блокированного состояния конечная точка, если она была заблокирована. Соответственно сбрасывается свойство пробуждать хост (remote wakeup).
Запрос GET_STATUS (00h) позволяет определить состояние USB устройства, интерфейса или конечной точки. Если запрос направлен к USB устройству, то можно получить информацию, установлено или сброшено свойство «wakeup» USB устройства. Дополнительно можно определить, способ питания USB устройства, от шины или от собственного источника.
При направлении запроса GET_STATUS к конечной точке, можно определить состояние конечной точки, заблокирована она или нет.
Запросы GET_CONFIGURATION (08h) и SET_CONFIGURATION (09h), используются хостом для работы с USB устройствами, имеющими несколько конфигураций, а так же в процессе энумерации. Соответственно, можно получить номер текущей конфигурации и установить альтернативную конфигурацию. Установка конфигурации выполняется на стадии конфигурирования USB устройства, в процессе энумерации.
Запросы GET_INTERFACE (0Ah) и SET_INTERFACE (0Bh), позволяют работать с альтернативными установками интерфейсов. Альтернативные установки интерфейсов, позволяют менять некоторые параметры интерфейса после стадии конфигурирования, в процессе нормальной работы. Альтернативные настройки интерфейсов здесь не рассматриваются.
Последний, стандартный запрос SYNC_FRAME (0Ch), имеет достаточно узкую специализацию и применяется в работе изохронных каналов, которые здесь не рассматриваются.
На данном этапе нужно понять, что существует набор запросов, которые посылает хост для управления USB устройством и для конфигурирования на стадии энумерации. В библиотеке libusb имеется функция, с помощью которой можно посылать запросы USB устройству.
![](/img/interface/usb/instr/ris9.jpg)
Рисунок 9 |
.
|