| 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'`. |
| | 45 | La première étape consiste à créer un module noyau, l'insérer puis l'effacer du noyau. |
| | 46 | |
| | 47 | Le module minimal se compose d'une fonction d'initialisation et d'une fonction de cleanup, dans le fichier `module.c`suivant: |
| | 48 | |
| | 49 | {{{ |
| | 50 | include <linux/module.h> |
| | 51 | #include <linux/init.h> |
| | 52 | |
| | 53 | MODULE_LICENSE("GPL"); |
| | 54 | MODULE_AUTHOR("Charlie, 2015"); |
| | 55 | MODULE_DESCRIPTION("Module, aussitot insere, aussitot efface"); |
| | 56 | |
| | 57 | static int __init mon_module_init(void) |
| | 58 | { |
| | 59 | printk(KERN_DEBUG "Hello World !\n"); |
| | 60 | return 0; |
| | 61 | } |
| | 62 | |
| | 63 | static void __exit mon_module_cleanup(void) |
| | 64 | { |
| | 65 | printk(KERN_DEBUG "Goodbye World!\n"); |
| | 66 | } |
| | 67 | |
| | 68 | module_init(mon_module_init); |
| | 69 | module_exit(mon_module_cleanup); |
| | 70 | }}} |
| | 71 | |
| | 72 | Ce fichier est cross compilé et copié sur le raspberry cible avec le fichier `Makefile` suivant: |
| | 73 | {{{ |
| | 74 | CARD_NUMB = 23 |
| | 75 | ROUTER = 132.227.102.36 |
| | 76 | LAB = lab2 |
| | 77 | LOGIN = franck |
| | 78 | |
| | 79 | MODULE = module |
| | 80 | |
| | 81 | CROSSDIR = /users/enseig/franck/peri |
| | 82 | KERNELDIR = $(CROSSDIR)/linux-rpi-3.18.y |
| | 83 | CROSS_COMPILE = $(CROSSDIR)/arm-bcm2708hardfp-linux-gnueabi/bin/bcm2708hardfp- |
| | 84 | |
| | 85 | obj-m += $(MODULE).o |
| | 86 | default:; make -C $(KERNELDIR) ARCH=arm CROSS_COMPILE=$(CROSS_COMPILE) M=$(PWD) modules |
| | 87 | clean:; make -C $(KERNELDIR) ARCH=arm CROSS_COMPILE=$(CROSS_COMPILE) M=$(PWD) clean |
| | 88 | upload:; scp -P50$(CARD_NUMB) $(MODULE).ko pi@$(ROUTER):$(LOGIN)/$(LAB) |
| | 89 | }}} |
| | 90 | |
| | 91 | Vous 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 | |