Проблемы с модулем устройства (Can't open device file)

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

asuprok
Сообщения: 15

Проблемы с модулем устройства

Сообщение asuprok »

Привет всем.
Объясню задачу: мне нужно написать драйвер обработки сигналов от платы ввода/вывода. Делаю я все это для ядра 2.6.8 в Debian. Написал свой модуль для ядра, собрал его с помощбю kbild, все прошло нормально. Создаю устройство

Код: Выделить всё

# mknod adw1711 c 100 0
. Дале гружу модуль

Код: Выделить всё

# insmod ./adw1711.ko
. В самом модуле при инициализации есть регистрация символьного устройства

Код: Выделить всё

register_chrdev(0,"/dev/adw1711",&Fops)
Все проходит нормально, возвращается номер устройства 100. По lsmod проверяю - модуль загружен. Проблема начинается когда я из клиента пытаюсь открыть устройство

Код: Выделить всё

open("/dev/adw1711",0)
выдается отрицательный результат. Подскажите, пожалуйста, где ошибка и как все это дело поправить.
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Проблемы с модулем устройства

Сообщение Zeus »

Так что говорит-то? Какая ошибка?
Спасибо сказали:
asuprok
Сообщения: 15

Re: Проблемы с модулем устройства

Сообщение asuprok »

Zeus писал(а): ↑
16.03.2006 11:32
Так что говорит-то? Какая ошибка?

При вызове в клиенте open() возвращается отрицательный результат, который является признаком ошибки. Может быть можно более конкретно узнать причину ошибки?
Спасибо сказали:
Аватара пользователя
flook
Сообщения: 585
Статус: Просто flook

Re: Проблемы с модулем устройства

Сообщение flook »

asuprok писал(а): ↑
17.03.2006 01:07
Zeus писал(а): ↑
16.03.2006 11:32

Так что говорит-то? Какая ошибка?

При вызове в клиенте open() возвращается отрицательный результат, который является признаком ошибки. Может быть можно более конкретно узнать причину ошибки?

Код: Выделить всё

printf("%d\n", errno);
В каждом из нас спит гений... и с каждым днем все крепче...
Спасибо сказали:
asuprok
Сообщения: 15

Re: Проблемы с модулем устройства

Сообщение asuprok »

При вызове perror() пишет: неправильный путь или имя. Устройство /dev/adw1711 есть и доступ к нему разрешен, а клиент не видит. Второй момент: если я указываю в вызове register_chrdev имя несуществующего устройства, то все равно возвращается номер старшего устройства и все нормально, хотя такого файла в /dev нет. Прямо не знаю что и делать, парадокс. Или я чего не доганяю :)
Спасибо сказали:
Аватара пользователя
flook
Сообщения: 585
Статус: Просто flook

Re: Проблемы с модулем устройства

Сообщение flook »

asuprok писал(а): ↑
18.03.2006 03:25
При вызове perror() пишет: неправильный путь или имя. Устройство /dev/adw1711 есть и доступ к нему разрешен, а клиент не видит. Второй момент: если я указываю в вызове register_chrdev имя несуществующего устройства, то все равно возвращается номер старшего устройства и все нормально, хотя такого файла в /dev нет. Прямо не знаю что и делать, парадокс. Или я чего не доганяю :)

register_chrdev на имя кладет - оно нужно лишь для sysfs (или devfs в старых ядрах). Он в качестве первого аргумента принимает major, а если ему 0 дать - то выдаст от балды, причем этот номер не обязательно совпадет с тем, который Вы в mknod указали. Поэтому у Вас ничего не работает. Правильное поведение будет таким

Код: Выделить всё

#define MY_MAJOR      12345
register_chrdev(MY_MAJOR, "name", &ops);
...
mknod /dev/mydev c MY_MAJOR MINOR

или таким

Код: Выделить всё

maj = register_chrdev(0, "name", &ops);
printk("I have major %d - call mknod accordingly\n", maj);
...
mknod /dev/myname c maj MINOR

Поскольку многие мажоры уже зарезервированы за конкретными девайсами - может быть будет лучше второй вариант, но тогда возникают проблемы с mknod. Для этого существует в старых ядрах devfs, а в новых - uevent на которые возбуждается udevd. Как поступить в Вашей ситуации - решайте сами.
В каждом из нас спит гений... и с каждым днем все крепче...
Спасибо сказали: