mardi 17 juillet 2012

Integrer un driver au noyau linux

Avant de proposer la deuxième partie de mon tutoriel sur la gestion d'une entrée GPIO à travers un driver Linux, je vais montrer comment intégrer le driver de led, précédemment créé, directement dans les sources du noyau pour pouvoir le compiler et l'installer en même temps que les autres modules.

Je rappelle que le fichier source du module est disponible sous github.

git://github.com/sinseman44/rpiled.git

Mon noyau Linux ayant été compilé avec l’environnement buildroot. les sources du kernel se trouve dans le dossier buildroot/output/build/linux-HEAD.
A partir de ce dossier parent, je vais copier le fichier source du module (raspberrypi_test_led.c) dans la partie drivers/gpio.

Dans ce dossier, 2 fichiers vont être modifiés pour l'intégration (Kconfig et Makefile).
Le premier Kconfig, fichier d'interface permettant de sélectionner via le menuconfig, les modules à installer avec le noyau  :

menuconfig GPIOLIB                                                                                
        bool "GPIO Support"                                                                       
        depends on ARCH_WANT_OPTIONAL_GPIOLIB || ARCH_REQUIRE_GPIOLIB                             
        select GENERIC_GPIO                                                                       
        help                                                                                      
          This enables GPIO support through the generic GPIO library.                             
          You only need to enable this, if you also want to enable                                
          one or more of the GPIO drivers below.                                                  
                                                                                                  
          If unsure, say N.                                                                       
                                                                                                  
if GPIOLIB

config RPI_GPIO_LED
        tristate "Raspberry Pi led GPIO"
        depends on GPIOLIB
        help
         driver to test a led connected to the raspberry pi

config DEBUG_GPIO                                                                                 
        bool "Debug GPIO calls"                                                                   
        depends on DEBUG_KERNEL                                                                   
        help                                                                                      
          Say Y here to add some extra checks and diagnostics to GPIO calls.                      
          These checks help ensure that GPIOs have been properly initialized                      
          before they are used, and that sleeping calls are not made from                         
          non-sleeping contexts.  They can make bitbanged serial protocols                        
          slower. The diagnostics help catch the type of setup errors                            
          that are most common when setting up new platforms or boards. 

Il y a deux possibilités pour la compilation soit statique, le noyau va construire le fichier objet et inclure le module directement l'image finale, soit dynamique, le driver va être compilé en module et c'est à l'utilisateur de charger/décharger par la suite le module sur le système embarqué.
Certains drivers ont la variable bool à la place de tristate, dans ce cas, le driver est soit compilé en statique, soit pas. La variable tristate, laisse le choix à l'utilisateur de compiler le driver en statique (X), en module (M) ou pas du tout.

La capture d'écran montre que notre driver va être compilé en module.

# make linux26-menuconfig

menu device drivers -> GPIO support


Le deuxième fichier à modifier est le Makefile :

[ ... ]
obj-$(CONFIG_GPIO_WM831X) += gpio-wm831x.o 
obj-$(CONFIG_GPIO_WM8350) += gpio-wm8350.o
obj-$(CONFIG_GPIO_WM8994) += gpio-wm8994.o
obj-$(CONFIG_GPIO_XILINX) += gpio-xilinx.o 
obj-$(CONFIG_RPI_GPIO_LED) += raspberrypi_test_led.o
Il ne reste plus qu'à utiliser les commandes de compilation :
# make
Le module, une fois compilé, va être installé sur le système de fichiers et visible dans le dossier lib/modules/3.1.9/kernel/drivers/gpio.

1 commentaire: