|
Много виртуальных UART, RPi3 |
|
|
|
Apr 12 2017, 16:28
|

Гуру
     
Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514

|
Добрый день Ну не то, чтоб я ноль прям в Linux  около того Но надо - значит надо. Есть задача такая: некий драйвер реализует в системе несколько виртуальных UART. Внешняя связь у него через один существующий - ttyS0 Драйвер от каждого виртуального UART собирает данные, заворачивает в обертку и отправляет в ttyS0 Оттуда же принимает завернутые данные и "рассовывает" по буферам соответствующих виртуальных UART Я так понимаю, мне не хватает знаний для: 1. Зарегистрировать имя в дереве устройств 2. Интерфейс драйвера UART для системы 3. Таймер для сбора данных из виртуальных портов Поможите примерами, люди добрые
|
|
|
|
|
Apr 13 2017, 06:29
|
Частый гость
 
Группа: Validating
Сообщений: 124
Регистрация: 10-08-05
Пользователь №: 7 502

|
Цитата(toweroff @ Apr 12 2017, 23:28)  Поможите примерами, люди добрые Давайте, я Вам лучше удочку дам. Драйверы tty описаны в LDD, глава 18. В главе 7 есть про ядерные таймеры. Но если очень хочется примеров, то что-то дожно быть в дереве исходников в /drivers/tty.
|
|
|
|
|
Apr 13 2017, 08:17
|
Местный
  
Группа: Свой
Сообщений: 351
Регистрация: 11-09-05
Из: Харьков
Пользователь №: 8 458

|
Цитата(toweroff @ Apr 12 2017, 19:28)  Есть задача такая: некий драйвер реализует в системе несколько виртуальных UART. Внешняя связь у него через один существующий - ttyS0 ... 1. Зарегистрировать имя в дереве устройств 2. Интерфейс драйвера UART для системы 3. Таймер для сбора данных из виртуальных портов Если вы заворачиваете все потоки в /dev/ttyS0, то вам сам интерфейс UART в ядре и не нужен... (это что-то типа самопального MODBUS?) Цитата(toweroff @ Apr 12 2017, 19:28)  Поможите примерами, люди добрые Я здесь рядом давал уже ссылку: Практикум по Linux Kernel. Там полно примеров и др. вещей вам нужных для этой затеи.
|
|
|
|
|
Apr 18 2017, 11:47
|

Гуру
     
Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514

|
Проясните, пожалуйста, такой момент. Нашел я на просторах tiny_serial, взял за основу Компилируется, после пересборки ядра даже не ругается и загружается. Появляется новое tty-устройство так, как я его и обозвал Но! Понатыканные мной сообщения printk в dmesg не вижу. В частности, вот такая структура: Код static struct uart_ops tiny_ops = { .tx_empty = tiny_tx_empty, .set_mctrl = tiny_set_mctrl, .get_mctrl = tiny_get_mctrl, .stop_tx = tiny_stop_tx, .start_tx = tiny_start_tx, .stop_rx = tiny_stop_rx, .enable_ms = tiny_enable_ms, .break_ctl = tiny_break_ctl, .startup = tiny_startup, .shutdown = tiny_shutdown, .set_termios = tiny_set_termios, .type = tiny_type, .release_port = tiny_release_port, .request_port = tiny_request_port, .config_port = tiny_config_port, .verify_port = tiny_verify_port, }; в .startup занесен правильный адрес, но функция не вызывается. Наткнулся на упоминание http://stackoverflow.com/questions/3705814...-being-executedпоправил .type, но все равно ноль реакции minicom запускается, но пишет offline Куда еще можно копнуть?
|
|
|
|
|
Apr 18 2017, 13:58
|
Знающий
   
Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088

|
Цитата(toweroff @ Apr 18 2017, 14:47)  Куда еще можно копнуть? В направлении udev rules. Вкратце - в современных линуксах сам по себе модуль ядра, загруженный в память, ещё ни к чему систему не обязывает (вызывать все его функции) - ОС должна "понять", что устройство, для которого загружен модуль ядра, есть (появилось) в системе. Вторая возможная причина, по которой может не работать ваш драйвер - для устройства уже есть драйвер в составе ядра или среди загруженных модулей.
--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
|
|
|
|
|
Apr 18 2017, 14:20
|
Местный
  
Группа: Свой
Сообщений: 351
Регистрация: 11-09-05
Из: Харьков
Пользователь №: 8 458

|
Цитата(gerber @ Apr 18 2017, 16:58)  Вкратце - в современных линуксах сам по себе модуль ядра, загруженный в память, ещё ни к чему систему не обязывает (вызывать все его функции) - ОС должна "понять", что устройство, для которого загружен модуль ядра, есть (появилось) в системе. Совершенно не обязательно - это всё зависит от того, как написан код самого модуля. udev/sysfs используется достаточно многими модулями ядра, но далеко не всеми, и это совсем не обязательно. Цитата(toweroff @ Apr 18 2017, 14:47)  Нашел я на просторах tiny_serial, взял за основу Компилируется, после пересборки ядра даже не ругается и загружается. Появляется новое tty-устройство так, как я его и обозвал Но! Понатыканные мной сообщения printk в dmesg не вижу. Какой уровень диагностики у вас указан в printk()? (нужно не на пальцах рассказывать, а хотя бы 2-3-5 строчек с этим свои printf() показывать) Вы выполняет загрузку в графическом терминале? - выполните её в текстовой консоли.
|
|
|
|
|
Apr 18 2017, 16:15
|

Гуру
     
Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514

|
Значится так... Я тут нагуглил tty0tty - виртуальные порты, "соединенные" между собой. Вот уже и становится понятно, почему у меня "нихт" Нужно и управляющие сигналы нормально обрабатывать (похоже, не стоит надеяться на то, будут там всякие RTS/CTS, DSR/DTR использоваться или нет, программно лучше сделать) да и сам TTY драйвер явно приводится к TTY_DRIVER_TYPE_SERIAL и SERIAL_TYPE_NORMAL В общем пример абсолютно рабочий, буду путем выбрасывания лишнего вкорячивать свой функционал  Цитата(krux @ Apr 18 2017, 17:36)  не надо никаких самописных модулей ядра. гуглите "socat virtual serial port" видел и как мне со всем этим городить обертки для работающего железа за малиной?
|
|
|
|
|
Apr 19 2017, 10:31
|
Знающий
   
Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088

|
Цитата(toweroff @ Apr 18 2017, 20:19)  Товарищи, вот какой вопрос возник. Правильно ли будет забирать из драйвера данные физического порта, обрабатывать и рассовывать по виртуальным системным таймером? ИМХО, это неправильно, будить систему по каждому тику таймера, а не по приходу данных. Вообще, драйвер на уровне ядра тут лишний (как уже указывалось выше). Задача решается в userspace обычным демоном, который создает нужное вам количество char devices, после чего блокируется на read() из физического порта. Все пришедшие из "виртуальных" портов данные он пишет в физический порт, и наоборот, пришедшие из физического порта парсит, и рассовывает по "виртуальным".
--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
|
|
|
|
|
Apr 19 2017, 13:04
|

Гуру
     
Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514

|
Цитата(gerber @ Apr 19 2017, 13:31)  ИМХО, это неправильно, будить систему по каждому тику таймера, а не по приходу данных. Вообще, драйвер на уровне ядра тут лишний (как уже указывалось выше). Задача решается в userspace обычным демоном, который создает нужное вам количество char devices, после чего блокируется на read() из физического порта. Все пришедшие из "виртуальных" портов данные он пишет в физический порт, и наоборот, пришедшие из физического порта парсит, и рассовывает по "виртуальным". не нашел, все примеры в kernel space  или мой гугель сломался с другой стороны, если драйвер будет совершать по таймеру очень короткое действие раз эдак в 10мс, что с того? у меня ж еще вот какая загвоздка - создаваемые порты должны быть вполне себе полноценными, со всякими ioctl(), ибо на них будет садиться и звонилка модемная и еще вещи
|
|
|
|
|
Apr 19 2017, 21:58
|
Местный
  
Группа: Свой
Сообщений: 351
Регистрация: 11-09-05
Из: Харьков
Пользователь №: 8 458

|
Цитата(toweroff @ Apr 19 2017, 22:14)  я обрисовал Нужно больше читать, и меньше писать херни.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|