Здравствуйте.
Я хочу написать драйвер, работающий с последовательным портом. Нужно навесить протокол на ком порт и отобразить его в файловую систему.
Т.е. множество устройств подключенных к одному порту (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.
Как мне это обойти или исправить?
Посоветуйте пожалуйста ...
И исправьте где можете ...
Заранее благодарен.
П.С. Жду ваших коментариев.
Ядро, драйвер и ком порт, tty_drivers (Ком порт из ядра)
Модератор: Модераторы разделов
-
- Бывший модератор
- Сообщения: 2421
- Статус: Übermensch
- ОС: лялих
Re: Ядро, драйвер и ком порт, tty_drivers
используй FUSE и сиди в userspace.
это проще и гораздо беспроблемней.
это проще и гораздо беспроблемней.
слава роботам!
-
- Сообщения: 1338
- Статус: We are all Kosh
- ОС: Fedora 10
Re: Ядро, драйвер и ком порт, tty_drivers
Показывай весь код (желательно приаттачить).
LightLang Team
-
- Сообщения: 7
- ОС: Suse 10, WXP
Re: Ядро, драйвер и ком порт, tty_drivers
Попробовал Fuse - впринципе, то что нужно, но ... Данный драйвер разрабатывается для встраиваемых систем - хочется уменьшить нагрузку на процессор и объем ОЗУ (может быть прийдется SRAM ставить + энергосбережение)
Это будет запасной вариант.
Всетаки хочется научиться работать в ядре, мало ли что еще прийдется делать, может скорость понадобиться ....
2 BlackStar
Файл прикрепил.
Пока решение не найденно.
С уважением
Андрей
Это будет запасной вариант.
Всетаки хочется научиться работать в ядре, мало ли что еще прийдется делать, может скорость понадобиться ....
2 BlackStar
Файл прикрепил.
Пока решение не найденно.
С уважением
Андрей
-
- Сообщения: 1338
- Статус: We are all Kosh
- ОС: Fedora 10
Re: Ядро, драйвер и ком порт, tty_drivers
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
-
- Сообщения: 7
- ОС: Suse 10, WXP
Re: Ядро, драйвер и ком порт, tty_drivers
Спасибо за отзывчивость, но никак не могу понять почему при компиляции и при инсталяции модуля не находится этот tty_drivers ?
При компиляции именно в момент линковки выдается предупреждение о неопределенности tty_drivers.
Может быть я не делаю какой-то элементарной операции - опция компилятора или еще что-то, почитал помощь gcc, make и ld, но ничего не увидел подходящего ...
Подскажите ПЛЗ, как это обойти.
Заранее благодарен
С уважением Андрей.
П.С. RS485 - тоже, что и RS232, только полудуплекс и другие физ уровни
При компиляции именно в момент линковки выдается предупреждение о неопределенности tty_drivers.
Может быть я не делаю какой-то элементарной операции - опция компилятора или еще что-то, почитал помощь gcc, make и ld, но ничего не увидел подходящего ...
Подскажите ПЛЗ, как это обойти.
Заранее благодарен
С уважением Андрей.
П.С. RS485 - тоже, что и RS232, только полудуплекс и другие физ уровни
-
- Сообщения: 1338
- Статус: We are all Kosh
- ОС: Fedora 10
Re: Ядро, драйвер и ком порт, tty_drivers
Сдается мне что к переменной tty_drivers нельзя на прямую обращаться.
LightLang Team
-
- Сообщения: 7
- ОС: Suse 10, WXP
Re: Ядро, драйвер и ком порт, tty_drivers
А какой ей комплемент нужно сделать ?

Определена эта структура в 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 это часть ядра - т.е. пространво имен должно быть доступным моему модулю
В чем тут загадка ?
-
- Сообщения: 1338
- Статус: We are all Kosh
- ОС: Fedora 10
Re: Ядро, драйвер и ком порт, tty_drivers
Доступны только объекты (переменные, функции) помеченные макросом EXPORT_SYMBOL.
LightLang Team
-
- Сообщения: 7
- ОС: Suse 10, WXP
Re: Ядро, драйвер и ком порт, tty_drivers
Еще раз, спасибо за помощь.
Хочу подвести итог.
Ядро не поддерживает механизм прямого доступа к драйверу. Вы можете зарегестрировать свой драйвер, выделить под него память и много чего там еще ... но не можете воспользоваться, из модуля, уже зарегестрированным драйвером.
Может быть я не достаточно глубоко изучил tty_driver, и я могу ошибаться, но мне кажется что я все правильно понял - "ЯДРО НЕ ПОДДЕРЖИВАЕТ ПРЯМОЙ ДОСТУП К ДРАЙВЕРУ"
Спасибо за помощь.
Если кто-то выяснит, что я ошибался - буду рад об этом услышать.
П.С. Воспользуюсь запасным вариантом
Хочу подвести итог.
Ядро не поддерживает механизм прямого доступа к драйверу. Вы можете зарегестрировать свой драйвер, выделить под него память и много чего там еще ... но не можете воспользоваться, из модуля, уже зарегестрированным драйвером.
Может быть я не достаточно глубоко изучил tty_driver, и я могу ошибаться, но мне кажется что я все правильно понял - "ЯДРО НЕ ПОДДЕРЖИВАЕТ ПРЯМОЙ ДОСТУП К ДРАЙВЕРУ"
Спасибо за помощь.
Если кто-то выяснит, что я ошибался - буду рад об этом услышать.
П.С. Воспользуюсь запасным вариантом
-
- Сообщения: 1338
- Статус: We are all Kosh
- ОС: Fedora 10
Re: Ядро, драйвер и ком порт, tty_drivers
Ответа на вопрос не знаю, но интересно что за запасной вариант? 

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