Changes between Version 4 and Version 5 of SujetTP3-2015


Ignore:
Timestamp:
Feb 28, 2015, 12:48:20 AM (10 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • SujetTP3-2015

    v4 v5  
    33== Objectif ==
    44
    5 L'objectif de la séance est le commander les leds et les boutons poussoir en passant par un pilote.
    6 Lors de la dernière séance pour commander les leds et accéder aux boutons, vous aviez dû mapper dans l'espace virtuel de l'utilisateur la zone de mémoire permettant l'accès aux GPIO. Il vous fallait avoir les droits du root pour cela. Désormais, les LED et boutons seront accessibles en mode utilisateur.
     5L'objectif de la séance est de commander les LEDS et les boutons poussoir en passant par un pilote.
     6Lors de la dernière séance pour commander les LEDS et accéder aux boutons, vous aviez dû mapper dans l'espace virtuel de l'utilisateur la zone de mémoire permettant l'accès aux GPIO. Il vous fallait avoir les droits du root pour cela. Désormais, les LED et boutons seront accessibles en mode utilisateur.
    77
    8 Nous allons donc créé un pilote pour le périphérique LED+!BoutonsPoussoir.
    9 Ce pilote sera accessible dans par le pseudo-fichier `/dev/ledbtn` (noter que vous serez peut-être obligé de changer un peu le nom pour éviter les conflit avec vos camarades).
     8Nous allons donc créer un pilote pour le périphérique LED+!BoutonsPoussoir.
     9Ce pilote sera accessible dans par le pseudo-fichier `/dev/ledbtn` (noter que vous serez peut-être obligé de changer un peu le nom pour éviter les conflits avec vos camarades).
    1010
    1111Par exemple vous pourrez écrire cela dans un fichier `test.c` ci-dessous. Ce que fait ce programme importe peu. Ce qui est important c'est que ce programme s'exécute entièrement en mode utilisateur.
    1212Le comportement proposé ici du pilote est le suivant.
    13 * Pour les leds on envoie un tableau de caractère de 4 cases. La case 0 définit l'état de la de leds 0 (`'0'` led éteinte sinon led allumée).
    14 * Pour les boutons, on propose un tableau de caractères de 2 cases. Le pilote lit l'état du bouton 0 et le met dans la case 0, et l'état du bouton 1 et le met dans la case 1. Quand le bouton est relaché, le pilote met le caractère `'0'`, quand le bouton est enfoncé, le pilote met la valeur `'1'`.
     13* Pour les LEDS, on envoie un tableau de caractère de 4 cases. La case 0 définit l'état de la LED 0 (`'0'` LED éteinte sinon LED allumée).
     14* Pour les boutons, on propose un tableau de caractères de 2 cases. Le pilote lit l'état du bouton 0 et le met dans la case 0, et l'état du bouton 1 et le met dans la case 1. Quand le bouton est relâché, le pilote met le caractère `'0'`, quand le bouton est enfoncé, le pilote met la valeur `'1'`.
    1515
    1616C'est une proposition, vous pouvez faire comme bon vous semble.
     
    3030   do {
    3131      for ( i=0; i<4; i++) {
    32          memcpy( led, "0000", 4);
    33          led[i] = '1';
    34          write( fd, led, 4);
     32         memcpy( LED, "0000", 4);
     33         LED[i] = '1';
     34         write( fd, LED, 4);
    3535         sleep( 1);
    3636      }
     
    4141}}}
    4242
    43 == Etapes ==
     43== Etape 1 : création et test d'un module noyau ==
    4444
     45La première étape consiste à créer un module noyau, l'insérer puis l'effacer du noyau.
     46
     47Le module minimal se compose d'une fonction d'initialisation et d'une fonction de cleanup, dans le fichier `module.c`suivant:
     48
     49{{{
     50include <linux/module.h>
     51#include <linux/init.h>
     52
     53MODULE_LICENSE("GPL");
     54MODULE_AUTHOR("Charlie, 2015");
     55MODULE_DESCRIPTION("Module, aussitot insere, aussitot efface");
     56
     57static int __init mon_module_init(void)
     58{
     59   printk(KERN_DEBUG "Hello World !\n");
     60   return 0;
     61}
     62
     63static void __exit mon_module_cleanup(void)
     64{
     65   printk(KERN_DEBUG "Goodbye World!\n");
     66}
     67
     68module_init(mon_module_init);
     69module_exit(mon_module_cleanup);
     70}}}
     71
     72Ce fichier est cross compilé et copié sur le raspberry cible avec le fichier `Makefile` suivant:
     73{{{
     74CARD_NUMB       = 23
     75ROUTER          = 132.227.102.36
     76LAB             = lab2
     77LOGIN           = franck
     78
     79MODULE          = module
     80
     81CROSSDIR        = /users/enseig/franck/peri
     82KERNELDIR       = $(CROSSDIR)/linux-rpi-3.18.y
     83CROSS_COMPILE   = $(CROSSDIR)/arm-bcm2708hardfp-linux-gnueabi/bin/bcm2708hardfp-
     84       
     85obj-m           += $(MODULE).o
     86default:;       make -C $(KERNELDIR) ARCH=arm CROSS_COMPILE=$(CROSS_COMPILE) M=$(PWD) modules
     87clean:;         make -C $(KERNELDIR) ARCH=arm CROSS_COMPILE=$(CROSS_COMPILE) M=$(PWD) clean
     88upload:;        scp -P50$(CARD_NUMB) $(MODULE).ko pi@$(ROUTER):$(LOGIN)/$(LAB)
     89}}}
     90
     91Vous devez créer ces fichiers et bien sûr, les comprendre.
     92
     93== étape 2 : création d'un driver qui ne fait rien mais dans le noyau ==
     94
     95== étape 3 : accès aux GPIO depuis les fonctions du pilote ==
     96