Перейти к содержанию

    

Composite CDC ACM

Добрый день.

 

Есть задачка под STM32407 на FS порту (3 in EP + 3 out EP + EP0) сделать два или даже лучше три последовательных порта. И чтобы работало без самописных драйверов.

Т.е. композитное устройство из...

 

1. CDC ACM в классическом варианте "не влезает", т.к. используется 1 Bulk in + 1 Bulk out + 1 Interrupt EP.

Покурил стандарт - Interrupt EP опциональная. Т.е. вроде как хватит и двух EP на интерфейс.

Но тут же наступил на грабли - линуксовый драйвер такие устройства отфутболивает. Подавай ему Interrupt EP на Control Interface или иди нафиг.

 

2. Под линуксом можно использовать кого-нить из http://elixir.free-electrons.com/linux/lat...vers/usb/serial , например http://elixir.free-electrons.com/linux/lat...erial/generic.c но непонятно как он будет работать под виндами. Чужой драйвер подтягивать не хочется.

 

Может есть у кого какие-то идеи?

Можно ли заиспользовать одну Interrupt EP в двух интерфейсах? Вроде как нет.

Один Control Interface к двум Data Interface в CDC тоже не прицепить.

 

В общем приветствуются любые идеи.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Один Control Interface к двум Data Interface в CDC не стоит делать. он не занимает ендпоинтов.

 

Вот вам образец как делается два например CDC.

 

Целиком проект тут

https://188.134.5.254/browser/trunk

 

Отсутствие Interrupt endpoint мешает работать под windows xp и 7-кой. под W10 работает.

192_kHz_descriptor.pdf

usb.zip

Изменено пользователем Genadi Zawidowski

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Один Control Interface к двум Data Interface в CDC не стоит делать. он не занимает ендпоинтов.

 

Вот вам образец как делается два например CDC.

 

Целиком проект тут

https://188.134.5.254/browser/trunk

 

Отсутствие Interrupt endpoint мешает работать под windows xp и 7-кой. под W10 работает.

Большое спасибо за информацию! Исходники изучу подробно вечером.

К сожалению отсутствие Interrupt Endpoint мешает работать и под Linux http://elixir.free-electrons.com/linux/v4....cdc-acm.c#L1287 . Кто-то решил "исправить" https://lkml.org/lkml/2012/9/9/192 . Для меня Линукс основная ОС.

Для себя то я могу это поправить, но не будешь же это обьяснять другим пользвателям.

Семерка и ХР, я думаю, мало у кого остались.

Но все же хочется иметь более-менее беспроблемный вариант. Видимо не зря со всякими FreeRTOS и ChibiOS идут примеры с Int EP, хотя никаких уведомлений через нее не ходит.

 

Если задать несколько конфигураций. Предположим первая: CDC + CDC + CDC без Int EP, а вторая: CDC с Int EP ("резервный" вариант), будет ли операционная система перебирать конфигурации пока не найдет устраивающую ее? Не совсем понимаю механизм переключения конфигураций.

 

Или, может быть, можно как-то со стороны устройства определить тип ОС? Хотя что-то сомневаюсь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А встречал кто нибудь реализацию виртуального хаба? чтобы через его интерфейс можно было цеплять произвольное количество девайсов?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я ендпоинты нотификационные назначал на несуществующие номера. На один всех нельзя. Увидите в исходниках.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
А встречал кто нибудь реализацию виртуального хаба? чтобы через его интерфейс можно было цеплять произвольное количество девайсов?

Сомневаюсь что такое возможно. У каждого устройства есть адресс. Чтобы эмулировать несколько надо откликаться на несколько. Я такого не видел.

 

я ендпоинты нотификационные назначал на несуществующие номера. На один всех нельзя. Увидите в исходниках.

Спасибо. Т.е. девайс будет слать NACK при обращении к ним? И все будет как бы верно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Насчет альтернативных конфигураций в CDC кажется и не предполагается...

Т.е. девайс будет слать NACK при обращении к ним? И все будет как бы верно?

Девайс не может слать NAK с отсутствующего EP, там таймаут просто... хотя надо смотреть, у меня уже не работает usblyzer. Критерий что все нормально - если работает через USB HUB, многие вещи допустимые при прямом соединении не работают через HUB.

 

Кстати, у F7 endpoints больше чем у F4

ps: в питере можно и лично повидаться.

Изменено пользователем Genadi Zawidowski

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Насчет альтернативных конфигураций в CDC кажется и не предполагается...

 

Девайс не может слать NAK с отсутствующего EP, там таймаут просто... хотя надо смотреть, у меня уже не работает usblyzer. Критерий что все нормально - если работает через USB HUB, многие вещи допустимые при прямом соединении не работают через HUB.

 

Кстати, у F7 endpoints больше чем у F4

ps: в питере можно и лично повидаться.

Я имел в виду конфигурации устройства. Те что в Configuration Descriptor. Обычно он один, не очень представляю логику хоста по выбору из нескольких.

Надо будет почитать спеку, что же делает девайс если нет контрольной точки. Вроде как Int точки опрашиваются с заданным интервалом. Расточительно ждать таймаут. А вообще красивое решение. :)

Да. Про Ф7 знаю. И про HS порт у 407го. Но таковы реалии проекта. Кстати вот этого http://rusefi.com Может быть осилю свою версию с STM32F7xx, но пока на стадии рисования железа завис.

Можно. Раньше вроде были какие-то встречи посетителей electronix.ru . Потом я лет так на 5 выпал. Ну в любом случае с меня пиво! :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вроде заработало под Линуксом. Правда если включить отладочную информацию от модуля cdc_acm то он сыплет ошибками по несузествующим EP. Но на работу не влияет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация