LINUX.ORG.RU

[kernel][cdev_add] не работает

 


0

1

делаю так:

#define MAX_DEV_NUM 16
#define MAJ_DEV 240
...
dev_reg = MKDEV(MAJ_DEV, 0);
register_chrdev_region(dev_reg, MAX_DEV_NUM, "sp605");

а потом для каждого найденого устройства

struct cdev *chr_dev;
...
chr_dev = cdev_alloc() // ошибки везде проверяются по стаднартной схеме с goto, я их здесь убрал просто.
chr_dev->owner = THIS_MODULE;
chr_dev->ops = filops;
devno = MKDEV(MAJ_NUM, i); //i - соответсвующий minor number 0<i<MAX_DEV_NUM;
cdev_add(chr_dev, devno, 1);

короче общая схема такая - делаю register_chrdev_region для 16ти устройств, а потом по одному из добавляю cdev_add.

загружается драйвер нормально, ошибок никаких не возвращает. в /proc/devices запись есть. но когда я делаю

mknod /dev/device0 c 240 0
устройство ведёт себя так, как будто драйвера нету. .open/.close из filops драйвера не вызываются. open из юзерспейса возвращает no such device or address.

В чём проблема? Спасибо.

>devno = MKDEV(MAJ_NUM, i); //i - соответсвующий minor number 0<i<MAX_DEV_NUM;

cdev_add(chr_dev, devno, 1);

думаю, проблема здесь.
IIUC (глядя в LDD и tty_register_driver) должно быть так:

cdev_add(chr_dev, dev_reg, MAX_DEV_NUM);

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

я каждый раз по одному устройству создаю. Так что count должно быть 1.

спасибо за помощь, но я нашел проблему. в module init я сначала делал pci_register_driver а потом инициализировал нулями всякую лабуду, которая для него нужна. А надо было наоборот - сначала инициализация, а потом pci_register_driver. А то получалось, что после .probe всё занулялось.

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

> в module init я сначала делал pci_register_driver а потом инициализировал нулями всякую лабуду, которая для него нужна. А надо было наоборот

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

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

Ничего не будет. Я сначала лабуду нулями инициализирую, а потом pci_register_driver. char_dev не причём. Он в конце инициализируется.

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