9-битный протокол UART во встроенном Linux

Я пытаюсь настроить 9-битный протокол на UART во встроенном Linux. В настоящее время я тестирую это на плате am335x_evm. Я планирую сделать это, используя контроль четности. В идеале я надеялся, что мне не нужно будет изменять какой-либо код драйвера omap-serial.c.

Причиной использования 9-битного протокола является поддержка некоторого устаревшего оборудования, которое его использует. Бит четности должен быть равен 1 для адресной части сообщения, 0 для части данных, затем снова 1 для завершающего байта.

Я планировал запустить процесс в пользовательском пространстве, который будет взаимодействовать с UART через стандартные системные вызовы (open, write, read, ioctl, tcsetattr и т. д.). Я бы настроил UART, чтобы включить четность и установить четность флешки. Затем я установил бы четность на даже и вызвал бы write() для отправки данных моего адреса. Затем я бы установил четность на 0 и отправил данные. Меня беспокоит, если я изменю четность с 1 на 0, когда это повлияет? Если UART не отправляет все адресные данные, будет ли изменение четности применяться ко всем неотправленным данным?


person tpotter01    schedule 12.11.2014    source источник
comment
Это очень хорошие вопросы. Вы всегда можете очистить канал, но это приводит к небольшой задержке между вашим адресом и данными, которая может быть не понята вашими периферийными устройствами.   -  person Dima Tisnek    schedule 12.11.2014
comment
Флеш может быть не плохой идеей. Я буду иметь это в виду. Хотя насчет задержки вы правы. Получатели сообщения будут ждать только короткий период, прежде чем отказаться от того, что у них есть.   -  person tpotter01    schedule 12.11.2014
comment
Другой вариант — написать свой собственный серийный line discipline драйвер. Это не самая легкая вещь в мире, но и не самая сложная. Это позволяет вам отправлять сообщения в/из пользовательского пространства через ioctl (и, возможно, чтение/запись) по одному сообщению за раз, в отличие от потока байтов. Тогда у драйвера дисциплины будет больше доступа из пространства ядра. Этот подход также поможет вам в получении сообщений.   -  person Dima Tisnek    schedule 12.11.2014
comment
Что-то вроде этого должно было стать моим запасным вариантом. Чтобы использовать ioctl для отправки того, что мне нужно, в драйвер uart, тогда на этом более низком уровне у меня будет больше контроля.   -  person tpotter01    schedule 12.11.2014
comment
@qarma - написать свой собственный драйвер дисциплины последовательной линии... (и) отправлять сообщения в/из пользовательского пространства через ioctl -- Если вы используете дисциплину линии, то злоупотребление ioctl() не будет работать, потому что это нарушает линейную дисциплину.   -  person sawdust    schedule 13.11.2014
comment
Без UART, поддерживающего 9-битную передачу, вы могли бы придумать схему для передачи 8 бит данных плюс принудительная четность 0 или 1 в качестве 9-го бита данных. Но получение намного сложнее, потребует модификации драйвера, потребует запрограммированного ввода-вывода (т.е. без DMA) и потребует приостановки передачи во время приема. Упрощенное описание находится по адресу digital.ni.com/public.nsf/allkb/. .   -  person sawdust    schedule 13.11.2014
comment
Общие ioctl @sawdust могут обрабатываться уровнем tty, но возможны и пользовательские ioctl, вот пример lxr.free-electrons.com/source/drivers/tty/n_r3964.c#L1183 (только пример, тот модуль, код которого старый, сломанный и откровенно ужасный, лучше используйте другой n_xxx. в)   -  person Dima Tisnek    schedule 13.11.2014


Ответы (2)


Закончилось тем, что я написал свой собственный 9-битный драйвер uart. Было самым простым и эффективным решением.

person tpotter01    schedule 17.12.2014
comment
Не могли бы вы поделиться источником с сообществом, пожалуйста? Я тоже хочу использовать 9-битный uart, и, кажется, в мире тоже много людей! - person asiniy; 27.03.2015
comment
Ага, здесь же. Это было бы круто - person pdel; 31.03.2015
comment
Мне также очень любопытно увидеть это, я пытался это сделать, и я понял, что Tx, я думаю, но Rx кажется намного сложнее, или я упускаю из виду что-то тривиальное ... любое руководство было бы удивительным. ! - person While-E; 18.05.2015

Правильный способ - установить cs9 на ваш последовательный порт (и, возможно, без четности), при условии, что оборудование и драйвер поддерживают это.

Я поищу для вас ссылку...

person Dima Tisnek    schedule 12.11.2014
comment
Спасибо, однако UART на чипе TI Sitara (тот, что на avm335X_evm) не поддерживает CS9. Вот почему я пытаюсь пойти по пути паритета палки. - person tpotter01; 12.11.2014