Ядро, драйвер и ком порт, tty_drivers (Ком порт из ядра)

Взгляд изнутри

Модератор: Модераторы разделов

Rocky
Сообщения: 7
ОС: Suse 10, WXP

Ядро, драйвер и ком порт, tty_drivers

Сообщение Rocky »

Здравствуйте.
Я хочу написать драйвер, работающий с последовательным портом. Нужно навесить протокол на ком порт и отобразить его в файловую систему.
Т.е. множество устройств подключенных к одному порту (RS485) должны отобразиться в виде отдельных файлов.
Написание дисциплины и FIFO тут неподходит (ИМХО).
Значит работаем напрямую с драйвером нужного порта...?

Я на правильном пути?

Проблема №1 получить список всех доступных портов в модуле. После длительного изучения мануалов и исходников (кстати, в большинстве мануалов на эту тему, сразу посылают изучать исходники ... а что там смотреть? /drivers/serial ? начинающему это непросто ...) остановился на следующем.

1. драйвера последовательных портов помещенны в список tty_drivers (для меня это было не просто узнать)
2. найти нужный порт можно по имени, которое храниться в структуре драйвера - tty_driver->name

Решил вывести весь список имен драйверов
привожу обрезанный исходник кода, если попросите выложу все ...
/////////////////////////////////////////начало/////////////////////////////////////////
#include <linux/tty.h> // итак понятно
#include <linux/list.h> // для работы со списками (драйверов)
#include <linux/tty_driver.h> // можно не включать?
*********************************
static int tty_hw_init_module(void)
{
struct tty_driver *p;
list_for_each_entry(p,&tty_drivers,tty_drivers); // перебераем все элементы
{
printk(KERN_INFO "%s\n",p->name ); // и выводим /var/log/messages
}
return 0;
}
*************************************
/////////////////////////////////////////конец/////////////////////////////////////////

Скомпилировалось все отлично,
но при инсталяции модуля (insmod tty_hw-driver.ko) выдается ошибка
insmod: error inserting 'tty_hw-driver.ko': -1 Unknown symbol in module
Мне кажется невоспринимается tty_drivers.

Как мне это обойти или исправить?

Посоветуйте пожалуйста ...
И исправьте где можете ...
Заранее благодарен.
П.С. Жду ваших коментариев.
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Ядро, драйвер и ком порт, tty_drivers

Сообщение elide »

используй FUSE и сиди в userspace.
это проще и гораздо беспроблемней.
слава роботам!
Спасибо сказали:
Аватара пользователя
BlackStar
Сообщения: 1338
Статус: We are all Kosh
ОС: Fedora 10

Re: Ядро, драйвер и ком порт, tty_drivers

Сообщение BlackStar »

Показывай весь код (желательно приаттачить).
LightLang Team
Спасибо сказали:
Rocky
Сообщения: 7
ОС: Suse 10, WXP

Re: Ядро, драйвер и ком порт, tty_drivers

Сообщение Rocky »

Попробовал Fuse - впринципе, то что нужно, но ... Данный драйвер разрабатывается для встраиваемых систем - хочется уменьшить нагрузку на процессор и объем ОЗУ (может быть прийдется SRAM ставить + энергосбережение)
Это будет запасной вариант.
Всетаки хочется научиться работать в ядре, мало ли что еще прийдется делать, может скорость понадобиться ....

2 BlackStar
Файл прикрепил.
Пока решение не найденно.

С уважением
Андрей
Спасибо сказали:
Аватара пользователя
BlackStar
Сообщения: 1338
Статус: We are all Kosh
ОС: Fedora 10

Re: Ядро, драйвер и ком порт, tty_drivers

Сообщение BlackStar »

insmod: error inserting 'tty_hw-driver.ko': -1 Unknown symbol in module
Мне кажется невоспринимается tty_drivers.


Все правильно не воспринимается tty_drivers, о чем нам сообщает dmesg. tty_drivers описана linux/tty_driver.h как extern переменная, а определена она в char/tty_io.c. Дальше разбирайся сам, про интерфейс RS485 я к сожалению ни чего незнаю.
LightLang Team
Спасибо сказали:
Rocky
Сообщения: 7
ОС: Suse 10, WXP

Re: Ядро, драйвер и ком порт, tty_drivers

Сообщение Rocky »

Спасибо за отзывчивость, но никак не могу понять почему при компиляции и при инсталяции модуля не находится этот tty_drivers ?
При компиляции именно в момент линковки выдается предупреждение о неопределенности tty_drivers.
Может быть я не делаю какой-то элементарной операции - опция компилятора или еще что-то, почитал помощь gcc, make и ld, но ничего не увидел подходящего ...
Подскажите ПЛЗ, как это обойти.
Заранее благодарен
С уважением Андрей.
П.С. RS485 - тоже, что и RS232, только полудуплекс и другие физ уровни
Спасибо сказали:
Аватара пользователя
BlackStar
Сообщения: 1338
Статус: We are all Kosh
ОС: Fedora 10

Re: Ядро, драйвер и ком порт, tty_drivers

Сообщение BlackStar »

Сдается мне что к переменной tty_drivers нельзя на прямую обращаться.
LightLang Team
Спасибо сказали:
Rocky
Сообщения: 7
ОС: Suse 10, WXP

Re: Ядро, драйвер и ком порт, tty_drivers

Сообщение Rocky »

BlackStar писал(а):
12.02.2007 16:27
Сдается мне что к переменной tty_drivers нельзя на прямую обращаться.

А какой ей комплемент нужно сделать ? :cool: Или через знакомых ...

Определена эта структура в ttу_io.c
вот так

struct list_head {
struct list_head *next, *prev;
};


#define LIST_HEAD_INIT(name) { &(name), &(name) }

#define LIST_HEAD(name) \
struct list_head name = LIST_HEAD_INIT(name)

LIST_HEAD(tty_drivers); /* linked list of tty drivers */
Как я понял tty_io это часть ядра - т.е. пространво имен должно быть доступным моему модулю
В чем тут загадка ?
Спасибо сказали:
Аватара пользователя
BlackStar
Сообщения: 1338
Статус: We are all Kosh
ОС: Fedora 10

Re: Ядро, драйвер и ком порт, tty_drivers

Сообщение BlackStar »

Доступны только объекты (переменные, функции) помеченные макросом EXPORT_SYMBOL.
LightLang Team
Спасибо сказали:
Rocky
Сообщения: 7
ОС: Suse 10, WXP

Re: Ядро, драйвер и ком порт, tty_drivers

Сообщение Rocky »

Еще раз, спасибо за помощь.
Хочу подвести итог.
Ядро не поддерживает механизм прямого доступа к драйверу. Вы можете зарегестрировать свой драйвер, выделить под него память и много чего там еще ... но не можете воспользоваться, из модуля, уже зарегестрированным драйвером.
Может быть я не достаточно глубоко изучил tty_driver, и я могу ошибаться, но мне кажется что я все правильно понял - "ЯДРО НЕ ПОДДЕРЖИВАЕТ ПРЯМОЙ ДОСТУП К ДРАЙВЕРУ"
Спасибо за помощь.
Если кто-то выяснит, что я ошибался - буду рад об этом услышать.
П.С. Воспользуюсь запасным вариантом
Спасибо сказали:
Аватара пользователя
BlackStar
Сообщения: 1338
Статус: We are all Kosh
ОС: Fedora 10

Re: Ядро, драйвер и ком порт, tty_drivers

Сообщение BlackStar »

Ответа на вопрос не знаю, но интересно что за запасной вариант? :)
LightLang Team
Спасибо сказали:
Rocky
Сообщения: 7
ОС: Suse 10, WXP

Re: Ядро, драйвер и ком порт, tty_drivers

Сообщение Rocky »

А вариант - использовать FUSE
FUSE предоставляет доступ к файловой системе из пользовательского пространнства. Т.Е. Обработчики файловых операций переносятнся в область пользователья. Из программы можно динамически добавлять или удалять файлы ... Ну и т.д. ...
Из пространства пользователя открываем порт (как обычно) делаем свои операции ... Предоставляем нужные данные пользователям через файлы, так же как и драйвера ...
Подробнее можно узнать на http://fuse.sourceforge.net
Спасибо сказали: