Pilotes de périphériques
Pilotes orientés mémoire
Exercice #1: Réaliser un pilote orienté mémoire permettant de mapper en espace utilisateur les registres du microprocesseur en utilisant le fichier virtuel /dev/mem
. Ce pilote permettra de lire l’identification du microprocesseur (Chip-ID aux adresses 0x01c1'4200
à 0x01c1'420c
) décrit dans l’exercice “Accès aux entrées/sorties” du cours sur la programmation de modules noyau.
Pilotes orientés caractère
Exercice #2: Implémenter un pilote de périphérique orienté caractère. Ce pilote sera capable de stocker dans une variable globale au module les données reçues par l’opération write et de les restituer par l’opération read
. Pour tester le module, on utilisera les commandes echo
et cat
.
Exercice #3: Etendre la fonctionnalité du pilote de l’exercice précédent afin que l’on puisse à l’aide d’un paramètre module spécifier le nombre d’instances. Pour chaque instance, on créera une variable unique permettant de stocker les données échangées avec l’application en espace utilisateur.
Exercice #4: Développer une petite application en espace utilisateur permettant d’accéder à ces pilotes orientés caractère. L’application devra écrire un texte dans le pilote et le relire.
sysfs
Exercice #5: Développer un pilote de périphérique orienté caractère permettant de valider la fonctionnalité du sysfs. Le pilote offrira quelques attributs pouvant être lus et écrites avec les commandes echo
et cat
. Ces attributs seront disponibles sous l’arborescence /sys/class/...
.
Dans un premier temps, implémentez juste ce qu’il faut pour créer une nouvelle classe (par exemple : my_sysfs_class
)
Exercice #5.1 : Ajoutez maintenant les opérations sur les fichiers définies à l’exercice #3. Vous pouvez définir une classe
comme dans l’exercice précédent, ou vous pouvez utiliser un platform_device
, ou encore un miscdevice
.
Device Tree (optionel)
Exercice #6:
Adapter l’implémentation de l’exercice #3 ci-dessus afin que celui-ci utilise un device tree (DT) pour décrire le nombre de périphériques à mettre en œuvre. Le DT sera externe à l’arborescence des sources du noyaux Linux. La structure struct miscdevice
peut être utilisée pour instancier les devices et les fichiers d’accès (/dev/...
).
Opérations bloquantes
Exercice #7: Développer un pilote et une application utilisant les entrées/sorties bloquantes pour signaler une interruption matérielle provenant de l’un des switches de la carte d’extension du NanoPI. L’application utilisera le service select pour compter le nombre d’interruptions.
Remarque
les switches n’ont pas d’anti-rebonds, par conséquent il est fort probable que vous comptiez un peu trop d’impulsions; effet à ignorer.
Pilotes orientés mémoire (optionel)
Exercice #8: Sur la base de l’exercice 1, développer un pilote orienté caractère permettant de mapper en espace utilisateur ces registres (implémentation de l’opération de fichier « mmap »). Le driver orienté mémoire sera ensuite adapté à cette nouvelle interface.
Remarque
à effectuer après les exercices des pilotes orientés caractère.
Ioctl (optionel)
Exercice #9: Implémenter à l’intérieur d’un pilote de périphérique l’opération ioctl
afin de pouvoir:
- Envoyer une commande
- Ecrire et lire une valeur entière
- Ecrire et lire un bloc de configuration de plus de 50 octets
Afin de valider le pilote, développer une petite application permettant d’effectuer ces opérations et de les valider.
procfs
(optionel)
Exercice #10: Implémenter à l’intérieur d’un pilote de périphérique les opérations nécessaires afin de pouvoir lire un bloc de configuration et de pouvoir modifier le contenu de la valeur entière par procfs
. Seules les commandes echo
et cat
doivent être nécessaires pour manipuler ces attributs.
Archives 2021/2022