IMA4 2019/2020 EC1 : Différence entre versions

De Wiki d'activités IMA
(Périphérique USB)
(Cahier des charges)
Ligne 25 : Ligne 25 :
 
Durant cette épreuve, je vais me servir de la board ''XMEGA-C3 Xplained'' comme un périphérique USB spécifique. Afin de réaliser toutes les tâches attendues, il va falloir procéder en plusieurs étapes :
 
Durant cette épreuve, je vais me servir de la board ''XMEGA-C3 Xplained'' comme un périphérique USB spécifique. Afin de réaliser toutes les tâches attendues, il va falloir procéder en plusieurs étapes :
  
* '''Lire l'état des 2 boutons et commander les 4 LEDs''' : Pour se faire, il va falloir implanter un périphérique USB en programmant le microcontrôleur de la board (''ATXmega384C3''). Ce périphérique n'aura qu'une seule configuration pour les deux interfaces IN et OUT.  
+
* '''Lire l'état de mes I/O et sauver les points d'accès''' : Pour se faire, il va falloir implanter une configuration avec la librairie [http://libusb.sourceforge.net/api-1.0/modules.html libusb-1.0] :
  
 
Interface ''IN'' : un seul point d'accès (sens Hôte vers Périphérique) <br>
 
Interface ''IN'' : un seul point d'accès (sens Hôte vers Périphérique) <br>
Interface ''OUT'' : deux points d'accès (sens inverse)
+
Interface ''OUT'' : deux points d'accès (sens inverse)  
  
La bibliothèque [http://www.fourwalledcubicle.com/LUFA.php LUFA] me permettra de gérer l'USB sans passer par les registres. Pour la programmation du microcontrôleur, je me servirai de l'utilitaire ''dfu-programmer'' [https://dfu-programmer.github.io/ adapté au ATXmega384C3].
+
* '''Créer le déclenchement et l'arrêt du chenillard en C''' : Pour programmer le microcontrôleur, la [http://www.fourwalledcubicle.com/LUFA.php LUFA] me permettra de gérer l'USB sans passer par les registres. Pour téléverser mon programme, je me servirai de l'utilitaire dfu-programmer.
 
 
* '''Programmer le déclenchement et l'arrêt du chenillard en C''' : La librairie [http://libusb.sourceforge.net/api-1.0/modules.html libusb-1.0] sera utile ici pour la partie contrôle du périphérique USB. Je compilerai ce programme avec ''gcc'', comme d'habitude.
 
  
 
= Travail réalisé =
 
= Travail réalisé =

Version du 30 mai 2020 à 16:42

Objectif

Vous allez travailler sur une carte de développement ATXMEGAC3-XPLD. L'idée est de refaire le tutorat système sur cette carte.

Vous aurez donc à écrire un programme C sur PC avec la libusb-1.0 et à écrire un programme pour le micro-contrôleur ATXmega384C3 avec la LUFA.

Coté périphérique USB vous devez implanter une configuration avec une interface IN pour les deux boutons mécanique de la carte, une interface OUT pour les deux LED orange et une interface OUT pour les LED verte et rouge.

Coté PC vous devez écrire un programme qui attend une pression sur un bouton mécanique et qui déclenche un chenillard sur les 4 LED. Le chenillard s'arrête sur pression du second bouton mécanique.

Environnement de travail

Le matériel a été reçu le 09/04/2020 : il s'agit bien d'une carte de développement ATXMEGAC3-XPLD ainsi qu'une carte micro-SD de 8GB et le câble USB qui va avec.

Matériel à disposition


Tout le travail sera effectué sous Linux, plus précisément avec la distribution Ubuntu. Ci-dessous, vous pourrez retrouver un aperçu des fonctionnalités de la carte :

XMEGA-C3 Xplained


Cahier des charges

Durant cette épreuve, je vais me servir de la board XMEGA-C3 Xplained comme un périphérique USB spécifique. Afin de réaliser toutes les tâches attendues, il va falloir procéder en plusieurs étapes :

  • Lire l'état de mes I/O et sauver les points d'accès : Pour se faire, il va falloir implanter une configuration avec la librairie libusb-1.0 :

Interface IN : un seul point d'accès (sens Hôte vers Périphérique)
Interface OUT : deux points d'accès (sens inverse)

  • Créer le déclenchement et l'arrêt du chenillard en C : Pour programmer le microcontrôleur, la LUFA me permettra de gérer l'USB sans passer par les registres. Pour téléverser mon programme, je me servirai de l'utilitaire dfu-programmer.

Travail réalisé

Périphérique USB

Reconnaissance USB

Afin de se servir du XMEGA-C3 Xplained comme périphérique USB, il faut le reconnaître parmi tous les périphériques de la machine. Grâce à la commande suivante, je peux facilement reconnaître les caractéristiques de la carte :

lsusb

Je crée alors une fonction enum_usb qui reconnaîtra le périphérique pour la suite des opérations et qui ne se soucis pas des autres :

Reconnaissance USB

Je peux ensuite sauver la "poingée" dans une variable globale de type libusb_device_handle *.

Il faut ensuite configurer notre périphérique USB. Je crée une fonction configuration qui permettra, dans un premier temps, de récupérer la première configuration de la carte via un pointeur sur périphérique libusb_device *. Dans un second temps, je peux afficher cette configuration et la déclarer comme courante. Cependant, le périphérique ou la ressource semblent occupés. Je tente de résoudre ce problème au plus vite.

Il semblerait que cela soit dû au méchant noyau passé avant moi. Il faut détacher le "driver". Je crée alors une fonction detach qui inclura libusb_detach_kernel_driver. Je peux maintenant récupérer et sauver les endpoints.

Récupération des Endpoints

Grâce à la commande suivante, je peux retrouver le parcours de l'arbre arborescent et les paramètres qui m'intéressent :

lsusb -D /dev/bus/usb/001/00x 

Avec x le numéro correspondant à l'adresse du périphérique (retrouvé avec lsusb) qui change lorsqu'on détache le driver. Pour éviter des manipulations pénibles, je crée une fonction attach qui inclura libusb_attach_kernel_driver et qui fixera x. Le but est de re-attacher le driver après l'avoir détaché dans la fonction configuration.

Grâce à cette commande, nous pouvons retrouver les 3 interfaces de notre périphérique. L'interface 0 possède un seul Endpoint IN tandis que les deux autres ont un Endpoint IN ainsi que OUT. Voici un résumé dans le tableau ci-dessous :

Numéro Interface Adresse EP_IN Type de Transfert EP_IN Adresse EP_OUT Type de Transfert EP_OUT
0 0x81 Interrupt NONE NONE
1 0x82 BULK 0x02 BULK
2 0x83 BULK 0x03 BULK

On peut remarquer que tous les Endpoints ne sont pas de type Interrupt. Pour notre application, nous allons nous intéresser à l'Endpoint IN de type Interrupt de l'interface 0, ainsi qu'aux Endpoints OUT des interfaces suivantes. Cependant, nous allons sauver tous les Endpoints pour l'instant, dans le cas où nous rencontrons des problèmes avec la LUFA.

Enfin, il faut libérer le périphérique USB, grâce à une fonction libere . Cela sert à relâcher toutes les interfaces et fermer la "poignée". Voici le résultat final de mon programme :

Exécution finale du programme