Ich schreibe einen chardev-treiber für eigene Hardware. Dazu habe ich als fileoperations folgende als relevant definiert:
struct file_operations vpu_driver_operations = {
.owner = THIS_MODULE,
.open = vpu_Open,
.release = vpu_Release,
.llseek = vpu_Llseek,
.read = vpu_Read,
.write = vpu_Write,
.ioctl = vpu_ioctl,
};
Ich linke diesen Treiber fest in den Kernel und erzeuge beim Start ein devicenode mit Major 41
In meiner Applikation benutze ich nun also ein FILE *vpu_fd = fopen("/dev/vpu", „rw“);
–> Klappt.
In dem Treiber selbst, lasse ich mir messages generieren, um zu sehen, an welchen Stellen mein Treiber durchlaufen
wird und auch, welche Adressen z.B. mit lseek gesetzt werden oder welche commands und arguments ein ioctl bekommt.
Seltsam ist nun, dass mein ioctl aufgerufen wird, direkt zwischen open und close, obwohl ich
dies in meiner Applikation gar nicht explizit mache…
Die Parameter sind dabei: cmd 0x5401, arg 0xeff8e4
Dieses 0x5401 ist im Linux-kernel definiert als
MGSL_MAGIC
TCGETS
TTY_MAGIC
Kann der MOD_INC_USE_COUNT damit etwas zu tun haben? Wer ruft das auf??
Hingegen wird mein oictl aber NICHT aufgerufen, wenn ich dies explizit in meiner Applikation tue…
Aus meinem user-prog kann ich offenbar nicht einfach so vpu_status = ioctl(vpu_fd, 0x414, 0);
aufrufen, denn der erwartet ja einen integer als ersten parameter (filedescriptor)…
Ich habe jedoch beim open nur einen Filepointer bekommen. Ich erhalte natürlich eine warning, und es wird
nicht die ioctl aufgerufen, welche ich implementiert habe, denn das würde ich ja im LOG sehen wegen printk…
Es wird anscheinend gar keine ioctl funktion aufgerufen bzw. der Aufruf kommt eben nicht bei der von mir
implementierten funktion an…
Haben Sie da eine gute Referenz im Internet oder besser noch eine Idee, was ich hier falsch mache?
Habe es auch mit fcntl versucht. Keine Warning mehr allerdings immernoch kein Aufruf meines Treibers…