Changes between Version 8 and Version 9 of SujetTP2-2017
- Timestamp:
- Feb 3, 2017, 7:37:32 AM (8 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
SujetTP2-2017
v8 v9 11 11 Ce pilote sera accessible dans par le pseudo-fichier `/dev/ledbpXY`\\ 12 12 '''XY''' correspond aux initiales de votre binôme pour éviter les conflits avec vos camarades\\ 13 Par exemple, pour '''A'''lmada et '''F'''omentin, il faudrait créer /dev/ledbp'''AF''' 13 Par exemple, pour '''A'''lmada et '''F'''omentin, il faudrait créer /dev/ledbp'''AF'''\\\\ 14 **Dans le texte de TP, nous n'avons pas fait apparaître les lettres XY, vous devez les ajoutez vous-même.** 14 15 }}} 15 16 }}} … … 66 67 La première étape consiste à créer un module noyau, l'insérer puis l'effacer du noyau. 67 68 68 Le module minimal se compose d'une fonction d'initialisation et d'une fonction de cleanup, dans le fichier `module.c` suivant:69 Le module minimal se compose d'une fonction d'initialisation et d'une fonction de cleanup, dans le fichier `module.c` suivant: 69 70 70 71 {{{#!c … … 136 137 }}} 137 138 * Les commandes `lsmod`et `dmesg` permettent de voir que les actions du module. 138 * Dans le CR, vous pouvez résumerce que que vous avez fait et ce que vous observez.139 * **Résumez dans le CR** ce que que vous avez fait et ce que vous observez. 139 140 140 141 == Étape 2 : ajout des paramètres au module == … … 143 144 Dans un premier temps vous allez vous contenter d'indiquer le nombre de LED et de bouton pour le module de test, mais il faudra être plus précis pour le vrai driver. 144 145 145 Vous devez ajouterdans module.c (faite d'équivalent pour les boutons):146 **Vous devez ajouter** dans module.c (faite d'équivalent pour les boutons): 146 147 {{{#!c 147 148 static int LED; … … 161 162 }}} 162 163 163 * Comment voir que le paramètre a été lu164 * **Comment voir** que le paramètre a été lu ? 164 165 165 166 == Étape 3 : création d'un driver qui ne fait rien mais dans le noyau == 166 167 167 Votre driver va être intégré dans un module. Vous allez donc créer un module nommé `ledbp`paramétré avec les numéros de ports pour les LEDS et le bouton. Vous utiliserez un nouveau répertoire. Vous modifierez le Makefile en conséquence.168 Votre driver va être intégré dans un module. Vous allez donc créer un module **nommé `ledbp`** (et non plus module) paramétré avec les numéros de ports pour les LEDS et le bouton. Vous utiliserez un nouveau répertoire. Vous modifierez le Makefile en conséquence. 168 169 169 170 * Vous ajoutez dans le fichier `.c` du module: … … 172 173 173 174 #include <linux/fs.h> 175 176 static int 177 open_ledbp(struct inode *inode, struct file *file) { 178 printk(KERN_DEBUG "open()\n"); 179 return 0; 180 } 181 182 static ssize_t 183 read_ledbp(struct file *file, char *buf, size_t count, loff_t *ppos) { 184 printk(KERN_DEBUG "read()\n"); 185 return count; 186 } 187 188 static ssize_t 189 write_ledbp(struct file *file, const char *buf, size_t count, loff_t *ppos) { 190 printk(KERN_DEBUG "write()\n"); 191 return count; 192 } 193 194 static int 195 release_ledbp(struct inode *inode, struct file *file) { 196 printk(KERN_DEBUG "close()\n"); 197 return 0; 198 } 174 199 175 200 struct file_operations fops_ledbp = … … 180 205 .release = release_ledbp 181 206 }; 182 static int 183 open_ledbp(struct inode *inode, struct file *file) { 184 printk(KERN_DEBUG "open()\n"); 185 return 0; 186 } 187 188 static ssize_t 189 read_ledbp(struct file *file, char *buf, size_t count, loff_t *ppos) { 190 printk(KERN_DEBUG "read()\n"); 191 return count; 192 } 193 194 static ssize_t 195 write_ledbp(struct file *file, const char *buf, size_t count, loff_t *ppos) { 196 printk(KERN_DEBUG "write()\n"); 197 return count; 198 } 199 200 static int 201 release_ledbp(struct inode *inode, struct file *file) { 202 printk(KERN_DEBUG "close()\n"); 203 return 0; 204 } 205 }}} 206 * Vous allez enregistrer ce driver dans ce module en ajoutant la fonction d'enregistrement dans la fonction init du module. Vous devez aussi prendre en compte les paramètres. C'est à vous de décider comment.\\\\ 207 208 }}} 209 210 * **Vous allez enregistrer** ce driver dans ce module en ajoutant la fonction d'enregistrement dans la fonction init du module. Vous devez aussi prendre en compte les paramètres. C'est à vous de décider comment.\\\\ 207 211 * Au début du fichier c du module, vous déclarez une nouvelle variable statique. 208 212 {{{#!c 209 213 static int major; 210 214 }}} 211 * et dans la fonction d'init alisation du module, vous ajouterl'enregistrement du driver,215 * et dans la fonction d'initialisation du module, vous ajoutez l'enregistrement du driver, 212 216 {{{#!c 213 register_chrdev(0, "ledbp"&fops_ledbp); // 0 est le numéro majeur qu'on laisse choisir par linux217 major = register_chrdev(0, "ledbp", &fops_ledbp); // 0 est le numéro majeur qu'on laisse choisir par linux 214 218 }}} 215 219 * et vous allez décharger le driver dans ce module en ajoutant dans la fonction exit du module: … … 220 224 * Vous devez compiler, déplacer le module (upload) et le charger (insmod). 221 225 * Vous allez chercher dans le fichier `/proc/devices` le numéro `major` choisi par linux. 222 * vous allez maintenant créer le noeud dans le répertoire `/dev` et le rendre accessible par tous.226 * vous allez maintenant créer le noeud dans le répertoire `/dev` et le rendre accessible par tous. 223 227 Le numéro mineur est 0 car il n'y a qu'une seule instance. 224 228 … … 227 231 sudo chmod a+rw /dev/ledbp 228 232 }}} 233 234 * **Comment savoir** que le device a été créé ? 229 235 230 236 Le test de votre driver peut se faire par les commandes suivantes (avant de faire un vrai programme): … … 235 241 $ dmesg 236 242 }}} 243 244 Nous pouvons automatiser le chargement du driver et son effacement dans des scripts shell:\\ 245 * Dans un fichier `insdev` 246 {{{#!bash 247 #!/bin/sh 248 module=$1 249 shift 250 /sbin/insmod ./$module.ko $* || exit 1 251 rm -f /dev/$module 252 major=$(awk "\$2==\"$module\" {print \$1;exit}" /proc/devices) 253 mknod /dev/$module c $major 0 254 chmod 666 /dev/$module 255 echo "Device /dev/$module created with major=$major" 256 }}} 257 * Dans un fichier `insdev` 258 {{{#!bash 237 259 238 260 == Étape 4 : accès aux GPIO depuis les fonctions du pilote ==