Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Реализация USB->UART (CDC Class) под linux
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
Hoodwin
Не доводилось ли кому гонять 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.

mcheb
Цитата(Hoodwin @ Jun 29 2016, 00:13) *
Не доводилось ли кому гонять USB стэк от TI на семействе F55x под линуксом? Конкретно интересует реализация USB-UART интерфейсов.

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

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

А с каким драйвером оно у Вас по линукс работает?
mcheb
В системе выглядит так (Убунту)
Bus 008 Device 003: ID 0451:16a4 Texas Instruments, Inc. (Это CC2511F32 от TI)
видится как /dev/ttyACM0
Программа от TI создаёт дескриптор и скелет программы для композитного устройства, наверное 2 CDC тоже позволяет. Были проблемы с Вин8, Win требовала подписанный CDC драйвер (это было года 2,5 назад).
Hoodwin
А с каким драйвером оно у Вас под линукс работает?
mcheb
Цитата(Hoodwin @ Jun 29 2016, 12:16) *
А с каким драйвером оно у Вас под линукс работает?

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

aaarrr
/drivers/usb/class/cdc-acm.c
mcheb
Цитата(Hoodwin @ Jun 29 2016, 17:59) *
Поэтому я и спрашиваю, какой конкретно драйвер поддерживает вообще CDC устройства?

Почитайте стандарт на USB. Есть дескриптор устройства,там всё прописано, какие эндпойты,их размер , интервалы и тд. МК будет работать от USB прерывания, где указано,что чего и зачем. Это проблемы МК, засинхронизировать 2 -3 -4 асинхронных процесса. Для CDC устройства требуется только контрольная точка и дальше от версии USB-CDC. Ключевое слово - дескриптор. Там говорится, что устройство - CDC,AT-Modem , поддерживает команды Set/Get LineCoding, Set/Get LineState и тд. Всё есть в стандарте. Виндоуз и Линукс и Мак это поддерживают. Это всё нудно, но когда разберёшься, то просто.
Hoodwin
Мне вот нужно сделать на самом деле мостик 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?
aaarrr
Если это виртуальный порт, а не мост, то вполне можно обойтись CDC.
mcheb
Цитата(Hoodwin @ Jun 29 2016, 20:22) *
Тогда вопрос такой. Для реализации протого UART какой вариант правильней: через /drivers/usb/class/cdc-acm.c или через /drivers/usb/serial/usb-serial.c?

если я правильно понимаю, /dev/ttyUSBxx это CDC устройства от производителя( например FTDI ), а /dev/ttyACMxx это просто CDC устройства в соответствии со стандартом. И стандарт - набор устройств ,а он там широкий.
aaarrr
Цитата(mcheb @ Jun 29 2016, 20:10) *
если я правильно понимаю, /dev/ttyUSBxx это CDC устройства от производителя( например FTDI )

Это вообще не CDC.
Hoodwin
На самом деле я тему открыл после некоторых своих экспериментов в духе 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
Эдди
Посмотрите мою заготовку USB-CDC: эта функция обрабатывает запросы, и реагирует на get/set linecoding.
Вообще, мне это было в другом проекте необходимо, чтобы организовать мост между третьей стороной, которая только UART умеет, и компом посредством STM32F103. Сам чип принимает команды только в определенном формате, все остальное насквозь проходит. А set/get linecoding был нужен для задания параметров третьей стороны.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.