2016-04-15 4 views
0

Je crée un pilote pour un système encastré. J'utilise la fonction IOCTL. Le périphérique est enregistré correctement et les fonctions d'ouverture et d'écriture fonctionnent comme prévu, mais pas IOCTL.IOCTL: fonctionne uniquement avec le paramètre 0 dans le boîtier de commutation

Lorsque j'appelle IOCTL à partir de l'espace utilisateur avec le paramètre 0, la fonction my_ioctl est appelée avec ioctl_num = 0 mais lorsque j'utilise d'autres valeurs, la fonction my_ioctl kernel n'est pas appelée.

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

Quand je fais un appel IOCTL de l'espace utilisateur à l'aide READ_IOCTL (0), tout fonctionne correctement. Cependant, lorsque j'essaie WRITE_IOCTL et ASK_VALUE (1 et 2).

Si j'utilise les éléments suivants:

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

fonctionne uniquement WRITE_IOCTL appels de l'espace utilisateur. J'utilise Linux 3.16 et PowerPC. Une idée de ce qui ne va pas?

+0

Voici un exemple de pilote. Peut être utile https://github.com/jeyaramvrp/kernel-module-programming/tree/master/sample-char-dir – Jeyaram

+0

Merci d'avoir répondu. J'ai vu le code, mais il semble assez similaire à ce que j'ai fait. Il semble que le programme ne reconnaisse pas le nombre magique. Une idée pourquoi ça marche avec 0 et pas avec le 1,2,3, etc? –

+0

'Une idée pourquoi ça marche avec 0 et pas avec le 1,2,3, etc?' - probablement, vos codes correspondent aux codes ioctl prédéfinis. Voir [man ioctl_list] (http://man7.org/linux/man-pages/man2/ioctl_list.2.html). – Tsyvarev

Répondre

0

J'ai trouvé la solution. J'étais dans un noyau de 64 bits. Le code dans c dans l'espace utilisateur était en 32 bits. Je dois compiler en 64 bits pour pouvoir travailler.