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

Реализация USB->UART (CDC Class) под linux

Не доводилось ли кому гонять USB стэк от TI на семействе F55x под линуксом? Конкретно интересует реализация USB-UART интерфейсов.

 

1) Есть ли какой-нибудь аналог драйвера MSP430 USB Example, CDC device под линукс?

2) Из стандартных примеров TI вроде бы получается, что можно пытаться создать устройство на несколько интерфейсов CDC (поменять define), но дейскриптор устройтва там только про один интерфейс. Если его механически поменять, скажем, на 2, то возникает такая проблема, что endpoint у всех интерфейсов получается одинаковый. Отсюда второй вопрос (он, конечно, больше к USB specification относится, но все же), можно ли в принципе реализовать несколько портов на одном endpoint-е, или они должны быть разные? Насколько я смог понять, нонешний стек во всех функциях передает номер интерфейса, но реально он у меня всегда нулевой, если все интерфейсы настроены на один endpoint.

3) Можно ли экономить endpoint-ы для конфигурационных сообщений для нескольких портов, сделав один общий адрес для всех управляющих сообщений (set line coding etc)?

4) Бывают ли вообще стандартные реализации USB->UART на основе CDC class (drivers/usb/serial/usbserial.c), которым не нужно вообще ничего дополнительно в ядро вставлять? Пока что наблюдал модули для Silabs CP210x, FTDI, CH341, все они самостоятельно регистрируются в usbserial. Более того, CP210x и CH341 вообще сообщают изначально, что они не CDC.

 

 

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


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

Не доводилось ли кому гонять USB стэк от TI на семействе F55x под линуксом? Конкретно интересует реализация USB-UART интерфейсов.

 

1) Есть ли какой-нибудь аналог драйвера MSP430 USB Example, CDC device под линукс?

Есть такая штука MSP_USB_Descriptor_Tool , очень удобная. Для одного CDC пробовал, работает под Вин (ХР - 8) и Линукс. А зачем куча CDC? Канал связи один.

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


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

Мне нужно, чтобы система видела два ком-порта в микроконтроллере, а не один. С ними будут работать разные приложения. Это может быть одно устройство CDC с двумя интерфейсами.

 

А с каким драйвером оно у Вас по линукс работает?

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


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

В системе выглядит так (Убунту)

Bus 008 Device 003: ID 0451:16a4 Texas Instruments, Inc. (Это CC2511F32 от TI)

видится как /dev/ttyACM0

Программа от TI создаёт дескриптор и скелет программы для композитного устройства, наверное 2 CDC тоже позволяет. Были проблемы с Вин8, Win требовала подписанный CDC драйвер (это было года 2,5 назад).

 

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


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

А с каким драйвером оно у Вас под линукс работает?

Насколько я разобрался в этом вопросе, поддержка CDC,HID,MSD встроена в Линуксе и Виндоуз. Но в Виндоузе начиная с Win8(или Win7_64) стали для CDC требовать подписанный inf файл.

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


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

Вот беру дерево от ядра 3.15. Каталог drivers. grep -r 16a4 * не выдает никаких признаков драйвера для TI. Что говорит о том, что драйвера под это устройство в системе нет. А драйвер drivers/usb/serial/usbserial.c никакие CDC устройства сам не определяет, пока их мини-драйвер не опознает по VID и PID. Поэтому я и спрашиваю, какой конкретно драйвер поддерживает вообще CDC устройства?

 

 

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


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

Поэтому я и спрашиваю, какой конкретно драйвер поддерживает вообще CDC устройства?

Почитайте стандарт на USB. Есть дескриптор устройства,там всё прописано, какие эндпойты,их размер , интервалы и тд. МК будет работать от USB прерывания, где указано,что чего и зачем. Это проблемы МК, засинхронизировать 2 -3 -4 асинхронных процесса. Для CDC устройства требуется только контрольная точка и дальше от версии USB-CDC. Ключевое слово - дескриптор. Там говорится, что устройство - CDC,AT-Modem , поддерживает команды Set/Get LineCoding, Set/Get LineState и тд. Всё есть в стандарте. Виндоуз и Линукс и Мак это поддерживают. Это всё нудно, но когда разберёшься, то просто.

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


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

Мне вот нужно сделать на самом деле мостик USB-UART. Все мостики такого типа, которые мне попались на глаза, на самом деле не являются CDC-устрйоствами и базируются на драйвере /drivers/usb/serial/usb-serial.c, регистрируются в линуксе как /dev/ttyUSBx. Сам класс CDC довольно таки обширен, и подразумевает более сложные интерфейсы, чем просто UART. В стандарте прописаны варианты CDC чуть ли не сетевых интерфейсов.

 

Тогда вопрос такой. Для реализации протого UART какой вариант правильней: через /drivers/usb/class/cdc-acm.c или через /drivers/usb/serial/usb-serial.c?

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

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


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

Тогда вопрос такой. Для реализации протого UART какой вариант правильней: через /drivers/usb/class/cdc-acm.c или через /drivers/usb/serial/usb-serial.c?

если я правильно понимаю, /dev/ttyUSBxx это CDC устройства от производителя( например FTDI ), а /dev/ttyACMxx это просто CDC устройства в соответствии со стандартом. И стандарт - набор устройств ,а он там широкий.

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


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

если я правильно понимаю, /dev/ttyUSBxx это CDC устройства от производителя( например FTDI )

Это вообще не CDC.

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


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

На самом деле я тему открыл после некоторых своих экспериментов в духе usb-serial.с и некоторого своего хелпера к нему по аналогии с cp210x.c. Начал с того, что просто поставил в заголовке USB_config/descriptors.h параметр CDC_NUM_INTERFACES равным 2, и оказалось, что usb-serial попытался сразу зарегистрировать два устройства: /dev/ttyUSB0 и /dev/ttyUSB1. Ну и далее я стал смотреть, как оно реагирует на попытки сделать что-нибудь вроде echo 123 > /dev/ttyUSB0. Параллельно сверял все это с USB specification и ее дополнением про USB CDC. И вот по мере углубления в процесс все навязчивее становилась мысль, что usb-serial - это не CDC, а что-то совсем другое, причем в каждом драйвере реализация функций управления терминалом вроде set/get line coding/state делается отдельными вызовами в своем стиле. Поэтому все драйверы в usb/serial/* цепляются только на конкретные VID и PID, которые соответствуют только их собственным контроллерам. Я попытался переставить VID и PID контроллера CDC из TI MSP430 USB Example на вариант Silabs CP2103, и в результате оно порты даже не подцепило, поскольку функция probe драйвера пытается какие-то baud rate и прочие параметры же на этапе инициализации провести, а у TI это все не поддерживается. Аналогично с CH341.

Я в своем модуле все эти проверки отрезал, и теперь он вполне нормально открывает устройство и засылает туда данные. И микроконтроллер видит и различает данные, записываемые в разные устройства. Правда пока не работает правильно на чтение, cat /dev/ttyUSB0 сначала молчит, а после записи в это устроство чего-нибудь сразу начинает читать без остановки. Хотя по смылу там для начала сделано простое эхо.

 

Но в целом пока не вполне ясно, какой путь правильный, и не является ли то, что я сейчас сделал (два интерфейса одного класса, но при этом это не композитное устройство), каким то хаком. Поэтому было бы интересно услышать ответы на поставленные вначале темы вопросы. Ну хотя бы вопросы 2 и 3, так как на 1 и 4, по-видимому ответил aaarrr, указав на драйвер usb/class/cdc-acm.c

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

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


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

Посмотрите мою заготовку USB-CDC: эта функция обрабатывает запросы, и реагирует на get/set linecoding.

Вообще, мне это было в другом проекте необходимо, чтобы организовать мост между третьей стороной, которая только UART умеет, и компом посредством STM32F103. Сам чип принимает команды только в определенном формате, все остальное насквозь проходит. А set/get linecoding был нужен для задания параметров третьей стороны.

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...