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

Много виртуальных UART

Добрый день

 

Ну не то, чтоб я ноль прям в Linux :) около того

 

Но надо - значит надо.

Есть задача такая: некий драйвер реализует в системе несколько виртуальных UART. Внешняя связь у него через один существующий - ttyS0

Драйвер от каждого виртуального UART собирает данные, заворачивает в обертку и отправляет в ttyS0

Оттуда же принимает завернутые данные и "рассовывает" по буферам соответствующих виртуальных UART

 

Я так понимаю, мне не хватает знаний для:

 

1. Зарегистрировать имя в дереве устройств

2. Интерфейс драйвера UART для системы

3. Таймер для сбора данных из виртуальных портов

 

Поможите примерами, люди добрые

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


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

Гость nill
Поможите примерами, люди добрые

Давайте, я Вам лучше удочку дам. Драйверы tty описаны в LDD, глава 18. В главе 7 есть про ядерные таймеры. Но если очень хочется примеров, то что-то дожно быть в дереве исходников в /drivers/tty.

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


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

Есть задача такая: некий драйвер реализует в системе несколько виртуальных UART. Внешняя связь у него через один существующий - ttyS0

...

1. Зарегистрировать имя в дереве устройств

2. Интерфейс драйвера UART для системы

3. Таймер для сбора данных из виртуальных портов

Если вы заворачиваете все потоки в /dev/ttyS0, то вам сам интерфейс UART в ядре и не нужен... (это что-то типа самопального MODBUS?)

Поможите примерами, люди добрые

Я здесь рядом давал уже ссылку: Практикум по Linux Kernel.

Там полно примеров и др. вещей вам нужных для этой затеи.

 

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


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

Проясните, пожалуйста, такой момент. Нашел я на просторах 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

 

Куда еще можно копнуть?

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


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

Куда еще можно копнуть?

В направлении udev rules.

Вкратце - в современных линуксах сам по себе модуль ядра, загруженный в память, ещё ни к чему систему не обязывает (вызывать все его функции) - ОС должна "понять", что устройство, для которого загружен модуль ядра, есть (появилось) в системе.

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

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


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

Вкратце - в современных линуксах сам по себе модуль ядра, загруженный в память, ещё ни к чему систему не обязывает (вызывать все его функции) - ОС должна "понять", что устройство, для которого загружен модуль ядра, есть (появилось) в системе.

Совершенно не обязательно - это всё зависит от того, как написан код самого модуля.

udev/sysfs используется достаточно многими модулями ядра, но далеко не всеми, и это совсем не обязательно.

 

 

Нашел я на просторах tiny_serial, взял за основу

Компилируется, после пересборки ядра даже не ругается и загружается. Появляется новое tty-устройство так, как я его и обозвал

Но! Понатыканные мной сообщения printk в dmesg не вижу.

Какой уровень диагностики у вас указан в printk()?

(нужно не на пальцах рассказывать, а хотя бы 2-3-5 строчек с этим свои printf() показывать)

Вы выполняет загрузку в графическом терминале? - выполните её в текстовой консоли.

 

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


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

Значится так... Я тут нагуглил tty0tty - виртуальные порты, "соединенные" между собой. Вот уже и становится понятно, почему у меня "нихт"

Нужно и управляющие сигналы нормально обрабатывать (похоже, не стоит надеяться на то, будут там всякие RTS/CTS, DSR/DTR использоваться или нет, программно лучше сделать)

да и сам TTY драйвер явно приводится к TTY_DRIVER_TYPE_SERIAL и SERIAL_TYPE_NORMAL

В общем пример абсолютно рабочий, буду путем выбрасывания лишнего вкорячивать свой функционал :)

 

 

не надо никаких самописных модулей ядра.

гуглите "socat virtual serial port"

видел

и как мне со всем этим городить обертки для работающего железа за малиной?

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


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

UPD

Товарищи, вот какой вопрос возник. Правильно ли будет забирать из драйвера данные физического порта, обрабатывать и рассовывать по виртуальным системным таймером?

Или для подобных действий нужен специальный механизм (драйвер-то сам по себе не дергается, по сути, его "теребят" пользовательские приложения, а забирать данные нужно)

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


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

Товарищи, вот какой вопрос возник. Правильно ли будет забирать из драйвера данные физического порта, обрабатывать и рассовывать по виртуальным системным таймером?

ИМХО, это неправильно, будить систему по каждому тику таймера, а не по приходу данных.

Вообще, драйвер на уровне ядра тут лишний (как уже указывалось выше). Задача решается в userspace обычным демоном, который создает нужное вам количество char devices, после чего блокируется на read() из физического порта. Все пришедшие из "виртуальных" портов данные он пишет в физический порт, и наоборот, пришедшие из физического порта парсит, и рассовывает по "виртуальным".

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


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

ИМХО, это неправильно, будить систему по каждому тику таймера, а не по приходу данных.

Вообще, драйвер на уровне ядра тут лишний (как уже указывалось выше). Задача решается в userspace обычным демоном, который создает нужное вам количество char devices, после чего блокируется на read() из физического порта. Все пришедшие из "виртуальных" портов данные он пишет в физический порт, и наоборот, пришедшие из физического порта парсит, и рассовывает по "виртуальным".

не нашел, все примеры в kernel space :(

или мой гугель сломался

с другой стороны, если драйвер будет совершать по таймеру очень короткое действие раз эдак в 10мс, что с того?

у меня ж еще вот какая загвоздка - создаваемые порты должны быть вполне себе полноценными, со всякими ioctl(), ибо на них будет садиться и звонилка модемная и еще вещи

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


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

с другой стороны, если драйвер будет совершать по таймеру очень короткое действие раз эдак в 10мс, что с того?

у меня ж еще вот какая загвоздка - создаваемые порты должны быть вполне себе полноценными, со всякими ioctl(), ибо на них будет садиться и звонилка модемная и еще вещи

Как-то мне всё это видится: самомнения - полные штаны, а умений - кот наплакал :1111493779:

 

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


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

Как-то мне всё это видится: самомнения - полные штаны, а умений - кот наплакал :1111493779:

В первом посте я обрисовал ситуацию. А самомнение у Вас, похоже

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


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

Нужно больше читать, и меньше писать херни.

Подсказать советом религия не позволяет? Такое ощущение, что Вы со всеми знаниями родились сразу, вся нужная литература была при рождении сразу привязана к заднице и помощь и советы вообще не требовались, так?

И речь была одномоментно поставлена правильно?

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


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

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

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

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

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

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

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

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

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

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