Российский производитель и разработчик сертифицированного измерительного оборудования с 1987 года


Проблема со сборкой драйвера под linux

Вы не вошли.

 Поиск | Регистрация | Вход 

Павел
21.09.2009 14:13:42
#1

Гость

Проблема со сборкой драйвера под linux

Добрый день!

Попытался собрать библиотеку lcomp под linux (openSUSE 11.1 ядро 2.6.27.29-0.1). Делал всё согласно readme, хотя порядок там чётко НЕ прописан! Вопрос: что я не так делаю?

1. скопировал lcard.rules в /etc/udev/rules.d/
2. выполнил make в основной директории:
make -C /lib/modules/2.6.27.29-0.1-default/build M=/storage/distribs/lin/L-card/dstr modules
make[1]: Entering directory `/usr/src/linux-2.6.27.29-0.1-obj/i386/default/'                 
make -C ../../../linux-2.6.27.29-0.1 O=/usr/src/linux-2.6.27.29-0.1-obj/i386/default/. modules
  CC [M]  /storage/distribs/lin/L-card/dstr/ldevice.o                                         
/storage/distribs/lin/L-card/dstr/ldevice.c: In function ‘ldev_init’:                         
/storage/distribs/lin/L-card/dstr/ldevice.c:158: warning: passing argument 5 of ‘device_create’ makes pointer from integer without a cast
  CC [M]  /storage/distribs/lin/L-card/dstr/l760.o                                                                                       
  CC [M]  /storage/distribs/lin/L-card/dstr/ldevpciu.o                                                                                   
  CC [M]  /storage/distribs/lin/L-card/dstr/l791.o                                                                                       
  CC [M]  /storage/distribs/lin/L-card/dstr/ldevpcib.o                                                                                   
  CC [M]  /storage/distribs/lin/L-card/dstr/e2010.o                                                                                     
  CC [M]  /storage/distribs/lin/L-card/dstr/e140.o                                                                                       
  CC [M]  /storage/distribs/lin/L-card/dstr/e440.o                                                                                       
  CC [M]  /storage/distribs/lin/L-card/dstr/e154.o                                                                                       
  CC [M]  /storage/distribs/lin/L-card/dstr/ldevusbu.o                                                                                   
  LD [M]  /storage/distribs/lin/L-card/dstr/ldevpci.o                                                                                   
  LD [M]  /storage/distribs/lin/L-card/dstr/ldevusb.o                                                                                   
  LD [M]  /storage/distribs/lin/L-card/dstr/ldevpcibm.o                                                                                 
  Building modules, stage 2.                                                                                                             
  MODPOST 4 modules                                                                                                                     
  CC      /storage/distribs/lin/L-card/dstr/ldevice.mod.o                                                                               
  LD [M]  /storage/distribs/lin/L-card/dstr/ldevice.ko                                                                                   
  CC      /storage/distribs/lin/L-card/dstr/ldevpci.mod.o                                                                               
  LD [M]  /storage/distribs/lin/L-card/dstr/ldevpci.ko                                                                                   
  CC      /storage/distribs/lin/L-card/dstr/ldevpcibm.mod.o                                                                             
  LD [M]  /storage/distribs/lin/L-card/dstr/ldevpcibm.ko                                                                                 
  CC      /storage/distribs/lin/L-card/dstr/ldevusb.mod.o                                                                               
  LD [M]  /storage/distribs/lin/L-card/dstr/ldevusb.ko                                                                                   
make[1]: Leaving directory `/usr/src/linux-2.6.27.29-0.1-obj/i386/default/'

3. Выполнил make modules_install:
make -C /lib/modules/2.6.27.29-0.1-default/build M=/storage/distribs/lin/L-card/dstr modules_install                                     
make[1]: Entering directory `/usr/src/linux-2.6.27.29-0.1-obj/i386/default/'                                                             
make -C ../../../linux-2.6.27.29-0.1 O=/usr/src/linux-2.6.27.29-0.1-obj/i386/default/. modules_install                                   
  INSTALL /storage/distribs/lin/L-card/dstr/ldevice.ko
  INSTALL /storage/distribs/lin/L-card/dstr/ldevpci.ko
  INSTALL /storage/distribs/lin/L-card/dstr/ldevpcibm.ko
  INSTALL /storage/distribs/lin/L-card/dstr/ldevusb.ko
  DEPMOD  2.6.27.29-0.1-default
make[1]: Leaving directory `/usr/src/linux-2.6.27.29-0.1-obj/i386/default`

4. Попытался запустить драйвер скриптом sh ./start:
ERROR: Module ldevpcibm does not exist in /proc/modules
ERROR: Module ldevusb does not exist in /proc/modules
ERROR: Module ldevpci does not exist in /proc/modules
ERROR: Module ldevice is in use
insmod: error inserting /'ldevice.ko/': -1 File exists
insmod: error inserting /'ldevpcibm.ko/': -1 Unknown symbol in module
insmod: error inserting /'ldevpci.ko/': -1 Unknown symbol in module
insmod: error inserting /'ldevusb.ko/': -1 Unknown symbol in module


PS При сборке lcomp вывод такой:

g++ -fPIC -c -O3 -Wall -I/include -L/lib -I../include -L../lib -DLCOMP_LINUX=1 stubs.cpp                                                 
../include/stubs.h:126: warning: ‘void atomic_inc(atomic_t*)’ defined but not used                                                       
../include/stubs.h:137: warning: ‘void atomic_dec(atomic_t*)’ defined but not used                                                       
g++ -fPIC -c -O3 -Wall -I/include -L/lib -I../include -L../lib -DLCOMP_LINUX=1 maincomp.cpp                                             
../include/stubs.h:126: warning: ‘void atomic_inc(atomic_t*)’ defined but not used                                                       
../include/stubs.h:137: warning: ‘void atomic_dec(atomic_t*)’ defined but not used                                                       
g++ -fPIC -c -O3 -Wall -I/include -L/lib -I../include -L../lib -DLCOMP_LINUX=1 lguids.cpp                                               
In file included from lguids.cpp:6:                                                                                                     
../include/stubs.h:126: warning: ‘void atomic_inc(atomic_t*)’ defined but not used                                                       
../include/stubs.h:137: warning: ‘void atomic_dec(atomic_t*)’ defined but not used                                                       
g++ -fPIC -c -O3 -Wall -I/include -L/lib -I../include -L../lib -DLCOMP_LINUX=1 ldevbase.cpp                                             
g++ -fPIC -c -O3 -Wall -I/include -L/lib -I../include -L../lib -DLCOMP_LINUX=1 plx.cpp                                                   
plx.cpp: In member function ‘virtual ULONG DaqL780::FillADCparameters(_DAQ_PARAM_*)’:                                                   
plx.cpp:185: warning: deprecated conversion from string constant to ‘char*’                                                             
plx.cpp:185: warning: deprecated conversion from string constant to ‘char*’                                                             
plx.cpp:185: warning: deprecated conversion from string constant to ‘char*’                                                             
plx.cpp: In member function ‘virtual ULONG DaqL780::ReadPlataDescr(void*)’:                                                             
plx.cpp:299: warning: unused variable ‘pdt’                                                                                             
plx.cpp: In member function ‘virtual ULONG DaqL780::WritePlataDescr(void*, USHORT)’:                                                     
plx.cpp:312: warning: unused variable ‘pdt’                                                                                             
../include/stubs.h: At global scope:                                                                                                     
../include/stubs.h:126: warning: ‘void atomic_inc(atomic_t*)’ defined but not used                                                       
../include/stubs.h:137: warning: ‘void atomic_dec(atomic_t*)’ defined but not used                                                       
g++ -fPIC -c -O3 -Wall -I/include -L/lib -I../include -L../lib -DLCOMP_LINUX=1 loadplx.cpp                                               
loadplx.cpp: In member function ‘virtual ULONG DaqL780::LoadBios(char*)’:                                                               
loadplx.cpp:38: warning: comparison between signed and unsigned integer expressions                                                     
../include/stubs.h: At global scope:                                                                                                     
../include/stubs.h:126: warning: ‘void atomic_inc(atomic_t*)’ defined but not used                                                       
../include/stubs.h:137: warning: ‘void atomic_dec(atomic_t*)’ defined but not used                                                       
g++ -fPIC -c -O3 -Wall -I/include -L/lib -I../include -L../lib -DLCOMP_LINUX=1 e440.cpp                                                 
e440.cpp: In member function ‘virtual ULONG DaqE440::ReadPlataDescr(void*)’:                                                             
e440.cpp:253: warning: unused variable ‘pdt’                                                                                             
e440.cpp: In member function ‘virtual ULONG DaqE440::WritePlataDescr(void*, USHORT)’:                                                   
e440.cpp:265: warning: unused variable ‘pdt’                                                                                             
../include/stubs.h: At global scope:                                                                                                     
../include/stubs.h:126: warning: ‘void atomic_inc(atomic_t*)’ defined but not used                                                       
../include/stubs.h:137: warning: ‘void atomic_dec(atomic_t*)’ defined but not used                                                       
g++ -fPIC -c -O3 -Wall -I/include -L/lib -I../include -L../lib -DLCOMP_LINUX=1 loade440.cpp                                             
loade440.cpp: In member function ‘virtual ULONG DaqE440::LoadBios(char*)’:                                                               
loade440.cpp:42: warning: comparison between signed and unsigned integer expressions                                                     
../include/stubs.h: At global scope:                                                                                                     
../include/stubs.h:126: warning: ‘void atomic_inc(atomic_t*)’ defined but not used                                                       
../include/stubs.h:137: warning: ‘void atomic_dec(atomic_t*)’ defined but not used                                                       
g++ -fPIC -c -O3 -Wall -I/include -L/lib -I../include -L../lib -DLCOMP_LINUX=1 e140.cpp                                                 
e140.cpp: In member function ‘virtual ULONG DaqE140::ReadPlataDescr(void*)’:                                                             
e140.cpp:184: warning: unused variable ‘pdt’                                                                                             
e140.cpp: In member function ‘virtual ULONG DaqE140::WritePlataDescr(void*, USHORT)’:                                                   
e140.cpp:198: warning: unused variable ‘pdt’                                                                                             
../include/stubs.h: At global scope:                                                                                                     
../include/stubs.h:126: warning: ‘void atomic_inc(atomic_t*)’ defined but not used                                                       
../include/stubs.h:137: warning: ‘void atomic_dec(atomic_t*)’ defined but not used                                                       
g++ -fPIC -c -O3 -Wall -I/include -L/lib -I../include -L../lib -DLCOMP_LINUX=1 loade2010.cpp                                             
loade2010.cpp: In member function ‘virtual ULONG DaqE2010::LoadBios(char*)’:                                                             
loade2010.cpp:37: warning: comparison between signed and unsigned integer expressions                                                   
loade2010.cpp:63: warning: ‘BC’ may be used uninitialized in this function                                                               
../include/stubs.h: At global scope:                                                                                                     
../include/stubs.h:126: warning: ‘void atomic_inc(atomic_t*)’ defined but not used                                                       
../include/stubs.h:137: warning: ‘void atomic_dec(atomic_t*)’ defined but not used                                                       
g++ -fPIC -c -O3 -Wall -I/include -L/lib -I../include -L../lib -DLCOMP_LINUX=1 e2010.cpp                                                 
../include/stubs.h:126: warning: ‘void atomic_inc(atomic_t*)’ defined but not used                                                       
../include/stubs.h:137: warning: ‘void atomic_dec(atomic_t*)’ defined but not used                                                       
g++ -fPIC -c -O3 -Wall -I/include -L/lib -I../include -L../lib -DLCOMP_LINUX=1 791.cpp                                                   
791.cpp: In member function ‘virtual ULONG DaqL791::csCloseLDevice(ULONG)’:                                                             
791.cpp:27: warning: unused variable ‘sts’                                                                                               
791.cpp: In member function ‘virtual ULONG DaqL791::WritePlataDescr(void*, USHORT)’:                                                     
791.cpp:102: warning: comparison between signed and unsigned integer expressions                                                         
791.cpp:115: warning: comparison between signed and unsigned integer expressions                                                         
../include/stubs.h: At global scope:                                                                                                     
../include/stubs.h:126: warning: ‘void atomic_inc(atomic_t*)’ defined but not used                                                       
../include/stubs.h:137: warning: ‘void atomic_dec(atomic_t*)’ defined but not used                                                       
g++ -fPIC -c -O3 -Wall -I/include -L/lib -I../include -L../lib -DLCOMP_LINUX=1 e154.cpp                                                 
e154.cpp: In member function ‘virtual ULONG DaqE154::ReadPlataDescr(void*)’:                                                             
e154.cpp:185: warning: unused variable ‘status’                                                                                         
e154.cpp: In member function ‘virtual ULONG DaqE154::WritePlataDescr(void*, USHORT)’:                                                   
e154.cpp:205: warning: unused variable ‘status’                                                                                         
../include/stubs.h: At global scope:                                                                                                     
../include/stubs.h:126: warning: ‘void atomic_inc(atomic_t*)’ defined but not used                                                       
../include/stubs.h:137: warning: ‘void atomic_dec(atomic_t*)’ defined but not used                                                       
g++ -shared -Wl,-soname,liblcomp.so -o liblcomp.so stubs.o maincomp.o lguids.o ldevbase.o plx.o loadplx.o e440.o loade440.o e140.o loade2010.o e2010.o 791.o e154.o -lc

21.09.2009 14:29:54
#2

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Проблема со сборкой драйвера под linux

Во первых там надо подпатчить
http://www.lcard.ru/forumthreads/7748
можт потом заработает...

Павел
21.09.2009 16:31:09
#3

Гость

Re: Проблема со сборкой драйвера под linux

Вызов поправил стало так:
2. make в основной директории:
make -C /lib/modules/2.6.27.29-0.1-default/build M=/storage/distribs/lin/L-card/dstr modules
make[1]: Entering directory `/usr/src/linux-2.6.27.29-0.1-obj/i386/default/'                 
make -C ../../../linux-2.6.27.29-0.1 O=/usr/src/linux-2.6.27.29-0.1-obj/i386/default/. modules
  CC [M]  /storage/distribs/lin/L-card/dstr/ldevice.o                                         
  CC [M]  /storage/distribs/lin/L-card/dstr/l760.o                                           
  CC [M]  /storage/distribs/lin/L-card/dstr/ldevpciu.o                                       
  CC [M]  /storage/distribs/lin/L-card/dstr/l791.o                                           
  CC [M]  /storage/distribs/lin/L-card/dstr/ldevpcib.o                                       
  CC [M]  /storage/distribs/lin/L-card/dstr/e2010.o                                           
  CC [M]  /storage/distribs/lin/L-card/dstr/e140.o                                           
  CC [M]  /storage/distribs/lin/L-card/dstr/e440.o                                           
  CC [M]  /storage/distribs/lin/L-card/dstr/e154.o                                           
  CC [M]  /storage/distribs/lin/L-card/dstr/ldevusbu.o                                       
  LD [M]  /storage/distribs/lin/L-card/dstr/ldevpci.o                                         
  LD [M]  /storage/distribs/lin/L-card/dstr/ldevusb.o                                         
  LD [M]  /storage/distribs/lin/L-card/dstr/ldevpcibm.o                                       
  Building modules, stage 2.                                                                 
  MODPOST 4 modules                                                                           
  CC      /storage/distribs/lin/L-card/dstr/ldevice.mod.o                                     
  LD [M]  /storage/distribs/lin/L-card/dstr/ldevice.ko                                       
  CC      /storage/distribs/lin/L-card/dstr/ldevpci.mod.o                                     
  LD [M]  /storage/distribs/lin/L-card/dstr/ldevpci.ko                                       
  CC      /storage/distribs/lin/L-card/dstr/ldevpcibm.mod.o                                   
  LD [M]  /storage/distribs/lin/L-card/dstr/ldevpcibm.ko                                     
  CC      /storage/distribs/lin/L-card/dstr/ldevusb.mod.o                                     
  LD [M]  /storage/distribs/lin/L-card/dstr/ldevusb.ko                                       
make[1]: Leaving directory `/usr/src/linux-2.6.27.29-0.1-obj/i386/default/'                   

3. make modules_install:
make -C /lib/modules/2.6.27.29-0.1-default/build M=/storage/distribs/lin/L-card/dstr modules_install
make[1]: Entering directory `/usr/src/linux-2.6.27.29-0.1-obj/i386/default/'
make -C ../../../linux-2.6.27.29-0.1 O=/usr/src/linux-2.6.27.29-0.1-obj/i386/default/. modules_install
  INSTALL /storage/distribs/lin/L-card/dstr/ldevice.ko
  INSTALL /storage/distribs/lin/L-card/dstr/ldevpci.ko
  INSTALL /storage/distribs/lin/L-card/dstr/ldevpcibm.ko
  INSTALL /storage/distribs/lin/L-card/dstr/ldevusb.ko
  DEPMOD  2.6.27.29-0.1-default
make[1]: Leaving directory `/usr/src/linux-2.6.27.29-0.1-obj/i386/default/'

4. Попытался запустить драйвер скриптом sh ./start:
ERROR: Module ldevpcibm does not exist in /proc/modules
ERROR: Module ldevusb does not exist in /proc/modules
ERROR: Module ldevpci does not exist in /proc/modules
ERROR: Module ldevice is in use
insmod: error inserting /'ldevice.ko/': -1 File exists
insmod: error inserting /'ldevpcibm.ko/': -1 Unknown symbol in module
insmod: error inserting //'ldevpci.ko//': -1 Unknown symbol in module
insmod: error inserting //'ldevusb.ko//': -1 Unknown symbol in module

21.09.2009 21:22:38
#4

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Проблема со сборкой драйвера под linux

а запустить просто из папки где они собранные лежат?

Павел
21.09.2009 23:22:28
#5

Гость

Re: Проблема со сборкой драйвера под linux

Доброго времени суток!

Всё заработало! И на ядре 2.6.27.33-4-default x86_64. Нужно было перезагрузиться - неверный модуль использовался ядром (см. вывод п. 4).
Во избежание подобных ситуаций впредь, желательно включить разъяснение зависимости параметров device_create от версии ядра в readme и в исходники с комментариями. Это же всего одна строчка!

22.09.2009 10:43:14
#6

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Проблема со сборкой драйвера под linux

Это хорошо. Только непонятно как неверный модуль ядром использовался.... Насчет device_create просто скоро будет новая версия....

Павел
22.09.2009 11:33:35
#7

Гость

Re: Проблема со сборкой драйвера под linux

Похоже, ещё не всё...

Попробовал test на двух платах e140 и e440.
На 140, кажется, без проблем. На 440, видимо, не грузится bios... Вывод такой:
Get IDaqLDevice interface                                       
IDaqLDevice get success                                         
Free IUnknown
OpenLDevice Handle3

Slot parameters
Base    0
BaseL   0
Mem     0
MemL    0
Type    1e
DSPType 889
Irq     0
Load Bios 2
Plata Test 2

Read FLASH

//здесь долго мигает диод на плате, а программа ждёт и выдаёт:

SerNum       I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I��!��
BrdName      �I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I��!��
Rev          I
DspType      �I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I��!��
IsDacPresent I
Quartz       1236289968

Press any key

//Жму
alloc size 10000384
Buffer size(word): 131072
Pages:             32
IrqStep:           4096
FIFO:              4096
Rate:              18.8646

Press any key

//Жму
Ошибка сегментирования

PS Не подскажете, когда будет новая версия, и что в ней изменится?

22.09.2009 13:52:08
#8

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Проблема со сборкой драйвера под linux

там все чувствительно к регистру букв. просто может надо e440 маленькими написатиь или большими E440. У 140 биоса просто нету. Ну новая версия под новое ядро просто будет...

Павел
22.09.2009 16:46:49
#9

Гость

Re: Проблема со сборкой драйвера под linux

Я пробовал и так и так... Результат одинаковый :-(
Про e140 - плавали, знаем...
Попробую e440 дома на другой машине x86_64.

Павел
22.09.2009 22:30:35
#10

Гость

Re: Проблема со сборкой драйвера под linux

На машине x86_64 всё заработало... Буду завтра с бубном плясать вокруг x86.

Павел
24.09.2009 14:56:13
#11

Гость

Re: Проблема со сборкой драйвера под linux

Добрый день!

Пляски ни к чему не привели... Bios отказывается грузиться.

На машине x64 заметил "странность". Я немного модифицировал test - добавил пробную развёртку ЦАП одиночными отсчётами от -5 до 5 В (все 4096 точек с шагом 1). Для e440 время цикла 17 секунд, а для e140 - 4 с (последнее подтверждено и на машине x86)!
На Windows то же самое занимало 61 секунду для обеих.
Вопрос: почему время так сильно разнИтся для плат под linux? Что-то "притормаживает" e440 или и на x64 драйвер работает не совсем корректно?

24.09.2009 15:23:28
#12

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Проблема со сборкой драйвера под linux

Тестов не проводил, но реализация вывода на ЦАП  у них разная... даже по коду библиотеки видно.
Почему не работает с 440 на этом дистрибутиве - не скажу. В слаке работает, да и другие насколько я могу судить по сообщениям в конфе работают успешно...

Arcady
26.11.2010 07:03:24
#13

Гость

Re: Проблема со сборкой драйвера под linux

Всё собралось и для ядра 2.6.35.5. На E140 работает.
Надо только переопределить названия функций:

#define usb_buffer_alloc usb_alloc_coherent
#define usb_buffer_free usb_free_coherent

Arcady
26.11.2010 11:58:41
#14

Гость

Re: Проблема со сборкой драйвера под linux

Странности в драйвере:

Если по тестовому примеру делать программу, то для E140 наблюдается такая картина:

1. При первом заполнении полубуфера
   *pp содержит 0
2. После заполнения полубуфера
   *pp содержит длину полубуфера
3. После заполнения полного буфера
   *pp содержит длину буфера
4. После заполнения первого полубуфера
   *pp содержит длину полубуфера
...
и т.д.
   
Следующая конструкция в тестовом примере

fl1=(*pp<=halfbuffer)? 0:1;

неверна для такой логики счётчика (*pp).