Составное usb устройство что это
Перейти к содержимому

Составное usb устройство что это

  • автор:

Что такое составное USB-устройство?

Что такое составное USB-устройство?

Составное USB-устройство — это отдельный гаджет, способный выполнять несколько функций. Например, есть машины, которые выполняют функцию и мыши, и клавиатуры. Для обеспечения полной функциональности потребуются драйвер и слот USB 2.0.

Установить драйвер для составного USB-устройства довольно просто, поскольку для многих устройств уже есть драйверы, доступные в Windows. Если составное устройство подключено к одному из открытых разъемов USB 2.0 на компьютере, будет получен запрос на загрузку диска через Windows. Если составное устройство подключено к разъему, который не настроен для USB 2.0, появится предупреждение о том, что вместо этого устройство подключено к низкоскоростному порту.

При использовании автоматической установки будет предоставлен мастер, помогающий в этом процессе. Иногда на этом этапе происходит ошибка, и в этом случае необходимо вставить диск, поставляемый с композитным USB-устройством, и использовать его для загрузки драйвера. При установке диска также запускается мастер, который поможет завершить процесс. После установки драйвера компьютер распознает составное USB-устройство каждый раз, когда оно подключается для использования.

Составное usb устройство что это

Нравится ресурс?

Правила раздела Windows

1. Указывайте версию Вашей ОС.
2. Запрещается размещать запросы и ссылки на кряки, серийники и т.п., а также вопросы нарушения лицензии ПО и его взлома.
3. Не разрешается давать советы из разряда «Поставь Linux».
4. Переустановка ОС — крайнее и безотказное лекарство, которое знают все. В таких советах никто не нуждается.
5. При публикации скриптов пользоваться тегами code. Тип подсветки кода выбирать строго в соответствии с языком публикуемого кода.
6. Прежде чем задать вопрос, обязательно загляните в FAQ и следуйте написанным рекомендациям для устранения проблемы. И если не помогло, а поиск по разделу не дал результатов — только тогда задавайте вопрос на форуме.
7. Вопросы, связанные с проблемами ПО, задавайте в разделе Программное обеспечение

Перечисление составных USB-устройств

Когда новое USB-устройство подключено к хост-компьютеру, драйвер шины USB создает объект физического устройства (PDO) для устройства и создает событие PnP, чтобы сообщить о новом PDO. Затем операционная система запрашивает у драйвера шины идентификаторы оборудования, связанные с PDO.

Для всех USB-устройств драйвер шины USB сообщает идентификатор устройства в следующем формате:

Примечаниеxxxx и yyyyy взяты непосредственно из полей idVendor и idProduct дескриптора устройства соответственно.

Драйвер шины также сообщает совместимый идентификатор , USB\COMPOSITE если устройство соответствует следующим требованиям:

  • Поле класса устройства дескриптора устройства (bDeviceClass) должно содержать нулевое значение, или поля класса (bDeviceClass), подкласса (bDeviceSubClass) и протокола (bDeviceProtocol) дескриптора устройства должны иметь значения 0xEF, 0x02 и 0x01 соответственно, как описано в разделе Дескриптор ассоциации интерфейса USB.
  • Устройство должно иметь несколько интерфейсов.
  • Устройство должно иметь одну конфигурацию.

Драйвер шины также проверяет поля класса устройства (bDeviceClass), подкласса (bDeviceSubClass) и протокола (bDeviceProtocol) дескриптора устройства. Если эти поля равны нулю, устройство является составным, а драйвер шины сообщает дополнительный совместимый идентификатор USB\COMPOSITE для PDO.

После получения аппаратных и совместимых идентификаторов для нового PDO операционная система выполняет поиск в INF-файлах. Если один из INF-файлов содержит совпадение с идентификатором устройства, Windows загружает драйвер, указанный в этом INF-файле, и универсальный родительский драйвер не будет использоваться. Если inf-файл не содержит идентификатор устройства и PDO имеет совместимый идентификатор, Windows выполняет поиск совместимого идентификатора. Это создает совпадение в файле Usb.inf и приводит к загрузке операционной системой универсального родительского драйвера USB (Usbccgp.sys).

Если требуется, чтобы универсальный родительский драйвер управлял устройством, но устройство не имеет характеристик, необходимых для создания совместимого идентификатора USB\COMPOSITE, необходимо предоставить INF-файл, который загружает универсальный родительский драйвер. INF-файл должен содержать раздел needs/includes, который ссылается на usb.inf.

Если составное устройство имеет несколько конфигураций, предоставленный INF-файл должен указать, какую конфигурацию универсальный родительский элемент должен использовать в реестре. Необходимые разделы реестра описаны в разделе Настройка Usbccgp.sys для выбора конфигурации USB, отличной от конфигурации USB по умолчанию.

Составное устройство USB на STM32. Часть 1: Предпосылки

История эта началась три года назад, когда я осознал, что мне скоро исполнится 50 лет, что я погряз в бумажной работе, и что мне хочется чего-то нового. Работу поменять в моём возрасте уже проблематично, поэтому я решил начать pet-проект.

Первое, что приходит в таких случаях на ум старому радиолюбителю: новая радиостанция. Стопроцентно аппаратные решения остались в далёком прошлом. Сейчас гораздо более актуальны SDR-трансиверы: решение это программно-аппаратное, есть опубликованные примеры реализации, к некоторым из них даже выложены исходные коды прошивок.

Основная проблема в разработке заключалась в том, что несложные SDR-радиостанции, работающие в связке со звуковой картой, требуют наличия у компьютера, к которому они подключены, двухканальных линейных входа и выхода для работы приёмо-передающего тракта, а также COM-порта для работы CAT-интерфейса. В современных же ноутбуках аудиовход обычно предназначен для подключения микрофона гарнитуры и бывает только монофоническим.

Решением проблемы стала реализация составного устройства USB, состоящего из виртуального COM-порта и дуплексной звуковой карты. Кому интересно, как я с этим справился, не имея опыта программирования, милости прошу под cut.

TL/DR: Как я с этим справился, не имея опыта программирования? Просто начал программировать на C, а остальное приложилось само: MVP проекта реализован, а исходные коды публикуемой реализации составного устройства USB, состоящего из виртуального COM-порта и дуплексной звуковой карты находятся здесь: http://github.com/dmitrii-rudnev/selenite-habr

… и опыт, сын ошибок трудных.

И опыт и навыки формируются практикой. Для их формирования необходимо:

  • изучать документацию;
  • проводить анализ существующих решений;
  • разрабатывать собственные решения;
  • воплощать собственные решения в «железе»;
  • возвращаться к началу цикла если не заработало.

Язык C разрабатывался инженерами и для инженеров. Использование языка программирования C дало мне возможность абстрагироваться от ассемблера и машинных кодов с одной стороны, но в тоже время обращаться напрямую к регистрам или к памяти.

Нелюбимый многими STM32CubeMX с библиотекой HAL значительно облегчил мне процесс разработки хотя бы тем, что не надо было за каждой мелочью заглядывать в Reference Manual.

Кроме того, я очень многому научился, разбирая сгенерированный STM32CubeMX код:

  • его писали разные люди, но он выдержан в одном стиле;
  • назначение переменных и функций понятно из имени;
  • комментарии к коду позволяют документировать его через Doxygen и т.п.

В силу того, что я не мог гарантировать результат своей программистской деятельности, пришлось вводить градации по функционалу MVP проекта от простого к сложному.

Минимальный функционал MVP подразумевал подключение приёмной части радиостанции к линейному входу звуковой карты компьютера и приём на фиксированной частоте.

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

И только после этого планировалось подключение SDR-трансивера к компьютеру как звукового устройства USB с управлением по CAT-интерфейсу.

Такой подход сразу дал плоды: уже к началу 2019 года, всего через шесть месяцев после установки на мой компьютер STM32CubeMX, был реализован минимальный MVP проекта: функциональный аналог SDR-приёмника Softrock Lite II RX уверенно принимал сигналы точного времени на частоте 9996 кГц.

В настоящее время MVP проекта является функциональным аналогом SDR-трансивера Peaberry SDR V2 и работает как на приём, так и на передачу.

Структура приёмопередающего тракта SDR-трансивера

Описываемое в публикации составное устройство USB работает в составе SDR-трансивера. Структура приёмопередающего тракта разрабатываемого SDR-трансивера включает в себя пока только самый необходимый минимум и представлена на рисунке ниже:

При приёме радиосигнал поступает из антенны через полосовой фильтр (BPF) в квадратурный детектор (QSD). Полученный в результате квадратурный сигнал (IQ) через двухканальный вход дуплексного звукового устройства USB поступает в компьютер для дальнейшей обработки.

При передаче сформированный в компьютере квадратурный сигнал (IQ) через двухканальный выход дуплексного звукового устройства USB поступает в квадратурный возбудитель (QSE).
Полученный в результате радиосигнал подаётся через полосовой фильтр (BPF) в антенну.

Обработка сигналов на стороне компьютера осуществляется программой HDSDR.

Частота приёма и передачи задаётся настройками генератора плавного диапазона (VFO). Управление VFO и режимом работы (приём-передача) осуществляется из программы HDSDR через CAT-интерфейс, подключенный к виртуальному COM-порту.

Связь HDSDR с виртуальным COM-портом осуществляется посредством программы OmniRig, созданной канадским радиолюбителем Alex Shovkoplyas (VE3NEA).

CAT-интерфейс трансивера использует ограниченный набор команд популярного во всём мире трансивера Yaesu FT-817.

Виртуальный COM-порт и дуплексное звуковое устройство объединены в составное устройство USB, работа которого и будет разобрана в данной публикации. Для облегчения проверки работоспособности публикуемого решения на входные и выходные потоки устройств установлены шлейфы.

Вся необходимая для разработки описанного в публикации составного устройства USB документация была найдена поиском по сайту usb.org.

Техническое решение разрабатывалось на основе анализа созданной немецким радиолюбителем Andreas Richter (DF8OE) open source прошивки для трансивера mcHF M0NKA и его клонов. Ряд нюансов был проработан при попытках разобраться в кодах дуплексного звукового устройства USB на базе расширения X-CUBE-AUDIO для STM32CubeMХ.

Структура составного устройства USB

Описываемое в публикации составное устройство USB состоит из виртуального COM-порта и дуплексного звукового устройства USB 16 бит 48 кГц. Публикуемое решение реализовано на микроконтроллере STM32F446ZET6 из состава платы NUCLEO-F446ZE.

Упрощенная структура дескриптора представлена на рисунке ниже:

Дескриптор составного устройства USB создан по рекомендациям, содержащимся в документе:

Хотел бы заострить внимание на том, что в структуре дескриптора составного устройства USB важен порядок описания интерфейсов: сначала идёт описание интерфейса 0, затем интерфейса 1 и т.д. Номера используемых интерфейсами конечных точек (EP) могут идти не по порядку.

При генерации кода STM32CubeMX размещает дескриптор устройства (Device Descriptor) в файле usbd_desc.c. Нужно отметить, что STM32CubeMX при последующей генерации кода не сохранит изменения, вручную внесённые в дескриптор, т.к. они не находятся в области, помеченной как USER CODE.

Дескрипторы конфигурации и классов устройств размещаются в файлах usbd_cdc.c и usbd_audio.c, размещённых в папках директории Middlewares/ST/Class. Важно помнить, что STM32CubeMX даёт выбрать за раз только один класс устройств. Если ранее был выбран другой класс, при генерации кода файлы с драйверами этого класса из проекта будут удалены.

От автора

В следующей части публикации будет разобрана:

  • подготовка проекта в STM32CubeMX;
  • настройка параметров звукового устройства USB;
  • работа звукового устройства USB, которое STM32CubeMX генерирует по умолчанию «из коробки».

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *