Usb composite device что это
USB 3.0 стал крупным прорывом на рынке передачи данных. Отмеченный голубыми USB-портами, USB 3.0 предоставил пользователям скорость до 10 раз больше USB 2.0 (5 Гбит/с), благодаря чему большие медиа-файлы и программы можно было передавать за считанные минуты.
USB 3.0 поддерживает обратную совместимость, что означает, что все устройства, работающие на USB 2.0, должны хорошо работать с USB 3.0. Однако многие пользователи сообщают о следующей ошибке при попытке подключить устройства к слотам USB 3.0 – USB Composite Device является устаревшим устройством USB и может не работать в USB 3.0.
Способ 1. Обновите драйвер составного USB-устройства с помощью диспетчера устройств
- На клавиатуре нажмите и удерживайте клавишу с логотипом Windows , затем нажмите R , чтобы открыть окно «Выполнить».
- Введите devmgmt.msc в поле и нажмите Enter , чтобы открыть диспетчер устройств.
- Дважды щелкните Контроллеры универсальной последовательной шины , затем щелкните правой кнопкой мыши USB Составное устройство , чтобы выбрать Обновить программное обеспечение драйвера…
- Щелкните Автоматический поиск. для обновленного программного обеспечения драйвера .
Подождите для Windows, обнаруживающей обновления, и следуйте инструкциям на экране, чтобы установить обновление.
Иногда Microsoft не может каким-либо образом обнаружить обновление для вас, в этом случае вам нужно найти другой способ обновления драйвера. У нас есть для вас отличный выбор — Driver Easy . Переходите к способу 2.
Способ 2: автоматически обновляйте драйвер композитного USB-устройства
Driver Easy будет автоматически распознает вашу систему и находит для нее подходящие драйверы. Вам не нужно точно знать, в какой системе работает ваш компьютер, вам не нужно рисковать загрузкой и установкой неправильного драйвера, и вам не нужно беспокоиться об ошибке при установке.
- Загрузите и установите Driver Easy.
- Запустите Driver Easy и нажмите кнопку Сканировать сейчас . Затем Driver Easy просканирует ваш компьютер и обнаружит все проблемные драйверы. Ваш звуковой драйвер не является исключением.
- Нажмите Обновить все , чтобы автоматически загрузите и установите правильную версию всех драйверов, которые отсутствуют или устарели в вашей системе (для этого требуется версия Pro — вы будете предлагается обновить, когда вы нажимаете Обновить все).
Выводы
Автору удалось реализовать составное устройство USB, состоящее из виртуального COM-порта и дуплексной звуковой карты, на ресурсах платы NUCLEO-F446ZE.
Решение оформлено в виде проекта в среде разработки STM32CubeIDE. После генерации кода STM32CubeMX для восстановления работоспособности решения необходимо вручную изменить значения трёх байтов в стандартном дескрипторе устройства USB (USB standard device descriptor), размещённом в файле usbd_desc.c.
USB Composite Device – старое USB-устройство
Эта проблема более заметна с принтерами. Причиной обычно являются несовместимые драйверы. Попробуйте изменить порт USB, и если это не сработает, воспользуйтесь следующими решениями для решения проблемы:
- Запустите аппаратные средства и устранение неполадок USB
- Обновите или переустановите драйверы USB
- Удалите и переустановите драйверы принтера.
1] Запуск оборудования и устранения неполадок USB
Средство устранения неполадок оборудования и устройств проверяет параметры, связанные с оборудованием, и, если возможно, корректирует их.
Чтобы использовать это средство устранения неполадок, нажмите кнопку «Пуск» и выберите «Настройки»> «Обновления и безопасность» >> «Устранение неполадок».
Выберите средство устранения неполадок оборудования и устройств и запустите его. Перезагрузите систему, как только вы закончите.
Вы также можете запустить Устранение неполадок USB .
2] Обновите или переустановите драйверы USB
Чтобы обновить драйвер устройства. нажмите Win + R, чтобы открыть окно «Выполнить» и введите команду devmgmt.msc. Нажмите Enter, чтобы открыть диспетчер устройств.
Найдите драйверы Универсальный контроллер последовательной шины и раскройте список. Щелкните правой кнопкой мыши и выберите «Обновить драйвер» для каждого драйвера USB.
3] Удалите и переустановите драйверы принтера.
Поскольку вы не можете подключить принтер к компьютеру, новые драйверы необходимо будет загрузить с веб-сайта производителя. Установите их в систему и проверьте, нормально ли работает принтер после этого.
Это решение остается тем же для других аппаратных устройств, которые показывают ту же ошибку при попытке подключения к компьютеру.
В заключительной части публикации о составном устройстве USB я расскажу о том, как заставил заработать составное устройство USB, а также поделюсь некоторыми неочевидными нюансами этого процесса.
Работа составных частей устройства была описана во второй и третьей частях публикации.
Ответы на вопрос, зачем это всё было затеяно, даются в начале первой части и в конце четвёртой.
Исходные коды публикуемой реализации составного устройства USB, состоящего из виртуального COM-порта и дуплексной звуковой карты находятся здесь.
Файлы драйвера составного устройства usbd_comp.c и usbd_comp.h расположены в папках Core/Scr и Core/Inc соответственно.
Структура класса составного устройства аналогична структуре класса звукового устройства и содержит подобный набор функций-обработчиков событий.
Основная функция драйвера составного устройства заключается в том, чтобы определить, драйвер какого устройства нужно подключить для обработки события. При обработке запросов (Requests) это определяется по номеру интерфейса в случае Standard Requests или атрибутам запроса в случае Class-Specific Requests. При обработке пакетов данных переключение производится, как правило, по номеру конечной точки (EP).
Подробно Standard Requests описаны на стр.248 – 260 документа:
[5] Universal Serial Bus Specification, Revision 2.0, April 27, 2000
Запросы Communication Device Class-Specific Requests подробно описаны на стр.18 – 30 документа [4], а Audio Device Class-Specific Requests, соответственно, на стр.74 – 85 документа [3].
Дескриптор описанного в публикации составного устройства USB состоит из девяти байтов раздела Configuration Descriptor, восьми байтов раздела Interface Association Descriptor (IAD) для двух интерфейсов виртуального COM-порта, 58 байтов дескриптора виртуального COM-порта, восьми байтов раздела IAD для трёх интерфейсов звукового устройства и 183 байтов дескриптора звукового устройства USB.
Виртуальный COM-порт использует интерфейсы 0 и 1, а также конечные точки 1 и 2. Дуплексное звуковое устройство использует интерфейсы 2, 3 и 4, а также конечную точку 3.
Рассмотрим доработанный файл usb_device.c, расположенный в папке USB_DEVICE/App:
Сначала создаётся переменная hUsbDeviceFS. Тип USBD_HandleTypeDef объявлен в usbd_def.h.
Функция MX_USB_DEVICE_Init вызывается из main.c.
Вызовом функции USBD_Init задаются начальные значения переменной hUsbDeviceFS.
Затем вызовом функций HAL_PCDEx_SetTxFiFo производится настройка буфера USB для каждой конечной точки составного устройства.
Неочевидный нюанс 1: по умолчанию настройка буфера USB производится при исполнении функции USBD_LL_Init, размещённой в файле usbd_conf.c. В теле этой функции области, помеченной как USER CODE, нет. Т.е. при каждой генерации кода STM32CubeMX будет удалять настройки буфера для конечных точек 2 и 3. Именно поэтому окончательная настройка буфера USB производится уже после того, как функция USBD_LL_Init отработала.
Вызовом функции USBD_RegisterClass в hUsbDeviceFS.pClass размещается указатель на созданную в usbd_comp.c переменную USBD_COMP, содержащую указатели на обработчики событий, относящихся к классу устройства. Тип USBD_ClassTypeDef объявлен в usbd_def.h.
Вызовом функции USBD_RegisterInterface в hUsbDeviceFS.pUserData размещается указатель на созданную в usbd_comp.h пустую переменную USBD_COMP_fops_FS.
В дальнейшем обработчики событий составного устройства USB будут вызывать обработчики событий нужного устройства, входящего в составное, а также подключать нужный интерфейс связи с оконечными устройствами.
Вызовом функции USBD_Start производится запуск устройства USB.
Неочевидный нюанс 2: составное устройство будет упорно определяться как виртуальный COM-порт, если не поменять значения трёх байтов в стандартном дескрипторе устройства USB (USB standard device descriptor), размещённом в файле usbd_desc.c, причём при каждой генерации кода STM32CubeMX эти изменения будет удалять:
Неочевидный нюанс 3: виртуальный COM-порт в данном решении работает корректно только в случае, когда номер используемой им конечной точки меньше, чем номер конечной точки звукового устройства.
Неочевидный нюанс 4: виртуальный COM-порт в данном решении работает корректно только в случае, когда при инициализации в его буфер прописываются параметры порта (см. USBD_COMP_Init). Без этой записи программы терминалов к COM-порту могут и не подключиться.
Соединяем воедино проверки работоспособности драйвера виртуального COM-порта и дуплексного звукового устройства USB. Убеждаемся, что они отлично уживаются.
Неочевидный нюанс 5: при проверке работоспособности «эхо» через COM-порт возвращается, когда составное устройство уже «переключено на COM-порт». В реальном применении устройства передача может начаться, когда подключено звуковое устройство. Чтобы избежать подобной ситуации, перед началом передачи производится вызов функции COMP_CDC_Transmit_FS для подключения драйвера виртуального COM-порта:
Исправление 2: переустановите драйверы контроллера USB
Вы также можете попробовать удалить и переустановить драйверы USB через диспетчер устройств. Это действие позволит Windows автоматически сканировать аппаратные изменения и переустанавливать необходимые драйверы. Вот что вам нужно сделать:
-
На клавиатуре нажмите Логотип Windows
ключ
р
нажмите одновременно, чтобы открыть окно «Выполнить».
Исправление 3: использование средства устранения неполадок Windows USB
Если описанные выше действия не помогли вам, попробуйте Windows Устранение неполадок USB.
Чтобы использовать его, во-первых, вам нужно скачать инструмент с эта ссылка.
Затем вы можете открыть инструмент и следовать инструкциям на экране для устранения проблемы.
Если у вас есть какие-либо вопросы или предложения, пожалуйста, не стесняйтесь оставлять комментарии ниже.
Попробуйте эти исправления
Вот 3 исправления, которые помогли многим другим пользователям решить проблему с USB Composite Device. Вам не нужно пробовать их все; просто пройдите вниз по списку, пока не найдете тот, который подходит вам.
- Обновите драйвер USB Composite Device
- Переустановите драйверы контроллера USB
- Используйте Windows USB Устранение неполадок
От автора
Данный цикл публикаций подводит черту, фиксирует результат проекта, которой мне удалось достичь в одиночку.
Хочу поблагодарить своих читателей за доброжелательность и тёплый приём. Я никогда не был и никогда уже не буду профессиональным разработчиком ПО для микроконтроллеров. И это моя первая публикация про разработку программного обеспечения.
Благодарю Георгия (RX9CIM) за моральную поддержку при запуске проекта.
Отдельная благодарность romanetz_omsk, без которого я бы забросил проект ещё два года назад.
По логике дальнейшего развития MVP нужно приступать к написанию DSP, а это уже достаточно сложная для меня математика. Как это осилить в одиночку, ума не приложу…
Не так давно, была опубликована статья «Пастильда — открытый аппаратный менеджер паролей». Так как данный проект является открытым, то мы решили, что будет интересно, если мы будем писать небольшие заметки о процессе проектирования, о задачах, которые перед нами стоят и о трудностях, с которыми мы сталкиваемся.
Реализация USB хоста
Итак, во-первых мне нужно было реализовать на устройстве USB хост, чтобы оно могло распознавать и общаться с подключенной к нему клавиатурой. Так как в работе я использую связку Eclipse + GNU ARM Eclipse + libopencm3, то очень хотелось найти уже что-то готовое и желательно написанное с использованием библиотеки libopencm3. Желание мое было очень жирным, до последнего момента не верила, что мои поиски увенчаются успехом. Однако под конец рабочего дня, проскролив интернет до самого дна, я вдруг наткнулась вот на это. libusbhost? Серьезно? И это был не просто написанный на основе libopencm3 usb хост, он еще и был написан под STM32F4, под тот самый, который мы решили использовать в проекте. В общем, звезды сошлись и радости моей не было предела. Кстати, оказалось, что этот проект создавался как часть libopencm3, однако его так и не добавили в библиотеку.
Как библиотеку, libusbhost я не собирала, просто взяла необходимые мне исходники, написала драйвер для клавиатуры и, в общем-то все, погнали! Но обо всем по-порядку.
- usbh_device_driver.h
- usbh_config.h
- usbh_hubbed.[ch]
- usbh_lld_stm32f4.[ch]
По аналогии с usbh_driver_hid_mouse.[ch], я написала драйвер для клавиатуры (usbh_driver_hid_kbd.[ch]).
Далее был реализован простенький класс, для работы с хостом:
Реализация составного USB устройства
Далее мне нужно было сделать так, чтобы наше устройство отображалось в диспетчере устройств и как клавиатура, и как дисковый накопитель. Тут вся магия в дескрипторах=) В этом документе, в главе 9, подробно описан USB Device Framework. Эту главу нужно очень внимательно прочитать и в соответствии с ней описать дескрипторы устройства. В моем случае получилось следующее:
- usb_config_descriptor: поле bNumInterfaces должно отражать столько интерфейсов, сколько реально реализовано. В нашем случае два: HID и MSD
- usb_interface_descriptor: поле bInterfaceNumber обозначает номер интерфейса, но отсчет начинается с нуля, следовательно, номер первого интерфейса — 0.
Для работы с составным устройством был написан класс USB_composite, представленный ниже.
- Функция hid_control_request нужна для общения Пастильды как клавиатуры с хостом (в данном случае, хост — это ПК). Вне класса данная функция вызывается через USB_control_callback.
- Функция hid_set_config нужна для того, чтобы настроить конечные точки (endpoints) и зарегистрировать USB_control_callback, описанный в предыдущем пункте. Вне класса данная функция вызывается через USB_set_config_callback.
Как правило, функции control_request и set_config должны быть явно описаны для каждого устройства. Однако из этого правила есть исключение: Mass Storage Device. Итак, разберемся с конструктором класса USB_Composite.
Во-первых, мы инициализируем ноги USB OTG FS:
Во-вторых, нам нужно проинициализировать наше составное устройство, зарегистрировать USB_set_config_callback, о котором шла речь выше, и разрешить прерывание:
- Во вкладке «Контроллеры USB»: как составное устройство,
- В этой же вкладке, как «Запоминающее устройство для USB»,
- Во вкладке «Клавиатуры», как «Клавиатура HID».
- block_count: количество секторов памяти,
- read_block: функция для чтения сектора,
- write_block: функция для записи сектора.
Так вот. Теперь, когда конструктор класса USB_Composite дописан, можно собрать проект, прошить устройство и увидеть, что «Запоминающее устройство для USB» больше не помечено предупреждением, а во вкладке «Дисковые устройства» можно обнаружить «ThirdPin Pastilda USB Device». И, казалось бы, все хорошо. Но нет=) Проблем стало больше:
1. Зайти на диск невозможно. При попытке сделать это все виснет, умирает, компьютеру очень плохо.
2. Распознавание устройства как дискового занимает более 2-х минут.
Об этих проблемах и о том, как их решить без вреда для здоровья написано здесь: USB mass storage device и libopencm3.
И, о, чудо! Никаких пятен=) Теперь все работает. У нас есть USB хост и составное USB устройство. Осталось только объединить их работу.
Обычно вы можете обновить драйвер USB Composite Device на вашем компьютере с Windows, чтобы решить эту проблему. Вот два варианта обновления драйвера USB Composite Device:
- Обновите драйвер составного USB-устройства в диспетчере устройств.
- Обновите драйвер составного USB-устройства автоматически
Исправление 1: Обновите драйвер USB Composite Device
Наиболее вероятной причиной ошибки USB Composite Device является проблема с драйвером устройства.
К счастью, это одна из самых простых проблем.
Есть два способа обновить драйвер USB Composite Device: вручную а также автоматически.
Обновите драйвер USB Composite Device вручную — Вы можете обновить драйвер вручную, перейдя на веб-сайт производителя оборудования и выполнив поиск последней версии драйвера для вашего USB Composite Device. Если вы выберете такой подход, обязательно выберите драйвер, совместимый с точным номером модели вашего оборудования и вашей версией Windows.
Обновите драйвер USB Composite Device автоматически — Если у вас нет времени, терпения или навыков работы с компьютером, чтобы обновить драйвер вручную, вместо этого вы можете сделать это автоматически с Водитель Легко. Вам не нужно точно знать, на какой системе работает ваш компьютер, вам не нужно беспокоиться из-за неправильного драйвера, который вы загружаете, и вам не нужно беспокоиться об ошибке при установке. Driver Easy справится со всем этим.
Читайте также: