Linux: как передавать данные через USB-конечную точку драйвера cdc-adm из пользовательского пространства

Я новичок в драйверах для Linux и начал с написания приложения для USB-устройства на основе cdc-acm в Linux. Поэтому я использовал драйвер cdc_acm. USB-устройство, которое я использую, имеет 2 конечные точки Bulk (чтение и запись) и одну конечную точку прерывания.

Теперь мой вопрос заключается в том, работают ли все эти конечные точки с одним и тем же файлом /dev/ttyACM0, и как вызов записи в этот файл tty преобразуется в вызов acm_write_bulk fops?

Если я запишу данные для запуска функции USB в файл ttyACM0, будут ли данные отправлены через конечную точку массовой рассылки? Или как мне отправить данные на массовую конечную точку непосредственно из пользовательского пространства. Должен ли я писать какой-либо поддерживающий драйвер в пространстве ядра? Точно так же, как мне прочитать данные из конечной точки прерывания в пользовательском пространстве?

Я ценю вашу помощь заранее.


person surya prakash    schedule 26.02.2020    source источник


Ответы (1)


Нет необходимости писать драйвер пространства ядра. Вы можете открыть /dev/ttyACM0 с помощью системного вызова open, задать для него параметры с помощью termios (необязательно), а затем используйте системные вызовы read и write для чтения и записи больших объемов данных с вашего устройства. К этим системным вызовам проще всего получить доступ из C и C++, но в большинстве языков есть библиотека, которую можно использовать для доступа к последовательным портам.

Я не знаю отличного способа чтения данных из конечной точки прерывания в Linux, но вы можете, по крайней мере, заглянуть в ioctl TIOCMGET, TIOCGICOUNT и TIOCMIWAIT, которые вам действительно нужны.

Интерфейс последовательного порта Linux абстрагирует все подробности о USB, конечных точках и массовых передачах, поэтому вы можете использовать более простой и абстрактный API для связи с последовательным портом. Фактически, вы можете использовать один и тот же код для любого типа последовательного порта, независимо от того, какой драйвер ядра реализует последовательный порт. Вам может помочь поиск в Интернете таких вещей, как "программирование последовательного порта linux" или "программирование последовательного порта posix", чтобы понять больше о том, как это сделать.

Если вам действительно интересно, как работает драйвер Linux CDC ACM и как он преобразует системный вызов write в соответствующую передачу USB, вы можете прочитать источник драйвера cdc-acm. Однако это намного больше, чем просто использование последовательного порта.

person David Grayson    schedule 26.02.2020