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?
Voici un exemple de pilote. Peut être utile https://github.com/jeyaramvrp/kernel-module-programming/tree/master/sample-char-dir – Jeyaram
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? –
'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