Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Не получается разобраться с usb

Вт окт 01, 2019 14:32:39

Здравствуйте, хочу разобраться с usb. Для примера решил сделать custom hid устройство. Так вот написал самодельный драйвер на CMSIS. Устройство определяется в системе правильно. Но передача данных не работает. По сообщениям в анализаторе судя по всему драйверу не нравятся string дескрипторы. Почему не знаю. Если сгенерировать код в кубе то же самое. В чем может быть проблема? Если есть рабочий пример на f429zit скиньте пожалуйста.
Спойлер
Код:
000000: PnP Event: Device Connected (UP), 2019-10-01 15:43:58,4981010 (1. Device: My device (pid.codes Test PID))
The USB device has just been connected to the system.
000001: Get Descriptor Request (DOWN), 2019-10-01 15:43:58,4981106 +0,0000096 (1. Device: My device (pid.codes Test PID))
Descriptor Type: Device
Descriptor Index: 0x0
Transfer Buffer Size: 0x12 bytes
000002: Control Transfer (UP), 2019-10-01 15:43:58,4982936 +0,0001830. (1. Device: My device (pid.codes Test PID)) Status: 0x00000000
Pipe Handle: Control Pipe
 12 01 00 02 00 00 00 08 09 12 01 00 00 02 01 02   ................
 03 01                                             ..
Setup Packet
000003: Get Descriptor Request (DOWN), 2019-10-01 15:43:58,4983099 +0,0000163 (1. Device: My device (pid.codes Test PID))
Descriptor Type: Configuration
Descriptor Index: 0x0
Transfer Buffer Size: 0x9 bytes

000004: Control Transfer (UP), 2019-10-01 15:43:58,4985354 +0,0002255. (1. Device: My device (pid.codes Test PID)) Status: 0x00000000
Pipe Handle: Control Pipe
 09 02 29 00 01 01 00 E0 32                        ..)....а2
Setup Packet

000005: Get Descriptor Request (DOWN), 2019-10-01 15:43:58,4985449 +0,0000095 (1. Device: My device (pid.codes Test PID))
Descriptor Type: Configuration
Descriptor Index: 0x0
Transfer Buffer Size: 0x29 bytes

000006: Control Transfer (UP), 2019-10-01 15:43:58,4987822 +0,0002373. (1. Device: My device (pid.codes Test PID)) Status: 0x00000000
Pipe Handle: Control Pipe
 09 02 29 00 01 01 00 E0 32 09 04 00 00 02 03 00   ..)....а2.......
 00 00 09 21 11 01 00 01 22 26 00 07 05 81 03 02   ...!...."&...Ѓ..
 00 05 07 05 01 03 02 00 05                        .........
Setup Packet
000007: Select Configuration (DOWN), 2019-10-01 15:43:58,4987994 +0,0000172 (1. Device: My device (pid.codes Test PID))
Configuration Index: 1

000008: Select Configuration (UP), 2019-10-01 15:43:58,4990083 +0,0000010. (1. Device: My device (pid.codes Test PID)) Status: 0x00000000
Configuration Index: 1
Configuration Handle: 0x10989620
000009: Class-Specific Request (DOWN), 2019-10-01 15:43:58,4990166 +0,0000083 (1. Device: My device (pid.codes Test PID))
Destination: Interface, Index 0
Reserved Bits: 34
Request: 0xa
Value: 0x0
Send 0x0 bytes to the device
000010: Control Transfer (UP), 2019-10-01 15:43:58,4991632 +0,0001466. (1. Device: My device (pid.codes Test PID)) Status: 0x00000000
Pipe Handle: Control Pipe
Setup Packet

000011: Get Descriptor Request (DOWN), 2019-10-01 15:43:58,4991865 +0,0000233 (1. Device: My device (pid.codes Test PID))
Descriptor Type: HID Report Descriptor
Descriptor Index: 0x0
Transfer Buffer Size: 0x66 bytes


000012: Control Transfer (UP), 2019-10-01 15:43:58,4994164 +0,0002299. (1. Device: My device (pid.codes Test PID)) Status: 0x00000000
Pipe Handle: Control Pipe
 05 0C 09 01 A1 01 85 01 09 01 15 00 26 FF 00 75   ....Ў.….....&я.u
 08 95 01 B1 82 85 01 09 01 91 82 85 02 09 02 75   .•.±‚…...‘‚…...u
 08 95 01 81 82 C0                                 .•.Ѓ‚А
Setup Packet
000013: PnP Event: Query ID (UP), 2019-10-01 15:43:58,4998351 +0,0004187 (1. Device: My device (pid.codes Test PID))
Device ID: USB\VID_1209&PID_0001

000014: PnP Event: Query ID (UP), 2019-10-01 15:43:58,4999088 +0,0000737 (1. Device: My device (pid.codes Test PID))
Hardware IDs: USB\VID_1209&PID_0001&REV_0200, USB\VID_1209&PID_0001

000017: Get Descriptor Request (DOWN), 2019-10-01 15:43:58,8163532 +0,3160812 (1. Device: My device (pid.codes Test PID))
Descriptor Type: String
Descriptor Index: 0x2
Transfer Buffer Size: 0x20a bytes
LanguageId: 0x409

000018: Control Transfer (UP), 2019-10-01 15:43:58,8165216 +0,0001684. (1. Device: My device (pid.codes Test PID)) Status: 0x00000000
Pipe Handle: Control Pipe
 14 03 4D 00 79 00 20 00 64 00 65 00 76 00 69 00   ..M.y. .d.e.v.i.
 63 00 65 00                                       c.e.
Setup Packet

000019: Get Descriptor Request (DOWN), 2019-10-01 15:43:58,8168660 +0,0003444 (1. Device: My device (pid.codes Test PID))
Descriptor Type: String
Descriptor Index: 0x2
Transfer Buffer Size: 0x20a bytes
LanguageId: 0x409

000020: Control Transfer (UP), 2019-10-01 15:43:58,8170165 +0,0001505. (1. Device: My device (pid.codes Test PID)) Status: 0x00000000
Pipe Handle: Control Pipe
 14 03 4D 00 79 00 20 00 64 00 65 00 76 00 69 00   ..M.y. .d.e.v.i.
 63 00 65 00                                       c.e.
Setup Packet

000021: Get Descriptor Request (DOWN), 2019-10-01 15:43:59,8245625 +1,0075460 (1. Device: My device (pid.codes Test PID))
Descriptor Type: String
Descriptor Index: 0x3
Transfer Buffer Size: 0x402 bytes
LanguageId: 0x409

000022: Control Transfer (UP), 2019-10-01 15:43:59,8247647 +0,0002022. (1. Device: My device (pid.codes Test PID)) Status: 0x00000000
Pipe Handle: Control Pipe
 0C 03 31 00 32 00 33 00 34 00 35 00               ..1.2.3.4.5.
Setup Packet

000023: Get Descriptor Request (DOWN), 2019-10-01 15:43:59,8247822 +0,0000175 (1. Device: My device (pid.codes Test PID))
Descriptor Type: String
Descriptor Index: 0x1
Transfer Buffer Size: 0x402 bytes
LanguageId: 0x409

000024: Control Transfer (UP), 2019-10-01 15:43:59,8250076 +0,0002254. (1. Device: My device (pid.codes Test PID)) Status: 0x00000000
Pipe Handle: Control Pipe
 0C 03 49 00 74 00 73 00 20 00 49 00               ..I.t.s. .I.
Setup Packet

000025: Get Descriptor Request (DOWN), 2019-10-01 15:43:59,8250670 +0,0000594 (1. Device: My device (pid.codes Test PID))
Descriptor Type: String
Descriptor Index: 0x2
Transfer Buffer Size: 0x402 bytes
LanguageId: 0x409

000026: Control Transfer (UP), 2019-10-01 15:43:59,8252570 +0,0001900. (1. Device: My device (pid.codes Test PID)) Status: 0x00000000
Pipe Handle: Control Pipe
 14 03 4D 00 79 00 20 00 64 00 65 00 76 00 69 00   ..M.y. .d.e.v.i.
 63 00 65 00                                       c.e.
Setup Packet

000027: Get Descriptor Request (DOWN), 2019-10-01 15:44:00,3206128 +0,4953558 (1. Device: My device (pid.codes Test PID))
Descriptor Type: String
Descriptor Index: 0x2
Transfer Buffer Size: 0x20a bytes
LanguageId: 0x409

000028: Control Transfer (UP), 2019-10-01 15:44:00,3207602 +0,0001474. (1. Device: My device (pid.codes Test PID)) Status: 0x00000000
Pipe Handle: Control Pipe
 14 03 4D 00 79 00 20 00 64 00 65 00 76 00 69 00   ..M.y. .d.e.v.i.
 63 00 65 00                                       c.e.
Setup Packet

000029: Get Descriptor Request (DOWN), 2019-10-01 15:44:00,3210908 +0,0003306 (1. Device: My device (pid.codes Test PID))
Descriptor Type: String
Descriptor Index: 0x2
Transfer Buffer Size: 0x20a bytes
LanguageId: 0x409

000030: Control Transfer (UP), 2019-10-01 15:44:00,3212461 +0,0001553. (1. Device: My device (pid.codes Test PID)) Status: 0x00000000
Pipe Handle: Control Pipe
 14 03 4D 00 79 00 20 00 64 00 65 00 76 00 69 00   ..M.y. .d.e.v.i.
 63 00 65 00                                       c.e.
Setup Packet

000031: Get Descriptor Request (DOWN), 2019-10-01 15:44:00,8221648 +0,5009187 (1. Device: My device (pid.codes Test PID))
Descriptor Type: String
Descriptor Index: 0x3
Transfer Buffer Size: 0x402 bytes
LanguageId: 0x409

000032: Control Transfer (UP), 2019-10-01 15:44:00,8223657 +0,0002009. (1. Device: My device (pid.codes Test PID)) Status: 0x00000000
Pipe Handle: Control Pipe
 0C 03 31 00 32 00 33 00 34 00 35 00               ..1.2.3.4.5.
Setup Packet

000033: Get Descriptor Request (DOWN), 2019-10-01 15:44:00,8223753 +0,0000096 (1. Device: My device (pid.codes Test PID))
Descriptor Type: String
Descriptor Index: 0x1
Transfer Buffer Size: 0x402 bytes
LanguageId: 0x409

000034: Control Transfer (UP), 2019-10-01 15:44:00,8224930 +0,0001177. (1. Device: My device (pid.codes Test PID)) Status: 0x00000000
Pipe Handle: Control Pipe
 0C 03 49 00 74 00 73 00 20 00 49 00               ..I.t.s. .I.
Setup Packet

000035: Get Descriptor Request (DOWN), 2019-10-01 15:44:00,8225006 +0,0000076 (1. Device: My device (pid.codes Test PID))
Descriptor Type: String
Descriptor Index: 0x2
Transfer Buffer Size: 0x402 bytes
LanguageId: 0x409

000036: Control Transfer (UP), 2019-10-01 15:44:00,8226167 +0,0001161. (1. Device: My device (pid.codes Test PID)) Status: 0x00000000
Pipe Handle: Control Pipe
 14 03 4D 00 79 00 20 00 64 00 65 00 76 00 69 00   ..M.y. .d.e.v.i.
 63 00 65 00                                       c.e.
Setup Packet

000037: Get Descriptor Request (DOWN), 2019-10-01 15:44:01,3152936 +0,4926769 (1. Device: My device (pid.codes Test PID))
Descriptor Type: String
Descriptor Index: 0x3
Transfer Buffer Size: 0x402 bytes
LanguageId: 0x409

000038: Control Transfer (UP), 2019-10-01 15:44:01,3154996 +0,0002060. (1. Device: My device (pid.codes Test PID)) Status: 0x00000000
Pipe Handle: Control Pipe
 0C 03 31 00 32 00 33 00 34 00 35 00               ..1.2.3.4.5.
Setup Packet

000039: Get Descriptor Request (DOWN), 2019-10-01 15:44:01,3155251 +0,0000255 (1. Device: My device (pid.codes Test PID))
Descriptor Type: String
Descriptor Index: 0x1
Transfer Buffer Size: 0x402 bytes
LanguageId: 0x409

000040: Control Transfer (UP), 2019-10-01 15:44:01,3157470 +0,0002219. (1. Device: My device (pid.codes Test PID)) Status: 0x00000000
Pipe Handle: Control Pipe
 0C 03 49 00 74 00 73 00 20 00 49 00               ..I.t.s. .I.
Setup Packet

000041: Get Descriptor Request (DOWN), 2019-10-01 15:44:01,3157630 +0,0000160 (1. Device: My device (pid.codes Test PID))
Descriptor Type: String
Descriptor Index: 0x2
Transfer Buffer Size: 0x402 bytes
LanguageId: 0x409

000042: Control Transfer (UP), 2019-10-01 15:44:01,3159887 +0,0002257. (1. Device: My device (pid.codes Test PID)) Status: 0x00000000
Pipe Handle: Control Pipe
 14 03 4D 00 79 00 20 00 64 00 65 00 76 00 69 00   ..M.y. .d.e.v.i.
 63 00 65 00                                       c.e.
Setup Packet

000043: Get Descriptor Request (DOWN), 2019-10-01 15:44:02,3415104 +1,0255217 (1. Device: My device (pid.codes Test PID))
Descriptor Type: String
Descriptor Index: 0x2
Transfer Buffer Size: 0x20a bytes
LanguageId: 0x409

000044: Control Transfer (UP), 2019-10-01 15:44:02,3417323 +0,0002219. (1. Device: My device (pid.codes Test PID)) Status: 0x00000000
Pipe Handle: Control Pipe
 14 03 4D 00 79 00 20 00 64 00 65 00 76 00 69 00   ..M.y. .d.e.v.i.
 63 00 65 00                                       c.e.
Setup Packet

000045: Get Descriptor Request (DOWN), 2019-10-01 15:44:02,3430005 +0,0012682 (1. Device: My device (pid.codes Test PID))
Descriptor Type: String
Descriptor Index: 0x2
Transfer Buffer Size: 0x20a bytes
LanguageId: 0x409

000046: Control Transfer (UP), 2019-10-01 15:44:02,3432435 +0,0002430. (1. Device: My device (pid.codes Test PID)) Status: 0x00000000
Pipe Handle: Control Pipe
 14 03 4D 00 79 00 20 00 64 00 65 00 76 00 69 00   ..M.y. .d.e.v.i.
 63 00 65 00                                       c.e.
Setup Packet

 

Re: Не получается разобраться с usb

Сб окт 05, 2019 11:07:47

https://radiokot.ru/forum/viewtopic.php ... 0%BA%D0%B0

Re: Не получается разобраться с usb

Сб окт 05, 2019 11:18:24

А строковые дескрипторы правильно передаются? Если дескриптор длинней 63 символов, его надо в несколько заходов отправлять. Я когда HID делал, намучился, сделал так. Потом начал лепить CDC ACM, пришлось подобным же образом реализовать функцию отправки остальных дескрипторов (т.к. дескриптор устройства вылез за пределы 63 байт, чего в эмуляции PL2303 не было).

P.S. От custom HID никакой пользы нет! Делайте CDC!!!

Re: Не получается разобраться с usb

Сб окт 05, 2019 12:03:17

Eddy_Em писал(а):От custom HID никакой пользы нет!
В винде HID позволяет ставить дрова автоматически и подключаться к устройству без прав администратора.

Re: Не получается разобраться с usb

Сб окт 05, 2019 12:04:54

А мне нравится HID. Ни драйверов специальных, не надо приложению говорить на каком порту девайс висит. Сложнее обмен только делать. Свое надо городить.

Re: Не получается разобраться с usb

Сб окт 05, 2019 12:14:37

Z_h_e писал(а):Сложнее обмен только делать. Свое надо городить.
Через COM порт не нужно придумывать (или использовать готовый) протокол обмена.
С USB проще в том что пакеты делятся на 64 байта и в большинстве случаев данные в них помещаются, т. е. не нужно как с COM портом искать начало и конец посылки.

Re: Не получается разобраться с usb

Сб окт 05, 2019 12:22:47

Мурик, я так и написал, что с HIDoм надо свое городить, то есть в отличии от CDC.

Re: Не получается разобраться с usb

Сб окт 05, 2019 13:10:13

С COM портом разве не нужно? Как без протокола обмена понять где какие данные?

Re: Не получается разобраться с usb

Сб окт 05, 2019 13:16:32

Разные уровни протокола нужны будут. Тот уровень что для HID, для COM будет прозрачен. Со стороны компа.

Re: Не получается разобраться с usb

Вт окт 08, 2019 19:03:51

А мне нравится HID. Ни драйверов специальных, не надо приложению говорить на каком порту девайс висит. Сложнее обмен только делать. Свое надо городить.

Для работы с HID на стадии отладки ПО невозможно просто взять, и сделать
Код:
echo "команды" > /dev/ttyUSBx

Это очень удобно с текстовым командным протоколом. Кроме того, у CDC и скорость значительно выше, чем у HID! А если нет полномочий суперпользователя, а очень хочется, можно и в юзерспейсе сделать посредника... В случае с HID всегда нужно сначала набросать какой-то костяк, прежде чем станет возможным с девайсом работать (разве что девайс - эмуляция клавы-мыши-джойстика). Поэтому лично я считаю, что HID на МК нужен лишь для эмуляции названных устройств. У меня старая версия велохронометра так и работала - эмулировала клавиатуру. Но было неудобно работать: приходилось вручную время вбивать с одного устройства в другое. Поэтому переделал на CDC.

Re: Не получается разобраться с usb

Вт окт 08, 2019 19:29:27

Eddy_Em писал(а):Для работы с HID на стадии отладки ПО невозможно просто взять, и сделать
Вы не умеете писать проги для компа производящие обмен по USB?

Eddy_Em писал(а):Это очень удобно с текстовым командным протоколом.
В большинстве случаев обмен компа с МК бинарный, т. к. перевод в текст это лишняя трата ресурсов.

Eddy_Em писал(а):А если нет полномочий суперпользователя
Ставьте винду. В ней работа с HID не требует прав админа. С COM портом тоже. Для того и другого есть API.
А в линуксе есть API для HID или только через libusb?

Re: Не получается разобраться с usb

Вт окт 08, 2019 19:34:51

Мурик писал(а):Вы не умеете писать проги для компа производящие обмен по USB?

Умею, но зачем мне лишние трудности на стадии отладки протокола и алгоритмов работы устройства? Я просто открываю терминал и работаю. А некоторые железяки у меня вообще так и запускаются из баш-скриптов: в порт пишутся команды и читаются оттуда обычными командами echo и read.
Мурик писал(а):В большинстве случаев обмен компа с МК бинарный, т. к. перевод в текст это лишняя трата ресурсов.

Бинарный протокол нужен лишь если требуется гнать большие массивы данных. В остальных случаях сериализация удобней!
Мурик писал(а):Ставьте винду.

Зачем людям советовать есть фекалии?
Мурик писал(а):А в линуксе есть API для HID или только через libusb?

Два варианта: либо написать свой модуль ядра и работать через open/read/write/close и сисвызовы с устройством, либо в пространстве пользователя через libusb.
Да, с custom HID я связывался только один раз. И то - по нужде: нужно было для фотометра применить готовые турели. А производители, сволочи, никакого SDK в комплекте не давали. И протокол зажопили. Пришлось искать комп с мастдайкой и при помощи wireshark'а реверсить протокол. Получилось вот это.

Re: Не получается разобраться с usb

Вт окт 08, 2019 19:42:22

Eddy_Em писал(а):Бинарный протокол нужен лишь если требуется гнать большие массивы данных. В остальных случаях сериализация удобней!
Знаете как осуществляется сериализация бинарных данных? Берется структура и заполняется данными, включая ИД команды размером и контрольной суммой и отправляется. При приеме данные помещаются в структуру и считываются из нее.

Eddy_Em писал(а):Два варианта: либо написать свой модуль ядра и работать через open/read/write/close и сисвызовы с устройством, либо в пространстве пользователя через libusb.
Тогда понятно почему вы не понимаете преимуществ HID. В винде есть API позволяющее получить доступ к устройству без разработки и установки драйверов и прав администратора.

Re: Не получается разобраться с usb

Вт окт 08, 2019 19:45:29

Мурик, можно подумать, для функционала libusb нужны права суперпользователя...
Те же яйца!
Только удобней намного. В мастдайке вообще разработка железа - как выдирание гланд у себя самого при помощи раскаленного лома через задницу!

Re: Не получается разобраться с usb

Ср окт 09, 2019 07:01:53

Eddy_Em, уж кто бы говорил :)
Самому патчить st-flash уж очень неохота!
Иногда задаёшься вопросом, а красноглазики вообще работать между патченьем и пересборкой всего софта успевают?

Re: Не получается разобраться с usb

Ср окт 09, 2019 07:04:29

А я постоянно задаюсь вопросом: как геймеры успевают работать? Им же постоянно нужно сражаться с мышкой!
В операционных системах же все просто: нужен тебе софт, которого нет — напиши его сам. А вот пользователям игровых приставок, которые ничего не умеют, кроме как мышеблудием заниматься, приходится платить за ПО... Да еще и, бедняги, мучаются в совершенно неюзабельном интерфейсе. Но терпят — зонд не жмет!

Re: Не получается разобраться с usb

Ср окт 09, 2019 07:31:33

У тебя мусофобия? Хочешь об этом поговорить? :) Давно ты видел компьютер без мышки или тачпада?
Изображение

Написать самому софт под win Ктулху не разрешает?

Re: Не получается разобраться с usb

Ср окт 09, 2019 07:52:31

Ну вот, одни работают подходящими и эффективными инструментами, а другие демагогию о "мусофобии" разводят. И ничего полезного не делают, только руками водят. Руководители, блин!
P.S. Советую сравнить время, затраченное на написание софта для работы с железом под линукс и под игровые приставки. Разница во времени будет поразительная: то, что в линуксе делается за день, в прошивке потребует неделю корпеть над кодом! я уж не говорю об элементарных удобствах: отсутствие полноценной командной строки в прошивке делает ее абсолютно неюзабельной. Но крысолюбам это, похоже, нравится! Видимо, иметь переменную PATH длиной в несколько страниц — круто!

Re: Не получается разобраться с usb

Ср окт 09, 2019 07:55:13

Я просто открываю терминал и работаю.

Проблема только в том, что в РЕАЛЬНЫХ устройствах созданных как товар софт предназначен для юзера, а не для разработчика. Мало того, этот юзер сам определяет с какой ОС ему требуется работать. И в 99,99% случаев это Винда.
Подключение CDC в винде не обеспечивает автоматического коннекта типа воткнул и забыл. А юзерам именно так и надо. Они вообще ничего не понимают в ОС и программировании. Им нужен функционал купленного девайса. ФУНКЦИОНАЛ, а не внутренние фичи встроенной системы.
Мы уже давно отказались от CDC в пользу кастомного HID. Исключительно удобно. Скорости 64 кбайт/с хватает с большим запасом. Кстати, я так понимаю, что даже при изохронном USB с сотнями мегабайт в секунду трафика USB устройства делают как составные и коннект обеспечивается кастомным HID.

Re: Не получается разобраться с usb

Ср окт 09, 2019 11:26:22

Да плевать мне на вантузоидов! Пусть себе мучаются, как хотят! Если им хочется работать - пускай ставят операционную систему, а не геймерскую прошивку...
Насчет же оконечного управления устройствами, я последнее время делаю веб-морды: очень удобно! Можно даже с какого-нибудь ондроедофона выйти, авторизоваться и поуправлять железякой.
Учитывая то, что апач или хотя бы nginx на любой машине всегда есть, никаких сложностей с веб-мордой нет. В исключительных случаях можно вебсокет-сервер запустить из-под пользователя с доступом к 80-му порту и без вебсервера выдавать нужные веб-странички, картинки и жабоскрипт юзеру.
Ответить