Есть Linux машина с PCI-66 интерфейсом на FPGA. Загрузка ядра обнаружила устройство и в /proc созданы соответствующие PCI файлы и директории. Из приложения (использовал как пример pciutils) читаю конфиг space. Но не могу понять как мне работать с данными? На PCI target создал 2 bar-а в memory - небольшой регистровый пул и окно для потокового чтения. Ядро мапировало оба бара как задано и PCI настроило с method как proc Как мне из userspace получить read/write в нужный бар? Очевидно нужно писать еще один уровень драйвера? Посколько в коде ядра нашел функции оперирующие с bars: void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long max) iomap можно вызвать из userspace или он может быть только в модуле ядра или модуль можно будет подгрузить через insmod ? Все мои пробы кончались segmentation fault. После чтения доков только окончательно запутался, поскольку нет понимания- как вообще правильно работать с устройствами из userspase. Вижу что через файлы. Это понятно. Насторожило что в pciutils КАЖДОЕ обращение закрывает/открывает дескриптор. Это что так надо? или просто так сделано? Будут ли потери эффективности при потоковом обращении через файл таким способом? После загрузки в proc на PCI уже имелся fd = 4. Полагаю открытый значит. Или это "чужой", а надо заводить свой? В общем одни вопросы, поскольку начинающий. Подскажите кто-нибудь, или ссылку на литературу. Как писать драйверы описано достаточно подробно, но далее у меня нет ясности, привык к хорошо документированым API, а тут полная каша, плюс еще большая часть доков а-ля 1999 год - а в OS принципиальные изменения.
|