Beispielprogramme des alten SDK unter Linux ?

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

Moderator: Guido Körber

Post Reply
blip
Posts: 12
Joined: Sun May 09, 2004 11:49 am
Location: Winznau, Switzerland
Contact:

Beispielprogramme des alten SDK unter Linux ?

Post by blip »

Hallo zusammen,

ich habe ein kleines Problem. Durch einen Plattencrash kamen mir ein
paar Sachen abhanden, unter anderem meine Versuche mit dem
IOWarrior.

Ich bin auf der Suche nach den Beispielprogrammen aus dem alten
SDK (im neuen sind sie nicht mehr dabei) um ein Problem zu lösen.
Vielleicht kann mir jemand mit dem alten SDK aushelfen oder erinnert
sich wie man die Seriennummern der Antwortpakete erhält ?

Ich steuere den IOWarrior über das Kernelmodul (somit also
/dev/usb/iowarriorX) und ioctls an, also z.B. so:

Code: Select all

  char data[9];
  data[0]=0x0c;       /* special mode: rc5 */
  data[1]=0x01;       /* enable it */
  if(ioctl(fd, IOW_WRITE, &data)) {
                printf("error in write ioctl\n");
  }
Der Code funktioniert im Grunde auch, ich kann (wie in diesem
Beispiel) RC5 Codes empfangen - aber ohne die Nummer des
Antwortpaketes. In diesem Beispiel heisst das, dass ich nicht
so einfach entscheiden kann, ob eine Taste nochmals gedrückt
wurde, gedrückt gehalten wird oder nicht. Der dazugehörige
Code ist dieser (muss ich die Grösse ddes Puffers irgendwie
hier mitteilen ????)

Code: Select all

  data[0]=0;     /* clear bytes */
  data[1]=0;
  if(ioctl(fd, IOW_READ, &data)) {
                printf("error in write ioctl\n");
  }
(Ja ich weiss, es gibt bei RC5 das Togglebit - habe das Problem
aber auch z.B. bei benutzung der I2C Funktion).

Vielen Dank

Blip
Last edited by blip on Wed May 28, 2008 9:40 pm, edited 1 time in total.
wayoda
Posts: 362
Joined: Fri Dec 19, 2003 12:00 pm
Location: Wuppertal/Germany

Post by wayoda »

Ich nehme an, dass sich die Frage auf die interne Serienummer für gepufferte Datenpakete vom IOWarrior bezieht, die im Kernelmodul verwaltet wird.

Dein Lese-Beispiel verwendet leider den ioctl-Befehl IOW_READ was jedoch einem asynchronen Aufruf der Funktion usb_control_msg bewirkt. Diese Art zu Lesen umgeht jedoch den interen Datenpuffer des Moduls, und liefert daher auch nicht die laufende Nummer des Datenpaketes.

Richtig wäre es eine "normale" read-Funktion auf den Filedescriptor zu verwenden wie im unten folgenden Code. Die Länge des übergebenen Puffers muß (für Special-Modes) 9 betragen, und die gewünschte Nummer findest Du bei der Rückkehr der Funtion in data[8].

Üblicherweise würde man natürlich noch einen select-Aufruf benutzen, um erst mal zu testen ob überhaupt Daten zum Lesen vorliegen (ansonsten blockiert read() im folgenden Beispiel bis neue Daten ankommen).

Minimaler Code zum Lesen vom Special-Mode Interface:

Code: Select all

#include <stdlib.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <asm/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/input.h>

#include <linux/ioctl.h>
#include "iowarrior.h"

typedef char IOWReport[9];

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

	int fd1 = -1;

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

	IOWReport in_buffer;
	
	int retval=-1;

	retval = read( fd1, in_buffer, 9 );
	if( retval <= -1 )
		{
			printf("retval = %d\n",retval);
			perror( "iowarrior1 read" );
			goto end;
		}
	printf( "%02x - %02x %02x %02x %02x %02x %02x %02x %02x\n",
					in_buffer[8],
					in_buffer[0],
					in_buffer[1],
					in_buffer[2],
					in_buffer[3],
					in_buffer[4],
					in_buffer[5],
					in_buffer[6],
					in_buffer[7]);
 end:
	close( fd1 );
	exit( 0 );
}
Eberhard
blip
Posts: 12
Joined: Sun May 09, 2004 11:49 am
Location: Winznau, Switzerland
Contact:

:-)

Post by blip »

Ja, genau das meinte ich. Excellent, vielen Dank :-)
(Da war ja die Lösung so offensichtlich, dass ich sie nicht sehen
konnte und es unnötig kompliziert versucht habe ;-)
Post Reply