SE2a4 USB 2023/2024

De wiki-se.plil.fr
Aller à la navigation Aller à la recherche

Cahier des charges

Vous devez réaliser un périphérique USB permettant de contrôler le démarrage et l'arrêt d'ecrans de stations de travail. L'idée est de ne pas imposer de modification sur l'écran. Le dispositif est sensé appuyer sur le bouton de l'écran avec un servo-moteur et contrôler l'état de l'écran avec un photo-récepteur.

Pour le tutorat USB il est juste demandé de simuler le dispositif avec un servo-moteur et un photo-récepteur, pour la partie électronique l'ATmega8u2 d'un Arduino Uno Rev3 va être utilisé et la partie mécanique n'est pas demandée. Vous poursuivrez cet exercice au prochain semestre en projet système et réseau. En projet vous aurez à concevoir et réaliser une carte et à réfléchir à la partie mécanique (il y aura bien entendu aussi des aspects système et réseau).

La difficulté avec l'Arduino Uno est que les entrées/sorties de l'ATmega8u2 ne sont pas accessibles hormis l'UART. Vous aurez donc aussi à programmer l'ATmega328p pour accéder au servo-moteur et au photo-récepteur. Il faut aussi prévoir une communication UART entre les deux puces.

Le périphérique USB sera implanté à l'aide de la bibliothèque LUFA sous la forme d'un périphérique spécifique. La gestion du périphérique doit se faire au travers d'une application sur PC utilisant la bibliothèque libusb-1.0.

Programmation de l'ATmega8u2

Récupérez le code de la bibliothèque LUFA. Créez un sous-répertoire SE2a4 dans cette bibliothèque et installez-y la démonstration minimale Media:2023-SE2a4-Minimal.zip.

Adaptez le makefile de la démonstration à votre microcontrôleur et carte cible. Ajustez aussi le chemin de la bibliothèque LUFA en restant en chemin relatif.

Définition du périphérique USB

Votre périphérique USB est un capteur et un actionneur : il faut donc prévoir un point d'accès entrant et un point d'accès sortant. Des points d'accès de type interruption sont parfaitement adaptés ici. Pour informer le contrôleur USB de la présence de ces points d'accès vous devez effectuer les actions ci-dessous.

  • Dans le fichier descripteur.h ajouter à la structure USB_Descriptor_Configuration_t un champ interface et deux champs points d'accès. Pour vous aidez dans le non des types à employer pour les champs, regardez le même fichier dans la démonstration LUFA Demos/Device/LowLevel/Keyboard/.
  • Dans le fichier descripteur.h décommentez l'union pour donner un numéro à votre interface spécifique.
  • Dans le fichier descripteur.h ajoutez des macros pour indiquer les numéros de vos points d'accès ainsi que la taille des données à leur transmettre. Là encore la démonstration Keyboard vous indique comment faire.
  • Dans le fichier descripteur.c instanciez la structure définie dans le fichier d'inclusion. Pour vous aider sur les valeurs des champs, regardez le même fichier dans la démonstration Keyboard. N'oubliez pas de mettre à jour le descripteur de configuration.

A ce niveau vous pouvez compiler la démonstration, passer l'ATmega8u2 en mode DFU USB en court-circuitant les broches reset et GND de son connecteur ISP, télécharger la démonstration sur l'ATmega8u2 en utilisant make dfu et vérifier que les descripteurs sont bien reconnus via l'utilitaire lsusb. Concernant l'utilitaire lsusb mettez à profit les options -d et -vvv.

Gestion des interruptions

La gestion des interruptions se fait dans le fichier Minimal.c. Passez par les étapes ci-dessous.

  • Initialisez vos points d'accès dans la fonction EVENT_USB_Device_ConfigurationChanged. Adaptez le code se trouvant dans la même fonction du fichier Keyboard.c de la démonstration Keyboard.
  • Ecrivez une fonction de gestion du point d'accès entrant, vous en trouvez un exemple dans le fichier Keyboard.c de la démonstration Keyboard. N'oubliez pas d'appeler cette fonction dans la boucle infinie du programme principal.
  • Ecrivez une fonction de gestion du point d'accès sortant, vous en trouvez un exemple dans le fichier Keyboard.c de la démonstration Keyboard. N'oubliez pas d'appeler cette fonction dans la boucle infinie du programme principal.

Compilez et téléchargez. Pour pouvoir tester il vous faut un programme PC fonctionnel.

Programmation de l'ATmega328p

Application PC

L’objectif est d’utiliser la bibliothèque USB libusb-1.0 pour écrire un programme C permettant de récupérer des informations de votre périphérique USB.

Un manuel complet de la bibliothèque est disponible [1]. Vous pouvez aussi trouver un résumé de la bibliothèque [2]. Pour cette utilisation assez basique nous utiliserons les fonctions de communication bloquantes.

Enumération des périphériques USB

Ecrivez une fonction pour examiner tous les périphériques USB disponibles sur les bus USB de votre machine. Dès qu'un périphérique s'avère être le périphérique USB du type cherché, sauvez la "poignée" vers ce périphérique dans un tableau global dont les éléments sont de type libusb_device_handle.

Vous pouvez utiliser la commande lsub pour trouver les identifiants USB de votre type de périphérique. Pour chaque périphérique sélectionné, faites afficher le numéro du bus sur lequel se trouve le périphérique ainsi que son adresse sur ce bus.