Created the user space code to interract with the module. Q4 done
This commit is contained in:
6
module.c
6
module.c
@@ -25,17 +25,11 @@ static int dev_open(struct inode *, struct file *);
|
||||
static ssize_t dev_read(struct file *filep, char __user *buffer, size_t len, loff_t *offset){
|
||||
int joystick_status[5] = {UP,DOWN,LEFT,RIGHT,BUTTON};
|
||||
int data_len = 5*sizeof(int);
|
||||
// Ensure we only send data once
|
||||
if (*offset > 0)
|
||||
return 0; // End of file
|
||||
|
||||
// Copy data to user-space buffer
|
||||
if (copy_to_user(buffer, joystick_status, data_len)) {
|
||||
pr_err("Failed to send data to user\n");
|
||||
return -EFAULT;
|
||||
}
|
||||
// Update the file offset
|
||||
*offset += data_len;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
108
tp6.md
108
tp6.md
@@ -350,12 +350,17 @@ int main(void)
|
||||
0
|
||||
```
|
||||
|
||||
## [Q2] Expliquez l’implémentation de votre programme et indiquez où il se trouve sur votre git.
|
||||
|
||||
Le code ci dessus devrait faire en permanence du pulling et dès que le joystick est bougé on l'affiche.
|
||||
|
||||
J'ai ajouté le fait que quand on appuie sur le bouton du joystick ca arrête le programme et que le sleep(0.1) permette à la boucle de ne s'executer que toutes les 0.1s pour ne pas surcharger le processeur.
|
||||
|
||||
Le code a été adapté d'un code existant dispo sur le git de libgpiod
|
||||
|
||||
### Lecture du joystick via l’API C libgpiod
|
||||
|
||||
## [Q1]
|
||||
En fait j'avais pas compris que il fallait utiliser les outils dabord et ensuite l'API. J'ai commencé direct avec l'API.
|
||||
|
||||
Mais on peut facilement imaginer un petit script bash qui utiliserait juste les outils avec des commande simples genre `gpioget` et `gpioset`
|
||||
@@ -641,17 +646,11 @@ Maintenant le moment tant attendu, on implémente la methode read();
|
||||
static ssize_t dev_read(struct file *filep, char __user *buffer, size_t len, loff_t *offset){
|
||||
int joystick_status[5] = {UP,DOWN,LEFT,RIGHT,BUTTON};
|
||||
int data_len = 5*sizeof(int);
|
||||
// Ensure we only send data once
|
||||
if (*offset > 0)
|
||||
return 0; // End of file
|
||||
|
||||
// Copy data to user-space buffer
|
||||
if (copy_to_user(buffer, joystick_status, data_len)) {
|
||||
pr_err("Failed to send data to user\n");
|
||||
return -EFAULT;
|
||||
}
|
||||
// Update the file offset
|
||||
*offset += data_len;
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
@@ -662,6 +661,7 @@ Verifications du bon fonctionnement du module terminé:
|
||||
|
||||
```
|
||||
~ # insmod mymodule.ko
|
||||
mymodule: loading out-of-tree module taints kernel.
|
||||
mylab1_joystick: driver initialized
|
||||
```
|
||||
|
||||
@@ -725,6 +725,102 @@ Sur le git les trois niveaux de modules se trouvent sous
|
||||
Le fonctionnement est décrit plus haut.
|
||||
|
||||
|
||||
## Utilisation du module noyau depuis l’espace utilisateur
|
||||
|
||||
La le but ca va être d'utiliser notre module avec un programme en C.
|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define PATH_MODULE "/dev/mylab1_joystick"
|
||||
|
||||
int main(){
|
||||
int fd;
|
||||
int buffer[5] = {1,1,1,1,1};
|
||||
int read_err;
|
||||
int offset = 0;
|
||||
fd = open(PATH_MODULE,O_RDONLY,S_IRUSR);
|
||||
if(fd < 0){
|
||||
printf("Could not retrieve module at PATH_MODULE\n");
|
||||
return fd;
|
||||
}
|
||||
while(1){
|
||||
|
||||
read_err = read(fd,buffer,5 * sizeof(int));
|
||||
if(read_err < 0)
|
||||
printf("Could not read module\n");
|
||||
|
||||
if(!buffer[0])
|
||||
printf("UP\n");
|
||||
if(!buffer[1])
|
||||
printf("DOWN\n");
|
||||
if(!buffer[2])
|
||||
printf("LEFT\n");
|
||||
if(!buffer[3])
|
||||
printf("RIGHT\n");
|
||||
if(!buffer[4])
|
||||
break;
|
||||
|
||||
usleep(100); //1000 microseconds delay to not stress the cpu too much
|
||||
|
||||
//printf("Up %d,Down %d,Left %d,Right %d,Button %d\n",buffer[0],buffer[1],buffer[2],buffer[3],buffer[4]);
|
||||
}
|
||||
close(fd);
|
||||
printf("Exiting the app !\n");
|
||||
}
|
||||
```
|
||||
|
||||
`arm-buildroot-linux-musleabi-gcc moduletester.c -o moduletester`
|
||||
|
||||
`chmod +x moduletester`
|
||||
|
||||
Ensuite quand on essaie de le lancer on a l'erreur : `could not retrieve module` par ce que je viens de lancer mon kernel et que le module n'est pas directement chargé par défaut pour le moment.
|
||||
|
||||
Donc `insmod mymodule.ko`
|
||||
|
||||
`./mymodule.ko`
|
||||
|
||||
Va savoir pourquoi quand le gpio est pas pressé c'est 1 et pas 0, bon ca demande juste une simple inversion.
|
||||
|
||||
Pour le makefile on peut utiliser ca :
|
||||
|
||||
```makefile
|
||||
# Name of the target executable
|
||||
TARGET = moduletester
|
||||
|
||||
# Compiler
|
||||
CC = arm-buildroot-linux-musleabi-gcc
|
||||
|
||||
# Source file
|
||||
SRC = moduletester.c
|
||||
|
||||
# Default target
|
||||
all: $(TARGET)
|
||||
|
||||
$(TARGET): $(SRC)
|
||||
$(CC) $(SRC) -o $(TARGET)
|
||||
|
||||
# Clean up generated files
|
||||
clean:
|
||||
rm -f $(TARGET)
|
||||
```
|
||||
|
||||
### [Q4] Expliquez le fonctionnement de votre programme, notamment comment vous obtenez les états du joystick. Indiquez où se trouvent les sources du programme ainsi que le Makefile correspondant sur votre git.
|
||||
|
||||
Le code du testeur n'est pas sur le git car il est assez petit pour tenir sur ce markdown. J'ai mis un exemple de makefile juste au dessus. Pour recupèrer les valeurs du driver on le lit comme un fichier et comme ca a été prévu lors de la conception du driver, les données sont envoyées sous forme de tableau avec cinq positions ou dans chaque position on a l'étât du GPIO correspondant.
|
||||
|
||||
## Compilation croisée de la librairie ncurses
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user