Easyelectronics.ru

Электроника для всех
Текущее время: 07 июл 2020, 21:31

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 62 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: USB CDC ACM
СообщениеДобавлено: 15 янв 2019, 12:44 
Старожил
Аватара пользователя

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 681
Откуда: Германия
Коллеги, есть ли где полноценное описание CDC ACM? В частности, flow control. Или пример правильной реализации, которую можно засниффить.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: USB CDC ACM
СообщениеДобавлено: 15 янв 2019, 13:18 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 692
В принципе, с первого запроса
https://cscott.net/usb_dev/data/devclass/usbcdc11.pdf
https://www.xmos.com/developer/download/private/AN00124%3A-USB-CDC-Class-as-Virtual-Serial-Port%282.0.2rc1%29.pdf

А что вас собственно интересует в вопросе "flow control" ? Со стороны USB этого нет, USART имеет flow control, но причем тут спецификация на CDC ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: USB CDC ACM
СообщениеДобавлено: 15 янв 2019, 13:26 
Старожил
Аватара пользователя

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 681
Откуда: Германия
Увы, эти описания совсем не полные. Я их, разумеется, изучил первым делом.

А flow control: как девайс может сказать хосту, что входной буфер переполнился и надо подождать с посылкой данных?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: USB CDC ACM
СообщениеДобавлено: 15 янв 2019, 14:47 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 2775
Никак. Точнее нет такого в CDC стандартного ничего. Или свои методы выдумывайте или что-то другое используйте.
Для этого вон Эдди где-то тут писал "эмуляцию" протокола PL2303 уже с Flow Control под STM32. Почти тот же "COM-порт" получается в итоге.

EDIT: Вот оно:
viewtopic.php?f=35&t=36865
https://github.com/eddyem/stm32samples/ ... lib/usbcdc


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: USB CDC ACM
СообщениеДобавлено: 15 янв 2019, 16:45 
Старожил
Аватара пользователя

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 681
Откуда: Германия
В стандарте (последняя версия) оно вскользь упоминается как опциональное, с невнятным описанием. Приходится по кусочкам собирать из линуксовкого драйвера и реализаций разной полноты.

Линки почитаю, конечно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: USB CDC ACM
СообщениеДобавлено: 15 янв 2019, 17:39 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 692
Кажется я знаю о чем вы :) Пока сам разобрался, была неделя не забываемых сексуальных отношений с USB, с небольшими перерывами на еду и сон :)
В общем, делал я стандартный CDC ACM (лень дрова было писать под разные системы) с максимальной скоростью обмена (FS) на stm32f103 с использованием двойной буферизации и при передаче большого пакета (> 256 байт) все время терял концовку пакета, а передача шла в сниффере со статусом aborted. Так вот, что бы хост не обрывался EP0 нужно на время обмена ставить в состояние STALL.
В общем, исходные данные:
EP0: двунаправленный
EP1:канал OUT
EP2:канал Interrupt
EP3:канал IN
Алгоритм такой на девайсе:
EP1 в состояние VALID, принимаем первый пакет, EP0 IN в состояние STALL, обрабатываем полученный пакет, опять EP1 в состояние VALID, опять принимаем, проверяем не нулевой длинны - принимаем следующий и т.д. А если нулевой, то возвращаем EP0 IN в состояние VALID и обрабатываем запросы EP0.
Пока на запрос EP0 не ответишь, хост будет считать что операция не завешена.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: USB CDC ACM
СообщениеДобавлено: 15 янв 2019, 20:21 
Старожил
Аватара пользователя

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 681
Откуда: Германия
Ого, интересная мысль - управлять с помощью EP0. Надо проверить.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: USB CDC ACM
СообщениеДобавлено: 15 янв 2019, 21:35 
Старожил
Аватара пользователя

Зарегистрирован: 27 мар 2015, 04:10
Сообщения: 1931
Откуда: Харьков
Дык, так и должно быть. Просто нужно немного маны читать. Правда это не путь истинных джедаев :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: USB CDC ACM
СообщениеДобавлено: 15 янв 2019, 21:46 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 4679
Откуда: КЧР, поселок Нижний Архыз
EP2 на самом деле не нужен, т.к. ничем не используется. Можно не париться на его счет.
А обработку системных сигналов нужно делать в соответствии с реализацией ядреного модуля этой железяки. Я эмуляцию PL2303 делал на основе кода drivers/usb/serial/pl2303.c + в мастдайном эмуляторе погонял (оказывается, в линуксе сделали минимальный реверс, там не все посылки обрабатывают; ну да хрен с ними: документации я не нашел, поэтому сделал так же).
https://github.com/eddyem/stm32samples/ ... lib/pl2303


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: USB CDC ACM
СообщениеДобавлено: 16 янв 2019, 00:14 
Старожил
Аватара пользователя

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 681
Откуда: Германия
alexsam писал(а):
Дык, так и должно быть. Просто нужно немного маны читать. Правда это не путь истинных джедаев :)


Ну так первоначальный вопрос и был - какие маны читать. С ответами пока не густо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: USB CDC ACM
СообщениеДобавлено: 16 янв 2019, 00:51 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 4679
Откуда: КЧР, поселок Нижний Архыз
Маны читать — тот еще трешняк! В паре сотен страниц спецификаций CDC уйма воды, а конкретика понемногу размазана.
Проще спереть готовый минимальный код у того, кто с этим разобрался, да допилить нужный функционал.
Аппаратное управление потоком обычно контролируется через SET_CONTROL_LINE_STATE (EP0), весь более расширенный функционал чаще через vendor-запросы идет и нужно смотреть на конкретное устройство. В общем классе CDC-ACM полного управления не требуется и поэтому там такого нет!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: USB CDC ACM
СообщениеДобавлено: 17 янв 2019, 16:37 
Старожил
Аватара пользователя

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 681
Откуда: Германия
Отчитываюсь. Работает, простое эхо - 200 кБ/с на STM32F103@72 МГц. Дальше оптимизировать мне не интересно. Конкретно, меня интересовала 1-в-1 замена UART в прошивке, что бы с устройством можно было через стандартный терминал поговорить.

"EP2" не нужен (в данном случае), трюки с "EP0" не нужны; flow-control реализуется средствами самого USB - достаточно отвечать NACK пока уже полученное не обработаешь.

Засады, пока помню:
- если на хосте никто не слушает, то данные забираться не будут
- есть SET_CONTROL_LINE_STATE, но оно гарантированно приходит только при коннекте; при дисконнекте - как повезет
- поэтому совершенно необходим таймаут на передачу
- но в передаче могут возникать паузы, я видел 20 мс, поэтому таймаут не может быть слишком маленьким
- передачу лучше всегда завершать ACK с пустыми данными, потом NACK
- в линуксе не забыть "stty raw -echo", что бы не удивляться лишний раз
- если под линуксом вначале сыпется всякий мусор, то отключить ModemManager


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: USB CDC ACM
СообщениеДобавлено: 17 янв 2019, 17:06 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 4679
Откуда: КЧР, поселок Нижний Архыз
dev писал(а):
- если на хосте никто не слушает, то данные забираться не будут

Если не больше одного подключившегося процесса, то после отключения посылается BREAK → можно определить, что слушателей больше нет.
SET_CONTROL_LINE_STATE при дисконнекте приходит лишь если клиент возвращает настройки порта в предыдущее состояние.
Цитата:
отключить ModemManager

Его вообще гнать надо ссаной тряпкой из системы. Вместе со всяким поцтерошлаком вроде systemd, pulseadio и прочего говна!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: USB CDC ACM
СообщениеДобавлено: 17 янв 2019, 18:17 
Старожил
Аватара пользователя

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 681
Откуда: Германия
Eddy_Em писал(а):
Если не больше одного подключившегося процесса, то после отключения посылается BREAK → можно определить, что слушателей больше нет.


А вот break я вообще ни разу не видел, ни в одной системе.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: USB CDC ACM
СообщениеДобавлено: 17 янв 2019, 18:53 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 4679
Откуда: КЧР, поселок Нижний Архыз
Блин, это я попутал. BREAK посылает модуль pl23030.ko
Если эмулировать абстрактный CDC-ACM, нужно исходники ядреного модуля смотреть, что там происходит в конце разрыва соединения: может, тоже какой-нибудь сигнал да посылается. А если нет, то грусть-печаль..

P.S. Вот поэтому я именно PL2303 и эмулировал, что с ней надежней работать. В отличие от этих непредсказуемых CDC-ACM (которые, к тому же, во всяких недолинуксах вроде бубунты или дебилиана modemmanager так и норовит на себя перехватить).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: USB CDC ACM
СообщениеДобавлено: 18 янв 2019, 22:52 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 692
Я так понимаю вы хотите отловить разрыв соединения. Прерывание ESOF приходит после 3-х пропусков SOF.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: USB CDC ACM
СообщениеДобавлено: 19 янв 2019, 03:14 
Старожил
Аватара пользователя

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 681
Откуда: Германия
Не, разрыв соединения с хостом более-менее прост. А вот разрыв соединения со слушателем на хосте - непонятно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: USB CDC ACM
СообщениеДобавлено: 19 янв 2019, 03:27 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 4679
Откуда: КЧР, поселок Нижний Архыз
В общем случае USB CDC-ACM невозможно определить, что коннект разорвали. Поэтому вместо общего ACM и пользуются всякими хитрыми шнягами (вроде тех же PL2303, cp2102 и т.п.).
А, да: я наконец-то получил (всего лишь 3.5 месяца прошло, как купил на ибее) переходничок на cp2102. Посмотрю wireshark'ом, что там лезет, и если не слишком муторно (у ch340, эмулятор которого я хотел забацать после эмулятора pl2303, слишком черезжопный протокол оказался, лень стало делать), сделаю еще и эмуляцию cp2102.
Вообще, надо составное устройство попробовать запилить, эмулирующее два преобразователя usb-uart. Вдруг такое извращение когда-нибудь понадобится...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: USB CDC ACM
СообщениеДобавлено: 19 янв 2019, 04:13 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 692
dev писал(а):
Не, разрыв соединения с хостом более-менее прост. А вот разрыв соединения со слушателем на хосте - непонятно.

У UART в принципе нет контроля разрыва со слушателем, для этого есть таймаут. Остальное реализуется протоколом.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: USB CDC ACM
СообщениеДобавлено: 19 янв 2019, 04:18 
Старожил
Аватара пользователя

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 681
Откуда: Германия
У UART этой проблемы нет - если никто не слушает, то данные просто уйдут в пустоту. Хочется добиться того же от CDC.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: USB CDC ACM
СообщениеДобавлено: 19 янв 2019, 04:32 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 692
dev писал(а):
У UART этой проблемы нет - если никто не слушает, то данные просто уйдут в пустоту. Хочется добиться того же от CDC.

Зачем !?!?!?!? Если 3мс пакет не ушел, а SOF бегает исправно, значит провод подключен, никто не слушает. Ну или игнорируйте что пакет не ушел, считайте - ушел в пустоту !


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: USB CDC ACM
СообщениеДобавлено: 19 янв 2019, 04:53 
Старожил
Аватара пользователя

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 681
Откуда: Германия
Я же говорю - своими глазами видел паузы 20 мс, после чего пакет успешно забирали. И сколько теперь ждать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: USB CDC ACM
СообщениеДобавлено: 19 янв 2019, 05:04 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 692
Значит у вас программа на хосте тормозит. Откуда я знаю что у вас на хосте за программа ? Я обычно делаю обмен лимитированными пакетами с подтверждением, а что там у вас происходит я не знаю. К тому же как вам поможет если отправка будет уходить в никуда (UART версия) ? Хотя стоп, дело может быть не в программе на хосте, дело в том что если драйвер открыт то он должен все равно пакет принять и закешировать, пока программа не вызовет функцию read. А вообще что у вас за система на хосте ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: USB CDC ACM
СообщениеДобавлено: 19 янв 2019, 05:11 
Старожил
Аватара пользователя

Зарегистрирован: 06 ноя 2013, 16:07
Сообщения: 681
Откуда: Германия
Это был линукс в виртуалке под виндой. В нем простой cat, который точно не тормозит на таких скоростях. Драйвер без потребителя, сам по себе, точно ничего не читает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: USB CDC ACM
СообщениеДобавлено: 19 янв 2019, 05:14 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 692
dev писал(а):
Это был линукс в виртуалке под виндой. В нем простой cat, который точно не тормозит на таких скоростях. Драйвер без потребителя, сам по себе, точно ничего не читает.

что значит "без потребителя" ? У вас девайс открыт или нет ? Открой терминалом - допустим screen и посылай всякие символы, должны отображаться на экране.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 62 ]  На страницу 1, 2, 3  След.


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB