![]() |
M2 SETI B4 / MS SE SE758 |
L’objectif de ce TP est de compléter le pilote de périphérique ADXL345 commencé lors du TP précédent et de lui ajouter la possibilité pour l’espace utilisateur d’interagir avec lui via le framework misc.
Nous allons reprendre le répertoire créé lors du TP précédent.
$ export TPROOT=xxx # À adapter
$ cd $TPROOT
$ cd pilote_i2c
Pensez à adapter les commandes ci-dessus en fonction du nom donné au répertoire lors du premier TP.
Pour rappel, le lien vers la documentation de l’accéléromètre :
Dans cette première étape, nous allons nous contenter de s’enregistrer auprès du framework misc.
Déclarez une structure struct adxl345_device
contenant pour le moment un unique champ de type
struct miscdevice
Dans la fonction probe
Allouez dynamiquement la mémoire pour une instance de la
structure struct adxl345_device
Associez cette instance à la structure
struct i2c_client
Remplissez le contenu de la structure
struct miscdevice
contenue dans l’instance de la structure
struct adxl345_device
(regardez dans le cours la liste des
champs importants à initialiser dans cette structure)
Remarque concernant le champ name
: cette
chaîne de caractères sera utilisée comme nom pour créer automatiquement
un fichier spécial dans /dev
. Comme plusieurs
accéléromètres peuvent être présents, il faut que ce nom soit unique
pour chaque accéléromètre. On utilisera un nom du type
adxl345-x
où x
est le numéro de
l’accéléromètre (ex. adxl345-0
, adxl345-1
…).
Pour générer ce nom, on maintiendra une variable globale indiquant le
nombre d’accéléromètres présents (variable incrémentée à chaque appel à
la fonction probe
et décrémentée à chaque appel de la
fonction remove
), puis dans probe
, on
utilisera la fonction kasprintf
(vue en cours) pour générer
la chaîne de caractère appropriée pour le champ name
.
Pensez à bien libérer la mémoire allouée par kasprintf
mais
pas trop tôt !
Enregistrez-vous auprès du framework misc
remove
Récupérez l’instance de la structure
struct adxl345_device
à partir de la structure
struct i2c_client
récupérée en argument
Désenregistrez vous auprès du framework misc
/dev
après avoir chargé votre
pilote)Dans cette deuxième étape, nous allons implémenter la fonction de
rappel read
pour permettre à une application de récupérer
des données depuis l’application.
On supposera dans un premier temps que cette fonction renvoie les
données de l’axe X
de l’accéléromètre. Pour simplifier, si
l’application demande un octet, on renverra l’octet de poids fort du
dernier échantillon, et si l’application demande plus d’un octet, on
renverra la valeur complète d’un échantillon (16 bits) mais pas plus
(donc même si l’application demande 6 octets, notre fonction ne lui en
fournira que 2).
adxl345_read
À partir de la structure struct file
récupérée en
argument, récupérez l’instance de la structure
struct adxl345_device
et l’instance de la structure
struct i2c_client
correspondants à votre
périphérique
Récupérez un échantillon depuis l’accéléromètre
Transmettez tout ou partie de cet échantillon à l’application
Dans la fonction probe
, déclarez cette fonction
adxl345_read
Compilez et chargez votre pilote
Écrivez une petite application en C pour tester
Écrivez l’application en C sur votre PC (profitez-en pour
consulter la page de manuel de open
et read
via la commande man 2 open
et man 2 read
pour
voir les arguments à passer à ces appels systèmes)
Compilez cette application à l’aide de la commande
arm-linux-gnueabihf-gcc -Wall -o main main.c
(en supposant
que le fichier source s’appelle main.c
)
Placez le fichier main
dans votre répertoire
pilote_i2c
Redémarrez QEMU. Une fois le montage effectué, vous trouverez
votre application dans /mnt/main
On veut maintenant permettre à l’application de choisir l’axe
(X
, Y
ou Z
) qu’elle veut
récupérer, grâce à l’appel système ioctl
.
Pour ce faire, lisez bien la documentation du noyau (fichier
Documentation/driver-api/ioctl.rst
) afin de respecter les
conventions autour d’ioctl
.
Dans un premier temps, on acceptera que la modification de l’axe choisi impacte toutes les applications qui utilisent l’accéléromètre en question. On réfléchira ensuite à comment faire en sorte que ce changement n’impacte que l’application qui l’a demandée.
À vous de jouer !
© Copyright 2020 Guillaume Duc. Le contenu de cette page est mis à disposition selon les termes de la Licence Creative Commons Attribution - Partage dans les Mêmes Conditions 4.0 International (à l'exception des exemples de code tirés du noyau Linux et qui sont distribués sous leurs licences d'origine).