Changes between Version 3 and Version 4 of IOC20_T02


Ignore:
Timestamp:
Feb 7, 2020, 7:25:09 AM (5 years ago)
Author:
franck
Comment:

ur

Legend:

Unmodified
Added
Removed
Modified
  • IOC20_T02

    v3 v4  
    11= Pilote de périphérique simple
    22
    3 EN COURS DE MODIFICATION ...
    4 
    53== Objectif
    64
    7 L'objectif de la séance est de commander les LEDS et le bouton poussoir (BP) et en passant par un pilote installé dans le noyau sur la !RaspberryPi 1.
     5L'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.
    86Vous 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.
    97
     
    119{{{#!td
    1210**Nous allons donc créer un pilote pour le périphérique LED et BP.**\\
    13   Ce pilote sera accessible dans par le pseudo-fichier `/dev/ledbpXY`\\
     11  Ce pilote sera accessible dans par le pseudo-fichier `/dev/ledXY`\\
    1412  '''XY''' correspond aux initiales de votre binôme pour éviter les conflits avec vos camarades\\
    1513  Par exemple, pour '''A'''lmada et '''F'''omentin, il faudrait créer /dev/ledbp'''AF'''\\\\
    16   **Dans le texte de TP, nous n'avons pas fait apparaître les lettres XY, vous devez les ajouter vous-même en les remplaçant par vos initiales.**
     14  **Dans le texte de TP, nous n'avons pas toujours fait apparaître les lettres XY, vous devez les ajouter vous-même en les remplaçant par vos initiales.**
    1715}}}
    1816}}}
     
    3533C'est une proposition, vous pouvez faire comme bon vous semble.
    3634On peut imaginer d'autres manières, mais celle-ci me semble plus simple.
    37 Ce programme (non testé) est censé faire clignoter la led `'0'` jusqu'à ce qu'on appuie sur le bouton.
     35Ce programme (de principe) est censé faire clignoter la led `'0'` jusqu'à ce qu'on appuie sur le bouton.
    3836
    3937{{{#!c
     
    121119* Ce programme est cross compilé, puis copié sur la Raspberry Pi cible avec le fichier `Makefile` ci-après.
    122120* Ce Makefile a besoin des sources compilées du noyau présent sur la !RaspberryPi. Comme elles sont   volumineuses, elles sont copiées dans le répertoire `/dsk/l1/misc/linux-rpi-3.18.y`.
    123 * Si vous voulez le faire chez vous, il faut que vous preniez les sources de votre distribution. Vous pouvez suivre le tutoriel très clair [http://www.chicoree.fr/w/Compilation_crois%C3%A9e_d%27un_module_Linux_pour_Rasberry_Pi Compilation croisée d'un module linux pour Raspberry Pi]''.
     121* Si vous voulez le faire chez vous, il faut que vous preniez les sources de votre distribution. Vous pouvez suivre le tutoriel suivant : [http://www.chicoree.fr/w/Compilation_crois%C3%A9e_d%27un_module_Linux_pour_Rasberry_Pi Compilation croisée d'un module linux pour Raspberry Pi]''.
    124122* Sur votre PC, vous allez commencer par regarder si le répertoire `/dsk/l1/misc/linux-rpi-3.18.y` existe avec \\`ls -d /dsk/l1/misc/linux-rpi-3.18.y`. \\**s'il existe**, c'est bon, il n'y a rien à faire.\\**s'il n'existe pas** vous allez le créer :
    125123  * en téléchargeant l'archive [[htdocs:linux-rpi-3.18.y.tbz2]]  (192Mb) **dans le répertoire** `/dsk/l1/misc`
     
    133131MODULE          = module
    134132
    135 CROSSDIR        = /users/enseig/franck/peri
     133CROSSDIR        = /users/enseig/franck/IOC
    136134KERNELDIR       = /dsk/l1/misc/linux-rpi-3.18.y
    137135CROSS_COMPILE   = $(CROSSDIR)/arm-bcm2708hardfp-linux-gnueabi/bin/bcm2708hardfp-
     
    146144  * Sur votre compte enseignement, vous devez:
    147145    * **Créer** ces fichiers, vous pouvez les commenter en cherchant dans les manuels (ou Google).
    148     * **changer la valeur des variables** `CARD_NUMB`, `LOGIN`et `LAB` afin de les adapter respectivement à votre numéro carte, au nom du répertoire créé par vous sur la !RaspberryPI et au nom du sous-répertoire créé par vous pour ce TP. Les répertoires et sous-répertoires doivent exister et vous devez donc commencer par vous logger sur votre carte !RaspberryPI avec `ssh` pour les créer.
     146    * **Changer la valeur des variables** `CARD_NUMB`, `LOGIN`et `LAB` afin de les adapter respectivement à votre numéro carte, au nom du répertoire créé par vous sur la !RaspberryPI et au nom du sous-répertoire créé par vous pour ce TP. Les répertoires et sous-répertoires doivent exister et vous devez donc commencer par vous logger sur votre carte !RaspberryPI avec `ssh` pour les créer.
    149147    * **Compiler** le module avec la commande `make`.
    150148    * **Copier** sur la !RaspberryPi avec scp avec la commande `make upload`.\\\\
    151149  * Sur la carte !RaspberryPi, vous devez:
    152     * Dans le répertoire `$(LOGIN)/$(LAB)'(par exemple `lacas/lab2`) où vous avez copié votre module
     150    * Dans le répertoire `$(LOGIN)/$(LAB)` (par exemple `alamada-fromentin/lab2`) où vous avez copié votre module
    153151{{{#!sh
    154152$ sudo insmod ./module.ko
     
    159157$ dmesg
    160158}}}
    161   * Les commandes `lsmod`et `dmesg` permettent de voir que les actions du module.
     159  * Les commandes `lsmod`et `dmesg` permettent de voir les actions du module.
    162160  * **Résumez dans le CR** ce que vous avez fait et ce que vous observez.
    163161
     
    283281* Dans votre CR, je vous suggère d'expliquer chaque étape.
    284282* **Comment savoir** que le device a été créé ?
    285 * Le test de votre driver peut se faire par les commandes suivantes (avant de faire un vrai programme): dites ce que vous observez:
     283* 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.
    286284  {{{#!sh
    287   $ echo "rien" > /dev/ledbp
     285  $ echo "rien" > /dev/ledbpXY
    288286  $ dd bs=1 count=1 < /dev/ledbp
    289287  $ dmesg
     
    322320  }}}
    323321
     322**Question**:
     323* Expliquer comment `insdev` récupère le numéro `major`
     324
    324325
    325326
     
    331332
    332333* Nous devons pouvoir accéder aux registres de configuration des GPIO.
    333   * Pour l'accès aux GPIOs, vous voyez que l'on peut simplifier les calculs d'adresses en utilisant une structure représentant l'organisation des registres.
    334   * Vous noterez également que l'adresse physique de base des GPIO (GPIO_BASE 0x20200000) est mappée dans l'espace virtuel du noyau à l'adresse '''io_addresse''' et récupérer avec la macro du noyau `__io_address()`.
     334  * Pour l'accès aux GPIOs, vous allez reprendre le principe des écritures dans les registre en passant par une structure.
     335  * Vous noterez que l'adresse physique de base des GPIO est mappée dans l'espace virtuel du noyau à l'adresse '''io_addresse''' et récupérer avec la macro du noyau `__io_address()`.
     336  * GPIO_BASE est prédéfini dans les includes à 0x20200000.
    335337{{{#!c
    336338#include <linux/module.h>
     
    385387* Un script de chargement.
    386388* un programme de validation utilisant le driver.
     389
     390
     391== Travail optionnel
     392
     393Je vous propose de faire deux autres choses pour ceux qui sont intéressés et qui auraient fini plus tôt.
     394
     3951. La création du noeud du device dans le répertoire `/dev` est possible directement dans la fonction `module_init` et son déchargement est possible dans la fonction `module_exit`. Je vous laisse découvrir comment et l'implémenter.
     3962. Vous pourriez ne pas faire un seul driver mais en faire deux. Un pour les LEDs et un pour le BP. Celui pour les LEDs ne s'occuperait que d'une seule LED. Il y aurait deux instances du device avec des configurations différentes. Probablement, un seul numéro `major` et deux `minor`.