Changes between Version 8 and Version 9 of SujetTP2-2017


Ignore:
Timestamp:
Feb 3, 2017, 7:37:32 AM (8 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • SujetTP2-2017

    v8 v9  
    1111  Ce pilote sera accessible dans par le pseudo-fichier `/dev/ledbpXY`\\
    1212  '''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.**
    1415}}}
    1516}}}
     
    6667La première étape consiste à créer un module noyau, l'insérer puis l'effacer du noyau.
    6768
    68 Le module minimal se compose d'une fonction d'initialisation et d'une fonction de cleanup, dans le fichier `module.c`suivant:
     69Le module minimal se compose d'une fonction d'initialisation et d'une fonction de cleanup, dans le fichier `module.c` suivant:
    6970
    7071{{{#!c
     
    136137}}}
    137138* Les commandes `lsmod`et `dmesg` permettent de voir que les actions du module.
    138 * Dans le CR, vous pouvez résumer ce 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.
    139140
    140141== Étape 2 : ajout des paramètres au module ==
     
    143144Dans 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.
    144145
    145 Vous devez ajouter dans module.c (faite d'équivalent pour les boutons):
     146**Vous devez ajouter** dans module.c (faite d'équivalent pour les boutons):
    146147{{{#!c
    147148static int LED;
     
    161162}}}
    162163
    163 * Comment voir que le paramètre a été lu
     164* **Comment voir** que le paramètre a été lu ?
    164165
    165166== Étape 3 : création d'un driver qui ne fait rien mais dans le noyau ==
    166167
    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.
     168Votre 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.
    168169
    169170* Vous ajoutez dans le fichier `.c` du module:
     
    172173
    173174#include <linux/fs.h>
     175
     176static int
     177open_ledbp(struct inode *inode, struct file *file) {
     178    printk(KERN_DEBUG "open()\n");
     179    return 0;
     180}
     181
     182static ssize_t
     183read_ledbp(struct file *file, char *buf, size_t count, loff_t *ppos) {
     184    printk(KERN_DEBUG "read()\n");
     185    return count;
     186}
     187
     188static ssize_t
     189write_ledbp(struct file *file, const char *buf, size_t count, loff_t *ppos) {
     190    printk(KERN_DEBUG "write()\n");
     191    return count;
     192}
     193
     194static int
     195release_ledbp(struct inode *inode, struct file *file) {
     196    printk(KERN_DEBUG "close()\n");
     197    return 0;
     198}
    174199
    175200struct file_operations fops_ledbp =
     
    180205    .release    = release_ledbp
    181206};
    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.\\\\
    207211  * Au début du fichier c du module, vous déclarez une nouvelle variable statique.
    208212   {{{#!c
    209213   static int major;
    210214   }}}
    211   * et dans la fonction d'initalisation du module, vous ajouter l'enregistrement du driver,
     215  * et dans la fonction d'initialisation du module, vous ajoutez l'enregistrement du driver,
    212216   {{{#!c
    213    register_chrdev(0, "ledbp" &fops_ledbp); // 0 est le numéro majeur qu'on laisse choisir par linux
     217   major = register_chrdev(0, "ledbp", &fops_ledbp); // 0 est le numéro majeur qu'on laisse choisir par linux
    214218   }}}
    215219  * et vous allez décharger le driver dans ce module en ajoutant dans la fonction exit du module:
     
    220224* Vous devez compiler, déplacer le module (upload) et le charger (insmod).
    221225* 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.
    223227  Le numéro mineur est 0 car il n'y a qu'une seule instance.
    224228
     
    227231sudo chmod a+rw /dev/ledbp
    228232}}}
     233
     234* **Comment savoir** que le device a été créé ?
    229235
    230236Le test de votre driver peut se faire par les commandes suivantes (avant de faire un vrai programme):
     
    235241$ dmesg
    236242}}}
     243
     244Nous pouvons automatiser le chargement du driver et son effacement dans des scripts shell:\\
     245* Dans un fichier `insdev`
     246{{{#!bash
     247#!/bin/sh
     248module=$1
     249shift
     250/sbin/insmod ./$module.ko $* || exit 1
     251rm -f /dev/$module
     252major=$(awk "\$2==\"$module\" {print \$1;exit}" /proc/devices)
     253mknod /dev/$module c $major 0
     254chmod 666 /dev/$module
     255echo "Device /dev/$module created with major=$major"
     256}}}
     257* Dans un fichier `insdev`
     258{{{#!bash
    237259
    238260== Étape 4 : accès aux GPIO depuis les fonctions du pilote ==