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 | |