2016-04-15 17 views
0

Ich erstelle einen Treiber für ein versenktes System. Ich verwende IOCTL-Funktion. Das Gerät ist korrekt registriert und die Funktionen zum Öffnen und Schreiben funktionieren wie erwartet, IOCTL jedoch nicht.IOCTL: arbeite nur mit Parameter 0 im Switch-Case

Wenn ich IOCTL aus Benutzerraum mit Parameter 0 aufrufen, die my_ioctl-Funktion mit ioctl_num = 0 aufgerufen, aber wenn ich andere Werte verwende, wird die my_ioctl Kernel-Funktion nicht aufgerufen.

#define READ_IOCTL      _IO(UAM_DEV_MAGIC, 0) 
#define WRITE_IOCTL      _IO(UAM_DEV_MAGIC, 1) 
#define ASK_VALUE      _IO(UAM_DEV_MAGIC, 2) 

Als ich einen IOCTL-Aufruf vom Anwenderraum mit READ_IOCTL (0) machen, alles richtig funktioniert. Wenn ich jedoch WRITE_IOCTL und ASK_VALUE (1 und 2) versuche.

Wenn ich folgendes:

#define READ_IOCTL      _IO(UAM_DEV_MAGIC, 1) 
#define WRITE_IOCTL      _IO(UAM_DEV_MAGIC, 0) 
#define ASK_VALUE      _IO(UAM_DEV_MAGIC, 2) 

Funktioniert nur WRITE_IOCTL Anrufe von User-Space. Ich benutze Linux 3.16 und PowerPC. Irgendeine Idee was falsch ist?

+0

Hier ist ein Beispieltreiber. Könnte hilfreich sein https://github.com/jeyaramvrp/kernel-module-programming/tree/master/sample-char-dir – Jeyaram

+0

Vielen Dank für Ihre Antwort. Ich habe den Code gesehen, aber er scheint dem, was ich getan habe, ziemlich ähnlich zu sein. Es sieht so aus, als ob das Programm die magische Zahl nicht rekonstruiert. Irgendeine Idee warum funktioniert es mit 0 und nicht mit dem 1,2,3, etc? –

+0

'Jede Idee, warum funktioniert es mit 0 und nicht mit der 1,2,3, etc?' - Wahrscheinlich stimmen Ihre Codes mit vordefinierten ioctl Codes. Siehe [man ioctl_list] (http://man7.org/linux/man-pages/man2/ioctl_list.2.html). – Tsyvarev

Antwort

0

Ich habe die Lösung gefunden. Ich war in einem Kernel von 64 Bit. Der Code in c im Benutzerraum war in 32 Bit. Ich muss in 64 Bit kompilieren, um arbeiten zu können.