LINUX.ORG.RU

[OpenSUSE x86_64] PCI DAQ Advantech 1751


0

1

Здравствуйте. Имеется сия плата и 64-битный дистрибутив OpenSUSE 11.4, а также почти аналогичная плата 1716. Из драйверов для них только полностью открытые comedi (http://www.comedi.org), который не умеет и половины того, что умеют эти платы, и родные, из которых без ошибок собираются и подключаются модули ядра. Но есть проблема: библиотеки, которые работают с этими модулями закрытые и 32-битные. Поэтому покурив ioctl и всё, что с ним связано, решил написать программу (для начала, затем библиотеку) для взаимодействия с этим модулем. Написал для начала простенькую программу:

#include "PCI1751.h" //из этого header'a собирается модуль ядра

main() {
}

vanekrus@linux-iaqa:~/work/advdaq/kernel/ioctl_test> gcc ioctl_test.c -I/usr/include/linux/include
In file included from PCI1751.h:6:0,
                 from ioctl_test.c:1:
../include/advdrv.h:28:26: fatal error: linux/module.h: Нет такого файла или каталога
compilation terminated.

P. S. Пакеты kernel-source, kernel-devel установлены. Гугла уже обкурился, с опцией -I/usr/src/linux/include тоже пробовал - не находит файл asm/processor.h, если добавить ещё опцию -I/usr/src/linux/arch/x86/include, то появляется большой количество ошибок в файлах ядра.

> и родные, из которых без ошибок собираются и подключаются модули ядра.

Ну так и используй скрипты сборки модулей от Advantech - зачем свой велосипед изобретать, если не знаеешь как собирать ядреные модули!

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

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

        int ret = 0;
...
	ret = ioctl(fdesc, DEVCONFIG, dev_conf);
	if (ret < 0) {
		perror("Error ioctl");
	}

DEVCONFIG - ioctl number, объявленный в Advantech'овском файле. Если выводить его значение в stdout, то он равен 26631, а в функции модуля ядра, которая парсит ioctl запрос в качестве cmd приходит какое-то случайное значение (иногда происходит сегфолт).

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

Драйверы оказались совсем старые и в них ещё не было нормальной поддержки unlocked_ioctl, в котором в качестве входого параметра inode не передаётся, а берётся из struct file. Отсюда и происходил сегфолт и прочие сложности. В итоге драйверы были собраны и заработали, но учитывая количество костылей в них, плохую поддержку и отсутствие библиотек под x86_64 перешёл на comedi.

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