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

De projets-se.plil.fr
Aller à la navigation Aller à la recherche
Ligne 98 : Ligne 98 :
| ECHO || Affiche les arguments de la commande
| ECHO || Affiche les arguments de la commande
|}
|}
=== Commandes liées aux processus ===


=== Commandes liées au système de fichiers ===
=== Commandes liées au système de fichiers ===


=== Commandes liées aux processus ===
Commandes pour gérer le système de fichiers :
 
{| class="wikitable"
! Commande !! Description
|-
| LS || Affiche les fichiers du répertoire principal
|-
| TYPE ||
|}
 
=== Commandes liées au réseau ===
 
{| class="wikitable"
! Commande !! Description
|-
| LOAD ||
|}


== Programmation des pilotes ==
== Programmation des pilotes ==

Version du 6 août 2023 à 17:15

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.

Tâches à réaliser

Pour que chaque binôme puisse avoir un minimum d'autonomie, chaque binôme commencera en utilisant un Arduino Uno adjoint de deux périphériques SPI.

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.

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
0x01 Clavier
0x02 Affichage
0x04 Réseau
0x08 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
ECHO Affiche les arguments de la commande

Commandes liées aux processus

Commandes liées au système de fichiers

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

Commande Description
LS Affiche les fichiers du répertoire principal
TYPE

Commandes liées au réseau

Commande Description
LOAD

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.

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 désiré et la vitesse 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 une ligne de sélection SPI et une ligne pour générer une interruption sur la carte mère.

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 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. 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 ;
  • si une interruption est reçue qui correspond à un périphérique clavier, le SE 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 (echo) ;
  • à terme les lignes reçues sont analysées pour en extraires des commandes et les exécuter.

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.