LINUX.ORG.RU

STM32 bluepill как заставить чувствовать коннект по usb?

 , ,


0

1

При подключении к каком нибудь терминалу(cutecom, putty, terminal 1b, termit) устройства часто умеют понимать, есть ли у них коннект с компом(когда соединён юсб). То есть воткнул юсб-загорелся светодиод с питанием, запустил программу, нажал коннект-загорелся второй, нажал дисконнект-погас второй. Как реализовать такую штуку в блюпиле?

Нужно строго программное решение, должно работать как в линуксе так и винде.


P.S.

  1. Блюпил там уже не совсем блюпил.
  2. Это CDC устройство.


Последнее исправление: nikitalol (всего исправлений: 4)

Берёшь, например, https://github.com/r2axz/bluepill-serial-monster/ отпиливаешь ненужное(лишние usart, вывод пришедших данных на внешние ноги), запиливаешь нужное(обработку команд управления светодиодом приходящих от программы с компа), профит

cobold ★★★★★
()

USB штука универсальная. Нет, можно, конечно, отлавливать по энумерации или запросу дескриптора. Но что-то мне подсказывает, что это не то, что вам нужно.

Допустим, ваша «пилюля» изображает мышку. Что должна сделать система чтобы «подключить» и «отключить» ее?

С cdc (терминалом) еще хуже: способа узнать идет ли обмен нет в принципе. Это ведь тот же UART - компьютер может час спать, а потом без предупреждения кинуть посылку. И открытие-закрытие терминала для устройства не видно. Максимум можно пытаться детектировать изменение скорости обмена, и то между вызовами

screen /dev/ttyACM0 9600
screen /dev/ttyACM0 9600
stty -F /dev/ttyACM0 9600
echo "AAA" > /dev/ttyACM0

никакого сообщения устройству что одна программа с ним закончила общаться, а другая начала - нет.

COKPOWEHEU
()

Возможно, при помощи DTR сигнала со стороны терминала. То есть при открытии порта терминал должен посылать DTR. Если порт виртуальный - USB CDC, то при этом с хоста посылается SETUP пакет на CONTROL endpoint, код запроса - SET_CONTROL_LINE_STATE (или 0x22 в цифрах).

Вот про этот код, страница 2, 3

https://www.silabs.com/documents/public/application-notes/AN758.pdf

Обрабатывая этот запрос, по идее они и понимают что подключен терминал. Видимо надо проверять бит 0 - DTE is present.

James_Holden ★★★
()
Последнее исправление: James_Holden (всего исправлений: 2)
Ответ на: комментарий от COKPOWEHEU

И открытие-закрытие терминала для устройства не видно

См. пост выше.

James_Holden ★★★
()

Можно поинтересоваться, прототип какого девайса разрабатываете? (исходя из этого, возможны и другие довольно удобные решения - пр. написание небольших драйверов под целевые ОС)

x86-
()
Последнее исправление: x86- (всего исправлений: 1)

Удобнее всего, наверное, использовать хардварный внешний USB-UART (их сотни разных) и повесить на него светодиод на соответствующий вывод.

CYB3R ★★★★★
()

Мы ведь до сих пор не знаем что за устройство ТС делает. Может, там надо реализовывать CDC. А может MSD (там, кстати, операции монтирования и отмонтирования предусмотрены). А может какой-нибудь HID или кастомное неспецифичное устройство, от которого требуется передавать данные в хитрой структуре.

COKPOWEHEU
()
Ответ на: комментарий от James_Holden

Ниоткуда не следует, что это оптимальное решение.

Я в свое время переводил прибор с RS232 на USB-HID, стало даже лучше.

COKPOWEHEU
()
Ответ на: комментарий от COKPOWEHEU

Зачем усложняешь, он же перечислил какие конкретно у него терминалы. Они не для HID. Для COM порта. То есть USB CDC будет.

James_Holden ★★★
()
Ответ на: комментарий от James_Holden

Тут пока нечего усложнять или упрощать, не зная исходной задачи ТСа.

COKPOWEHEU
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.