BE 2022-2023

De Wiki de bureau d'études PeiP

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).

Firefly-serenity-usb-flash-drive.jpg

Le bureau d'étude consiste à construire de A à Z une clé USB ou un clavier USB :

  • en créant un circuit électronique ou PCB (Printed Circuit Board) à l’aide d’un logiciel de CAO ;
  • en soudant les composants électroniques (micro-contrôleur, mémoire FLASH, boutons, ...) ;
  • 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 ou scanner les touches ;
  • en fabriquant un beau boitier pour votre clef ou de jolies touches pour votre clavier.

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 ...

Pour personnaliser votre clavier n'hésistez pas à ajouter des fonctionnalités :

  • LED pour refléter l'état du clavier ou pour l'esthétique ;
  • mémoire pour envoyer des suites de touches ou pour enregistrer ;
  • 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.

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".

USB-2.png
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.


USB-3.jpg
A partir de l'USB 3.0, la notion de bus série est un peu oubliée. La vitesse augmente en utilisant les deux nouvelles paires blindées : 5Gb/s (super vitesse).


USB-4.png
Et maintenant USB (USB 3.1, USB 3.2, USB 4) se prend pour de l'Ethernet. En effet, le connecteur USB-C ajoute, à la paire historique, quatre paires blindées. USB 3.2 promet des vitesses jusqu'à 20G/s.


Un protocole verbeux

USB-communication.gif

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.


USB-descripteurs.gif

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.

Les cartes intermédiaires utilisent un microcontrôleur plus facile à souder : un ATtiny84.

Les cartes intermédiaires se programment en utilisant un Arduino Uno et les connecteurs ISP (In-System Programming). Voir la section Programmation par SPI pour savoir comment connecter l'Arduino UNO et la carte intermédiaire.

Vous utiliserez l'IDE Arduino (commande arduino) pour la programmation :

  • l'IDE Arduino est déjà installé sur les machines zabeth ;
  • commencez par télécharger le module permettant de programmer des ATtiny84 :
    • lancez une fenêtre de commandes ;
    • tapez export http_proxy=http://proxy.polytech-lille.fr:3128 ;
    • lancez l'IDE via la fenêtre de commande en tapant arduino ;
    • naviguez via file puis preferences ;
    • remplissez la zone Additional Boards Manager URLs avec l'adresse http://drazzy.com/package_drazzy.com_index.json ;
    • naviguez via Tools puis Board et Boards Manager ... ;
    • dans la fenêtre qui s'affiche indiquez comme filtre attiny84 et installez ATTinyCore.

Si l'Arduino Uno n'a pas déjà été programmé comme programmateur :

  • sélectionnez Arduino Uno comme carte (Board) dans l'item Tools ;
  • sélectionnez le port série dans le même item ;
  • prenez l'exemple ArduinoISP dans l'item File ;
  • chargez le dans l'Arduino Uno avec l'icône Upload (flèche vers la droite).

Maintenant vous pouvez programmer votre carte :

  • sélectionnez ATtiny 24/44/84(a) (No bootloader) comme carte (Board) dans l'item Tools ;
  • vérifiez, dans le même item, que l'horloge est définie comme 8Mhz (internal) ;
  • sélectionnez, dans le même item pour le sous-item programmer, l'option "Arduino as ISP" ;
  • sélectionnez le port série dans le même item (celui de l'Arduino Uno) ;
  • vous pouvez alors envoyer votre programme à l'ATtiny84 par l'item Sketch, sous item Upload Using Programmer.

Pour tester votre carte voici un petit programme pour faire clignoter les LED (pensez à mettre à jour la liste des E/S de vos LED dans le tableau leds) :

int leds[]={7,8,9,10, -1};

void setup() {
  int i=0;
  while(leds[i]>=0) pinMode(leds[i++], OUTPUT);
}

void loop() {
  int i;
  i=0;
  while(leds[i]>=0) digitalWrite(leds[i++], LOW);
  delay(1000);
  i=0;
  while(leds[i]>=0) digitalWrite(leds[i++], HIGH);
  delay(1000);
}

Les composants électroniques

ATMega16u2

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) : [1].

AT45DB641E-SHN2B-T
MT29F128G8

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 [2] 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. Pour vous faciliter la vie il est cependant recommandé :

  • de prévoir un vrai connecteur ISP (connecteur 2x3 broches) pour la programmation initiale du micro-contrôleur ;
  • de prévoir un connecteur FTDI (comportant principalement la liaison série) pour la facilité de déverminage.

Cartes version beta

Schéma électronique
Carte électronique

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).

Schéma électronique
Carte électronique

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 :

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

Recto des deux cartes
Verso des deux cartes

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.

Ancienne clef, fils soudés au vol et programmateur SPI
Nouvelle clef, fils soudés sur le micro-ICSP et programmateur 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 [3].

 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

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

Mémoires MT29F128G8

L'accès à cette mémoire se fait par un bus de 8 bits. Le bus est utilisé à la fois pour envoyer des commandes et des données vers la mémoire mais aussi pour récupérer les données stockées en mémoire.

Les mémoires MT29F peut comporter plusieurs puces adressables séparémement, chaque puce pouvant comporter plusieurs unités logiques (LUN). La programmation commence par une réinitialisation des puces. Pour cela il suffit d'envoyer la commande 0xff à chaque puce et d'attendre que la ligne d'activité repasse au niveau "libre".

Ensuite pour tester la mémoire, il est possible de lui demander divers identifiants. Pour cela, il faut envoyer la commande 0x90 suivie des adresses 0x00, 0x20 ou 0x40 suivant l'identifiant souhaité. Les octets d'identification peuvent alors être récupérés, un par un, sur le bus 8 bits.

Le programme de récupération de l'identification est disponible Media:ClefUSBGoIDBasique.zip. Le test commence par 10 flashes rapides sur la LED de test. Les octets de l'identification sont ensuite "affichés" sur la LED de test. Cet affichage se fait bit par bit : un flashe pour un 0 et deux flashes pour un 1. Le programme se termine par 5 flashes rapides. Vérifiez avec la documentation de la mémoire que les octets donnés par le programme de test sont ceux attendus.


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.

Arduino Uno comme programmateur

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.

Arduino mini-pro comme programmateur

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 [4]. 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 at90usb162 erase
    • dfu-programmer at90usb162 flash MassStorage.hex
    • dfu-programmer at90usb162 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

Liste des élèves :

Nisrine AILANE OK
Maxime BARRET OK
Manel BENDAHI OK
Nicolas BERRIER OK
Theo BOSSELET OK
Corentin BRANLY OK
Martin CALCOEN OK
Fabio CAMACHO OK
Fabio DA-SILVA OK
Rémi DECALONNE OK
Juliette DELCROIX 
Augustin DJADJA-AVONYO OK
Alexandre FAVEEUW OK
Matthis FONTAINE OK
Valentin GIROT OK
Clément LEBRUN OK
Nathan LEMOINE OK
Alice MAILLET OK
Bilal MOUSSA OK
Gaspard TELLIER OK
Kévan TOURON OK
Dennis WASHINGTON-SARAZIN OK
Numéro Elèves Fonctionnalité supplémentaire Page
Binôme 1 Manel BENDAHI & Nisrine AILANE Clavier musical et espion Binôme 1 2022/2023
Binôme 2 Bilal MOUSSA & Kévan TOURON Binôme 2 2022/2023
Binôme 3 Theo BOSSELET & Alice MAILLET Binôme 3 2022/2023
Binôme 4 Dennis WASHINGTON SARAZIN & Valentin GIROT Binôme 4 2022/2023
Binôme 5 Martin CALCOEN & Fabio CAMACHO Clavier USB 20 touches avec écran led 10x10 qui affiche la touche appuyée Binôme 5 2022/2023
Binôme 6 Maxime BARRET & Nathan LEMOINE Clé USB Lampe torche Binôme 6 2022/2023
Binôme 7 Fabio DA SILVA & Corentin BRANLY clavier haut parleur et binaire Binôme 7 2022/2023
Binôme 8 Augustin DJADJA-AVONYO & Juliette DELCROIX RICARD clavier mécanique TKL ou 75%. Réaliser un PCB hotswap. Touche pour lancer une application et macro pour touches multimedias Binôme 8 2022/2023
Binôme 9 Matthis FONTAINE & Rémi DECALONNE Clavier qui calcule la vitesse de frappe et l'affiche via un vu-mètre Binôme 9 2022/2023
Binôme 10 Alexandre FAVEEUW & Gaspard TELLIER Binôme 10 2022/2023
Binôme 11 Nicolas BERRIER & Clément LEBRUN Clé USB avec led + web cam intégrée Binôme 11 2022/2023