Usb ids что это
Последние полгода я участвую в разработке первого в своей жизни USB-устройства и прикладного ПО к нему, и сейчас хочу поделиться своим пониманием того, как там всё работает: микроконтроллер, драйвер, прикладное ПО. Также затрону вопрос о выборе идентификаторов VID/PID. Список полезных ссылок для желающих более подробно разобраться в теме прилагается.
Контекст
Разрабатывается электронное устройство, которое будучи подключенным к датчику выполняет измерение микроперемещения и передаёт результат на ПК, где он выводится в удобной для оператора графической форме. Область применения измерительного прибора — машиностроение.
Немного о том, как всё работает
На схеме показаны основные действующие лица, участвующие в жизни разрабатываемого прибора.
Микроконтроллер — основной элемент устройства, который подаёт управляющие сигналы на датчик и принимает отклик, по которому вычисляет результат измерения. С помощью реализованного стека USB обмен данными с хостом сводится практически к работе с буферами чтения и записи. Ввиду того, что измерительный алгоритм не требует больших вычислительных мощностей и период одного измерения равен 100-150 мс выбран микроконтроллер at90usb162 (8 бит, 16 МГц, 16 кБ). В этом МК есть аппаратная поддержка USB, что значительно упрощает программную реализацию стека USB. В прочем, реализовывать стек и заниматься инициализацией МК мне не пришлось благодаря примеру USB Generic HID Implementation из сопроводительного пакета ПО. Из альтернатив фирменным примерам для AVR есть фреймворк LUFA (лицензия MIT) для AT90USBxxxx и ATMEGAxxUx и полностью программная реализация стека V-USB (GPL или коммерческая лицензия), позволяющая работать с AVR-овскими МК без аппаратной поддержки USB.
Немножко о аббревиатуре HID. Это класс USB-устройств, предназначенных для ввода данных человеком: клавиатура, мышь, игровые контроллеры. Предполагается, что у таких устройств небольшой объем передаваемой информации, как и у разрабатываемого устройства: пакеты по 8 байт с интервалом в 100-150 мс. Главное удобство работы с устройствами этого класса — наличие стандартного драйвера в ОС, что освобождает от написания своего.
Хостом (мастером, ведущим) в моём случае является ПК, а точнее встроенный в материнку контроллер USB. Согласно дескриптору (описанию) моего устройства хост опрашивает его на предмет новых посылок с периодом примерно в 20 мс. Прикладное ПО собирает принятые хостом данные, проводит небольшую обработку и рисует индикаторы, напоминающие автомобильные спидометры, на которых показываются измеряемые величины. Выводится список подключенных датчиков и их настройки, которые можно изменить: изменения будут переданы на устройство и сохранены в энергонезависимой памяти.
VID и PID
Основные источники информации
Отличное введение в USB (англ., р у с.) для разработчиков периферии – 30 страниц вместо многих сотен в стандарте. Более подробную информацию о разработке USB-периферии и драйверов к ней можно найти на сайте Lakeview Research, особенно хочу отметить книгу «USB Complete: The Developer's Guide», Jan Axelson.
▼ Название того или иного коннектора снабжается буквенными индексами.
Тип коннектора:
- А — активное, питающее устройство (компьютер, хост)
- B — пассивное, подключаемое устройство (принтер, сканер)
«Пол» коннектора:
Размер коннектора:
Например: USB micro-BM— штекер (M) для подключения к пассивному устройству (B); размер micro.
Назначение контактов USB 2.0
- Красный VBUS (+5V, Vcc — Voltage Collector Collector) +5 Вольт постоянного напряжения относительно GND. Для USB 2.0 максимальный ток — 500 mA.
- Белый D- (-Data)
- Зелёный D+ (+Data)
- Чёрный GND — общий провод, «земля», «минус», 0 Вольт
Разъёмы mini и micro содержат 5 контактов:
- Красный VBUS
- Белый D-
- Зелёный D+
- ID — в разъёмах «B» не задействован; в разъёмах «A» замкнут с GND для поддержки функции «OTG»
- Чёрный GND
Кроме прочего, в кабеле содержится (правда, не всегда) оголённый провод Shield — корпус, экран, оплётка. Этому проводу номер не присваивается.
Распиновка шнура мыши и клавиатуры
У некоторых мышей и клавиатур в кабеле встречаются нестандартные цвета проводов.
Прочтите также про подключение мышей и клавиатур к порту PS/2.
Пайка разъёмов USB 2.0
⚠ Обратите внимание, как расположены на колодке рабочие и «паятельные» контакты относительно друг друга! От этого зависит распайка разъёма.
В большинстве случаев рабочие контакты расположены с обратной стороны колодки относительно контактов для пайки ▼
Но встречаются разъёмы, у которых обе группы контактов расположены с одной стороны колодки. В этом случае распайка будет иной ▼
▼ Название того или иного коннектора снабжается буквенными индексами.
Тип коннектора:
- А — активное, питающее устройство (компьютер, хост)
- B — пассивное, подключаемое устройство (принтер, сканер)
«Пол» коннектора:
Размер коннектора:
Например: USB micro-BM— штекер (M) для подключения к пассивному устройству (B); размер micro.
Назначение контактов USB 2.0
- Красный VBUS (+5V, Vcc — Voltage Collector Collector) +5 Вольт постоянного напряжения относительно GND. Для USB 2.0 максимальный ток — 500 mA.
- Белый D- (-Data)
- Зелёный D+ (+Data)
- Чёрный GND — общий провод, «земля», «минус», 0 Вольт
Разъёмы mini и micro содержат 5 контактов:
- Красный VBUS
- Белый D-
- Зелёный D+
- ID — в разъёмах «B» не задействован; в разъёмах «A» замкнут с GND для поддержки функции «OTG»
- Чёрный GND
Кроме прочего, в кабеле содержится (правда, не всегда) оголённый провод Shield — корпус, экран, оплётка. Этому проводу номер не присваивается.
Распиновка шнура мыши и клавиатуры
У некоторых мышей и клавиатур в кабеле встречаются нестандартные цвета проводов.
Прочтите также про подключение мышей и клавиатур к порту PS/2.
Пайка разъёмов USB 2.0
⚠ Обратите внимание, как расположены на колодке рабочие и «паятельные» контакты относительно друг друга! От этого зависит распайка разъёма.
В большинстве случаев рабочие контакты расположены с обратной стороны колодки относительно контактов для пайки ▼
Но встречаются разъёмы, у которых обе группы контактов расположены с одной стороны колодки. В этом случае распайка будет иной ▼
Смежные материалы:
..добавлю. У навигатора есть функция просмотр видео файлов, читает некоторые файлы, такие как 3gp, avi, даже wmv, а вот mp4 не хочет.
Спасибо за ответ.
Есть еще вопросик, Видеокамера записывает видео и сохраняет в формате (расширение) mp4,
а навигатор не читает такой формат.
Можно ли научить навигатор распознавать такие файлы для чтения.
И встречный вопрос: можно ли устройство ((общее слово не подберу.) которое снимает видео),
научить сохранять видеофайл с другим расширением, которого нет в функциях данного устройства.
Способность устройства кодировать или декодировать видео тех или иных форматов (и расширений) зависит от программного обеспечения. В случае с регистратором или навигатором речь идёт о прошивке. Чисто теоретически, если разработчик выпустит новую прошивку с поддержкой нужного Вам формата, можно будет перепрошить Ваш гаджет. Иного способа я не знаю.
Увы, транслировать видеопоток через USB с камеры на навигатор (в качестве монитора) не получится.
я наверно себе мозг заворачиваю, но все -же спрошу..
У видеокамеры есть A\V выход (и мини usb),
можно ли этот видеосигнал подать на вход мини usb навигатора, который не имеет никаких других входов,
и не расчитан для подключения видео входа.
Навигатор: Prestigio GeoVision 5300 BT. или тут кто кого победит?? Питание (зарядка, подзарядка) одного устройства другим не интересует. Суть замысла: вывести изображения с камеры на экран навигатора.
Для какого устройства этот переходник? Вариантов распиновки такого кабеля под разные устройства достаточно много.
Вот четыре варианта распиновки переходника USB-TRRS (Jack).
Не представляю, какой выбрать. Если с белым-зелёным проводами можно смело экспериментировать, то с красным-чёрным (питание/зарядка) ошибки недопустимы. Может быть выясните, что за производитель? Хотя, едва ли это известная марка.
Есть вариант — вскрыть «часы» и определить по монтажной плате где плюс, где минус.
Спасибо большое, я не знаю, что выйдет из этого, но я постараюсь что-нибудь сделать ……
:x
Приветствую! Распиновку я нарисую. А пока скажу, что для получения питания с телефона нужен OTG кабель
А что за модель нового Эрика? Какого года выпуска? От этого зависти распиновка аудио. Пока выкладываю наиболее распространённую распиновку TRRS (Джек). Возможно понадобится впаять резистор между белым и коричневым проводом или поменять эти провода местами.
Плюс ко всему, понадобится стандартный кабель OTG-USB micro, через который будем подавать питание на штекер USB-AM. Без кабеля OTG этот штекер можно воткнуть в комп или в ноут и таким образом запитать колонки.
сони ериксон актив,2012 9 неделя
там юсб на 5 контактов. я так понял главное втыкнуть землю и +
Ну, если хотите сами распаять штекер OTG — вот схема. А вообще в кабеле OTG, о котором я уже говорил, как раз и есть штекер USB micro на 5 контактов.
Подключение колонок Sony Ericsson MPS-75 через TRRS (Jack) и OTG USB-BM micro:
по контактам усб
нормальные сторона пайки
5)земля 3)-дата 1)+5в
4)NC 2)+дата
вроде правильно
проверка показала гарнитуру определяет по
5+4 только распайка походу футуристическая
5)общий 3)микрофон 1)NC
4) канал 2)канал
кнопку ответа вызова куда ткнуть не понял посмотрю родную потом.
Спасибо за информацию! Пополню базу данных, но сперва хотелось бы получить уточнения.
Кнопка обычно между землёй и микрофоном. И странно, что 2 это Data-.
Короче говоря, подключается USB-хаб к Планшету вот так:
Гнездо USB-mini в хабе и есть его единственный вход.
Если Вы хотите подключить к планшету USB-хаб, чтобы через хаб подключить к планшету всякую периферию, то нужно:
-
переходник OTG-USB-BM-mini (втыкается в выход планшетника) — USB-AF
переходник USB-AM (втыкается в предыдущий переходник) — USB-BM-mini (втыкается во вход хаба)
Второй переходник должен быть в комплекте к планшету для подключения планшета к компу.
Скажите, какой у Вас вход на USB-хабе и есть ли шнур OTG-USB-mini?
Не могу понять, зачем Вам вообще гнездо USB-AF (как на снимке), тем более, без корпуса?
такая проблема- есть наушники без микрофона с джеком 3,5 хочу вместо джека припаять usb 2.0 для компа ,не знаю подойдет ли обычный стерео шнур,есть удлиннитель usb папа-мама ,нужна схема
Обычные наушники по USB к компьютеру подключить нельзя. Нужны специальные «цифровые» наушники с электронной схемой. Проще приобрести, чем паять схему цифро-аналогового преобразователя. В 21-м веке живём.
Достоинства разъёма Type-C:
★ долговечный
★ симметричный
Теперь гарантированно можно подключить USB кабель к устройству с первого раза.
⚠ Следует различать понятия «порт» и «разъём». Разъём (гнездо) Type-C можно припаять хоть к старому телефону (вместо micro-USB), но порт так и останется старым USB 2.0 — скорости заряда и передачи данных это не прибавит. Из удобств появится лишь симметричность и надёжность разъёма.
⚠ Таким образом наличие Type-C ещё ни о чём не говорит. Продаются модели смартфонов с новым разъёмом, но со старым портом. Перечисленные в этой статье достоинства к таким смартфонам не относятся.
Назначение контактов
Контакты разъёмов на схемах показаны с внешней (рабочей) стороны, если обратное не оговаривается особо.
Порт содержит 24 контакта (12 контактов на каждой стороне). «Верхняя» линейка нумеруется A1…A12, «нижняя» — B1…B12. По большей части линейки идентичны друг другу, что и делает этот порт равнодушным к ориентации штекера. Контакты каждой линейки можно разбить на 6 групп: USB 2.0 , USB 3.1 , Питание , Земля , Согласующий канал и Дополнительный канал . А теперь рассмотрим подробнее.
• Собственно, USB 3.1. Линии высокоскоростной передачи данных: TX+, TX-, RX+, RX- (контакты 2, 3, 10, 11). Скорость до 10 Гб/с. В кабеле эти пары перекроссированы, и что для одного устройства является RX, другому представляется как TX. И наоборот. По особому распоряжению эти пары могут переквалифицироваться под другие задачи, например — под передачу видео.
• Старый добрый USB 2.0. Линии низкоскоростной передачи данных: D+/D- (контакты 6, 7). Этот раритет включили в порт ради совместимости со старыми тихоходными устройствами до 480 Мб/с.
• Плюс питания — Vbus (контакты 4, 9). Стандартное напряжение 5 вольт. Ток выставляется в зависимости от потребностей периферии: 0,5А; 0,9А; 1,5А; 3А. Вообще, спецификация порта подразумевает передаваемую мощность до 100Вт, и «в случае войны» порт способен питать монитор или заряжать ноутбук напряжением 20 вольт!
• GND — «Земля»-матушка (контакты 1, 12). Минус всего и вся.
• Согласующий канал (или конфигурирующий) — СС (контакт 5). Это главная фишка USB type-C! Благодаря этому каналу система может определить:
— Факт подключения/отключения периферийного устройства;
— Ориентацию подключенного штекера. Как это ни странно, но разъём не абсолютно симметричен, и в некоторых случаях устройству хочется знать его ориентацию;
— Ток и напряжение, которое следует предоставить периферии для питания или заряда;
— Необходимость работы в альтернативном режиме, например, для передачи аудио-видео потока.
— Кроме функций мониторинга этот канал в случае необходимости подаёт питание на активный кабель.
• Дополнительный канал — SBU (контакт 8). Дополнительный канал обычно не используется и предусмотрен лишь для некоторых экзотических случаев. Например, при передаче по кабелю видео, по SBU идёт аудиоканал.
Распиновка USB 3.1 Type-C
«Полосатым цветом» здесь изображены контакты неизолированного провода.
Странным решением было отмаркировать провода D+ и D- не как в USB 2.0, а наоборот: D+ белый, D- зелёный.
Серой обводкой помечены провода, чей цвет по словам Википедии не регламентирован стандартом. Автор вообще не нашёл каких-либо указаний на цвета проводов в официальной документации.
Распайка коннекторов Type-C ▼
Схема типового кабеля USB-C «вилка-вилка»▼
Технология питания/заряда USB PD Rev.2 ( USB Power Delivery)
У кабеля USB-C нет таких понятий как «коннектор-A» или «коннектор-B» — коннекторы теперь во всех случаях одинаковы.
Роли устройства обозначены новыми терминами:
DFP — активное, питающее устройство (как бы порт USB-A)
UFP — пассивное, приёмное устройство (как бы порт USB-B)
DRP — «двуличное», динамически изменяющее свой статус устройство.
Кроме того, заряжающее устройство называется Power Provider, заряжаемое — Power Consumer.
Распределение ролей осуществляется установкой на контакте CC определённого потенциала с помощью того или иного резистора:
▶Активное устройство (DFP) определяется по резистору между контактами CC и Vbus.
Номинал резистора сообщает потребителю, на какой ток он может рассчитывать:
56±20% кОм — 500 или 900 мА
22±5% кОм — 1,5 А
10±5% кОм — 3 А
▲ Переходники с USB 2.0 (3.0) на USB-C, служащие для подключения новых смартфонов к старым ПК или ЗУ распаяны по схеме DFP, то есть, показывают себя смартфону как активное устройство
▶Пассивное устройство (UFP) определяется по резистору между контактами CC и GND.
Номинал резистора: 5,1 кОм
▲ Переходники с USB-C на USB-OTG распаяны именно по схеме UFP, то есть, имитируют потребляющее устройство.
⚠ Технологию USB PD Rev2 в которой по контакту CC согласуются ток и напряжение заряда не следует путать с технологией Quick Charge (QC), где по контактам D− и D+ согласуется только напряжение заряда. USB PD Rev2 поддерживается только в USB 3.1.
QC поддерживается без привязки к версии порта.
Переходник USB-micro—USB-C
Переходник micro-USB 2.0 на USB type-C служит для подключения гаджета с гнездом Type-C к стандартному дата-кабелю USB 2.0 для заряда и синхронизации с ПК. В переходнике установлен резистор 56 кОм между контактами CC и Vbus.
Этот резистор как бы говорит смартфону: «К тебе подключили активное устройство − заряжайся. Больше 0,9 ампер не дам».
То есть, даже от мощного зарядного устройства (скажем, на 3 ампера) через такой переходник мы не возьмём больше 0,9 ампер. Чтобы смартфон не стеснялся и взял 3 ампера, нужно заменить резистор на 10 кОм ▼
Внешний вид платы ▼
Универсальный переходник USB-micro—USB-C с поддержкой OTG
Наш читатель Сергей выслал схему универсального переходника micro-USB-BF to USB type-C (Тип 51125 Z22) − через него можно подключить как Data-кабель так и OTG-кабель USB 2.0. В зависимости от кабеля смартфон либо заряжается, либо работает с периферией.
В идеале вместо 55 кОм стоило бы использовать 51 (как в аналогичном переходнике от Huawei), чтобы в цепи Vcc-CC получались каноничные 56 кОм. Но спецификация не требует такой точности. Номинал сопротивления Vcc-CC допускается в диапазоне 45…67 кОм.
Внешний вид платы ▼
Вариант универсального переходника
Наш читатель Кирилл поделился схемой занятного переходника, подобного предыдущему▲. Ключевое отличие — в гнезде micro-USB не задействован контакт ID (№5), и оба резистора (и DFP, и UFP) подключены постоянно.
Устройство, к которому подключен этот переходник через Type-C, определяет свою роль по наличию или отсутствию напряжения на контакте Vbus. Если сперва подключить к переходнику зарядное устройство через гнездо micro-USB, а потом подключить переходник к смартфону, то порт смартфона обнаружит напряжение заряда и переведёт смартфон в режим потребления. Если же просто подключить переходник, то смартфон входит в режим OTG и подаёт напряжение сам.
Переходник испытывался на смартфоне Samsung Galaxy S8.
Переходник USB-C—USB-AF
Чтобы подключить USB-периферию к устройству с портом USB-C, в переходнике необходим резистор 5,1 кОм между контактами CC и GND.
Этот резистор сообщает смартфону: «К тебе подключено пассивное устройство. Подай питание».
Рассмотрим схему переходника OTG type-C на примере Type-C USB 3.1 To USB 3.0 OTG Adapter. Это переходник для подключения периферии USB 3.0 (2.0) к ПК или к смартфону Type-C.
Цвета проводов Data, TX и RX в этой модели несколько отличаются от каноничных, прошу обратить на это внимание! ▼
Ещё одна важная деталь — во всех переходниках типа USBtype-C—type-C или USBtype-C—USB3.0 (не обязательно OTG!) между контактами Vbus и Gnd необходим конденсатор для защиты контактов разъёма от искр при подключении. Например, для переходников на USB 3.0 требуется номинал конденсатора — 10нФ±20%×30В. Переходники на USB 3.1 требуют конденсатор большей ёмкости, а переходники на USB 2.0 не требуют конденсатора вовсе. Подробнее читайте в англоязычной статье «VBUS Bypass Capacitor».
Распайка платы переходника Type-C to USB 3.0 OTG с разных сторон ▼
Аналоговый звук через Type-C
Стандартом предусмотрена возможность передачи аналогового звука через цифровой порт. Эта возможность реализована в смартфонах HTC серии U, HTC 10 Evo, Xiaomi Mi, LeTV. Автор будет признателен, если читатель пополнит этот список.
Режим называется «Audio Adapter Accessory Mode». За подробностями обращайтесь к статье «Аналоговый звук через USB-C».
Для работы в этом режиме служат аналоговые гарнитуры с вилкой Type-C. Для подключения классической гарнитуры со штекером «джек» предусмотрены переходники.
Аналоговый звук передаётся по каналам Data−, Data+, SBU1 и SBU2. Смартфон переходит в этот режим, если в вилке гарнитуры или переходника между контактами A1—A5 и B1—B5 установлено сопротивление менее 0,8…1,2 кОм. Вместо резистора доводилось видеть просто перемычку.
Видео через USB-C
Для передачи видео через USB 3.1 разработан режим «DisplayPort Alternate Mode».
См. перечень устройств, поддерживающих этот режим.
В режиме «Display Port» назначение контактов порта меняется — две пары TX2/RX2 превращаются в видеоканал, а звуком занимается SBU1/2 ▼
Спасибо, что озадачили! Проработаю этот недочёт, но быстрых результатов не обещаю.
На дворе 2014 год, а для связи микроконтроллеров с ПК самым популярным средством является обычный последовательный порт. С ним легко начать работать, он до примитивности прост в понимании — просто поток байт.
Однако все современные стандарты исключили COM порт из состава ПК и приходится использовать USB-UART переходники, чтобы получить доступ к своему проекту на МК. Не всегда он есть под рукой. Не всегда такой переходник работает стабильно из-за проблем с драйверами. Есть и другие недостатки.
Но каждый раз, когда заходит разговор о том, применять USB или последовательный порт, находится множество поклонников логической простоты UART. И у них есть на то основания. Однако, хорошо ведь иметь альтернативу?
Меня давно просили рассказать как организовать пакетный обмен данными между ПК и МК на примере STM32F103. Я дам готовый рабочий проект и расскажу как его адаптировать для своих нужд. А уж вы сами решите — нужно оно вам или нет.
Выбор профиля HID
USB-HID — довольно обширный класс устройств, поэтому прежде всего придется выбрать какое именно устройство мы будем создавать.
Мы можем создать эмуляцию клавиатуры, мыши, джойстика и других устройств ввода, а можем создать свое устройство, чтобы не зависеть от довольно жестких рамок стандарта и свободно обмениваться данными с ПК.
Я расскажу как cделать Custom HID device. Это дает максимальную свободу. Чтобы не затягивать статью, постараюсь рассказать максимально кратко — описаний стандарта в сети и без меня много, но лично мне они слабо помогли, когда понадобилось решить конкретную задачу.
Структура проекта
- Папка USB-FS с библиотекой «STM32F10x, STM32L1xx and STM32F3xx USB-FS-Device Driver» версии 4.0.0.
- В папках Inc и Src файлы:
platform_config.h — здесь собраны определения, касающиеся конкретной платы и семейства МК
stm32_it.h, stm32_it.c — здесь определены обработчики прерываний
usb_conf.h, usb_endp.c — здесь определяются конечные точки (Endpoint), размеры и адреса их буферов, функции-обработчики
usb_desc.h, usb_desc.c — здесь собрана информаци о самом устройстве — как оно будет определяться при подключении к ПК и определены размеры и формат пакетов данных
hw_config.c — здесь собрана вся работа с отправкой данных на ПК
hw_config.h, usb_istr.h, usb_prop.h, usb_pwr.h
usb_istr.c, usb_prop.c, usb_pwr.c — нужны для работы USB-FS библиотеки, но лезть в них необязательно
Инициализация USB
Для корректной работы USB модуля важна частота работы МК. Далеко не все частоты позволяют правильно задать тактирование USB. В нашем случае используется кварцевый генератор на 8МГц и МК работает на частоте 72МГц, а USB модуль на 48МГц.
В main.c достаточно включить всего несколько строк кода
В функции Set_System() производится настройка пина подтяжки линии D+ к питанию для программного подключения/отключения устройства от ПК (в нашей плате не используется), настраивается прерывание и инициализируются светодиоды и кнопки для демонстрационного проекта.
В USB_Interrupts_Config() настраиваются прерывания в зависимости от семейства МК (поддерживаются F10x, F37x, L1x).
Функция USB_Init() запускает работу USB модуля. Если временно нужно отключить для отладки работу с USB, просто закомментируйте эту строку.
Далее в бесконечном цикле проверяется, удалось ли сконфигурировать USB модуль при подключении к ПК. Если все сработало верно и устройство успешно подключилось, ПК включен и не находится в режиме энергосбережения, то состояние будет CONFIGURED.
Далее проверяется, была ли закончена предыдущая передача данных в ПК и если да, то готовится к отправке новый пакет в функции RHIDCheckState()
Размер пакета и частота передачи
USB-HID девайс не может сам инициировать передачу, т.к. координацией шины занимается host устройство — ПК. Поэтому при подготовке USB дескриптора нашего устройства, мы пишем, как часто нужно опрашивать наше устройство. По спецификации максимальная частота опроса — 1кГц и максимальный размер передаваемого за раз пакета — 64 байта. Если этого недостаточно — придется использовать другие режимы работы — вроде USB bulk, но там уже без драйверов не обойтись.
За настройку взаимодействия с ПК отвечают 3 дескриптора:
В комментариях все довольно прозрачно. Обратите внимание на DEVICE_VER_L, DEVICE_VER_H — это константы из usb_desc.h, которые вы можете изменить для идентификации версии своего устройства.
Здесь стоит обратить внимание на константу wMaxPacketSize — она определяет максимальный размер пакета, которым мы будем обмениваться с ПК. Проект так настроен, чтобы при ее изменении менялись и размеры буферов. Но не забывайте, что больше 0x40 по стандарту указывать не стоит. С этой константой будьте осторожны — если передаваемый пакет будет отличаться по размеру — будут проблемы!
Следующая за ним константа с комментарием bInterval — это период опроса устройства в миллисекундах. Для нашего устройства задано 32мс.
Это самый важный дескриптор — он описывает протокол обмена и функционал устройства. Его формирование — не самая простая задача. Если допустить ошибку при формировании дескриптора — устройство перестанет работать. Формат дескриптора очень жесткий. Есть даже специальная утилита HID Descriptor tool. А в корне проекта лежит файл «RHID.hid» с описанным выше дескриптором для редактирования в этой утилите. Но если вы не понимаете, что делаете, лучше не лезть.
Для простоты я сделал две константы:
RPT3_COUNT — размер OUTPUT буфера в байтах для передачи пакета в МК (в примере — 1 байт)
RPT4_COUNT — размер INPUT буфера в байтах для передачи пакета в ПК (в примере — 4 байта)
Размер любого из этих буферов не должен превышать wMaxPacketSize. Меньше — можно.
Кстати, превратить Custom HID в другой HID девайс, например, клавиатуру или джойстик можно фактически только переписав ReportDescriptor и изменив класс и подкласс устройства в дескрипторе конфигурации.
Что такое Report
- REPORT_ID = 1 и 2 — команда МК включить/выключить LED1/LED2. Содержит поле размером 1 бит с желаемым состоянием светодиода и поддерживает отправку как методом SET_REPORT так и методом SET_FEATURE (об этом чуть позже).
- REPORT_ID = 3 — передает один байт в МК. Просто, чтобы показать, как передать данные МК. Мы будем передавать положение ползунка.
- REPORT_ID = 4 — это репорт для передачи данных ПК. Возвращает информацию о текущем состоянии светодиодов, кнопок (если они есть) и возвращает переданный в репорте с байт, чтобы показать, что данные приняты.
Цикл обмена
Массив uint8_t Buffer[RPT4_COUNT+1] определен как размер полезных данных входящего (рассматривается всегда с точки зрения хоста) пакета + байт ID. Это важно — если размер буфера будет отличаться — будут проблемы. Поэтому для изменения размеров буфера редактируйте значение константы в usb_desc.h.
В функции мы собираем данные в пакет, устанавливаем флаг PrevXferComplete = 0, говорящий о том, что данные отправляются и вызываем функциии библиотеки USB_SIL_Write и SetEPTxValid для отправки данных хосту.
Все, на этом передача данных хосту закончена.
С приемом данных немного сложнее — есть два способа послать данные девайсу — один из них заключается в использовании описанных в дескрипторе репорта возможностей устройства (Features), с соответствующими параметрами посредством функции SET_FEAUTRE. Это некоторая абстракция, для красивого управления устройством с кучей функций, чтобы можно было вызывать осмысленные функции, а не просто слать поток байт.
Второй способ — это работа с устройством как с файлом — просто записываем в него пакет как в файл. Этот метод называется SET_REPORT. На деле работает чуть-чуть медленнее.
Наше устройство поддерживает оба метода, о чем мы и сказали хосту в дескрипторе репортов.
Обработка SET_FEATURE
Данные, отправленные методом SET_FEAUTRE обрабатываются в usb_prop.c
Здесь мы проверяем первый байт в репорте и в соответствии с ним обрабатываем остаток пакета — управляем светодиодами или просто берем байт, отправленный нам хостом и кладем в пакет для последующей отправки обратно в функции RHIDCheckState.
Под Report_Buf зарезервировано wMaxPacketSize байт, чтобы влез любой пакет, который нам отправит хост.
Данные, отправленные методом SET_REPORT обрабатываются в usb_endp.c
Здесь почти то же самое, только нужно самостоятельно забрать данные вызовом USB_SIL_Read(EP1_OUT, Receive_Buffer) и в конце сообщить, что мы закончили вызовом SetEPRxStatus(ENDP1, EP_RX_VALID);
Настраивать устройство, передавать и принимать данные в пакетах нужного размера с нужной нам периодичностью мы научились.
Собираем проект и прошиваем в устройство.
Работать, это будет примерно так:
Также я написал маленькую демо-софтинку, которая автоматически определяет подключение к компу и отключение нашего девайса по его VID и PID, отображает статус — подключено/отключено индикатором рядом с чекбоксом Auto Connect
Радиокнока Send using позволяет выбрать метод отправки данных девайсу.
Report: отображает полученный от девайса пакет побайтно, начиная с ReportID.
Щелкая по светодиодам ниже — управляем светодиодами девайса. Их состояние отображает текущее состояние девайса. Считывается из репорта от девайса.
Перемещая ползунок, мы отправляем Report с и значением, соответствующим позиции ползунка. Девайс вернет это значение в 4 байте репорта.
В выпадающем комбобоксе отображаются HID девайсы, найденные в системе и если найден наш девайс, то отображается его название.
Если остались вопросы — пишите в комментариях. Постараюсь ответить. Я постарался не утопить суть в куче мелочей, чтобы сложилось общее понимание. Остальное уже можно понять, изучая проект. Но если вам нужно быстро сделать свое устройство, а лезть в дебри некогда — все, что вам нужно, я описал.
P.S. По умолчанию при уходе хоста в режим энергосбережения, девайс засыпает вместе с ним, а если подключить девайс к спящему ПК, то он тоже уйдет в слип. Поэтому если мы просто воткнем в девайс блок питания или запитаем от батареи, то работать он не будет, считая, что подключен к спящему ПК (пакетов конфигурации то от БП не придет точно). Я изменил библиотеку так, чтобы устройство работало и при подключении просто БП. Поэтому девайс будет работать как при подключениии к ПК так и автономно. (У меня ушло немало времени, чтобы разобраться с этим.)
Читайте также: