BE 2020-2021 : Différence entre versions
(→Réalisations des binômes) |
(→Calcul de l'espace occupée sur une clef USB) |
||
(16 révisions intermédiaires par le même utilisateur non affichées) | |||
Ligne 222 : | Ligne 222 : | ||
Pour tester une mémoire, il est possible de demander ses identifiants. Pour cela, il faut envoyer sur le bus SPI, une fois la mémoire sélectionnée, l'octet <tt>0x9F</tt>. Ensuite, il faut lire les cinq octets des identifiants (ID fabricant, ID de la mémoire, ...) puis il faut remonter la ligne de sélection à l'état haut. | Pour tester une mémoire, il est possible de demander ses identifiants. Pour cela, il faut envoyer sur le bus SPI, une fois la mémoire sélectionnée, l'octet <tt>0x9F</tt>. Ensuite, il faut lire les cinq octets des identifiants (ID fabricant, ID de la mémoire, ...) puis il faut remonter la ligne de sélection à l'état haut. | ||
− | Un programme de | + | Un programme de détection est disponible [[Media:ClefUSBTestMem.zip]]. Le test commence par 10 flashes rapides sur la LED de test. Pour simplifier la lecture du résultat, un test validé donne lieu à 5 flashes et un test en échec à un seul flash. Les deux mémoires sont testées tour à tour. Le prototype de clef USB avec des mémoires AT45DB641E passe avec succès ce test. |
+ | |||
+ | Pour aller plus loin, il faut écrire dans les mémoires et vérifier, par une lecture, que les écritures ont été bien effectuées. | ||
+ | |||
+ | Un premier programme de test des mémoires est disponible [[Media:ClefUSBTestMemRW.zip]]. Ce programme écrit cinq octets dans le premier bloc de la première mémoire, les lit, les multiplie par 2 et écrit les résultats dans le premier bloc de la seconde mémoire. Le test commence encore par 10 flashes rapides. Un test effectué avec succès donne lieu à 5 flashes, en cas d'échec un seul flash. Le prototype de clef USB avec des mémoires AT45DB641E passe avec succès ce test. | ||
+ | |||
+ | Un second programme de test de la première mémoire est disponible [[Media:ClefUSBTestMemRW2.zip]]. Ce programme écrit des valeurs séquentielles dans tous les blocs puis vérifie par des lectures que les écritures étaient bien effectuées. Le test commence encore par 10 flashes rapides. Ensuite un flash de contrôle est effectué tous les 256 blocs en écriture comme en lecture. C'est l'occasion de voir que les écritures sont plus lentes que les lectures. Après test des 8M de la première mémoire le résultat est donné en boucle. Toujours 5 flashes pour un succès et 1 pour un échec. Le résultat est répété toutes les 5 minutes histoire de pouvoir laisser le test se dérouler tout seul (test assez long). | ||
− | |||
<br style="clear: both;"/> | <br style="clear: both;"/> | ||
Ligne 263 : | Ligne 268 : | ||
* Dans ce répertoire copiez la démonstration de périphérique USB bas niveau <tt>MassStorage</tt>. Au niveau du <tt>makefile</tt> indiquez <tt>atmega16u2</tt> comme micro-contrôleur, <tt>NONE</tt> comme platine et restez à 8Mhz. | * Dans ce répertoire copiez la démonstration de périphérique USB bas niveau <tt>MassStorage</tt>. Au niveau du <tt>makefile</tt> indiquez <tt>atmega16u2</tt> comme micro-contrôleur, <tt>NONE</tt> comme platine et restez à 8Mhz. | ||
* Il faut ensuite modifier la configuration de la mémoire et les fonctions d'accès à cette mémoire dans le sous-répertoire <tt>Lib</tt> du répertoire <tt>PolytechLille/MassStorage</tt>. Pour vous aider une version modifiée de la démonstration <tt>MassStorage</tt> est disponible [[media:MassStoragePeiP.zip]]. Dans cette version, vous n'avez à modifier que les fichiers <tt>Lib/DataflashManager.h</tt> et <tt>Lib/DataflashManager.c</tt> en vous appuyant sur les programmes de test des mémoires. | * Il faut ensuite modifier la configuration de la mémoire et les fonctions d'accès à cette mémoire dans le sous-répertoire <tt>Lib</tt> du répertoire <tt>PolytechLille/MassStorage</tt>. Pour vous aider une version modifiée de la démonstration <tt>MassStorage</tt> est disponible [[media:MassStoragePeiP.zip]]. Dans cette version, vous n'avez à modifier que les fichiers <tt>Lib/DataflashManager.h</tt> et <tt>Lib/DataflashManager.c</tt> en vous appuyant sur les programmes de test des mémoires. | ||
+ | |||
+ | Une tendance naturelle est de créer un tableau pour stocker une page mémoire mais avec un ATMega16u2 il vaut mieux éviter : ce micro-contrôleur ne possède que 512 octets de mémoire vive. Même allouer un tableau pour une page de 256 octets n'est pas une évidence sachant que la bibliothèque LUFA consomme déjà de la mémoire. Vous écrirez donc les octets un à un dans le tampon d'écriture des mémoires et vous lirez les octets d'une page mémoire un à un. | ||
Pour téléverser votre programme sur l’<tt>ATMega16u2</tt>, le paquetage Debian <tt>dfu-programmer</tt> est nécessaire. Installez-le au besoin. La procédure à suivre pour charger votre programme sur l’<tt>ATMega16u2</tt> est la suivante : | Pour téléverser votre programme sur l’<tt>ATMega16u2</tt>, le paquetage Debian <tt>dfu-programmer</tt> est nécessaire. Installez-le au besoin. La procédure à suivre pour charger votre programme sur l’<tt>ATMega16u2</tt> est la suivante : | ||
Ligne 324 : | Ligne 331 : | ||
Mettre quelques fichiers dessus, la démonter (avec la commande <tt>umount</tt>) et vérifier que vos fichiers sont encore là quand vous reconnectez la clef. | Mettre quelques fichiers dessus, la démonter (avec la commande <tt>umount</tt>) et vérifier que vos fichiers sont encore là quand vous reconnectez la clef. | ||
+ | |||
+ | = Calcul de l'espace occupée sur une clef USB = | ||
+ | |||
+ | Certains binômes cherchent à afficher le pourcentage d'espace libre sur leur clef USB. C'est possible à réaliser avec quelques hypothèses. Dans un premier temps nous allons supposer que la clef n'est pas partionnée et que le système de fichiers est de type FAT. | ||
+ | |||
+ | == Cas du système de fichiers FAT32 == | ||
+ | |||
+ | Le système de fichier FAT32 peut être utilisé à partir d'environ 260Mo disponible. | ||
+ | |||
+ | Pour ce type de système de fichiers il est possible d'avoir une évalution de l'espace libre en utilisant deux champs de la structure "informations". Cette structure se trouve généralement dans le second bloc du système de fichier et comporte deux champs pour donner le nombre de groupes alloués et de groupes libres. Ces champs ne sont qu'approximatifs et malheureusement pas toujours mis à jour par les systèmes d'exploitation. Cela dit Linux fait correctement le travail. Un fichier C de démonstration est disponible : [[File:fat32disp.zip]]. | ||
+ | |||
+ | == Cas du système de fichiers FAT12 == | ||
+ | |||
+ | Pour les très petites clef (en dessous de 260Mo), seul le système de fichiers FAT12 peut fonctionner dans la famille des systèmes de fichiers FAT. | ||
+ | |||
+ | Pour ce système de fichiers la seule solution pour connaître la taille libre de la clef est de parcourir la table d'allocation des groupes de secteurs et de compter les groupes alloués. | ||
+ | |||
+ | D'un coté c'est assez simple car les groupes sont listés exhaustivement dans la table d'allocation et d'un autre coté en FAT12 un groupe est géré sur 12 bits, il faut donc regarder les groupes par deux (3 octets utilisés pour deux groupes). | ||
+ | |||
+ | Un programme C de démonstration est fourni : [[File:fatdisp.zip]]. | ||
+ | |||
+ | Le principe du programme est assez simple : | ||
+ | * le premier bloc est lu et quelques champs sont récupérés : | ||
+ | ** taille, en nombre de blocs, des groupes ; | ||
+ | ** nombre de blocs réservés ; | ||
+ | ** taille, en nombre de blocs, des tables d'allocation ; | ||
+ | ** nombre total de blocs. | ||
+ | * ensuite les blocs reservés sont passés ; | ||
+ | * enfin les chaînages des groupes sont lus deux par deux (en lisant 3 octets). | ||
+ | |||
+ | La partie de lecture des chaînages est un peu complexe en deux points : | ||
+ | * un calcul doit être effectué pour séparer les trois octets en deux chaînages ; | ||
+ | * l'énumération se fait sur les octets et pas sur les blocs. | ||
+ | |||
+ | Le dernier point fait que le programme de démonstration peut être assez facile à adapter sur la clef : au lieu de lire des blocs de 512 octets avec la primitive <code>read</code> il faut juste la fonction de lecture des pages avec la fonction <code>AT45DB641E_read_page</code> présentée plus haut. | ||
+ | |||
+ | == Implantation dans la clef == | ||
+ | |||
+ | Il ne faut surtout pas lancer le calcul de l'espace libre à chaque accès à la clef par le bus USB. Une façon efficace de faire est la suivante : | ||
+ | * lire les informations sur le premier bloc à l'initialisation et stocker les informations pertinentes en mémoire ; | ||
+ | * noter quand un bloc de la table d'allocation est modifié ; | ||
+ | * quand un bloc de données est accédé et que la table d'allocation a été modifiée lancer la fonction d'analyse de la table d'allocation. | ||
= Réalisations des binômes = | = Réalisations des binômes = | ||
Ligne 334 : | Ligne 383 : | ||
| Clé éducative qui délivre des décharges | | Clé éducative qui délivre des décharges | ||
| [[Binome2020-1|Binôme 1 2020/2021]] | | [[Binome2020-1|Binôme 1 2020/2021]] | ||
− | | Clé | + | | Clé reçue, carte fille reçue |
|- | |- | ||
| Binôme 2 | | Binôme 2 | ||
Ligne 340 : | Ligne 389 : | ||
| Clé avec déverrouillage par code + LED de confirmation | | Clé avec déverrouillage par code + LED de confirmation | ||
| [[Binome2020-2|Binôme 2 2020/2021]] | | [[Binome2020-2|Binôme 2 2020/2021]] | ||
− | | Clé | + | | Clé reçue (testée) |
|- | |- | ||
| Binôme 3 | | Binôme 3 | ||
Ligne 346 : | Ligne 395 : | ||
| Affichage digital de l'heure sous format 24h. | | Affichage digital de l'heure sous format 24h. | ||
| [[Binome2020-3|Binôme 3 2020/2021]] | | [[Binome2020-3|Binôme 3 2020/2021]] | ||
+ | | Clé reçue de chez Aisler, carte fille gravée à l'école | ||
|- | |- | ||
| Binôme 4 | | Binôme 4 | ||
Ligne 357 : | Ligne 407 : | ||
|Affichage de la capacité restante via afficheurs 7 segments | |Affichage de la capacité restante via afficheurs 7 segments | ||
| [[Binome2020-5|Binôme 5 2020/2021]] | | [[Binome2020-5|Binôme 5 2020/2021]] | ||
− | | Clé reçue, carte fille | + | | Clé reçue, carte fille reçue (soudée) |
|- | |- | ||
| Binôme 6 | | Binôme 6 | ||
Ligne 363 : | Ligne 413 : | ||
| Déverrouiller la clé par un bruit | | Déverrouiller la clé par un bruit | ||
| [[Binome2020-6|Binôme 6 2020/2021]] | | [[Binome2020-6|Binôme 6 2020/2021]] | ||
− | | Clé | + | | Clé reçue (testé), carte fille reçue |
|- | |- | ||
| Binôme 7 | | Binôme 7 | ||
Ligne 369 : | Ligne 419 : | ||
| Affichage de la capacité de la clé par vu-mètre à led | | Affichage de la capacité de la clé par vu-mètre à led | ||
| [[Binome2020-7|Binôme 7 2020/2021]] | | [[Binome2020-7|Binôme 7 2020/2021]] | ||
− | | Clé reçue, carte fille | + | | Clé reçue, carte fille reçue |
|- | |- | ||
| Binôme 8 | | Binôme 8 | ||
Ligne 375 : | Ligne 425 : | ||
| Affichage de la température et alimentation par dynamo | | Affichage de la température et alimentation par dynamo | ||
| [[Binome2020-8|Binôme 8 2020/2021]] | | [[Binome2020-8|Binôme 8 2020/2021]] | ||
− | | Clé | + | | Clé reçue (testée), carte fille réalisée par modification du bouclier classique (soudée non testée) |
|- | |- | ||
| Binôme 9 | | Binôme 9 | ||
Ligne 387 : | Ligne 437 : | ||
| Clé minuteur | | Clé minuteur | ||
| [[Binome2020-10|Binôme 10 2020/2021]] | | [[Binome2020-10|Binôme 10 2020/2021]] | ||
− | | Clé | + | | Clé reçue (une autre reçue avec ICSP classique, non soudée), carte fille reçue |
|- | |- | ||
| Binôme 11 | | Binôme 11 | ||
Ligne 393 : | Ligne 443 : | ||
| Déverrouillage par boutons + diodes + affichage de pages Pop-up | | Déverrouillage par boutons + diodes + affichage de pages Pop-up | ||
| [[Binome2020-11|Binôme 11 2020/2021]] | | [[Binome2020-11|Binôme 11 2020/2021]] | ||
− | | Clé | + | | Clé reçue (testée) |
|- | |- | ||
| Binôme 12 | | Binôme 12 |
Version actuelle datée du 22 avril 2021 à 12:31
Sommaire
- 1 Présentation du bureau d'étude
- 2 Survol d'USB
- 3 Logiciels
- 4 Cartes intermédiaires
- 5 Les composants électroniques
- 6 Test des cartes
- 7 Programmation de micro-contrôleur par SPI
- 8 Bibliothèque LUFA
- 9 Test du programme avec la bibliothèque LUFA
- 10 Calcul de l'espace occupée sur une clef USB
- 11 Réalisations des binômes
Présentation du bureau d'étude
Nous vous proposons de découvrir ce qu'est réellement cet objet devenu banal appelé clé USB (Universal Serial Bus).
Le bureau d'étude consiste à construire de A à Z une clé USB :
- en créant un circuit électronique ou PCB (Printed Circuit Board) à l’aide d’un logiciel ;
- en soudant des composants électroniques (micro-contrôleur, mémoire FLASH, ...) ;
- en programmant le micro-contrôleur pour gérer la communication USB en utilisant la bibliothèque LUFA (Lightweight USB Framework for AVRs) ;
- en programmant le micro-contrôleur pour accéder à la mémoire ;
- en fabriquant un beau boitier pour votre clef.
Pour personnaliser votre clé n'hésitez pas à ajouter des fonctionnalités :
- LED qui clignotent lors des accès en lecture ou écriture ;
- vumètre qui indique le remplissage de la clé ;
- micro-interrupteurs pour verrouiller la clé ;
- vibreur parce que c'est possible, vous trouverez bien une justification ;
- microphone permettant d’espionner les conversations ;
- toute autre fonction plus ou moins utile mais qui vous inspire ...
Vous allez d'abord réaliser une carte gérant uniquement une des fonctionnalités annexes de votre carte. Cette carte comportera un micro-contrôleur facile à souder : un ATTiny84. Ainsi cette première carte sera un minimum autonome. Par la suite, vous vous attacherez à concevoir la carte complète avec un micro-contrôleur plus puissant possédant des capacités USB matérielle comme l'ATMega16u2. Pour la première carte n'hésitez pas à consulter les pages Wiki de vos prédécesseurs, ils se sont servis d'un ATTiny84 pour réaliser un dé électronique.
Les supports de la présentation de ce bureau d'études : Media:BE_clef_USB.pdf.
Survol d'USB
Evolution des connexions USB
L'acronyme USB signifie "Universal Serial Bus" et effectivement l'USB peut être défini comme un bus USB très verbeux. L'USB est géré par un consortium autonome "USB Implementers Forum".
Jusqu'à la version 2, l'acronyme est fidèle à la réalité. Pour ces périphériques, 3 vitesses de transfert sont possibles sur la paire différentielle :- basse vitesse : 1,5 Mb/s ;
- pleine vitesse : 12 Mb/s ;
- haute vitesse : 480 Mb/s.
Un protocole verbeux
L'initialisation d'un périphérique USB se fait comme suit :
- détection électrique de la connexion du périphérique ;
- alimentation électrique du périphérique ;
- utilisation de l'adresse temporaire 0 sur le bus ;
- récupération de la taille des messages pour le point d'accès 0 ;
- envoi de l'adresse au périphérique sur le point d'accès 0 ;
- envoi des descripteurs du périphérique au contrôleur USB via le point d'accès 0.
Pour un périphérique simple :
- souris : environ 100 octets pour le descripteur de configuration ;
- clavier : environ 150 octets pour le descripteur de configuration.
Les points d'accès (terminaison sur le schéma) :
- des identifiants sur 8 bits (numéro sur 4 bits) ;
- un point d'accès de contrôle de numéro 0 bidirectionnel ;
- les communications se font de ou vers les points d'accès ;
- un sens de communication (bit de poid fort) :
- IN => du périphérique vers le contrôleur ;
- OUT => du contrôleur vers le périphérique.
- la direction est IN ou OUT vis à vis de l’hôte.
Plusieurs types de points d'accès :
- isodromique (isochronous) : débit réservé (e.g. vidéo en temps réel) ;
- par interruption (interrupt) : latence garantie (e.g. souris) ;
- de volume (bulk) : débit maximal sans garantie (e.g. clef mémoire).
Logiciels
Pour la conception de circuits imprimés nous vous recommandons le logiciel fritzing.
Pour la découpe laser de nombreux utilisateurs utilisent inkscape.
Pour la conception 3D vous pouvez tenter freeCAD. Une solution en ligne existe : onshape.
Pour la programmation du micro-contrôleur vous utiliserez le compilateur C avr-gcc et le logiciel de téléversement dfu-programmer.
Cartes intermédiaires
Pour les élèves n'ayant jamais conçu de carte électronique il est conseillé de concevoir une première carte ne comportant que la partie spécifique de leur clef USB.
Pour la saison précédente les élèves avaient conçu leur propre version d'un dé électronique copié sur celui d'Heliox : [1].
Pour voir ces cartes allez sur les pages Wiki des élèves. Pour que les élèves puissent avoir une version plus esthétique de cette carte, deux circuits ont été réalisés pour synthétiser l'ensemble des fonctionnalités de ces cartes.
Le schéma et le circuit compilant les fonctionnalités des cartes à base d'afficheurs 7 segments :
Le schéma et le circuit compilant les fonctionnalités des autres cartes (acquisition microphone, haut-parleur, LED, boutons et électrocuteur) :
Les fichiers Fritzing de ces deux cartes (penser à renommer en .fzz avant de charger) : Media:peip2021_7seg.zip et Media:peip2021_generic.zip.
Les composants électroniques
Le coeur de votre clé va être un micro-contrôleur AVR plus exactement l'ATMega16u2. Ce micro-contrôleur possède l'électronique nécessaire pour la gestion d'un bus USB 2.0. Un document très important pour comprendre le fonctionnement de ce micro-contrôleur est le document technique (datasheet en patoi) : [2].
Sans mémoire une clé n'est pas une clé.
Vous pouvez utiliser des mémoires AT45DB641E faciles à gérer avec un ATMega16u2. Ces mémoires sont accessibles par un bus série SPI et facile à souder. Par contre elles sont de faible capacité (64Mb). Le document technique [3] de ces mémoires permet de connaître les commandes pour les configurer et y accéder en lecture et en écriture.
Si vous êtes téméraire, vous pouvez utiliser une mémoire MT29F128G8 accessible par un bus de 8 bits, plus difficile à souder, plus difficile à programmer mais d'une capacité intéressante (128Gb). La documentation technique est plus difficile à trouver, il faut aller sur le site du fabricant (micron) et montrer patte blanche. Vous trouverez le document dans le répertoire éponyme des machines de projet.
Il vous faudra aussi quelques autres composants comme un quartz, des résistances, des condensateurs, des diodes, des régulateurs de tension et bien sur des LED pour ajouter un peu de lumière. La carte de base peut être décrite comme suit.
- Le micro-contrôleur peut être accompagné d'un quartz à 8Mhz et de ses condensateurs et résistance.
- Le micro-contrôleur peut être alimenté par le connecteur USB en 5v (broche UVCC) mais avec ses lignes VCC et AVCC bouclées sur la sortie UCAP du régulateur 3.3v interne.
- Un convertisseur 5v vers 3.3v est nécessaire pour l'alimentation des mémoires.
- Le micro-contrôleur dialogue avec les mémoires par le bus SPI, une ligne de sélection est nécessaire par mémoire.
Pour la conception de votre clé vous pouvez vous appuyer sur un prototype de clef réalisé pour ce bureau d'études.
Cartes version alpha
Le schéma décrit le circuit électronique partie par partie.
A partir du circuit, il faut créer une carte sans croisement de pistes pour éviter les court-circuits.
Le fichier source Fritzing est disponible : Media:cle_usb.zip (renommer en .fzz).
Une autre carte est disponible pour une mémoire parallèle de plus grande capacité. Attention cette carte n'a pas été testée.
Le fichier source Fritzing est disponible : Media:cle_usb_bis.zip (renommer en .fzz).
Cartes version beta
Une piste parasite entre masse et 3,3v a été supprimée, le reset est en 3,3v et un mini-connecteur ICSP a été ajouté.
Le fichier source Fritzing est disponible : Media:cle_usbv2.zip (renommer en .fzz).
Le reset est en 3,3v et un mini-connecteur ICSP a été ajouté.
Le fichier source Fritzing est disponible : Media:cle_usb_bisv2.zip (renommer en .fzz).
Il peut y avoir des problèmes lors du chargement des fichiers, des composants peuvent être déclarés absents. Essayez d'importer les composants suivants :
- mémoire MT29F128G8 : Fichier:MT29F128G08.zip
- mémoire AT45DB641E : Fichier:SO08-EIAJ.zip
- quartz FA238 : Fichier:FA238.zip
Renommez les fichiers de .zip en .fzpz avant de les importer dans Fritzing.
Test des cartes
Premier test, faire clignoter une LED par programmation DFU
Vision recto et verso des deux circuits décrit dans la section précédente (ancienne version à gauche). A noter que dans l'ancienne version seule les deux puces mémoire se trouvent au recto. Pour la nouvelle version la carte a du être agrandie et le micro-contrôleur rejoint la mémoire au verso.
La première étape de test consiste à insérer les PCB dans un port USB. Remarquez la sur-épaisseur réalisée à l'aide d'un papier un peu épais pour assurer le contact. Si l'ATMega16u2 est fonctionne correctement, en lançant l'utilitaire lsusb vous devez voir apparaître un périphérique labellé Atmel DFU device.
Pour tester plus en avant, il est proposé d'envoyer sur le micro-contrôleur un programme permettant de faire clignoter la LED connectée au micro-contrôleur (la LED est contrôlée par PB6 sur l'ancienne version et sur PB0 sur la nouvelle).
Vous pouvez trouver les programmes de test dans cette archive : Media:ClefUSB.zip. Pour compiler les programmes, il suffit de se placer dans le répertoire correspondant à la version de la clef et lancer le makefile avec la commande make. Pour télécharger le programme un simple make upload suffit. Pour remettre les micro-contrôleur en mode DFU pour les reprogrammer, il faut court-circuiter les broches reset et de la masse (connecteur à deux broches sur les deux cartes).
Premier problème, correction par programmation SPI
Voila le résultat de l'exécution du programme de test du micro-contrôleur sur la nouvelle version : Media:ClefUSBTestLed.mp4.
Force est de constater un problème, la LED clignote bien trop lentement. Quelques recherches apprennent que les ATMega16u2 sont vendus configurés avec un diviseur d'horloge par 8 activé. Le micro-contrôleur fonctionne donc à 1MHz et pas à 8Mhz comme souhaité. Ce type de configuration passe par une reconfiguration des fuses du micro-contrôleur. Manque de chance ces fuses ne peuvent être changées que par programmation SPI : impossible de les modifier en mode DFU. Voir le paragraphe ci-après pour comprendre comment se fait une programmation par SPI.
Les premières version de PCB n'étaient pas prévues pour ce type de programmation. Le mode DFU semblait suffisant. Pour faciliter cette programmation, des via ont été placées de façon à implanter un mini connecteur ICSP. Une erreur a été corrigée en passant : la ligne reset du micro-contrôleur était alimentée en 5v, elle a été passée à 3,3v. En attendant les nouvelles cartes, des fils ont été soudés sur les cartes pour avoir un accès au bus SPI et au reset. D'ailleurs, une malheureuse tentative de programmation en 5v ayant grillé les micro-contrôleur, d'autres cartes version alpha ont du être soudées.
Une fois le dispositif de programmation SPI adéquat mis au point, une configuration est tentée pour désactiver la division de l'horloge (modification de la valeur de l'octet de configuration appelé lfuse) :
avrdude -c arduino -p atmega16u2 -P /dev/ttyACM0 -b 19200 -U lfuse:w:0xFF:m
Cette configuration échoue : le micro-contrôleur est passé, en usine, en état verrouillé. Vous pouvez vérifier cela avec la commande ci-dessous et en utilisant l'outil de calcul des fuses en ligne [4].
avrdude -c arduino -p atmega16u2 -P /dev/ttyACM0 -b 19200 -U lock:r:-:h
Il faut donc totalement réinitialiser le micro-contrôleur :
avrdude -c arduino -p atmega16u2 -P /dev/ttyACM0 -b 19200 -t avrdude> erase avrdude> quit
Il est alors possible de modifier l'octet de configuration lfuse comme indiqué ci-dessus. Sauf que maintenant le micro-contrôleur ne contient même plus l'amorçeur. Il n'est plus possible de le programmer en mode DFU. Il ne semble pas possible de mettre la main sur l'amorceur du fondeur pour ATMega16u2. Heureusement l'amorceur pour une précédente version de la puce est disponible : media:at90usb162-bl-usb-1_0_5.zip. Il est assez simple d'installer l'amorceur par programmation SPI :
avrdude -c arduino -p atmega16u2 -P /dev/ttyACM0 -b 19200 -U flash:w:at90usb162-bl-usb-1_0_5.hex
Après la modification de l'octet de configuration lfuse, la LED clignote normalement : media:ClefUSBTestLedBis.mp4. A noter qu'il faut maintenant télécharger le programme en utilisant at90usb162 comme cible au lieu de atmega16u2 à cause de la différence d'amorceur.
Second test, accès aux mémoires
Il faut maintenant souder le régulateur 3,3v pour alimenter les mémoires et aussi souder les-dites mémoires.
Ensuite il faut tester si l'accès aux mémoires fonctionne. Les programmes sont différents suivant les types de mémoire.
Test des mémoires AT45DB641E
Pour tester une des deux mémoires, il faut déjà sélectionner la mémoire sur le bus SPI. La première mémoire se sélectionne en passant la ligne PD0 à l'état bas. Pour la seconde mémoire, il faut utiliser la ligne PB4. La broche reset des deux mémoires est reliée à la ligne PB5 du micro-contrôleur. Il faut donc passer PB5 en sortie et la mettre à l'état haut.
Pour tester une mémoire, il est possible de demander ses identifiants. Pour cela, il faut envoyer sur le bus SPI, une fois la mémoire sélectionnée, l'octet 0x9F. Ensuite, il faut lire les cinq octets des identifiants (ID fabricant, ID de la mémoire, ...) puis il faut remonter la ligne de sélection à l'état haut.
Un programme de détection est disponible Media:ClefUSBTestMem.zip. Le test commence par 10 flashes rapides sur la LED de test. Pour simplifier la lecture du résultat, un test validé donne lieu à 5 flashes et un test en échec à un seul flash. Les deux mémoires sont testées tour à tour. Le prototype de clef USB avec des mémoires AT45DB641E passe avec succès ce test.
Pour aller plus loin, il faut écrire dans les mémoires et vérifier, par une lecture, que les écritures ont été bien effectuées.
Un premier programme de test des mémoires est disponible Media:ClefUSBTestMemRW.zip. Ce programme écrit cinq octets dans le premier bloc de la première mémoire, les lit, les multiplie par 2 et écrit les résultats dans le premier bloc de la seconde mémoire. Le test commence encore par 10 flashes rapides. Un test effectué avec succès donne lieu à 5 flashes, en cas d'échec un seul flash. Le prototype de clef USB avec des mémoires AT45DB641E passe avec succès ce test.
Un second programme de test de la première mémoire est disponible Media:ClefUSBTestMemRW2.zip. Ce programme écrit des valeurs séquentielles dans tous les blocs puis vérifie par des lectures que les écritures étaient bien effectuées. Le test commence encore par 10 flashes rapides. Ensuite un flash de contrôle est effectué tous les 256 blocs en écriture comme en lecture. C'est l'occasion de voir que les écritures sont plus lentes que les lectures. Après test des 8M de la première mémoire le résultat est donné en boucle. Toujours 5 flashes pour un succès et 1 pour un échec. Le résultat est répété toutes les 5 minutes histoire de pouvoir laisser le test se dérouler tout seul (test assez long).
Test de la mémoire MT29F128G8
Cette mémoire est sélectionnée par défaut. Il faut juste arriver à lui envoyer un ordre en utilisant les 8 lignes de contrôle.
Programmation de micro-contrôleur par SPI
Nativement les micro-contrôleurs AVR peuvent être programmés via le bus SPI. Généralement un amorceur (bootloader) est installé sur ces micro-contrôleurs pour qu'ils puissent être programmés plus facilement par une connexion série pure (cas de l'ATMega328p par exemple) ou par une connexion USB (cas de l'ATMega16u2). Malheureusement les amorceurs peuvent être effacés par une mauvaise manoeuvre ou ne permettent pas de configurer tous les aspects du micro-contrôleur.
Généralement pour une programmation de micro-contrôleur par bus SPI, un connecteur ICSP est utilisé. Ce connecteur regroupe les lignes du bus SPI, la masse, l'alimentation et le reset. Un simple Arduino UNO peut-être utilisé comme programmateur par bus SPI. Les lignes MISO, MOSI, SCK, GND, VCC du programmateur sont connectées sur les mêmes lignes de la cible. La ligne 10 du programmateur est connectée sur le reset de la cible. Le programme ArduinoISP doit être téléversé sur le UNO jouant le rôle de programmateur. Ce programme fait partie des exemples fournis avec l'IDE Arduino.
Un exemple d'utilisation d'un programmateur par bus SPI pour obtenir les fuses d'un ATMega16u2 (les fuses sont des octets de configuration bas niveau du micro-contrôleur) :
avrdude -c arduino -p atmega16u2 -P /dev/ttyACM0 -b 19200 -v
Un exemple pour télécharger un programme par SPI sur un ATMega16u2 :
avrdude -c arduino -p atmega16u2 -P /dev/ttyACM0 -b 19200 -U flash:w:programme.hex
Dans ces exemples, il est supposé que le port série associé à l'UNO est /dev/ttyACMO.
Si le micro-contrôleur est alimenté en 3,3v utiliser un Arduino Uno comme programmateur est une mauvaise idée : un UNO fonctionne à 5v et la communication SPI entre une plateforme à 5v et une autre à 3,3v ne fonctionne pas. Il existe assez peu de plateformes Arduino en 3,3v. Vous pouvez utiliser un Arduino Mini Pro 3,3v en conjonction avec un FTDI (convertisseur USB/série) lui aussi en 3,3v. Le Mini Pro ne dispose pas d'un connecteur ICSP. Il faut utiliser la ligne 11 pour connecter la ligne MOSI de la cible, la ligne 12 pour MISO et la ligne 13 pour SCK.
L'utilitaire avrdude peut être utilisé pour programmer la cible comme avec le programmateur à base d'UNO. Attention le port série sera probablement /dev/ttyUSBO cette fois.
Bibliothèque LUFA
Pour la gestion du bus USB par le micro-contrôleur nous allons nous appuyer au maximum sur la bibliothèque USB LUFA. Cette bibliothèque permet d'exploiter plus facilement les aspects USB des micro-contrôleurs AVR comme l'ATMega16u2.
Vous pouvez télécharger la dernière version de la bibliothèque [5]. Il est ensuite conseillé d'effectuer quelques manipulations pour pouvoir développer dans de bonnes conditions.
- Créez un répertoire PolytechLille au même niveau que les répertoires Demos et Projects.
- Dans ce répertoire copiez la démonstration de périphérique USB bas niveau MassStorage. Au niveau du makefile indiquez atmega16u2 comme micro-contrôleur, NONE comme platine et restez à 8Mhz.
- Il faut ensuite modifier la configuration de la mémoire et les fonctions d'accès à cette mémoire dans le sous-répertoire Lib du répertoire PolytechLille/MassStorage. Pour vous aider une version modifiée de la démonstration MassStorage est disponible media:MassStoragePeiP.zip. Dans cette version, vous n'avez à modifier que les fichiers Lib/DataflashManager.h et Lib/DataflashManager.c en vous appuyant sur les programmes de test des mémoires.
Une tendance naturelle est de créer un tableau pour stocker une page mémoire mais avec un ATMega16u2 il vaut mieux éviter : ce micro-contrôleur ne possède que 512 octets de mémoire vive. Même allouer un tableau pour une page de 256 octets n'est pas une évidence sachant que la bibliothèque LUFA consomme déjà de la mémoire. Vous écrirez donc les octets un à un dans le tampon d'écriture des mémoires et vous lirez les octets d'une page mémoire un à un.
Pour téléverser votre programme sur l’ATMega16u2, le paquetage Debian dfu-programmer est nécessaire. Installez-le au besoin. La procédure à suivre pour charger votre programme sur l’ATMega16u2 est la suivante :
- court-circuitez momentanément les lignes reset et masse de l’ATMega16u2, l'utilitaire lsusb doit lister la carte comme étant en mode DFU, vous pouvez alors exécuter les commandes suivantes :
- dfu-programmer atmega16u2 erase
- dfu-programmer atmega16u2 flash MassStorage.hex
- dfu-programmer atmega16u2 reset
- débranchez et rebranchez votre carte, votre programme doit être actif sur le micro-contrôleur.
Test du programme avec la bibliothèque LUFA
Un premier test très simple à réaliser consiste à compiler le programme MassStoragePeiP sans ajouter les accès à la mémoire puis à le télécharger sur le micro-contrôleur. Vous devriez déjà vous apercevoir que votre carte est reconnue comme une clef USB. Sur un système Linux, les deux utilitaires dmesg et lsblk vous en convaincront.
# dmesg | tail [21942.134207] usb 1-1: new full-speed USB device number 4 using xhci_hcd [21942.333156] usb 1-1: New USB device found, idVendor=03eb, idProduct=2045, bcdDevice= 0.01 [21942.333161] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=220 [21942.333163] usb 1-1: Product: LUFA Mass Storage Demo [21942.333166] usb 1-1: Manufacturer: Dean Camera [21942.333168] usb 1-1: SerialNumber: 758303337383514140C1 [21942.339211] usb-storage 1-1:1.0: USB Mass Storage device detected [21942.339407] scsi host6: usb-storage 1-1:1.0 [21943.358141] scsi 6:0:0:0: Direct-Access LUFA Dataflash Disk 0.00 PQ: 0 ANSI: 0 [21943.358778] sd 6:0:0:0: Attached scsi generic sg2 type 0 [21943.359523] sd 6:0:0:0: [sdb] 2048 512-byte logical blocks: (1.05 MB/1.00 MiB) [21943.359910] sd 6:0:0:0: [sdb] Write Protect is off [21943.359915] sd 6:0:0:0: [sdb] Mode Sense: 00 00 00 00 [21943.360221] sd 6:0:0:0: [sdb] Asking for cache data failed [21943.360241] sd 6:0:0:0: [sdb] Assuming drive cache: write through [21943.404925] sd 6:0:0:0: [sdb] Attached SCSI removable disk
# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 119,2G 0 disk ├─sda1 8:1 0 114,4G 0 part / ├─sda2 8:2 0 1K 0 part └─sda5 8:5 0 4,9G 0 part [SWAP] sdb 8:16 1 1M 0 disk sr0 11:0 1 1024M 0 rom
Pour vous familiariser avec le code, vous pouvez tenter de changer les noms du produit, du fabricant, le numéro de série et même la taille de la clef.
Avant de faire un test de votre clef avec un système de fichier, vous pouvez tester si elle gère correctement ses blocs mémoires. Le programme media:TestBlock.zip permet d'effectuer une écriture dans les blocs et, dans un second temps, de vérifier que ces blocs contiennent bien les bonnes valeurs. Pour l'utiliser, insérez votre clef, trouvez le nom du périphérique avec la commande lsblk et lancez la commande ci-dessous (ici il est supposé que le nom du périphérique est /dev/sdb) :
./testblock /dev/sdb W
Une fois le programme terminé, enlevez la clef pour s'assurer que la lecture ne se fera pas dans les tampons, remettez la et envoyez la commande :
./testblock /dev/sdb R
Si le programme ne vous affiche pas de différence d'octet, c'est que votre clef fonctionne correctement.
Vous pouvez alors formater votre clef :
mkfs -t vfat /dev/sdb
La monter :
mount /dev/sdb /mnt
Mettre quelques fichiers dessus, la démonter (avec la commande umount) et vérifier que vos fichiers sont encore là quand vous reconnectez la clef.
Calcul de l'espace occupée sur une clef USB
Certains binômes cherchent à afficher le pourcentage d'espace libre sur leur clef USB. C'est possible à réaliser avec quelques hypothèses. Dans un premier temps nous allons supposer que la clef n'est pas partionnée et que le système de fichiers est de type FAT.
Cas du système de fichiers FAT32
Le système de fichier FAT32 peut être utilisé à partir d'environ 260Mo disponible.
Pour ce type de système de fichiers il est possible d'avoir une évalution de l'espace libre en utilisant deux champs de la structure "informations". Cette structure se trouve généralement dans le second bloc du système de fichier et comporte deux champs pour donner le nombre de groupes alloués et de groupes libres. Ces champs ne sont qu'approximatifs et malheureusement pas toujours mis à jour par les systèmes d'exploitation. Cela dit Linux fait correctement le travail. Un fichier C de démonstration est disponible : Fichier:Fat32disp.zip.
Cas du système de fichiers FAT12
Pour les très petites clef (en dessous de 260Mo), seul le système de fichiers FAT12 peut fonctionner dans la famille des systèmes de fichiers FAT.
Pour ce système de fichiers la seule solution pour connaître la taille libre de la clef est de parcourir la table d'allocation des groupes de secteurs et de compter les groupes alloués.
D'un coté c'est assez simple car les groupes sont listés exhaustivement dans la table d'allocation et d'un autre coté en FAT12 un groupe est géré sur 12 bits, il faut donc regarder les groupes par deux (3 octets utilisés pour deux groupes).
Un programme C de démonstration est fourni : Fichier:Fatdisp.zip.
Le principe du programme est assez simple :
- le premier bloc est lu et quelques champs sont récupérés :
- taille, en nombre de blocs, des groupes ;
- nombre de blocs réservés ;
- taille, en nombre de blocs, des tables d'allocation ;
- nombre total de blocs.
- ensuite les blocs reservés sont passés ;
- enfin les chaînages des groupes sont lus deux par deux (en lisant 3 octets).
La partie de lecture des chaînages est un peu complexe en deux points :
- un calcul doit être effectué pour séparer les trois octets en deux chaînages ;
- l'énumération se fait sur les octets et pas sur les blocs.
Le dernier point fait que le programme de démonstration peut être assez facile à adapter sur la clef : au lieu de lire des blocs de 512 octets avec la primitive read
il faut juste la fonction de lecture des pages avec la fonction AT45DB641E_read_page
présentée plus haut.
Implantation dans la clef
Il ne faut surtout pas lancer le calcul de l'espace libre à chaque accès à la clef par le bus USB. Une façon efficace de faire est la suivante :
- lire les informations sur le premier bloc à l'initialisation et stocker les informations pertinentes en mémoire ;
- noter quand un bloc de la table d'allocation est modifié ;
- quand un bloc de données est accédé et que la table d'allocation a été modifiée lancer la fonction d'analyse de la table d'allocation.
Réalisations des binômes
Numéro | Elèves | Fonctionnalité supplémentaire | Page | Carte finale |
---|---|---|---|---|
Binôme 1 | Antoine VION & Charles BRICOUT | Clé éducative qui délivre des décharges | Binôme 1 2020/2021 | Clé reçue, carte fille reçue |
Binôme 2 | Antoine DELETANG & Télian DELANNOY | Clé avec déverrouillage par code + LED de confirmation | Binôme 2 2020/2021 | Clé reçue (testée) |
Binôme 3 | Anas FAHID & Nicolas BENOODT | Affichage digital de l'heure sous format 24h. | Binôme 3 2020/2021 | Clé reçue de chez Aisler, carte fille gravée à l'école |
Binôme 4 | Jérémy VERSCHOORE DE LA HOUSSAYE & Albin MOUTON | Grosse mémoire + interface via Wi-FI + micro | Binôme 4 2020/2021 | Clé commandée par EasyEDA |
Binôme 5 | Chloé LEMAIRE & Thomas KORPAL | Affichage de la capacité restante via afficheurs 7 segments | Binôme 5 2020/2021 | Clé reçue, carte fille reçue (soudée) |
Binôme 6 | Louis WIJSMAN & Matthieu SANIEZ | Déverrouiller la clé par un bruit | Binôme 6 2020/2021 | Clé reçue (testé), carte fille reçue |
Binôme 7 | Edward TOLLET & Gabriel THOMAS | Affichage de la capacité de la clé par vu-mètre à led | Binôme 7 2020/2021 | Clé reçue, carte fille reçue |
Binôme 8 | Agathe LEROY & Ryan DEBOUVRIES | Affichage de la température et alimentation par dynamo | Binôme 8 2020/2021 | Clé reçue (testée), carte fille réalisée par modification du bouclier classique (soudée non testée) |
Binôme 9 | Laurine BULTEL & Hortense SCOPIN | Bruit émis à l'insertion et l'éjection de la clé | Binôme 9 2020/2021 | Clé reçue, carte fille reçue |
Binôme 10 | Lucas GONTIER & Estelle GODARD | Clé minuteur | Binôme 10 2020/2021 | Clé reçue (une autre reçue avec ICSP classique, non soudée), carte fille reçue |
Binôme 11 | Axel BOCQUET & Clara LACROIX | Déverrouillage par boutons + diodes + affichage de pages Pop-up | Binôme 11 2020/2021 | Clé reçue (testée) |
Binôme 12 | Maël DELABY & Rémi DETEVE | Grosse mémoire + led RB + Bouton d'urgence | Binôme 12 2020/2021 | Clé commandée par EasyEDA |