драйверы PCI устройств под Linux
От: unkn  
Дата: 29.10.03 13:11
Оценка:
Всем привет.
Как писать драйверы PCI устройств под Linux?
В частности как работать с конф. пространством PCI устройств?
Что такое модуль ядра я знаю.
Нашёл групу функций pcibios_(read|write)...
Нашёл файл pci.h.
Написал простой модуль ядра читающий конф. пространство заданного устройства.
Для стандартных устройств (сетивуха, мультимедиа устройства) всё нормально. Но вот для нашей платы /*находится тоже в разработке*/ не работает. При этом биос её находит. Выводит вендор и девайс ID при загрузке. Правильно определяет её положение на шине. Далее при загрузке Линукс опрашивает это устройство (определили аппаратно). При работе модуля обращения к конфиг. пространству устройства не проходят вообще. (pcibios_read... возвращает одни нули. /*для "фирменных" устройств возвращаются правильные значения*/
Функция pci_find_slot возращает NULL для нашего устройства/*для "фирменных" устройств работает верно*/.
И ешё в W2k при опросе всех устройств происходят обращения к конф. пространству устройства.
Если можно простой пример пример или ссылачку на такой пример.
Где можно почитать про написание PCI драйверов под Linux.
/usr/src/linux/documentation/pci.txt — читал. Но без примера не разобраться.
Re: драйверы PCI устройств под Linux
От: kiamor  
Дата: 29.10.03 13:27
Оценка:
Здравствуйте, unkn.

Дашь мыло — вышлю книжку.
Re: драйверы PCI устройств под Linux
От: Kubyshev Andrey  
Дата: 29.10.03 13:33
Оценка:
Первая ссыла на google по запросу linux device drivers
http://www.xml.com/ldd/chapter/book/
Posted via RSDN NNTP Server 1.6
Re[2]: драйверы PCI устройств под Linux
От: Аноним  
Дата: 29.10.03 13:35
Оценка:
Здравствуйте, kiamor, Вы писали:

K>Здравствуйте, unkn.


K>Дашь мыло — вышлю книжку.


Высылаю elephant@hotbox.ru
Re[3]: драйверы PCI устройств под Linux
От: kiamor  
Дата: 29.10.03 14:07
Оценка:
Здравствуйте, Аноним.

Смотри ссылку в другом сообщении. Оттуда и сливай.
Re[2]: драйверы PCI устройств под Linux
От: Linuxoid  
Дата: 30.10.03 20:29
Оценка:
Здравствуйте, Kubyshev Andrey, Вы писали:

KA>Первая ссыла на google по запросу linux device drivers

KA>http://www.xml.com/ldd/chapter/book/

Устаревшая книжка. В ней описано как писать драйвера для ядер 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.- ...
и т.д.
Re[4]: драйверы PCI устройств под Linux
От: Linuxoid  
Дата: 03.11.03 10:11
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Может кто-нибудь написать краткий план того, что должен делать драйвер при инициализации,

А>что бы соответствовать модели драйвера PCI устройства под Линукс.
А>По шагам.
А>Например
А> 1.- ... ( pci_register_driver(...) )
А> 2.- ...
А> и т.д.

Дык краткий план в "Linux Device Drivers" есть. Прототипы функций поменялись, но действия для устройства ты должен выполнить те же — считать конфигурацию, запросить прерывание, выделить DMA — короче, инициализировать ресурсы, используемые устройством. А конкретную реализацию и прототипы функций смотри в драйверах для текущего ядра.

Вообще драйвера в новом стиле (для ядер 2.4.x) пишут примерно так:


#ifdef MODULE
static int __init saa7146_init(void)
{    
    return pci_module_init(&saa_driver);
}

static void __exit saa7146_cleanup(void)
{
    pci_unregister_driver(&saa_driver);
}

module_init(saa7146_init);
module_exit(saa7146_cleanup);

#endif    /* MODULE */


При загрузке модуля ядру передается структура типа struct pci_driver, заполненная указателями на callback-функции, которые ядро вызывает для каждого найденного pci-устройства с соответствующей сигнатурой. А в функциях пишешь обработчики соответствующих событий — инициализацию, конфигурацию, освобождение ресурсов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.