что такое дескриптор устройства
Поддержка USB в KolibriOS: что внутри? Часть 5: уровень логического устройства
Обработка подключения устройства, начатая на уровне поддержки хост-контроллеров, остановилась, подготовив нулевую конечную точку устройства к работе. Уровень поддержки каналов предоставил методы работы с каналами. Самое время их применить для продолжения инициализации устройства: включается функция usb_new_device из bus/usb/protocol.inc.
Уровень логического устройства имеет две задачи: во-первых, сконфигурировать устройство; во-вторых, расспросить его, загрузить соответствующий драйвер — или даже драйверы — и сообщить драйверу о новом устройстве.
Первые шаги
usb_new_device начинает с создания канала к нулевой конечной точке устройства. Код поддержки хост-контроллеров перед вызовом usb_new_device заполнил структуру, описывающую устройство, остаётся только указать параметры конечной точки: номер — нулевой — и максимальный размер пакета. Максимальный размер пакета для управляющей конечной точки может варьироваться от 8 до 64 байт и записан среди первых 8 байт дескриптора устройства. Однако, чтобы прочесть дескриптор, нужен уже открытый канал. К счастью, можно выбраться из цикла зависимостей: максимальный размер пакета нужен только для того, чтобы разбить одну передачу на транзакции; гарантируется, что максимальный размер пакета для управляющей конечной точки не меньше 8 байт; если на начальных стадиях конфигурации передавать только данные длиной 8 байт или меньше, то точное значение максимального размера пакета неважно. Поэтому в качестве максимального значения пакета можно установить любое число, не меньшее 8 байт.
Впрочем, есть одна проблема: эмуляция EHCI в VirtualBox не совсем корректна и требует указания 64 байт для работы с HighSpeed-устройствами. Поскольку других требований нет, канал к нулевой конечной точке начинает существование с максимальным размером пакета в 64 байт.
Дескриптор устройства
Вместе с дескриптором конфигурации устройство возвращает много других дескрипторов, задающих детали конфигурации. Общий объём данных, ассоциированных с дескриптором конфигурации, заранее неизвестен, но содержится в самом дескрипторе конфигурации. Поэтому запрос протекает в два этапа — на первом этапе функция usb_get_descr_callback запрашивает 8 байт, на втором этапе функция usb_know_length_callback вытаскивает из прочитанных байт общий размер и запрашивает уже его.
Дескриптор конфигурации
Одна из самых простых конфигураций — у виртуального хаба RMH, она показана на рисунке. Вместе с дескриптором конфигурации устройство возвращает дескрипторы всех интерфейсов этой конфигурации, для каждого интерфейса — дескрипторы всех его конечных точек. Среди ассоциированных данных бывают и дескрипторы других типов — например, HID-устройства вроде мышек и клавиатур возвращают HID-дескриптор между дескриптором интерфейса и дескриптором конечной точки; их разбор — дело драйвера.
Интерфейс USB. Часть 4. Дескрипторы и классы
В зависимости от назначения, все usb устройства разделены по классам. Это деление довольно широкое и объединяет довольно большие группы устройств. Например, класс HID (human interface device) включает все устройства человеко-машинного взаимодействия (мышки, клавиатуры и тому подобное), класс Printer — все печатающие устройства и так далее. Зачем это деление нужно?
Дело в том, что для каждого класса устройств написаны свои спецификации, которые позволяют унифицировать общение с устройствами. Это удобно и разработчикам устройств (не надо каждый раз изобретать новые интерфейсы и протоколы) и производителям операционок (можно организовать поддержку всяких стандартных устройств на уровне операционок). Да и для простых пользователей навигация в менеджере устройств становится приятнее.
Наряду с классом, определить для чего предназначен девайс, как с ним общаться и какие дрова при этом использовать, помогает пара идентификаторов VID/PID, а также номер версии устройства.
VID — это уникальный идентификатор производителя (Vendor ID), а PID — это уникальный идентификатор продукта (Product ID). Каждый VID стоит денег и покупать его надо у некоммерческой международной организации, занимающейся разработкой USB, которая называется USB Implementers Forum или просто USB-IF. Покупая VID, производитель получает в своё распоряжение пачку PID-ов от 0x0000 до 0xFFFF и гарантии того, что серьёзные производители не будут делать свои продукты с такими же VID/PID (и писать под них свои дрова). То есть его оборудование будет идентифицироваться операционкой одназначно и она будет однозначно выбирать для работы с этим оборудованием нужные дрова.
Всю информацию о себе и отдельных своих частях (классы, VID/PID, интерфейсы, конечные точки …) устройства хранят в специальных структурах данных, называемых дескрипторами (от англ. description — описание).
Дескрипторы бывают стандартные и специфические. Стандартные дескрипторы для всех USB-устойств одинаковы, они обязательно есть в любом USB-устройстве и содержат общее описание устройства и его отдельных частей. Специфические дескрипторы содержат всякую специфическую для различных классов устройств информацию, соответственно, такие дескрипторы для каждого класса устройств свои.
Ниже описаны структуры и назначения различных стандартных дескрипторов:
Standard Device Descriptor (стандартный дескриптор устройства) — содержит информацию об устройстве вцелом и о количестве его возможных конфигураций. Такой дескриптор может быть в устройстве только один.
Структура стандартного дескриптора устройства | |||
Смещение (байт) | Название поля | Размер (байт) | Описание |
0 | bLength | 1 | Размер дескриптора в байтах (всегда 18) |
1 | bDescriptorType | 1 | Тип дескриптора (всегда 1) |
2 | bcdUSB | 2 | Номер версии USB в формате BCD |
4 | bDeviceClass | 1 | Код класса |
5 | bDeviceSubClass | 1 | Код подкласса (всегда 0) |
6 | bDeviceProtocol | 1 | Код протокола (всегда 0) |
7 | bMaxPacketSize0 | 1 | Максимальный размер пакета для нулевой конечной точки (64 для HS, 8 — для FS и LS) |
8 | idVendor | 2 | Идентификатор производителя |
10 | idProduct | 2 | Идентификатор продукта |
12 | bcdDevice | 2 | Номер версии устройства в формате BCD |
14 | iManufacturer | 1 | Индекс дескриптора строки, описывающей производителя |
15 | iProduct | 1 | Индекс дескриптора строки, описывающей продукт |
16 | iSerialNumber | 1 | Индекс дескриптора строки, содержащей серийный номер устройства |
17 | bNumConfigurations | 1 | Количество возможных конфигураций устройства |
Номер версии USB может принимать следующие значения:
Коды классов бывают следующими:
Если устройство поддерживает режимы HS и FS, то у него должно быть два разных дескриптора для этих режимов, один из которых — это стандартный дескриптор устройства, а другой — уточняющий дескриптор устройства.
Device Qualifier Descriptor (уточняющий дескриптор устройства) — содержит дополнительную информацию об устройстве, для его работы на другой скорости.
Структура уточняющего дескриптора устройства | |||
Смещение (байт) | Название поля | Размер (байт) | Описание |
0 | bLength | 1 | Размер дескриптора в байтах |
1 | bDescriptorType | 1 | Тип дескриптора |
2 | bcdUSB | 2 | Номер версии USB в формате BCD |
4 | bDeviceClass | 1 | Код класса |
5 | bDeviceSubClass | 1 | Код подкласса |
6 | bDeviceProtocol | 1 | Код протокола |
7 | bMaxPacketSize0 | 1 | Максимальный размер пакета для нулевой конечной точки (64 для HS, 8 — для FS и LS) |
8 | bNumConfigurations | 1 | Количество дополнительных конфигураций устройства |
9 | bReserved | 1 | Зарезервировано (всегда 0) |
Standard Configuration Descriptor (стандартный дескриптор конфигурации) — содержит информацию об одной из возможных конфигураций устройства.
Структура стандартного дескриптора конфигурации | |||
Смещение (байт) | Название поля | Размер (байт) | Описание |
0 | bLength | 1 | Размер дескриптора в байтах |
1 | bDescriptorType | 1 | Тип дескриптора |
2 | wTotalLength | 2 | Общий объём данных (в байтах), возвращаемых для данной конфигурации |
4 | bNumInterfaces | 1 | Количество интерфейсов для данной конфигурации |
5 | bConfigurationValue | 1 | Идентификатор конфигурации (используется при запросе SetConfiguration для установки данной конфигурации) |
6 | iConfiguration | 1 | Индекс дескриптора строки, описывающей данную конфигурацию |
7 | bmAttributes | 1 | Характеристики конфигурации |
8 | MaxPower | 1 | Максимальный потребляемый ток, делённый на 2 |
Битовая маска атрибутов содержит следующую информацию:
Standard Interface Descriptor (стандартный дескриптор интерфейса) — содержит информацию об одном из доступных в какой-либо конфигурации интерфейсов.
Структура стандартного дескриптора интерфейса | |||
Смещение (байт) | Название поля | Размер (байт) | Описание |
0 | bLength | 1 | Размер дескриптора в байтах |
1 | bDescriptorType | 1 | Тип дескриптора |
2 | bInterfaceNumber | 1 | Номер интерфейса в наборе, поддерживаемом в данной конфигурации (нумерация начинается с нуля) |
3 | bAlternateSetting | 1 | Альтернативный номер интерфейса |
4 | bNumEndpoints | 1 | Количество конечных точек данного интерфейса (нулевая конечная точка не учитывается, поскольку она общая для всех) |
5 | bInterfaceClass | 1 | Код класса интерфейса |
6 | bInterfaceSubClass | 1 | Код подкласса интерфейса |
7 | bInterfaceProtocol | 1 | Код протокола |
8 | iInterface | 1 | Индекс дескриптора строки, содержащей описание данного интерфейса |
Standard Endpoint Descriptor (стандартный дескриптор конечной точки) — содержит информацию об одной из доступных для какого-либо интерфейса конечных точек.
Структура стандартного дескриптора конечной точки | |||
Смещение (байт) | Название поля | Размер (байт) | Описание |
0 | bLength | 1 | Размер дескриптора в байтах |
1 | bDescriptorType | 1 | Тип дескриптора |
2 | bEndpointAddress | 1 | Адрес конечной точки |
3 | bmAttributes | 1 | Атрибуты конечной точки |
4 | wMaxPacketSize | 2 | Максимальный размер пакета для конечной точки |
6 | bInterval | 1 | Интервал опроса конечной точки в миллисекундах (используется при передаче данных по прерываниям, для остальных, кроме изохронных, — игнорируется, для изохронных всегда равен 1) |
Битовая маска атрибутов содержит следующую информацию:
Unicode String Descriptor (дескриптор строки) — текст в формате Unicode. Строка не содержит нуль-терминатора, а её размер вычисляется как размер дескриптора минус два.
Структура стандартного дескриптора конечной точки | |||
Смещение (байт) | Название поля | Размер (байт) | Описание |
0 | bLength | 1 | Размер дескриптора в байтах |
1 | bDescriptorType | 1 | Тип дескриптора |
2 | bString | N | Строка в формате Unicode |
Дескрипторы строк являются необязательными. Если девайс не поддерживает дескрипторы строк, то во всех остальных дескрипторах индексы дескрипторов строк, содержащих текстовое описание, должны быть равны нулю.
При подключении USB-устройства, хост с помощью управляющих передач запрашивает у устройства список дескрипторов в следующем порядке:
Причём при запросе дескриптора конфигурации хост получает сразу все дескрипторы (дескрипторы интерфейсов, конечных точек), относящиеся к этой конфигурации. Общий объём этих дескрипторов хосту заранее неизвестен, он хранится в поле wTotalLength дескриптора конфигурации, поэтому хост сначала запрашивает первые 8 байт этого дескриптора, запоминает из прочитанных данных значение поля wTotalLength, а потом снова запрашивает этот же дескриптор конфигурации, но размер запрашиваемых данных уже указывает равным wTotalLength. В результате такого трюка устройство присылает хосту все дескрипторы, относящиеся к данной конфигурации, в следующем виде:
Специфические дескрипторы мы рассмотрим подробнее когда будем разрабатывать какой-нибудь конкретный девайс, какого-нибудь определённого класса, а пока на этом всё.
Сбой запроса дескриптора usb устройства
Ошибка USB device descriptor failure (code43) часто встречается у пользователей Windows 10, когда они хотят подключить USB-накопитель к ПК или ноутбуку. При попытке найти USB-устройства, вы заметите над ними ярко-желтый значок с уведомлением об ошибке, а сама флешка не будет считываться.
Почти всегда это указывает на то, что устройство неисправно или же произошёл сбой устройства, но некоторые проблемы решаются программным путём.
Что означает эта ошибка
Любое устройство, которое имеет USB порт, должно иметь уникальный дескриптор набор информации о нём, включающей в себя идентификатор поставщика (idVendor), идентификатор продукта (idProduct) и др. Данная информация используется Windows 10 для создания аппаратного идентификатора этого конкретного устройства, а значит без него OC не увидит и будет постоянно выдавать сбой запроса дескриптора.
Ошибка «Сбой дескриптора» отображаются всякий раз, когда Windows обнаруживает проблемы с программным или аппаратным обеспечением системы. Проблемы эти могут быть разного характера, но в целом ошибка указывает на то, что устройство или его программное обеспечение неисправно.
Проще говоря, вы можете их увидеть, если подсоединяемое к системнику устройство обнаруживается, но не идентифицируется системой.
Обновить драйвера и ошибка уйдёт
Самым надёжным вариантом избавиться от «usb device descriptor failure» или же «сбой запроса дескриптора» является обновление программных компонентов составного usb устройства. Пошагово эта процедура выглядит следующим образом:
Нарушенная работа usb устройств напрямую связана с электропитанием
Ошибка драйвера «usb device descriptor failure» он же «сбой запроса дескриптора» может возникнуть в результате недостаточного электропитания USB-блока. Исправить её можно при помощи настроек электропитания. Для этого проделайте следующее:
Отключение режима энергосбережения
Энергосберегающий режим может быть одной из причин того, что подключаемые девайсы не определяются и периодически выдают «сбой запроса дескриптора» Поэтому его следует деактивировать. Для этого:
Драйвера на чипсет
Чипсет — это набор микросхем на мат.плате компьютера, которые отвечают за его непосредственную работу и корректное функционирование всех его составляющих, в том числе USB портов. Поэтому Microsoft регулярно поставляет обновления для ПО, обеспечивающего работу системы. Установить их можно через встроенный инструмент «десятки». Вот что для этого нужно сделать:
Обновление драйверов usb оборудования
Допустим, вы попробовали все варианты, но ошибка кода 43 по-прежнему присутствует (ошибка USB) и устранить её до сих пор не получается. Тогда вам нужно попробовать переустановить драйвера, вместо их обновления. Для этого проделайте следующее:
Важный момент: если Windows отказывается устанавливать драйвера, вам придётся переустановить их вручную. Для этого лучше всего использовать программу Driver Booster PRO, которая поможет вам подобрать оптимальный драйвер и вы избавитесь от ошибки «сбой запроса дескриптора» Но вы также можете скачать файл с оф.ресурсов поставщиков или иных источников.
Usb порты не функционируют из за неисправности с электросетями
Ситуация может в том числе сопровождаться ошибкой «Power surge on the USB port». Она показывает, что питание осуществляется неправильно. Это может быть связано с перебоями в работе электросетей.
Чтобы избавиться от ошибки, следуйте данному гайду:
Важный момент: для ноутбуков со съёмной батареей последовательность действия такая же, за исключением того, что к третьему пункту добавляется «снимите аккумулятор с ноутбука».
Установка драйверов на материнку в ручную
Если автоустановка драйверов на материнку не помогла, то попробуйте данный метод. Вы можете скачать драйверы чипсета с оф.сайта и установить их на свой компьютер вручную, для исключения ошибки usb device descriptor failure.
Но для этого вам необходимо сначала проверить системную информацию компьютера. Важно загрузить правильный драйвер, который подходит конкретно для вашей системы Windows — будь то Windows 10, 32-разрядная или 64-разрядная версия и т.п. Для этого:
После загрузки драйверов чипсета откройте загруженные файлы и следуйте инструкциям на экране, чтобы установить их на свой компьютер.
Какие причины могут быть для сбоя
За подобными ошибками всегда стоят технические или программные причины. В конкретном кейсе с ошибкой сбоя дескриптора устройства, их целое множество:
Ошибка «сбой запроса дескриптора» также может появиться, если гаджет подключён к порту с более высокой пропускной способностью, чем он сам. Например, порт USB 3.0 (этот вход всегда выделен синим входом) поддерживает устройства USB, указанные в стандарте USB 2.0, но при этом могут возникать трудности при соединении или передаче информации.