Changes between Version 1 and Version 2 of IOC_T02


Ignore:
Timestamp:
Feb 10, 2022, 7:50:38 PM (3 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • IOC_T02

    v1 v2  
    55= Objectif général
    66
    7 L'objectif de la séance est de commander les LEDS et le bouton poussoir (BP) et en passant par un (des) pilote(s) installé(s) dans le noyau sur la !RaspberryPi 1.
     7L'objectif de la séance est de commander les LEDS et le bouton poussoir (BP) et en passant par des pilotes installé(s) dans le noyau sur la !RaspberryPi 1.
    88
    99Vous savez déjà contrôler les LEDS et accéder au BP depuis l'espace utilisateur. Pour cela, vous avez dû mapper dans l'espace virtuel du processus utilisateur la zone de l'espace d'adressage physique permettant l'accès aux GPIO. Mais, il vous fallait avoir les droits du root. En passant par un pilote, les LED et le BP seront accessibles par un utilisateur standard.
     
    2929  * **Pour les LEDS**
    3030    * Le driver LED ne commande qu'une seule LED dont il reçoit le numéro au moment de l'enregistrement.
    31     * On éteint la led si on écrit '0', on l'allume en écrivant '1', les aut
    32     * Si le driver led est /dev/led0_XY
     31    * On éteint la led si on écrit '0', on l'allume en écrivant '1'.
     32    * Si le device led est accessible par /dev/led0_XY
    3333      {{{#!c
    3434      char led = '0';
    35       fd = open("/dev/led0_XY", O_WR);
     35      int fd = open("/dev/led0_XY", O_WR);
    3636      write( fd, &led, 1);
    3737      }}}
     
    4040    * Quand le bouton est relâché, le pilote met le caractère `'0'`.
    4141    * Quand le bouton est enfoncé, le pilote met une valeur différente de `'0'`.
    42     * Si le driver bp est /dev/bp_XY
     42    * Si le device bp est accessible par /dev/bp_XY
    4343      {{{#!c
    4444      char bp;
    45       fd = open("/dev/bp_XY", O_RD);
     45      int fd = open("/dev/bp_XY", O_RD);
    4646      read( fd, &bp, 1);
    4747      }}}
     
    194194$ sudo insmod ./module.ko btn=18
    195195}}}
    196 * Pour les numéros de GPIO de LEDs, comme il peut y en avoir plusieurs, vous pouvez utiliser `module_param_array`.
     196* Pour les numéros de GPIO de LEDs, comme il pourrait y en avoir plusieurs (si vous voulez commander les deux leds en même temps), vous pouvez utiliser `module_param_array`.
    197197{{{#!c
    198198#define NBMAX_LED 32
     
    224224=== Création du driver
    225225
    226 * 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.
    227 * Vous ajoutez dans le fichier `.c` du module `ledbp`:
     226* Votre driver va être intégré dans un module. Vous allez donc créer un module **nommé `led`** (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.
     227* Vous ajoutez dans le fichier `.c` du module `led`:
    228228{{{#!c
    229229
     
    231231
    232232static int
    233 open_ledbp(struct inode *inode, struct file *file) {
     233open_led_XY(struct inode *inode, struct file *file) {
    234234    printk(KERN_DEBUG "open()\n");
    235235    return 0;
     
    237237
    238238static ssize_t
    239 read_ledbp(struct file *file, char *buf, size_t count, loff_t *ppos) {
     239read_led_XY(struct file *file, char *buf, size_t count, loff_t *ppos) {
    240240    printk(KERN_DEBUG "read()\n");
    241241    return count;
     
    243243
    244244static ssize_t
    245 write_ledbp(struct file *file, const char *buf, size_t count, loff_t *ppos) {
     245write_led_XY(struct file *file, const char *buf, size_t count, loff_t *ppos) {
    246246    printk(KERN_DEBUG "write()\n");
    247247    return count;
     
    249249
    250250static int
    251 release_ledbp(struct inode *inode, struct file *file) {
     251release_led_XY(struct inode *inode, struct file *file) {
    252252    printk(KERN_DEBUG "close()\n");
    253253    return 0;
    254254}
    255255
    256 struct file_operations fops_ledbp =
    257 {
    258     .open       = open_ledbp,
    259     .read       = read_ledbp,
    260     .write      = write_ledbp,
    261     .release    = release_ledbp
     256struct file_operations fops_led =
     257{
     258    .open       = open_led_XY,
     259    .read       = read_led_XY,
     260    .write      = write_led_XY,
     261    .release    = release_led_XY
    262262};
    263263}}}
     
    269269  * et **dans la fonction d'initialisation du module**, vous ajoutez l'enregistrement du driver,
    270270    {{{#!c
    271     major = register_chrdev(0, "ledbp", &fops_ledbp); // 0 est le numéro majeur qu'on laisse choisir par linux
     271    major = register_chrdev(0, "led", &fops_led); // 0 est le numéro majeur qu'on laisse choisir par linux
    272272    }}}
    273273  * et **dans la fonction exit du module**, vous allez décharger le driver dans ce module en ajoutant :
    274274    {{{#!c
    275     unregister_chrdev(major, "ledbp");
     275    unregister_chrdev(major, "led");
    276276    }}}
    277277
     
    281281* Vous allez chercher dans le fichier `/proc/devices` le numéro `major` choisi par linux.
    282282* vous allez maintenant créer le noeud dans le répertoire `/dev` et le rendre accessible par tous.
    283   Le numéro mineur est 0 car il n'y a qu'une seule instance.
     283  * Dans les lignes qui suivent pensez à remplacer `major` par sa valeur !
     284  * Le numéro mineur est 0 car il n'y a qu'une seule instance.
     285
    284286{{{
    285 sudo mknod /dev/ledbp c major 0
    286 sudo chmod a+rw /dev/ledbp
     287sudo mknod /dev/led0_XY c major 0
     288sudo chmod a+rw /dev/led0_XY
    287289}}}
    288290
     
    292294* Le test de votre driver peut se faire par les commandes suivantes (avant de faire un vrai programme): dites ce que vous observez, en particulier, quelles opérations de votre driver sont utilisées.
    293295  {{{#!sh
    294   $ echo "rien" > /dev/ledbpXY
    295   $ dd bs=1 count=1 < /dev/ledbp
     296  $ echo "rien" > /dev/led0_XY
     297  $ dd bs=1 count=1 < /dev/led0_XY
    296298  $ dmesg
    297299  }}}
     
    391393=== Travail à faire
    392394
    393 * Ecrivez le driver complet pour le 
    394 * Un script de chargement.
     395* Ecrivez le driver complet pour les leds et le BP
     396* Un script de chargement (vu en cours)
    395397* un programme de validation utilisant le driver.