Всем привет.
Как писать драйверы PCI устройств под Linux?
В частности как работать с конф. пространством PCI устройств?
Что такое модуль ядра я знаю.
Нашёл групу функций pcibios_(read|write)...
Нашёл файл pci.h.
Написал простой модуль ядра читающий конф. пространство заданного устройства.
Для стандартных устройств (сетивуха, мультимедиа устройства) всё нормально. Но вот для нашей платы /*находится тоже в разработке*/ не работает. При этом биос её находит. Выводит вендор и девайс ID при загрузке. Правильно определяет её положение на шине. Далее при загрузке Линукс опрашивает это устройство (определили аппаратно). При работе модуля обращения к конфиг. пространству устройства не проходят вообще. (pcibios_read... возвращает одни нули. /*для "фирменных" устройств возвращаются правильные значения*/
Функция pci_find_slot возращает NULL для нашего устройства/*для "фирменных" устройств работает верно*/.
И ешё в W2k при опросе всех устройств происходят обращения к конф. пространству устройства.
Если можно простой пример пример или ссылачку на такой пример.
Где можно почитать про написание PCI драйверов под Linux.
/usr/src/linux/documentation/pci.txt — читал. Но без примера не разобраться.
Устаревшая книжка. В ней описано как писать драйвера для ядер 2.2, в ядре 2.4 все по-другому — калбеки испольуются. Впрочем, несложно разобраться. Посмотри в исходниках ядра драйвера PCI-устройств.
Re[3]: драйверы PCI устройств под Linux
От:
Аноним
Дата:
31.10.03 17:09
Оценка:
Здравствуйте, Linuxoid, Вы писали:
L>Устаревшая книжка. В ней описано как писать драйвера для ядер 2.2, в ядре 2.4 все по-другому — калбеки испольуются. Впрочем, несложно разобраться. Посмотри в исходниках ядра драйвера PCI-устройств.
Посматрю обязательно. А ты не мог бы точно указать какой драйвер лучше смотреть,
что бы в нём было меньше специфического для конкретного устройства кода.
А книжки я читал. И How to write Linux PCI driver то же читал.
Примеры кое-какие то же смотрел. Но в разных примерах всё по разному.
Просто хотел получить совет от специалиста в этом вопросе.
Тем более по твоим словам самая приличная книга (на мой взгяд) на эту тему уже устарела.
К стати проблема о которой я писал выше ришилась сама собой, но всё же много не ястностей.
Может кто-нибудь написать краткий план того, что должен делать драйвер при инициализации,
что бы соответствовать модели драйвера PCI устройства под Линукс.
По шагам.
Например
1.- ... ( pci_register_driver(...) )
2.- ...
и т.д.
Здравствуйте, Аноним, Вы писали:
А>Может кто-нибудь написать краткий план того, что должен делать драйвер при инициализации, А>что бы соответствовать модели драйвера PCI устройства под Линукс. А>По шагам. А>Например А> 1.- ... ( pci_register_driver(...) ) А> 2.- ... А> и т.д.
Дык краткий план в "Linux Device Drivers" есть. Прототипы функций поменялись, но действия для устройства ты должен выполнить те же — считать конфигурацию, запросить прерывание, выделить DMA — короче, инициализировать ресурсы, используемые устройством. А конкретную реализацию и прототипы функций смотри в драйверах для текущего ядра.
Вообще драйвера в новом стиле (для ядер 2.4.x) пишут примерно так:
При загрузке модуля ядру передается структура типа struct pci_driver, заполненная указателями на callback-функции, которые ядро вызывает для каждого найденного pci-устройства с соответствующей сигнатурой. А в функциях пишешь обработчики соответствующих событий — инициализацию, конфигурацию, освобождение ресурсов.