Effectuer un ioctl à partir de l’espace kernel

J’écris un pilote de kernel qui doit exécuter un ioctl sur un autre périphérique. Je réalise que ce n’est pas la meilleure façon de gérer le code, mais il ne s’agit que d’une solution temporaire pour l’instant. Je récupère le code d’erreur -22 (argument invalide) de mon appel ioctl dans la fonction, mais je ne vois pas ce qui pourrait être erroné avec les arguments. Voici les sections de code pertinentes.

#define GPIO74 "/dev/gpio/74" struct file* gpio74FD; . . . gpio74FD = filp_open(GPIO74,O_RDWR,0) . . . int device_ioctl(struct inode* inode,struct file *file, unsigned int ioctl_num,unsigned long ioctl_param) { . . . ret_val = gpio74FD->f_op->ioctl(inode, gpio74FD, GPIO_CONFIG_AS_INP, 0); //returns error code -22 (Invlaid Argument) . . . return ret_val; } 

Je suppose que cela peut avoir quelque chose à voir avec le passage de l’inode incorrect ici, mais je ne sais même pas comment obtenir le bon inode si ce n’est pas celui transmis à ioctl depuis l’espace utilisateur.

Puisque vous êtes maintenant au plus profond de la zone de piratage “ne faites pas ça”, append quelques printk au pilote gpio pourrait vous donner des informations précieuses.

Une autre option consiste à éviter ce piratage horrible et à passer à un processus moins dangereux: ajoutez une fonction exscope au pilote gpio, que vous pouvez appeler à partir de votre propre module.