Created the user space code to interract with the module. Q4 done

This commit is contained in:
2024-12-25 10:08:20 +01:00
parent 6ddb10c4a5
commit 8aeece620d
2 changed files with 102 additions and 12 deletions

View File

@@ -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
View File

@@ -350,12 +350,17 @@ int main(void)
0
```
## [Q2] Expliquez limplé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 lAPI 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 lespace 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