LINUX.ORG.RU

[kernel dev] устройство для pci


0

1

продолжаю писать драйвер ...
не соображу как создать для него /dev/my_drv
в /proc/devices не появляется (не могу узнать major)
пробовал читать про udev, вобщем и целом понял, но что делать нет (
читал http://thefreecountry.wordpress.com/2010/05/29/kernel_development/, то там miscdevice и все там автоматом както вышло
полный рабочий пример pci драйвера (вне ядра) очень бы помог

★★★★★

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

там более именно по написанию, про регистрацию мало или нет
конкретно по pci только скелет драйвера без создания node
думаю нужно перечитать еще раз man udevadm (?), но уже голова вспухла, нужно отдохнуть

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

> конкретно по pci только скелет драйвера без создания node

Device node создается не драйвером, а udev. Порядок примерно такой: ты заказываешь major и диапазон minor'ов для драйвера, создаешь character device для устройства, ядро генерирует событие «создано устройство с major == N и minor == M», вызывается udev, он ищет в своем конфиге правило и, если находит, создает указанный device node. Если не находит... вроде создает какой-то device node каким-то с умолчательным именем, но, может, это я так программирую свои драйверы.

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

т.е. должно быть в модуле:
register_chrdev - для общение через open,read/write,ioctl
и pci_register_driver - для прерываний/портов ?
буду пробовать ...

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

Специальный файл в /dev должен создавать udev при обнаружении устройства драйвером, что делается тривиальным правилом для udev

Nastishka ★★★★★
()

драйвер ты может и написал, а устройство-то в нем ты создаешь (struct device заполняешь?)?
и вообще он у тебя на platform_device?
в общем вопросов больше, чем возможных ответов...

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

а вообще misc_register делает device_create.
но тебе соответственно надо вызывать функцию <subsystem for your driver>_register. и да, subsystem это не pci.
см. drivers/watchdog/i6300esb.c для примера. вполне адекватный драйвер. не гербалайф^W platform_driver.

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

про platform_driver в ldd3 ни слова
и как я понял - за изменениями api ядра не поспевают писать книги, потому такие вопросы (я писал до этого драйвер для isa)
от драйвера мне нужны простейшие действия: читать и писать в порты платы по прерыванию; немного управлять через ioctl

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

тогда platform_driver тебе особо-то и не нужен.
а по поводу непоспевания, platform_driver был добавлен в конце 2005-го, что несколько позже LDD3 (начало 2005). вообще практически все книги по linux kernel уже малость устарели. точнее сказать «похудели». но тем не менее пока не врут.

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

от драйвера мне нужны простейшие действия

Возможно, UIO - то, что тебе нужно. Драйвер только мапирует память устройства и ловит прерывание, а все остальное можно делать в userspace.

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

> register_chrdev - для общение через open,read/write,ioctl

и pci_register_driver - для прерываний/портов ?

Примерно так. Еще есть концептуальная разница - драйвер один для всех устройств, а device node'ы - по N на устройство (N >= 1).

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

>а device node'ы - по N на устройство (N >= 1).
по-моему, для каждого драйвера как раз N своих device node'ов по 1 на каждое подключенное устройство к этому драйверу устройство. или я что-то проспал? можно пруф, если это так?
иначе бы ttyS0 и ttyS1, будучи с разными номерами, могли бы быть направлены на один и тот же физический порт.


еще добавлю для топик-стартера

register_chrdev

регистрирует устройство.

pci_register_driver

регистрирует драйвер.

в ядре устройство и драйвер - разные сущности.

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

> по-моему, для каждого драйвера как раз N своих device node'ов по 1 на каждое подключенное устройство

От устройства зависит. Классический пример - диски с partition table'ом, но, наверное, есть и другие.

иначе бы ttyS0 и ttyS1, будучи с разными номерами, могли бы быть направлены на один и тот же физический порт.

Представь себе мультипортовую PCI-карту - драйвер должен создавать для каждого физического устройства несколько device node'ов.

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

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

да, согласен.
сам немного запутался с терминами.
но всё равно получается, что ядро пусть даже для одного физического устройства регистрирует несколько struct device?

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

> получается, что ядро пусть даже для одного физического устройства регистрирует несколько struct device?

Нет. struct device представляет физическое устройство. В случае с мультипортовой картой в системе будет несколько struct cdev.

tailgunner ★★★★★
()

grep -nr «pci_register» drivers/char/

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