IO-Warrior 40 unter Linux einrichten

Dies ist das deutsche Forum für alle Themen um den IO-Warrior. Beiträge bitte nur in Deutsch.

Moderator: Guido Körber

Robert Marquardt
Posts: 543
Joined: Mon Dec 01, 2003 6:09 pm

Post by Robert Marquardt »

Das ist aber eher ein Pfadproblem. Dazu muss libiowkit.so irgendwo noch mit eingetragen werden. Ich weiss aber gerade nicht wo.
FelixA
Posts: 27
Joined: Sat Aug 13, 2005 4:42 pm

Post by FelixA »

Hmm. Kann sein. Ich hab jetzt nochmal einiges ausprobiert, aber es klappt noch nicht. Zwei Dinge die mich wundern. In einer Datei des SDK laß ich von dem Pfad:
/dev/usb/iowarrior

Dieser Ordner existiert bei mir jedoch nicht. Vielleicht ist, dass ein Zeichen, dass das Modul nicht richtig installiert ist.

Und dann hab ich mal versucht die iowkittest.c mit gcc zu komplieren. Es gab folgende Fehlermeldungen:

gcc -o iowkittest iowkittest.c

/tmp/ccIeCukV.o(.text+0x18): In function `WriteSimple':
: undefined reference to `IowKitGetProductId'
/tmp/ccIeCukV.o(.text+0x48): In function `WriteSimple':
: undefined reference to `IowKitWrite'
/tmp/ccIeCukV.o(.text+0x7d): In function `WriteSimple':
: undefined reference to `IowKitWrite'
/tmp/ccIeCukV.o(.text+0xc1): In function `main':
: undefined reference to `IowKitOpenDevice'
/tmp/ccIeCukV.o(.text+0xea): In function `main':
: undefined reference to `IowKitGetNumDevs'
/tmp/ccIeCukV.o(.text+0x124): In function `main':
: undefined reference to `IowKitGetDeviceHandle'
/tmp/ccIeCukV.o(.text+0x141): In function `main':
: undefined reference to `IowKitGetSerialNumber'
/tmp/ccIeCukV.o(.text+0x153): In function `main':
: undefined reference to `IowKitGetProductId'
/tmp/ccIeCukV.o(.text+0x1bc): In function `main':
: undefined reference to `IowKitSetWriteTimeout'
/tmp/ccIeCukV.o(.text+0x28a): In function `main':
: undefined reference to `IowKitWrite'
/tmp/ccIeCukV.o(.text+0x2ab): In function `main':
: undefined reference to `IowKitReadImmediate'
/tmp/ccIeCukV.o(.text+0x2f8): In function `main':
: undefined reference to `IowKitCloseDevice'
collect2: ld returned 1 exit status
kit


Vielleicht weiß ja jemand etwas. Diese Fehlermeldungen, kommen wohl nicht durch einen falschen Programmcode sondern durch etwas anders (falscher Pfad, fehlende Datei). Ich werd jetzt erstmal das kdevelop installieren und probier dann noch rum.

Liebe Grüße,
felix
towaibw
Posts: 198
Joined: Sat Dec 27, 2003 10:55 pm
Location: Berlin / Germany
Contact:

Post by towaibw »

Hallo Felix,
Probiere doch mal

Code: Select all

ldd ./iowkittest
dann bekommst Du alle libraries aufgelistet, welche das prog benötigt und welche davon gefunden wurden oder nicht.
FelixA wrote:Ich hoffe du weiß, was nicht passt. Die "liliowkit.so" exisitierte ja bereits im SDK.
Das alleine reicht nicht, das System muß die llib auch finden können. Das erreichst Du, indem Du das Verzeichnis (wo libiowkit.so enthalten ist) in die Umgebungsvariable LD_LIBRARY_PATH setzt oder ldconfig benutzt (unter

Code: Select all

man ldconfig
gibts mehr Informationen ;-)

Thomas
FelixA
Posts: 27
Joined: Sat Aug 13, 2005 4:42 pm

Post by FelixA »

Hallo Thomas,
du hast mir schon rießig geholfen. Es klappt zwar noch nicht, aber ich glaube ich stehe kurz davor.

Ich hab mal alles durchprobiert. Die Umgebungsvariable "LD_LIBRARY_PATH" konnte ich in keiner Datei finden, deshalb kopiert ich die "libiowkit.so" in den Ordner "/usr/lib".
Als ich dann "ldd ./iowkittest" ausführte erhielt ich:

Code: Select all

linux-gate.so.1 =>  (0xffffe000)
libiowkit.so => /usr/lib/libiowkit.so (0x4002e000)
libc.so.6 => /lib/tls/libc.so.6 (0x40032000)
libstdc++.so.5 => /usr/lib/libstdc++.so.5 (0x40147000)
libm.so.6 => /lib/tls/libm.so.6 (0x40204000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x40226000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
Ich glaube, das beduetet, alles ist ok. Als ich nun "./iowkittest" ausführte erhielt ich folgende Meldung:

Code: Select all

Failed to open device
Dann dachte ich mir, an den Modulen kann etwas nicht stimmen. Deshalb machte ich im Ordner "/LinuxSDK/Kernel_2.6/Device" nochmal "make" und dann "make install". Ich erhielt dann folgende Fehlermeldung:

Code: Select all

modprobe -qr iowarrior;
cp ./iowarrior.ko /lib/modules/2.6.4-52-default/kernel/drivers/usb/misc/;
depmod -e -A;
modprobe iowarrior debug=0;
FATAL: Error inserting iowarrior (/lib/modules/2.6.4-52-default/kernel/drivers/usb/misc/iowarrior.ko): Unknown symbol in module, or unknown parameter (see dmesg)
make: *** [install] Fehler 1
Ich glaube, wenn man diese Fehlermeldung behoben hat, müsste es klappen. Ich würde mich sehr freuen, wenn ihr mir nochmal helfen könntet.

Danke.

Liebe Grüße,
Felix
towaibw
Posts: 198
Joined: Sat Dec 27, 2003 10:55 pm
Location: Berlin / Germany
Contact:

Gerätedateien /dev/usb/iowarrior0 ... iowarrior15

Post by towaibw »

Hallo Felix,

auch wenn es keine Antwort auf Deine letzte Frage ist: was ist denn daraus geworden:
... Zwei Dinge die mich wundern. In einer Datei des SDK laß ich von dem Pfad:/dev/usb/iowarrior
Dieser Ordner existiert bei mir jedoch nicht. Vielleicht ist, dass ein Zeichen, dass das Modul nicht richtig installiert ist.
Diese Gerätedateien werden durch das Script make_nodes erzeugt. Das Makefile hat jedoch einen "Hacken": beim erstemn Aufruf schlägt die Zeile "modprobe -qr iowarrior" fehl, da ja noch kein Modul geladen wurde. Make bricht dann ab und make_nodes wird nicht mehr aufgerufen und somit die Gerätedateien nicht angelegt.
Du kannst das Script auch "per Hand" aufrufen.

Erledige das einmal und probiere, ob dann schon mehr funktioniert.

Gruß
Thomas
FelixA
Posts: 27
Joined: Sat Aug 13, 2005 4:42 pm

Post by FelixA »

Hallo Thomas.
Wenn ich als SuperUser ./make_nodes aufrufe erhalte ich nur folgende Fehlermeldung:

Code: Select all

bash: ./make_nodes: Keine Berechtigung
Ich geb mal, was bei make und make install ausgegben wird.
make

Code: Select all

make -C /lib/modules/2.6.4-52-default/build SUBDIRS=/home/gagantua/Documents/io-warrior/LinuxSDK/Kernel_2.6/Driver modules
make[1]: Entering directory `/usr/src/linux-2.6.4-52'
  CHK     include/linux/version.h
*** Warning: Overriding SUBDIRS on the command line can cause
***          inconsistencies
make[2]: »arch/i386/kernel/asm-offsets.s« ist bereits aktualisiert.
  CHK     include/asm-i386/asm_offsets.h
  CC [M]  /home/gagantua/Documents/io-warrior/LinuxSDK/Kernel_2.6/Driver/iowarrior.o
/home/gagantua/Documents/io-warrior/LinuxSDK/Kernel_2.6/Driver/iowarrior.c: In function `iowarrior_release':
/home/gagantua/Documents/io-warrior/LinuxSDK/Kernel_2.6/Driver/iowarrior.c:640: warning: implicit declaration of function `usb_kill_urb'
  Building modules, stage 2.
  MODPOST
  LD [M]  /home/gagantua/Documents/io-warrior/LinuxSDK/Kernel_2.6/Driver/iowarrior.ko
make[1]: Leaving directory `/usr/src/linux-2.6.4-52'
und dann bei make install

Code: Select all

modprobe -qr iowarrior;
cp ./iowarrior.ko /lib/modules/2.6.4-52-default/kernel/drivers/usb/misc/;
depmod -e -A;
modprobe iowarrior debug=0;
FATAL: Error inserting iowarrior (/lib/modules/2.6.4-52-default/kernel/drivers/usb/misc/iowarrior.ko): Unknown symbol in module, or unknown parameter (see dmesg)
make: *** [install] Fehler
Ich hoffe das Hilft uns weiter.

Liebe Grüße,
Felix
Robert Marquardt
Posts: 543
Joined: Mon Dec 01, 2003 6:09 pm

Post by Robert Marquardt »

Wieso wundert mich das jetzt nicht. Bei SuSE 9.1 koennen wir nichts versprechen. Die Warnung zu usb_kill_urb deutet an das es nicht funktionieren kann.
FelixA
Posts: 27
Joined: Sat Aug 13, 2005 4:42 pm

Post by FelixA »

Hmm, was stört denn an der Distribution? Soll ich mir den neuen Kernel hohlen? Ich nutze gerade die Version: 2.6.4-52
Auf meinem Laptop würde ich auch gern den Warrior nutzen, nur wollte ich mir auf diesem die Ubuntu Distribution installieren und nicht SuSE. Die Distirbution ist doch eigentlich auch egal, denn es geht ja nur um den Kernel.
Robert Marquardt
Posts: 543
Joined: Mon Dec 01, 2003 6:09 pm

Post by Robert Marquardt »

Die Warnung zu usb_kill_urb deutet an das diese Funktion erst in einer spaeteren Kernelversion dazugekommen ist.
Das das Laden des Moduls fehlschlaegt bestaetigt es.

Ab Kernel 2.6.11 sollte es gehen. Ob 2.6.9 bzw 10 gehen weiss ich nicht.
FelixA
Posts: 27
Joined: Sat Aug 13, 2005 4:42 pm

Post by FelixA »

Danke Robert.
Dann update ich mal meinen Kernel!
FelixA
Posts: 27
Joined: Sat Aug 13, 2005 4:42 pm

Post by FelixA »

Hab den Kernel 2.6.13 installiert. Schon bei den Standart Kerneleinstellungen sind die HID Treiber aktiviert. Diese auch so lassen.
Wenn ich jetzt "make" und "make install" mache, werden die Treiber ordnungsgemäß als Modul installiert.

Wenns bei euch also nicht klappt, dann achtet gleich mal auf den Kernel, denn die mitgelieferten Treiber sind nicht für alle 2.6er Kernels gedacht. Sie laufen sicher auf einem 2.6.13er. Robert Marquard meinte es ginge auch schon ab 2.6.10.

Liebe Grüße
Felix
wayoda
Posts: 362
Joined: Fri Dec 19, 2003 12:00 pm
Location: Wuppertal/Germany

Post by wayoda »

FelixA wrote: Wenns bei euch also nicht klappt, dann achtet gleich mal auf den Kernel, denn die mitgelieferten Treiber sind nicht für alle 2.6er Kernels gedacht. Sie laufen sicher auf einem 2.6.13er. Robert Marquard meinte es ginge auch schon ab 2.6.10.
Bei einem Kernel >= 2.6.10 funktioniert es auf jeden Fall, aber es geht ebenfalls mit einem Suse-Kernel ab Version 9.2. (Kernel 2.6.8) da Suse den nötigen Patch hier schon eingebaut hatte, bevor er im Mainstream-Kernel integriert wurde.

Eberhard
dummbatz
Posts: 4
Joined: Thu Oct 20, 2005 3:39 pm

Post by dummbatz »

hallo allerseits,
ich habe ein iowarrior 24 und wollte heute den kernelmodul installieren. ich habe suse 9.2. mit ein 2.6.8-xxx kernel. will allerdings kein 2.6.10 kernel installieren. habe leider folgendes problem:
die module kompiliere ich selbst und lade die mit insmod- klappt super
mit mknod mache ich mir im /dev/usb ein iowarrior0 und iowarrior1 devices. z.B. mknod iowarrior0 c 180 208
und mknod iowarrior1 c 180 209
wenn ich in ein c-programm ein read auf /dev/usb/iowarrior0 aufrufe oder cat iowarrior0 in der konsole eingebe kriege die fehlermeldung
cat: iowarrior0: Das Argument ist ungültig
oder : Invalid argument bei dem c-programm
hat jemand eine idee woran es liegen könnte? danke.
wayoda
Posts: 362
Joined: Fri Dec 19, 2003 12:00 pm
Location: Wuppertal/Germany

Post by wayoda »

Hallo... Äh (Schöner Nickname übrigens :-)
dummbatz wrote: ich habe suse 9.2. mit ein 2.6.8-xxx kernel. will allerdings kein 2.6.10 kernel installieren.
Ist auch nicht nötig. Bei Suse funktionierts auch ab Kernel 2.6.8
dummbatz wrote: cat: iowarrior0: Das Argument ist ungültig
Direktes cat auf das Device geht nicht. Zumindest weisst du aber schon, dass der iowarrior erkannt wird. Ansonsten wäre die Fehlermeldung sowas wie
"Device not found"
dummbatz wrote: Invalid argument bei dem c-programm
Ohne code kann man nichts dazu sagen.

Ein kleines Testprogramm folgt unten. Das Programm wartet nach dem Start maximal 10 Sekunden ob sich an den Eingängen etwas verändert.
Wenn man einen Eingang verändert wird der neue Wert auf der console ausgegen und das Programm beendet sich sofort.

Vielleicht einfach mal compilieren mit
gcc -Wall minimum_read0.c -o minimum_read0
und testen. Falls dann noch Probleme sind, melde dich noch mal

Code: Select all

#include <stdlib.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/input.h>
#include <linux/ioctl.h>
#include <errno.h>
#include<sys/time.h>
#include "iowarrior.h"


int main (int argc, char **argv) {

    int fd1 = -1;

    if(( fd1 = open( "/dev/usb/iowarrior0", O_RDWR)) < 0 )
    {
	perror( "iowarrior0 open" );
	exit( 1 );
    }

    unsigned char in_buffer[3];
    int result=-1;	//result of read and select operations
    fd_set rfds;	//fd_set for select
    struct timeval tv;	//the timeout for select
    tv.tv_sec=10;	//timeout is set to 10 seconds 
    tv.tv_usec=0;
    FD_ZERO(&rfds);	//clear the read-descriptors for select
    FD_SET(fd1, &rfds);	
    result=select(fd1+1,&rfds,NULL,NULL,&tv);
    printf("select returned %d\n",result);
    if(result==-1) {
	//error in select
	int errcode=errno;
	printf("Error in select! errno=%d\n",errcode);
    }
    else if(result==0) {
	//select returned 0, no new data to be read
	printf("Select timed out without any data\n");
    }
    else {
	if(FD_ISSET(fd1,&rfds)) {
	    //We got here, so there should be new data available
	    result = read(fd1,in_buffer,3);
	    if(result!=3) {
		//well thats not what we expected...
		int errcode=errno;
		if(errcode==ENODEV) 
		    printf("Device was unplugged\n");
		else
		    printf("Error in reading! errno is set to : %d\n",errcode);
	    }
	    else {
		//buffer now contains the io-status
		printf( "%02x - %02x %02x \n",
			in_buffer[2],
			in_buffer[0],
			in_buffer[1]);
	    }
	}
    }
    close( fd1 );
    exit( 0 );
}
dummbatz
Posts: 4
Joined: Thu Oct 20, 2005 3:39 pm

Post by dummbatz »

hallo wayoda,
hier erst mal mein programmchen, mit dem ich den iow24 lesen will:

#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <errno.h>

int main(){
int readfd, writefd;
int bytes_read;
unsigned char puffer[8];

if((readfd = open("/dev/usb/iowarrior0",O_RDONLY)) < 0 ){
printf("kann iowarrior nicht oeffnen...\n");
exit(-1);
}
if((writefd = open("iowarrior.txt",O_WRONLY)) < 0 ){
printf("kann iowarrior.txt nicht oeffnen...\n");
exit(-1);
}
while(bytes_read = read(readfd,puffer,sizeof(puffer))){
if(bytes_read < 0)
perror("fehler beim lesen von iowarrior...\n");
else
write(writefd,puffer,bytes_read);
}
close(readfd);
close(writefd);
return 0;
}

ich weiss nicht wo man hier was falsch machen konnte, hihi. man lernt wohl nie aus..... bei deinem beispel, was steht den im "iowarrior.h"? würde mich trotzdem interessieren, wo das problemm liegt. das was mir auffällt ist, dass du nur 3 Bytes erwartest!!! wieso eigentlich? ich denke , dass da s das problemm bei mir sein dürfte, da ich zu viele bytes erwarte!!!! mal sehen was du darüber denkst. jetzt probiere ich dein programm....
Post Reply