Changes between Version 4 and Version 5 of SujetTP2-2016
- Timestamp:
- Feb 3, 2016, 6:36:39 AM (9 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
SujetTP2-2016
v4 v5 39 39 #define NBBP 1 40 40 char led[NBLED]; 41 char b tn[NBBP];41 char bp[NBBP]; 42 42 43 43 int main() … … 56 56 write( fd, led, NBLED); 57 57 sleep( 1); 58 read( fd, b tn, NBBTN);59 } while (b tn[0] == '1');58 read( fd, bp, NBBP); 59 } while (bp[0] == '1'); 60 60 return 0; 61 61 } … … 68 68 Le module minimal se compose d'une fonction d'initialisation et d'une fonction de cleanup, dans le fichier `module.c`suivant: 69 69 70 {{{ 70 {{{#!c 71 71 #include <linux/module.h> 72 72 #include <linux/init.h> … … 92 92 93 93 Ce fichier est cross compilé et copié sur la Raspberry Pi cible avec le fichier `Makefile` suivant: 94 {{{ 95 CARD_NUMB = 2 394 {{{#!make 95 CARD_NUMB = 2X 96 96 ROUTER = 132.227.102.36 97 LOGIN = franck97 LOGIN = nom1-nom2 98 98 LAB = lab2 99 99 … … 101 101 102 102 CROSSDIR = /users/enseig/franck/peri 103 KERNELDIR = $(CROSSDIR)/linux-rpi-3.18.y103 KERNELDIR = /dsk/l1/misc/linux-rpi-3.18.y 104 104 CROSS_COMPILE = $(CROSSDIR)/arm-bcm2708hardfp-linux-gnueabi/bin/bcm2708hardfp- 105 105 … … 111 111 112 112 113 ||'''''Note:'''[[BR]]Ce Makefile a besoin des sources compilées du noyau. Si vous voulez le faire chez vous, il faut que vous preniez les sources de votre distribution. Vous pouvez suivre le tutoriel très clair [http://www.chicoree.fr/w/Compilation_crois%C3%A9e_d%27un_module_Linux_pour_Rasberry_Pi Compilation croisée d'un module linux pour Raspberry Pi]''.|| 113 ||'''''Note 1:'''\\ Ce Makefile a besoin des sources compilées du noyau. Comme elles sont volumineuses, elles sont copiées dans le répertoires `/dsk/l1/misc/linux-rpi-3.18.y`. Si vous voulez le faire chez vous, il faut que vous preniez les sources de votre distribution. Vous pouvez suivre le tutoriel très clair [http://www.chicoree.fr/w/Compilation_crois%C3%A9e_d%27un_module_Linux_pour_Rasberry_Pi Compilation croisée d'un module linux pour Raspberry Pi]''.|| 114 115 116 ||'''''Note 2:'''\\ Pour ne plus à avoir à taper le mot de passe, vous devez suivre la procédure décrite [[wiki:SujetTP1-2016#mdp]]|| 114 117 115 118 Sur votre compte enseignement, vous devez: 116 * Créerces fichiers et bien sûr, les comprendre.117 * '''changer la valeur des variables `CARD_NUMB`, `LOGIN`et `LAB` afin de les adapter respectivement au numéro de la carte choisie, au nom du répertoire créé par vous sur la raspberry et au nom du sous-répertoire créé par vous pour ce TP'''. Les répertoires et sous-répertoires doivent exister et vous devez donc commencer par vous logger sur votre carte RaspberryPI avec `ssh` pour les créer.118 * Compilerle module avec la commande `make`.119 * Copier sur la raspberryavec scp avec la commande `make upload`.120 121 Sur la carte Raspberry PI, vous devez:119 * **Créer** ces fichiers et bien sûr, les comprendre. 120 * **changer la valeur des variables** `CARD_NUMB`, `LOGIN`et `LAB` afin de les adapter respectivement au numéro de la carte choisie, au nom du répertoire créé par vous sur la RaspberryPI et au nom du sous-répertoire créé par vous pour ce TP. Les répertoires et sous-répertoires doivent exister et vous devez donc commencer par vous logger sur votre carte RaspberryPI avec `ssh` pour les créer. 121 * **Compiler** le module avec la commande `make`. 122 * **Copier** sur la RaspberryPi avec scp avec la commande `make upload`. 123 124 Sur la carte RaspberryPi, vous devez: 122 125 * Dans le répertoire `$(LOGIN)/$(LAB)'(par exemple `franck/lab2`) où vous avez copié votre module 123 126 124 {{{ 127 {{{#!sh 125 128 $ sudo insmod ./module.ko 126 129 $ lsmod … … 136 139 137 140 Votre driver devra être paramétré pour lui indiquer le numéro de ports utilisés pour les LEDS et les boutons. 138 Dans un premier temps vous allez vous contenter d'indiquer le nombre de LED et de bouton spour le module de test, mais il faudra être plus précis pour le vrai driver.141 Dans un premier temps vous allez vous contenter d'indiquer le nombre de LED et de bouton pour le module de test, mais il faudra être plus précis pour le vrai driver. 139 142 140 143 Vous devez ajouter dans module.c (faite d'équivalent pour les boutons): 141 {{{ 144 {{{#!c 142 145 static int led; 143 146 module_param(LED, int, 0); … … 152 155 }}} 153 156 Le paramètre est défini au moment de l'insertion. 154 {{{ 157 {{{#!sh 155 158 $ insmod ./module.o led=2 156 159 }}} … … 158 161 == Étape 3 : création d'un driver qui ne fait rien mais dans le noyau == 159 162 160 Votre driver va être intégré dans un module. Vous allez donc créer un module nommé `ledb tn` paramétré avec les numéros de ports pour les LEDS et les boutons. Vous utiliserez un nouveau répertoire. Vous modifierez le Makefile en conséquence.163 Votre driver va être intégré dans un module. Vous allez donc créer un module nommé `ledbp` paramétré avec les numéros de ports pour les LEDS et le bouton. Vous utiliserez un nouveau répertoire. Vous modifierez le Makefile en conséquence. 161 164 162 165 * Vous ajoutez dans le fichier `.c` du module: 163 166 164 {{{ 165 struct file_operations fops_ledb tn=166 { 167 .open = open_ledb tn,168 .read = read_ledb tn,169 .write = write_ledb tn,170 .release = release_ledb tn167 {{{#!c 168 struct file_operations fops_ledbp = 169 { 170 .open = open_ledbp, 171 .read = read_ledbp, 172 .write = write_ledbp, 173 .release = release_ledbp 171 174 }; 172 175 static int 173 open_ledb tn(struct inode *inode, struct file *file) {176 open_ledbp(struct inode *inode, struct file *file) { 174 177 printk(KERN_DEBUG "open()\n"); 175 178 return 0; … … 177 180 178 181 static ssize_t 179 read_ledb tn(struct file *file, char *buf, size_t count, loff_t *ppos) {182 read_ledbp(struct file *file, char *buf, size_t count, loff_t *ppos) { 180 183 printk(KERN_DEBUG "read()\n"); 181 184 return count; … … 183 186 184 187 static ssize_t 185 write_ledb tn(struct file *file, const char *buf, size_t count, loff_t *ppos) {188 write_ledbp(struct file *file, const char *buf, size_t count, loff_t *ppos) { 186 189 printk(KERN_DEBUG "write()\n"); 187 190 return count; … … 189 192 190 193 static int 191 release_ledb tn(struct inode *inode, struct file *file) {194 release_ledbp(struct inode *inode, struct file *file) { 192 195 printk(KERN_DEBUG "close()\n"); 193 196 return 0; … … 196 199 * Vous allez enregistrer ce driver dans ce module en ajoutant la fonction d'enregistrement dans la fonction init du module. Vous devez aussi prendre en compte les paramètres. C'est à vous de décider comment. 197 200 198 {{{ 199 int major = register_chrdev(0, "ledb tn" &fops_ledbtn); // 0 est le numéro majeur qu'on laisse choisir par linux201 {{{#!c 202 int major = register_chrdev(0, "ledbp" &fops_ledbp); // 0 est le numéro majeur qu'on laisse choisir par linux 200 203 }}} 201 204 * Vous allez décharger le driver dans ce module en ajoutant dans la fonction exit du module: 202 205 203 {{{ 204 unregister_chrdev(major, "ledb tn");206 {{{#!c 207 unregister_chrdev(major, "ledbp"); 205 208 }}} 206 209 … … 211 214 212 215 {{{ 213 sudo mknod /dev/ledb tnc major 0214 sudo chmod a+rw /dev/ledb tn216 sudo mknod /dev/ledbp c major 0 217 sudo chmod a+rw /dev/ledbp 215 218 }}} 216 219 217 220 Le test de votre driver peut se faire par les commandes suivantes (avant de faire un vrai programme): 218 221 219 {{{ 220 $ echo "rien" > /dev/ledb tn221 $ dd bs=1 count=1 < /dev/ledb tn222 {{{#!sh 223 $ echo "rien" > /dev/ledbp 224 $ dd bs=1 count=1 < /dev/ledbp 222 225 $ dmesg 223 226 }}} … … 225 228 == Étape 4 : accès aux GPIO depuis les fonctions du pilote == 226 229 227 Pour vous aider, voici un code qui fait clignoter la LED du GPIO04dans le module noyau.230 Pour vous aider, voici un code qui fait clignoter la LED du `GPIO04` dans le module noyau. 228 231 * 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. 229 232 * 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'''. … … 231 234 Inspirez-vous de code pour votre pilote. 232 235 233 {{{ 236 {{{#!c 234 237 #include <linux/module.h> 235 238 #include <linux/init.h>