Version 5 (modified by 11 years ago) (diff) | ,
---|
TP3 : Pilotage d'un écran LCD en mode noyau
Dans ce TP on vous demande de réaliser un pilote Linux de type caractère. Ce pilote doit permettre l'utilisation d'un afficheur LCD depuis l'espace utilisateur par simples écritures.
Par exemple on doit pouvoir écrire la commande suivante dans un terminal:
$ echo "Hello World!" > /dev/lcd0
ou /dev/lcd0 est le fichier spécial dans /dev qui représente le périphérique afficheur LCD.
1. Débuter avec les modules (i.e. pilotes Linux) et leur compilation
Commencez par récupérer les sources du TP:
$ cp -r /users/enseig/jpeeters/m1.peri/lab3 .
Ensuite réaliser d'abord un simple module qui affiche un message au chargement et un autre message au déchargement du module.
Pour compiler le module, n'oubliez pas de sourcer le fichier de configuration pour la chaine de compilation croisée:
$ source /users/enseig/jpeeters/m1.peri/export_rpi_toolchain.sh
Pour compiler votre module, tapez la commande make dans un terminal à la racine du dossier lab3.
Après avoir copier le module compilé (bcm2708_lcd.ko) sur la carte Raspberry Pi, chargez le module comme suit:
$ insmod ./bcm2708_lcd.ko
Vérifiez l'affichage de votre message de chargement en tapant la commande dmesg.
Pour décharger le module, utilisez la commande rmmod:
$ rmmod bcm2708_lcd
Vérifiez l'affichage de votre message de déchargement en tapant à nouveau la commande dmesg.
2. Initialisation/déinitialisation du module
Ajouter le code nécessaire à l'initialisation de votre module. Cela comprend:
- L'obtention dynamique d'un nombre majeur (i.e. major number)
- L'allocation mémoire (kzalloc) de la structure de donnée du pilote (i.e. variable globale bcm2708_lcd_p).
- Initialiser le chardev avec cdev_init
- Enregistrer le chardev dans le noyau avec cdev_add
- Initialiser l'afficheur LCD
Ajouter également le code réciproque pour la déinitialisation. Cela comprends:
- Déinitialiser l'afficheur LCD
- Déenregistrer le chardev du noyau avec cdev_del
- Libérer libérer le nombre majeur
- Déalloué la mémoire associée à la structure de donnée du pilote (kfree).
N'oubliez pas de gérer les cas d'erreurs. Une part importante de la notation sera allouée sur ce point.
Proposer un moyen de tester que l'initialisation et la déinitialisation fonctionnent correctement.
3. Appels systèmes (open, release, write)
4. Application utilisateur
Reprenez votre application utilisateur du TP précédent et modifiez la pour utiliser votre pilote. Pour cela, ouvrez et écrivez le fichier /dev/lcd0 au lieu de manipuler les GPIOs directement.