PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : zugriff auf devices mit ioctl



kat
23.02.05, 11:35
Hallo!
Ich habe einen Unix Treiber für ein xscale board und die an einem i2c bus hängenden devices geschrieben. Dieser läuft auch soweit recht gut. Allerdings ist der Zugriff auf die devices nur über ein cat oder echo auf den node unter /dev/i2c oder auf eine implementierte Schnittstelle unter /proc/sys/dev/... möglich. Nun möchte ich aber eine "normale" Zugriffsmöglichkeit haben. Über ein user Programm kann ich den device node auch öffnen (das open des treibers wird verwendet). Aber sobald ich mich mit ioctl versuche, kommt nur der Fehler EINVAL zurück; das ioctl des Treibers wird gar nicht aufgerufen! Das release ist wieder das vom Treiber. Sobald ich "echo" auf den device node ausführe wird interessanterweise sehr wohl das ioctl des Treibers verwendet (dies habe ich durch printks getestet)!

Ich habe nicht die geringste Ahnung woran es liegen könnte, vielleicht ein Problem mit dem Kernel?! Ich verwende die Version 2.4.19.

Wäre super wenn hier jemand was weiß! Danke!

kat
23.02.05, 13:44
hm, ich habe jetzt da weiter geforscht - es sieht irgendwie so aus, als wenn ich im open zwar die richtigen major/ minor nummern hätte. Diese sind aber beim Aufruf des ioctl geändert in minor 64 und major 4 (also serielles device). Keine Ahnung wie das passieren kann?! So sieht mein main aus:

int file;

if (file = open("/dev/i2c0",O_RDWR) < 0) {
printf("\nfile <0\n");
printf("errno: %d\n", errno);
exit(1);
}

printf("\nopen erfolgreich\n");

long addr = 0x4D;

if(ioctl(file,I2C_SLAVE,addr) < 0) {
printf("\nioctl <0 \n");
printf("errno: %d\n", errno);
}

spoensche
13.05.06, 00:35
du musst folgendes verwenden, dann sollte es funzen:

long addr;

int fd = open("/dev/i2c0",O_RDONLY);

if (fd == -1) perror("Device open error:");

if (ioctl(fd,I2C_SLAVE,&addr) == -1) perror("IOCTL error:");

// hier der rest von deinem code.