Top.Mail.Ru
Уведомления
Очистить все

[Решено] Пользовательские USB HID дискрипторы.

 stm
(@stm)
Level 4

Не знаю даже что спросить, всё непонятно.
С помощью простого USB HID я управлял курсором мыши.
По этому видео https://www.youtube.com/watch?v=B3Umr0YlR0w
С помощью функции USBD_HID_SendReport
Во первых правильно ли он делает?
Здесь https://www.youtube.com/watch?v=qgda0Zbjmgs человек говорит что репортами нельзя управлять.
Он на основе прерываний делает, слишком замудрил с уроком, мне надо без прерываний сначала.
--------------------------
Непонятно для чего нужны эти шестнадцатеричные цифры в десктипротах.
0x15, 0x01
Здесь https://habr.com/ru/articles/551720/ пишут:
Если «значение» равно 1 (один байт) то записано будет 0x15, 0x01. Для двухбайтного значения 0x1234 будет записано 0x16, 0x34, 0x12 — значение записывается от младшего к старшему. Ну и до кучи число 0x123456 будет 0x17, 0x56, 0x34, 0x12.
----
То есть если написано 0x15, 0x01
то значение здесь только цифра 0x01?
А 0x15 служит для описания этого значения?
Число 0x15 это 0001 0101, состоит из 8 ми бит, что означает каждый из этих бит?
И я видел дискрипторы, где эти шестнадцатеричные цифры идут не парами, а по одиночке.
----------------------------
Здесь https://radiokot.ru/circuit/digital/pcmod/63/ написано, что
Каждое USB устройство имеет один дескриптор устройства длиной 18 байт.
---
У каждого дескриптора число байт должно быть определённого размера или это только у дескриптор устройства так?
----------------------------
Читал, что в каждом дескрипторе первым байтом должно идти общее количество байт в дескритпоре, но я встречал примеры, где первым байтом шли другие параметры.
Например https://microtechnics.ru/stm32cube-usb-custom-hid-sozdanie-deskriptorov-ustrojstva/
Как дискриптор определит где заканчивается один репорт и начинается другой когда нет длины каждого репорта?

0x85, 0x01, // REPORT_ID (1)
0x09, 0x01, // USAGE (Vendor Usage 1)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 4, // REPORT_COUNT (4)
0xb1, 0x82, // FEATURE (Data,Var,Abs,Vol)
0x85, 0x01, // REPORT_ID (1)
0x09, 0x01, // USAGE (Vendor Usage 1)
0x91, 0x82, // OUTPUT (Data,Var,Abs,Vol)
//--------------------------------------------------
0x85, 0x02, // REPORT_ID (2)
0x09, 0x02, // USAGE (Vendor Usage 2)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 4, // REPORT_COUNT (4)
0x81, 0x82, // INPUT (Data,Var,Abs,Vol)

Даже я здесь не разберу где они начинаются и заканчиваются.

Цитата
Создатель темы Размещено : 13.09.2023 02:34
 stm
(@stm)
Level 4

Нашёл совпадения.
Например 0x85 это наверное ID репорта.
0x09 это производитель наверное
0x75 это REPORT_SIZE
REPORT_SIZE в этом коде равен 8 байт, но на самом деле репорт больше, почему?
0x95 Максимальное количество передаваемых данных. Или просто количество передаваемых данных, не знаю.
итп
Последние 2 бита первого байта могут меняться в зависимости от длины передаваемых байт.

Вот подобной информации мне не хватает.

ОтветитьЦитата
Создатель темы Размещено : 13.09.2023 04:01
 stm
(@stm)
Level 4

0x95  Размер REPORT_SIZE не должен превышать wMaxPacketSize. Меньше — можно.

ОтветитьЦитата
Создатель темы Размещено : 13.09.2023 04:14
 stm
(@stm)
Level 4

Например здесь https://codeby.net/threads/usb-flash-chast-1-ustrojstvo.77263/
Так же написано, что первым байтом должен идти размер дискриптора, но я это вижу далеко не всегда
----------------
Все дескрипторы имеют общий формат. Первый байт указывает длину дескриптора, а второй – его тип.
----------------

DevDesc
ОтветитьЦитата
Создатель темы Размещено : 13.09.2023 04:30
 stm
(@stm)
Level 4
desc
ОтветитьЦитата
Создатель темы Размещено : 13.09.2023 04:49
 stm
(@stm)
Level 4

Очень хорошую статью нашёл
https://electronics.stackexchange.com/questions/68141/where-do-i-lookup-values-for-building-a-usb-hid-descriptor
Например это
0xA1,0x01, // COLLECTION (Application)
имеет 3 части
0хА
0х1
0х01
0хА -- означает, что это коллекция(без понятия что за коллекция, может коллекция приборов)
После буквы 0хА единица означает, что длина равна 1 байт.
Наверное длина описания данного типа, то есть следующий байт.
Следующий байт 0x01 означает, что тип коллекции это Application.

UrFG0
ОтветитьЦитата
Создатель темы Размещено : 13.09.2023 06:13
 stm
(@stm)
Level 4

Report Size
0111 01 nn
Unsigned integer specifying the size of the report
fields in bits. This allows the parser to build an
item map for the report handler to use. For more
information, see Section 8: Report Protocol.

Это оказывается в битах, а не в байтах
0x75, 0x08, // REPORT_SIZE (8)
означает передачу 8 бит
Как это использовать я ещё не знаю, но думаю это важный параметр.

ОтветитьЦитата
Создатель темы Размещено : 13.09.2023 07:02
Aveal
(@aveal)
Top level Admin

Не успел пока посмотреть, но здесь должна быть вся информация:

.

ОтветитьЦитата
Размещено : 13.09.2023 10:50
 stm
(@stm)
Level 4

 

ОтветитьЦитата
Создатель темы Размещено : 14.09.2023 05:02
 stm
(@stm)
Level 4

Таких понятных книг я не встречал никогда.
Заметил там ошибку, но это пустяк, можно проверить на практике.
6.5.1.1. Элементы короткого типа
11 — 4 байта.
Обычно книги пишут извиняюсь "на от****сь". Главное чтоб заказчику понравилось максимально научным языком.

ОтветитьЦитата
Создатель темы Размещено : 14.09.2023 06:54
Поделиться: