2025-01-07

eddy_em: (Default)
2025-01-07 04:04 pm

"Новый" USB на STM32

Решил я еще в прошлом году "унифицировать" USB, чтобы проще было, если вдруг надумаю какое-то "эдакое" устройство сделать. Выкладываю на гитхаб помаленьку (HID, CDC и эмуляция PL2303). Пока только на F103. Если сегодня допишу составное устройство (7 USB-CDC в одном флаконе), то как-нибудь опробую всю четверку на F072 и F303.
Пока только один непонятный косяк: сразу после подключения неизменно вылезает:
string descriptor 0 read error: -75

и иногда
clear tt 2 (82a0) error -32

Но в дальнейшем проблем нет. ХЗ, что за причина этих ошибок. В отладочном выхлопе вообще проблем нет: пришел запрос — тут же на него ответ ушел. Правда, почему-то дескрипторы запрашиваются хостом по 2-3 раза. И в ответах на строковые дескрипторы wireshark иной раз ZLP показывает, хотя в отладке никаких ZLP не вижу, там что запросили, то и отправилось.

А еще, какой-то другой лютый косяк, который я отметил еще на CDC: хоть я и даю текстовый дескриптор интерфейса, в /dev/ udev не создает симлинк с этим дескриптором (чтобы различать интерфейсы составного устройства). Вижу, что udev мой скрипт проходит, т.к. появляется переменная, а вот симлинк - хрен!

Вот такой скрипт (может, кому пригодится):
ACTION=="add", DRIVERS=="usb", ENV{USB_IDS}="%s{idVendor}:%s{idProduct}"
ACTION=="add", ENV{USB_IDS}=="067b:2303", ATTRS{interface}=="?*", PROGRAM="/bin/bash -c \"ls /dev | grep $attr{interface} | wc -l \"", SYMLINK+="$attr{interface}%c", MODE="0666", GROUP="tty"
ACTION=="add", ENV{USB_IDS}=="0483:5740", ATTRS{interface}=="?*", PROGRAM="/bin/bash -c \"ls /dev | grep $attr{interface} | wc -l \"", SYMLINK+="$attr{interface}%c", MODE="0666", GROUP="tty"

(правда, ХЗ, зачем я вообще этот USB_IDS делаю, если есть готовый ID_SERIAL).
Пытаюсь глянуть этот "interface" в
udevadm info --attribute-walk --name=/dev/ttyACM0

- нет ничего…