LINUX.ORG.RU

Эмуляция COM-порта


0

0

Чего-то я никак не пойму как сделать такую вещь: необходимо сделать драйвер устройства по поведению напоминающий COM-порт. (то-есть чтобы при подсоывании файла этого устройства терминалкам они ничего не замечали).

ioctl-ы можно игнорировать.

Не могу добиться того, чтобы например комманда cat /dev/drv не выходя ждала пока не поступят новые данные. Получается или непрерывно выдается одно и то-же или он выходит сразу после выдачи.

Есть пример такого минимального драйвера? Ковыряться в исходниках ядра нет времени :(

★★★★

тебе нужен псевдотерминал. програмно можно отличить от ком-порта только по имени нативного девайса если он создан при помощи devfs

cvv ★★★★★
()
Ответ на: комментарий от cvv

Как это программно использовать?

И вообще как создать файл из которго может читаться скажем long-и. Но читаться они должны по мере их появления. Все остальное время cat /dev/xxx должен блокироваться,но не выходить.

alexru ★★★★
() автор топика
Ответ на: комментарий от alexru

>Все остальное время cat /dev/xxx должен блокироваться,но не выходить. это зависит большей частью от cat чем от девайса.

Хотя можешь попробовать при помощи setserial И stty

cvv ★★★★★
()
Ответ на: комментарий от cvv

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

cvv ★★★★★
()
Ответ на: комментарий от cvv

Задача такая: создать драйвер, который работал-бы так: делаю в одном окне терминада cat /dev/drv. В другом echo "123" > /dev/drv. И хочу видеть это 123 в том терминале.

alexru ★★★★
() автор топика
Ответ на: комментарий от alexru

Вот задача более корректно:

gpio.dhdl = open(dfile, O_RDWR); gpio.dhdl_nb = open(dfile, O_RDWR);

fflags = fcntl(gpio.dhdl_nb, F_GETFL); fflags |= O_NONBLOCK; fcntl(gpio.dhdl_nb, F_SETFL, fflags);

Таким образом нужно, в драйвере отличить блокирующий режим или нет. И работать соответвенно в блокирующем или нет режиме.

Проблема - как сделать блокирующий режим?

alexru ★★★★
() автор топика
Ответ на: комментарий от alexru

>Задача такая: создать драйвер, который работал-бы так: делаю в одном окне терминада cat /dev/drv. В другом echo "123" > /dev/drv. И хочу видеть это 123 в том терминале.

если задача именно в этом то этот и есть псевдо терминал.

ЗЫ: для портов/псевдотерминалов есть свой аналог cat. имени не помню

cvv ★★★★★
()
Ответ на: комментарий от cvv

но ему не нужен блокирующий режим

а ещё для етой же цели можно/проще юзать unix-сокеты но их набор ioctl отличается от ком порта

cvv ★★★★★
()
Ответ на: комментарий от cvv

Тут упоминание COM-порта вводит в заблуждение.

Это я пишу эмулятор одной железки. Программа на той железке обращается к 
файлам устройств /dev/gpio и работает с ним функциями open, read, write, close.

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

Грубо говоря я хочу чтобы работало такое:

        int e;
        int data, size;

        e = open("/dev/gpio", O_RDWR);
        while (1) {
                size = read(e, &data, sizeof(int)); // чтение должно быть блокирующим
                // сюда попадаем, если есть данные
        };

alexru ★★★★
() автор топика
Ответ на: комментарий от alexru

>и работает с ним функциями open, read, write, close.

если iopctl не пользует вообще то я бы юзал unix-сокеты. помоемому так проще. ибо в этом случае сэмулировать железку можно даже на баше

cvv ★★★★★
()
Ответ на: комментарий от cvv

Так я не могу уже ничего менять. Или я не понял? Программа которая отлаживается (которая использует open, read, write, close) не может меняться. (так как железку я не могу поменять).

alexru ★★★★
() автор топика
Ответ на: комментарий от alexru

кажись ты меня не понял:

тебе надо создать unix-сокет в который с одной стороны будет стучатся твоя программа а с другой стороны - программа которая отлаживается при этом программа которая отлаживается не заметит что ты ей подсунул сокет вместо /dev/gpio

cvv ★★★★★
()
Ответ на: комментарий от cvv

Был-бы идеальный вариант. Раньше с с окетами не работал. По какми ключевым словам искать?

alexru ★★★★
() автор топика

Можно попробовать так:

Записались данные в девайс, был вызван обработчик write из file_operations, выставить флажек какойнить типа глобальной переменной в драйвере вроде static int new_data_available, данные прочитаны read, сбросить флажок. Но это самое элементарное, может еще чтото можно придумать.

SatanClaus ★★★
()
Ответ на: комментарий от SatanClaus

А по поводу ожидания есть такие штуки как wait_event_interruptible и wakeup_interruptible

SatanClaus ★★★
()
Ответ на: комментарий от binr

обычные пайпы не катят по причине отсутствия привязки к файловой системе

именованные - по причине однонаправленности

cvv ★★★★★
()
Ответ на: комментарий от alexru

> Задача такая: создать драйвер, который работал-бы так: делаю в одном окне терминада cat /dev/drv. В другом echo "123" > /dev/drv. И хочу видеть это 123 в том терминале.

man mkfifo

lg ★★
()
Ответ на: комментарий от cvv

man 7 unix

если что-то не покатит тогда кроме псевдотерминалов ничё не остаётся но лезть в ядро думаю не стоит

cvv ★★★★★
()
Ответ на: комментарий от lg

>> Задача такая: создать драйвер, который работал-бы так: делаю в одном окне терминада cat /dev/drv. В другом echo "123"

>> /dev/drv. И хочу видеть это 123 в том терминале.

>man mkfifo

не катит - человеку требуется двунаправлненная связь. насколько я знаю fifo такого не обеспечивает

cvv ★★★★★
()
Ответ на: комментарий от cvv

> не катит - человеку требуется двунаправлненная связь. насколько я знаю fifo такого не обеспечивает

плохо знаешь

lg ★★
()
Ответ на: комментарий от lg

>> не катит - человеку требуется двунаправлненная связь. насколько я знаю fifo такого не обеспечивает

>плохо знаешь

возможно тогда это лучший вариант.

cvv ★★★★★
()
Ответ на: комментарий от cvv

>> не катит - человеку требуется двунаправлненная связь. насколько я знаю fifo такого не обеспечивает

>плохо знаешь

man fifo такой информации не содержит что ещё порекомендуете???

cvv ★★★★★
()
Ответ на: комментарий от cvv

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

lg ★★
()
Ответ на: комментарий от cvv

Спасибо всем.

mkfifo помог. И для ком портов тоже. И ioctl-ы нормально воспринимает.

PS: man mkfifo PPS: linux рулит, как бы банально это не было сказано :)

alexru ★★★★
() автор топика
Ответ на: комментарий от binr

>Разве не бывает двусторонних пайпов обычные пайпы всегда односторонние (симплексные) fifo со слов lg полудуплексные

>и других средств ОС? а разве сокеты не относятся к "другим средствам ОС". в основном они и есть дуплексными

ещё есть псевдо терминалы но они часто-густо пользуются в симплекном режиме хотя по теории должны нормально тянуть полный дуплекс

cvv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.