Changes between Version 9 and Version 10 of SujetTP2-2017


Ignore:
Timestamp:
Feb 3, 2017, 8:05:31 AM (8 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • SujetTP2-2017

    v9 v10  
    253253mknod /dev/$module c $major 0
    254254chmod 666 /dev/$module
    255 echo "Device /dev/$module created with major=$major"
    256 }}}
    257 * Dans un fichier `insdev`
     255echo "=> Device /dev/$module created with major=$major"
     256}}}
     257
     258* Dans un fichier `rmdev`
    258259{{{#!bash
     260#!/bin/sh
     261module=$1
     262/sbin/rmmod $module || exit 1
     263rm -f /dev/$module
     264echo "=> Device /dev/$module removed"
     265}}}
     266* Ces deux scripts doivent être copiés dans votre répertoire de la RaspberryPi. Ils doivent être exécutables et exécutés avec sudo.
     267{{{#!bash
     268chmod u+x insdev rmdev
     269}}}
     270* Pour les exécuter :
     271{{{#!bash
     272$ sudo ./insdev ledbp LED=2
     273  => Device /dev/ledbp created with major=237
     274$ sudo ./rmdev ledbp LED=2
     275  => Device /dev/ledbp removed
     276}}}
    259277
    260278== Étape 4 : accès aux GPIO depuis les fonctions du pilote ==
    261279
    262 Pour vous aider, voici un code qui fait clignoter la LED du `GPIO04` dans le module noyau.
    263 * 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.
    264 * Vous noterez également que l'adresse physique de base des GPIO (ici 0x20200000) est mappé dans l'espace virtuel du noyau à l'adresse '''io_addresse'''.
    265 * Vous trouvez aussi le moyen de faire faire périodiquement une fonction au système grâce à une file d'attente temporelle.
    266 Inspirez-vous de code pour votre pilote.
     280Nous devons pouvoir accéder aux registres de configuration des GPIO.
     281* 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.
     282* 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()`.
    267283
    268284{{{#!c
     
    273289
    274290static const int LED0 = 2;
    275 
    276 //------------------------------------------------------------------------------
    277 //                                GPIO ACCES
    278 //------------------------------------------------------------------------------
    279291
    280292struct gpio_s
     
    295307    uint32_t test[1];
    296308}
     309*gpio_regs = (struct gpio_s *)__io_address(GPIO_BASE);
     310}}}
     311
     312Les deux fonctions `gpio_fsel()` et `gpio_write()` possibles sont données juste après. Vous pouvez voir comment exploiter la structure.
     313Nous vous laissons le soin de faire `gpio_read()`, puis d'invoquer ces fonctions dans les fonctions `open_ledbp()`, `read_ledbp()`, etc.
     314
     315{{{#!c
     316static void gpio_fsel(int pin, int fun)
     317{
     318    uint32_t reg = pin / 10;
     319    uint32_t bit = (pin % 10) * 3;
     320    uint32_t mask = 0b111 << bit;
     321    gpio_regs->gpfsel[reg] = (gpio_regs->gpfsel[reg] & ~mask) | ((fun << bit) & mask);
     322}
     323
     324static void gpio_write(int pin, bool val)
     325{
     326    if (val)
     327        gpio_regs->gpset[pin / 32] = (1 << (pin % 32));
     328    else
     329        gpio_regs->gpclr[pin / 32] = (1 << (pin % 32));
     330}
     331}}}
     332
     333== Étape 5 : Usage d'un timer dans le noyau pour faire clignoter (optionnel) ==
     334
     335Le code suivant fait clignoter la led GPIO04.
     336Vous pouvez adapter votre driver, pour demander un clignotement plutôt qu'un allumage.
     337En effet, il existe un moyen de faire faire périodiquement une fonction au système grâce à une file d'attente temporelle.
     338Inspirez-vous de code pour votre pilote.
     339
     340{{{#!c
     341#include <linux/module.h>
     342#include <linux/init.h>
     343#include <asm/io.h>
     344#include <mach/platform.h>
     345
     346static const int LED0 = 2;
     347
     348//------------------------------------------------------------------------------
     349//                                GPIO ACCES
     350//------------------------------------------------------------------------------
     351
     352struct gpio_s
     353{
     354    uint32_t gpfsel[7];
     355    uint32_t gpset[3];
     356    uint32_t gpclr[3];
     357    uint32_t gplev[3];
     358    uint32_t gpeds[3];
     359    uint32_t gpren[3];
     360    uint32_t gpfen[3];
     361    uint32_t gphen[3];
     362    uint32_t gplen[3];
     363    uint32_t gparen[3];
     364    uint32_t gpafen[3];
     365    uint32_t gppud[1];
     366    uint32_t gppudclk[3];
     367    uint32_t test[1];
     368}
    297369*gpio_regs = (struct gpio_s *)__io_address(GPIO_BASE);;
    298370