Publié le 21 juin 2020 - par

Exploration de l’EEPROM HAT du Raspberry Pi (Partie 1/2)

Avec l’introduction de la carte HAT, la Fondation Raspberry Pi a normalisé l’utilisation d’une EEPROM présente sur la carte HAT, destinée à configurer automatiquement le système d’exploitation Raspberry Pi OS (ou Raspbian) pour qu’il prenne en compte le matériel présent sur la carte HAT présente sur le connecteur GPIO. Une sorte de Plug-and-Play

Explorer l’EEPROM d’une carte HAT sur Raspberry Pi

EEPROM HAT
Claude a déjà présenté plusieurs articles sur le blog, le plus récent concerne l’installation de Lazarus sur le Raspberry Pi 4. A la fin de cet article, il évoquait son projet d’écran pour ULM en OpenGL. Les composants seront embarqués sur une carte HAT dont l’EEPROM assurera la configuration du système pour une utilisation automatique.

L’EEPROM de la carte HAT

Si vous avez déjà bricolé avec des cartes prototypes HAT vous avez sans doute remarqué la présence d’une petite mémoire visible en bas à droite sur la photo ci-dessous :

C’est une EEPROM lue au boot et qui permet de configurer automatiquement votre RPi pour prendre en compte le matériel. Cette mémoire est loin d’être pleine et c’est l’endroit idéal pour stocker les paramètres de calibrage des capteurs de mon projet OpenAvionics Primary Flight Display. C’est aussi l’occasion de vous présenter la mise en œuvre de Lazarus.
Voir aussi l’article de Claude sur Lazarus.

Accéder à l’EEPROM

L’EEPROM est câblée sur le bus I2C0 en principe réservé au système. Il faut donc d’abord autoriser l’accès I2C via le volet « Interfaces » du programme « Configuration du Raspberry Pi » si ce n’est déjà fait. Il faut ensuite autoriser l’accès au bus I2C0 en éditant en sudo le fichier /boot/config.txt et d’ajouter la ligne  ci-dessous  dans le fichier :

dtparam=i2c0=on

Ce qui donne :

Rebooter et vérifier la détection de l’EEPROM en lançant la commande i2cdetect 0 qui doit indiquer la présence de la mémoire à l’adresse 0x50 :

Nota : il est possible d’empiler plusieurs cartes HAT avec des adresses d’EEPROM différentes mais les cartes proto que j’ai eu sous la main ont toutes l’adresse 0x50 non modifiable.

Lecture / écriture de l’EEPROM

Pour lire le contenu d’une case mémoire de l’EEPROM il faut envoyer son adresse (sur 2 octets) sur le bus, puis faire une lecture. On peut alors faire autant de lectures que souhaité pour lire les cases mémoires suivantes.

Pour écrire 1 case il faut écrire 3 octets : les 2 premiers pour l’adresse et le troisième pour la donnée. Il faut ensuite attendre 10 ms pendant lesquels la mémoire gère le cycle d’écriture et ce temps est indisponible. L’EEPROM est aussi programmable par pages de 16, 32 ou 64 octets selon le fabricant : on envoie la séquence complète 2 octets d’adresse (multiple de 16, 32, 64 respectivement) puis les octets de données de la page. On attend toujours 10ms pour passer à la page suivante.

Le programme qui programme

Pour avoir un outil facilement utilisable dans mes programmes rien de mieux qu’un objet
(= une classe pour les programmeurs C/C++) qui expose une API générique. Je l’ai appelé THat_eeprom_ctrl. Voyons la mise en œuvre avec Lazarus :

Initialisation

L’initialisation consiste à obtenir un handle (fonction fpopen) pour nos lectures/écriture sur le bus I2C0 à l’adresse 0x50 (Eeprom_addr) et de dimensionner un buffer pour stocker les données (SetLength(FeBuf, eSize[AType]);) en prenant en compte la taille de l’EEPROM qui peut être du type 24C16, 24C32, 24C64… La plus courante est la 24C32 soit 32kBit ou encore 4ko.

Lecture d’un octet

Il faut au préalable décoder l’adresse pour présenter les octets d’adresse dans l’ordre octet de poids fort et octet de poids faible. Il n’y a plus qu’à lancer un fpwrite de 2 octets suivi d’un fpread d’un octet.

Ecriture d’un octet

Formatage de l’adresse idem que pour l’écriture, ajout de la valeur à écrire et il ne reste plus qu’à lancer la séquence d’écriture des 3 octets :

 
RAZ de l’EEPROM

Je passe sur la lecture et l’écriture de blocs qui ne devraient plus vous poser de problème maintenant. Regardons juste la fonction Blank qui efface toutes les données (la valeur d’une EEPROM vierge est 0xFF). On créé un buffer qui comprend l’adresse en entête puis les données de la page initialisées à 0xFF. Puis on écrit les blocs avec un délai de 10 ms jusqu’à remplir la mémoire :

Sauvegarde / récupération

Lire et écrire notre EEPROM est la base. Sauvegarder le contenu et pouvoir le recharger c’est mieux. Pour cela nous allons utiliser le format Intel hex. Voici le programme d’écriture, le buffer est ici un TStringList dans lequel on va stocker les valeurs en texte dans le format sHex= ‘:10%s00%s’ où 10 est le nombre de données en hexadecimal, 00 indique qu’on a une ligne de données, entre les deux on intercale l’adresse de début de ligne et on termine par les données et le checksum. La fin du fichier est indiquée par une ligne au format sHexEOF. Notre buffer constitué il n’y a plus qu’à utiliser la méthode SaveToFile pour sauvegarder nos données :

Nota : EOL est la fin de ligne qui est un caractère CR sous Linux et CR+LF pour Windows.

Le programme qui affiche

Le point fort de Lazarus est de pouvoir créer rapidement une interface graphique à faire enrager les ayatollahs de la commande en ligne. Il suffit de créer un nouveau projet de type Application pour que Lazarus vous créé la fenêtre de lancement et son unité de code.

Initialisation

Affichage du contenu de l’EEPROM

Notre objet se charge de la lecture des données. Il n’y a plus qu’à mettre en forme : dans notre fiche (fenêtre) on met un composant Memo, nommé mDump, qui permet d’afficher les données converties en texte lisible. La lecture et l’affichage sont déclenchés par un élément d’un composant Menu (MenuItem) qui appelle la fonction de lecture, la fonction de formatage pour la présentation est séparée pour pouvoir être réutilisée :

et voici le résultat :

Suite au prochain épisode

Dans la seconde et dernière partie nous verrons comment interpréter le contenu de l’EEPROM et comment insérer vos données propres en respectant le standard HAT. Et si je suis de bonne humeur je vous livre le code complet et l’exécutable.

Références

HAT : Hardware Attached on Top

EEPROM : Electrically Erasable Programable Read Only Memory, ou mémoire programmable à lecture seule, effaçable et reprogrammable électriquement – passons sur l’incohérence due à des raisons historiques !

Introducing Raspberry Pi HATs

Sources

 

Share Button

4 réflexions au sujet de « Exploration de l’EEPROM HAT du Raspberry Pi (Partie 1/2) »

  1. Terence Hill

    « HAT : Hardware Attached on Top »
    Je n’avais jamais réalisé que hat était un acronyme… je me coucherai moins bête ce soir.

    Répondre
  2. Ping : Exploration de l’EEPROM HAT du Raspberry Pi (Partie 2/2) - Framboise 314, le Raspberry Pi à la sauce française....

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Complétez ce captcha SVP * Time limit is exhausted. Please reload CAPTCHA.

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.