« Pico SE4 2023/2024 » : différence entre les versions

De projets-se.plil.fr
Aller à la navigation Aller à la recherche
Ligne 136 : Ligne 136 :
{| class="wikitable"
{| class="wikitable"
! Commande !! Description
! Commande !! Description
|-
| FORMAT || Formate le système de fichiers
|-
|-
| LIST || Affiche les fichiers du répertoire principal
| LIST || Affiche les fichiers du répertoire principal

Version du 12 août 2023 à 16:10

Objectif

Pour l'année académique 2023/2024 nous vous demandons de construire un pico-ordinateur comprenant les éléments suivants :

  • un processeur de type microcontrôleur ;
  • un clavier ;
  • un dispositif d'affichage ;
  • un système d'exploitation stocké dans la mémoire flash du microcontrôleur ;
  • une mémoire de masse allant au delà de la mémoire flash sus-citée ;
  • un dispositif de communication avec l'extérieur.

Pour faire en sorte que tous les éléments puissent communiquer entre eux nous vous demandons d'utiliser le bus SPI.

Organisation du travail

Vous aurez, comme d'habitude, la lourde tâche de tester ce module de travaux pratiques.

Ce sera d'autant moins facile que nous vous demandons de vous coordonner pour réaliser le pico-ordinateur : un seul exemplaire fonctionnel est attendu par groupes de 4 binômes.

Vous allez donc devoir vous organiser pour que chaque binôme réalise une partie de l'ensemble. Cela dit des tâches identiques sont à réaliser par tous les binômes, ces tâches vos permettront de vous exercer mais aussi de tester vos réalisations spécifiques.

Matériel fourni

2023 Bouclier Pico.pdf

Pour que chaque binôme puisse avoir un minimum d'autonomie, un matériel de base est fourni :

  • un Arduino Uno pour prototyper le coeur d'une carte mère ;
  • un bouclier Arduino pour disposer d'une mémoire de masse (carte SD) et de connecteurs HE10 vers les cartes filles, voir le schéma et le PCB ci-contre ;
  • d'une matrice de LED et d'un afficheur 7-segments tous les deux gérables par SPI pour pouvoir écrire les briques de votre système d'exploitation.

Réalisations par binôme

Chaque binôme réalise :

  • un ordonnanceur, vous écrirez en particulier une tâche de lecture sur port série et deux tâches d'envoi d'information sur bus SPI. Le partage du bus SPI doit être supervisé par l'ordonnanceur ;
  • au choix, une carte fille FPGA programmée par VHDL et communicant via le bus SPI, le binôme réalise aussi la tâche d'ordonnancement utilisant la carte ;
  • au choix, une carte mère ou une carte fille, le binôme réalise aussi la tâche d'ordonnancement correspondante, le binôme peut réaliser plusieurs cartes pour maximiser sa note.

Réalisation par groupe de binômes

Par groupe de 4 binômes vous devez réaliser un pico-ordinateur complet :

  • une carte mère à base d'ATMega328p ;
  • une carte fille FPGA/VHDL fonctionnelle et supportée par votre carte mère ;
  • au moins 3 cartes filles fonctionnelles et supportées par votre carte mère (clavier, écran, réseau) ;
  • vous pouvez ajouter une cinquième carte fille optionnelle de type carte son.

Cahier des charges

Cartes filles FPGA

Les cartes filles FPGA doivent être programmées en VHDL. Tous les binômes doivent implanter en VHDL :

  • un contrôleur de bus série SPI ;
  • un décodeur des commandes reçues par SPI (commandes sur un octet avec éventuellement des paramètres à suivre) ;
  • un contrôleur d'écran VGA affichant le contenu graphique de la RAM de la carte FPGA.

A minima il faut une commande pour insérer un pixel d'une couleur donnée dans la RAM d'affichage.

Vous pouvez aussi ajouter des fonctionnalités supplémentaires à votre carte FPGA :

  • mémoire de masse par accès direct à une carte mémoire SD ;
  • carte réseau Ethernet en utilisant un module PHY Ethernet.

Pour les fonctionnalités supplémentaires vous devez prévoir des commandes supplémentaire au niveau du décodeur.

Cartes électroniques

Les connexions entre cartes mères et cartes filles doivent être réalisées via des connecteurs HE-10 à 8 connecteurs :

  • 2 broches pour l'alimentation ;
  • 3 broches pour les signaux SPI (MISO, MOSI, SCK) ;
  • 1 broche pour le CS (Chip Select) ;-
  • 1 broche pour une éventuelle ligne d'interruption ;
  • 1 broche pour une eventuelle réinitialisation de la carte (Reset).

Cartes mères :

  • une carte CPU ATMega328p avec une flash SPI NAND.

Cartes filles :

  • une carte fille SPI avec un ATMega328p et une matrice de touches (clavier) ;
  • une carte fille SPI avec un AT90USB647 pour connexion à un clavier USB ou une clef USB ;
  • une carte fille SPI avec un ATMega328p et un écran LCD 2 lignes HD44780 ;
  • une carte fille SPI avec un ATMega16u2 pour une connexion série USB ;
  • une carte fille SPI avec un ATMega328p et un DAC R-2R comme carte son ;
  • une carte fille SPI avec un ATMega16u2 pour une connexion réseau (EP bulk ou RNDIS) ;
  • une carte fille SPI avec un ATMega328p et un ENC28J60 pour une connexion Ethernet.

Toutes les cartes filles répondent à la commande SPI constituée du seul octet 0x00. La réponse tient sur un seul octet et détermine le type de la carte fille. Le chiffre de poid fort de la réponse est un code magique : 0xa. Le chiffre de poid faible est donné par le tableau ci-dessous :

Chiffre Type de carte
0x1 Clavier
0x2 Affichage
0x4 Réseau
0x8 Carte son

Des combinaisons sont possibles pour les cartes filles avec plusieurs fonctionnalités. Ainsi une carte connexion série peut émarger comme un clavier et un affichage.

Programmation système

Le système d'exploitation du pico-ordinateur doit avoir les fonctionnalités d'un DOS (Disk Operating System), à savoir :

  • lecture des commandes tapées par l'utilisateur ;
  • téléchargement d'exécutables ou de sources via le dispositif de communication extérieur  ;
  • sauvegarde et chargement d'exécutables ou de sources via la mémoire de masse ;
  • permettre l'affichage de chaînes de caractères ;
  • comprend un interpréteur micro-python pour faire tourner les sources ;
  • les différentes fonctionnalités sont réalisées sous forme de tâches gérées par un ordonnanceur.

Commandes de base

Ces commandes sont les commandes les plus simples à implanter :

Commande Description
VERSION Affiche la version du système d'exploitation
ECHO Affiche les arguments de la commande

Commandes liées aux processus

Commande Description
PS Liste les processus disponibles et leur état
START Démarre un processus dormant
STOP Met un processus en sommeil

Commandes liées au système de fichiers

Commandes pour gérer le système de fichiers :

Commande Description
FORMAT Formate le système de fichiers
LIST Affiche les fichiers du répertoire principal
CREATE Création d'un fichier avec l'entrée standard
TYPE Affiche le contenu d'un fichier
COPY Copie un fichier
RENAME Renomme un fichier

Commandes liées au réseau

Commande Description
REMOTE Liste les fichiers disponibles sur le réseau
GET Télécharge un fichier en provenance du réseau
PUT Sauve un fichier sur le réseau

Programmation des pilotes

La programmation c'est aussi l'écriture des sous-systèmes ou des pilotes liés à chaque cartes :

  • pour la carte mère, il faut écrire un sous-système de gestion de fichiers ;
  • pour la carte fille comportant une matrice de touches, il faut écrire le pilote identifiant les touches actionnées et gérant l'envoi de ces touches à la carte mère ;
  • pour la carte fille gérant un clavier USB, il faut utiliser un projet LUFA pour scanner régulièrement le clavier USB et envoyer d'éventuels événements à la carte mère ;
  • pour la carte fille gérant un écran LCD, il faut écrire le pilote capable de gérer l'écran et la partie récupérant les données de la carte mère ;
  • pour la carte fille gérant une clé USB, il faut utiliser un projet LUFA pour l'accès à la clé et écrire un sous-système de gestion de fichiers ;
  • la carte fille gérant une connexion série ne nécessite qu'un modeste pilote de communication avec la carte mère ;
  • pour la carte fille permettant une connexion avec le monde extérieur via de simples points d'accès USB de volume (EP Bulk), il faut écrire le pilote pour communication avec la carte mère mais aussi le programme sur le PC permettant la réception ou l'envoi de fichiers ;
  • pour la carte fille son, il faut écrire la partie permettant de récupérer les échantillons, les copier en mémoire, et les jouer à la vitesse d'échantillonnage préalablement transmise ;
  • pour la carte fille permettant une connexion Ethernet au dessus d'USB (RNDIS), il faut écrire une micro-pile réseau capable de récupérer et d'envoyer des fichiers au travers de paquets Ethernet mais aussi le programme sur le PC cible capable de comprendre ces paquets Ethernet ;
  • pour la carte fille incluant une puce Ethernet, il faut implanter la micro-pile réseau et le programme évoquée ci-dessus mais aussi le pilote capable de gérer la puce Ethernet.

Précisions sur les cartes électroniques

Précisions sur la carte mère

La carte mère doit comporter un microcontrôleur ATMega328p, une puce mémoire AT45DB641E et 5 connecteurs HE10 pour connecter une carte fille FPGA et 4 cartes filles à microcontrôleur. N'oublier de prévoir un connecteur AVR ISP pour programmer le microcontrôleur.

Du coté programmation vous êtes chargés d'écrire les fonctions d'accès à la mémoire, des primitives systèmes implantant un micro-système de fichiers et des primitives de communication via le bus SPI.

Les fonctions de base d'accès à la mémoire sont facilement trouvables, par exemple sur les sites du bureau d'études systèmes embarqués des PeiP.

Concernant le micro-système de fichiers, les fonctionnalités suivantes doivent être implantées :

  • le système de fichiers doit résider dans la mémoire de 8 Mo, les accès à la mémoire se font par blocs de 256 octets ;
  • l'accès au système de fichiers se fait par des primitives système ;
  • le micro-système de fichiers ne comporte qu'un répertoire : le répertoire principal, le répertoire principal peut comporter au maximum 64 fichiers, un fichier est caractérisé par un nom de 16 caractères au maximum, sa taille et ses blocs de données, un fichier est décrit par un maximum de 16 blocs de données ;
  • le superbloc du système de fichiers comprend, en plus de la description du répertoire racine, une carte bit à bit des blocs de données libres, cette carte nécessite 16 blocs ;
  • les différentes primitives à implanter sont :
    • append pour créer un fichier si non existant et ajouter des données en fin de fichier, les paramètres sont le nom du fichier, les données à ajouter et la taille des données,
    • read pour lire des données dans un fichier, les paramètres sont le nom du fichier, le tableau dans lequel stocker les données, la taille du tableau et le déplacement par rapport au début du fichier,
    • remove pour détruire un fichier, le seul paramètre est le nom du fichier,
    • rename pour renommer un fichier, les paramètres sont l'ancien et le nouveau noms du fichier,
    • copy pour copier un fichier, les paramètres sont le nom du fichier original et le nom de la copie.

Les primitives pour le bus SPI doivent être :

  • une fonction d'initialisation avec le mode SPI désiré et la vitesse d'horloge souhaitée ;
  • une primitive pour envoyer quelques octets via le bus SPI :
    • les paramètres de la primitive sont le tableau des octets à envoyer, le tableau des octets à recevoir, le nombre d'octets à envoyer et la spécification de la sortie CS de sélection du périphérique SPI,
    • la primitive stocke l'opération dans une file et effectue l'envoi dès que le bus est libre,
    • si la file est pleine la primitive peut retourner un code d'erreur sinon la primitive retourne l'identifiant unique de l'opération,
    • les octets de réponse du périphérique sont stockés dans le tableau des octets à recevoir, si le pointeur est nul les réponses ne sont pas stockées ;
  • une primitive pour attendre la fin d'un envoi SPI, il faut donner en unique paramètre l'identifiant de l'opération, l'attente s'effectue en mettant le processus appelant en mode sommeil et en le réveillant dès que l'opération est effectuée.

Précisions sur la carte fille clavier "matrice de touches"

La réalisation de la carte est simple, il s'agit de scanner une matrice de touches à l'aide d'un ATMega328p. N'oubliez pas le connecteur HE10 pour la connexion de cette carte fille à une carte mère. Sur le connecteur HE10 il faut prévoir à la fois la ligne de sélection SPI (utilisez la broche SS Ppar défault sur votre carte) et une ligne pour générer une interruption sur la carte mère. Enfin il vous faut prévoir un connecteur AVR ISP pour programmer le microcontrôleur.

Du coté programmation, c'est plus compliqué, vous êtes déjà chargés d'écrire la fonction de scan des touches :

  • le scan des touches consiste juste à passer les lignes de la matrice en sorties, les colonnes en entrées avec résistance de charge et de rentrer dans une boucle pour passer une sortie à GND tandis que les autres restent à VCC, il suffit alors de consulter les entrées pour voir si une touche est appuyée (ou plusieurs) ;
  • si une touche est appuyée la touche est stockée dans un tampon et la ligne d'interruption est activée ;
  • si une requête SPI de code commande 0x01 est reçue, le nombre de touches dans le tampon est envoyé suivi des touches elles-mêmes.

Ensuite, au niveau de la carte mère vous devez écrire la primitive gérant les claviers. Cette primitive prend en paramètre la ligne de sélection SPI du clavier ciblé et un tampon pour stocker les codes des touches. La taille du tampon est aussi passée en paramètre. La primitive prépare une transmission SPI constituée du seul octet de valeur 0x01 en prenant soin de préciser un tableau pour stocker d'éventuelles touches. Attention, la transmission SPI est constituée de l'octet 0x01 mais aussi d'autant d'octets de valeurs indéterminées qu'il est attendue d'octets dans la réponse SPI. La primitive se met alors en attente de la réponse.

Au niveau du système d'exploitation les comportements suivants sont à implanter :

  • à l'initialisation de la carte mère les périphériques SPI doivent être contactés pour déterminer lequels sont des claviers, des commandes SPI 0x00 sont donc envoyées avec attente des réponses SPI d'un octet aussi ;
  • le processus SHELL toujours présent dans le système d'exploitation doit avoir le comportement suivant :
    • si une interruption est reçue qui correspond à un périphérique clavier, le SHELL doit utiliser la primitive de lecture clavier pour obtenir la ou les touches appuyées ;
    • dans un premier temps, les caractères reçus sont affichés en utilisant la primitive d'affichage (echo) ;
    • à terme les lignes de caractères reçues sont analysées pour en extraire des commandes et les exécuter.

Précisions sur la carte fille écran LCD

Cette carte comporte un ATMega328p et un écran LCD à base de contrôleur HD44780. L'écran LCD nécessite un potentiomètre pour régler la luminosité des cristaux liquides. N'oubliez pas le connecteur HE10 pour la connexion de cette carte fille à une carte mère. Sur le connecteur HE10 il faut prévoir une ligne de sélection SPI. Aucune ligne d'interruption n'est nécessaire pour cette carte. Enfin il vous faut prévoir un connecteur AVR ISP pour programmer le microcontrôleur.

Le microcontrôleur de la carte fille doit être programmé pour gérer le contrôleur HD44780 ou compatible :

  • les écrans avec 1, 2, 3 ou 4 lignes doivent être gérés ;
  • les caractères ASCII doivent être affichés sur l'écran ;
  • les caractères spéciaux \n et \r doivent être pris en compte pour le saut de ligne et le retour chariot ;
  • les codes VT100 doivent être pris en compte, en particulier pour le déplacement du curseur doivent être pris en compte ;
  • le contrôleur HD44780 ou compatible doit être configuré en mode défilement automatique.

Les caractères à afficher ou spéciaux (y compris les séquences VT100) sont reçus par le bus SPI par la carte fille préfixés par le code commande 0x01.

Au niveau de la carte mère vous devez écrire la primitive système. Cette primitive prend en paramètre la ligne de sélection SPI de l'écran ciblé et la chaîne des caractères à envoyer. La primitive prépare une transmission SPI constituée de l'octet de commande 0x01 et des octets correspondant aux caractères. La primitive n'est pas obligée de se mettre en attente sur la réponse SPI.

Cette primitive est utilisée par le système d'exploitation pour réaliser l'écho des commandes dans le SHELL et aussi par toutes les commandes qui nécessitent un affichage. Tous les écrans doivent être sollicités lors des affichages, il faut donc que le système d'exploitation scanne les périphériques SPI pour trouvers les écrans comme il le fait pour les claviers.

Précisions sur la carte fille réseau RNIS

Le but de cette carte est de permettre au pico-ordinateur de converser avec l'extérieur. Une carte RNIS permet de faire transister des paquets Ethernet au dessus d'une liaison USB. La carte n'a besoin que d'un microcontrôleur avec capacités USB pour fonctionner. Vous pouvez utiliser un ATMega16u2, un ATMega32u4 ou un AT90USB suivant la taille mémoire dont vous souhaitez disposer. Gardez en mémoire qu'un paquet Ethernet peut comporter jusqu'à 1500 octets. La programmation du microcontrôleur se fera par DFU USB.

La base de la programmation de cette carte est la démonstration LUFA RNIS. Des versions de cette démonstration incluent une implantation de pile TCP/IP. A vous de voir à quel niveau vous souhaitez que votre carte réseau opère :

  • si vous visez Ethernet, votre projet LUFA sera assez simple à écrire mais l'application sur le PC sera un peu exotique, il vous faudra utiliser la programmation socket en mode RAW ;
  • si vous visez UDP, votre projet LUFA sera plus complexe mais l'application sur le PC pourra se faire avec des sockets en mode non connecté standard ;
  • si vous visez TCP, votre projet LUDA sera complexe et nécessitera un microcontrôleur avec pas mal de mémoire, par contre vous pourrez utiliser des applications standard sur le PC (serveur Web ou FTP).

Au niveau de la carte, en plus de votre pile réseau vous devez écrire les fonctions permettant de lister des fichiers distants, de les recevoir et d'en envoyer :

  • Si la commande SPI est 0x01, la carte mère vous demande de lister les fichiers distants, vous devez donc former les paquets réseau nécessaires pour envoyer la demande, la commande SPI peut comporter un argument supplémentaire pour préciser la localisation des fichiers. A la suite d'une commande 0x01, la carte mère doit envoyer des commandes 0x11 pour récupérer tous les noms de fichiers, idéalement un nom par commande 0x11 pour ne pas déborder la mémoire du microcontrôleur. Si le fichier n'est pas le dernier la réponse SPI est 0x01 sinon 0x00. Si vous utilisez Ethernet ou UDP, il faut prévoir un délai maximal pour la réception des paquets de sorte à ne pas bloquer la commande. En cas de non réception de paquet, il faut retourner un code SPI d'erreur, par exemple 0x02.
  • Si la commande SPI est 0x02, la carte mère souhaite récupérer un fichier. Vous devez former les paquets réseau nécessaires pour demander le fichier précisé dans la suite de la commande SPI. De la même façon que pour la liste, des commandes SPI ultérieures 0x12 doivent être envoyées pour récupérer le contenu du fichier, la carte mère précise dans la commande la taille de données qu'elle est prête à accepter par requête. Même principe pour les réponses SPI que pour les commandes 0x11. Si vous utilisez Ethernet ou UDP, il faut mettre en place le même dispositif de surveillance de perte de paquets que pour la liste.
  • Si la commande SPI est 0x03, la carte mère souhaite envoyer un fichier. Vous devez former les paquets réseau nécessaires pour préparer la réception du fichier précisé dans la suite de la commande SPI. De la même façon que pour la liste, des commandes SPI ultérieures 0x13 doivent être envoyées pour passer les fragements de fichier. Si vous utilisez Ethernet ou UDP, les paquets envoyés pour transmettre les fragments comportent un numéro de séquence. La carte mère termine par un fragment vide pour indiquer que le fichier est totalement transféré. Dans ce dernier cas un paquet particulier doit être envoyé pour indiquer la fin du fichier. Une réponse est requise pour ce paquet, cette réponse peut être un succès (tous les fragements ont été reçus) ou échec. Il convient de répercuter cette réponse en tant que réponse SPI : 0x00 pour succès ou 0x02 en cas d'erreur que ce soit une erreur remontée ou une absence de paquet réponse.

Au niveau de la carte mère vous devez écrire les primitives système permettant de préparer et de réaliser les listes, récupération et envois de fichiers. Ces primitives sont de simples encapsulation des commandes SPI décrites ci-dessus avec attente des réponses SPI pour les commandes de chiffre de poid fort 0x1.

Ces primitives sont utilisées par le système d'exploitation pour réaliser les commandes de sauvegarde et de chargement de fichiers. Il est supposé qu'il n'existe qu'une carte réseau par pico-ordinateur avec une ligne de sélection de périphérique SPI fixe.

Précisions sur la carte fille sonore

D'un point de vue électronique la carte n'est pas très compliquée, elle comporte un ATMega328p comme coeur et sa spécificité est un convertisseur numérique vers analogique dit R-2R utilisant un réseau de résistance pour implanter la conversion. Utilisez au moins un DAC sur 8 bits, vous devez pouvoir pousser jusqu'à 12 bits en utilisant pratiquement toutes les sorties disponibles. En sortie du DAC utilisez un montage Darligton pour commander le haut-parleur. N'oubliez pas le connecteur HE10 pour connecter votre carte à une carte mère. Utilisez la ligne de sélection SPI par défaut pour que la carte mère puisse commander votre carte et prévoyez une ligne d'interruption. Enfin il vous faut prévoir un connecteur AVR ISP pour programmer le microcontrôleur.

Le microcontrôleur de la carte fille doit être programmé pour pouvoir jouer des sons déjà enregistrés :

  • des variables globales doivent être configurées pour spécifier les caractéristiques des enregistrements à jouer :
    • précision d'échantillonnage (8 à 24 bits même si au-delà de 14 bits vous devez abandonner les bits de poids faibles),
    • vitesse d'acquisition (vous trouverez la vitesse maximale par essais et erreurs),
    • format des enregistrements (vous vous limiterez à un format PCM entier classique avec représentation petit-boutiste) ;
  • une fonction permettant d'envoyer les échantillons, à la bonne vitesse, sur le DAC.

Les échantillons sonores sont reçus par le bus SPI préfixés par le code commande 0x02. Les 2 valeurs de configuration, précision sur un octet et vitesse sur quatre octets sont envoyées préfixés par le code commande 0x01.

Au niveau de la carte mère vous devez écrire les primitives système :

  • la première primitive correspond au message SPI de code commande 0x01 et passe les paramètres de configuration à la carte fille ;
  • la seconde primitive correspond au message SPI de code commande 0x02 et passe les échantillons sonores à jouer à la carte fille, si la carte fille n'est pas prête (déjà en cours de traitement d'échantillons) les nouveaux échantillons sont perdus et la réponse SPI est le nombre d'échantillons restant à jouer sur un octet, si la carte est prête la réponse SPI est 0x00.

Ces primitives sont utilisées utilisée par le système d'exploitation pour implanter une nouvelle commande PLAY permettant de jouer un fichier WAV :

  • l'entête du fichier est récupéré avec la primitive read ;
  • l'entête WAV est analysée pour récupérer la fréquence et la précision d'échantillonnage, ces données sont passées à la carte son via la première primitive décrite ci-dessus ;
  • le nombre de canaux est récupéré dans l'entête, les echantillons du premier canal sont alors lus grâce à read et envoyés à la carte son en utilisant la seconde primitive ;
  • si les échantillons sont envoyés trop vite et donnent lieu à un code d'erreur de la seconde primitive, les mêmes echantillons sont à nouveau envoyés et ainsi de suite ;
  • éventuellement, si votre système d'exploitation dispose d'une primitive usleep vous pouvez mettre en place un algorithme d'attente adaptative après chaque appel à la primitive : commencez par une attente d'un temps dt faible, en cas de code d'erreur multipliez le temps par deux, sinon retirez dt du temps d'attente, divisez dt par deux, et reprenez l'algorithme.

Détails (brouillon)

  • Toutes les cartes doivent permettre un accès au port série de leur microcontrôleur pour un déverminage via un FTDI et ajouter des points de tests (bus SPI, alimentation, etc.).
  • Pour tester la partie mémoire de masse, des commandes doivent être prévue pour écrire directement dans un fichier de la mémoire de masse et pour afficher le contenu d'un fichier.
  • Tâche de gestion SPI spécifique, communication avec la tâche par pointeurs, file d'attente pour les demandes de communication, implanter un appel système.
  • Plutôt partir sur n groupes de 4 binômes, chaque binôme réalise une carte fille et en commun une carte mère pour obtenir au final un pico-ordinateur.