Lors du démarrage du raspberry, ce n’est pas un bios
habituel qui s’exécute mais un programme particulier exécuté par le GPU (c’est
le processeur graphique). Celui-ci prépare le raspberry puis lance l’Os désiré
stocké et qui peut être un Linux comme Raspbian ou un OS plus exotique ou
éventuellement le vôtre !!.
Ce programme appelé firmware continue à être présent et
dialogue avec le système d’exploitation au travers d’un mécanisme de mailboxes
(voir documentation sur le site : https://github.com/raspberrypi/firmware/wiki).
Nous allons voir que nous pouvons à partir d’un programme assembleur récupérer
des informations sur le raspberry. Il est bien sûr aussi possible d’afficher ces
infos dans une console Linux avec l’utilitaire et les options suivantes « vcgencmd
commands » : mais la récupération par le programme assembleur permet de
les utiliser comme nous le voulons. Source du programme
Comme les programmes auparavant sur le GPIO ou l’accès au
Timer, Linux limite les accès à la mémoire des périphériques et nous allons
donc devoir ouvrir le périphérique /dev/vcio et lancer des commandes avec la fonction
call système ioctl. Le plus difficile c’est de trouver les codes pour communiquer
avec le firmware et la description des réponses. Une partie se trouve dans la
documentation indiquée plus haut. Nous devons donc renseigner les données du message
à transmettre dans un buffer suivant la description de la structure msg mailbox.
Après l’ouverture du périphérique, nous cherchons la valeur
du code série du raspberry en passant à la fonction système IOCTL la zone message
contenant les informations pour la requête et dans laquelle nous récupérons les
infos retournées par le firmware. Cette zone doit contenir sur 4 octets sa
longueur, puis 4 octets à zero pour le code retour puis le code correspondant à
l’information recherché ici 0x10004 puis la longueur de la réponse.
En retour, nous trouverons un code retour égal à 0x80000000
si la requête s’est bien passée et la valeur du N) de série dans la zone
réponse. Il faut faire attention à l’endroit où commence la valeur. J’ai laissé
en commentaire l’appel à mon vidage des zones mémoire qui me permet de vérifier
le contenu.
Ensuite le programme effectue une deuxième requête pour chercher
la température du Raspberry , température qui sera retourné en degré * 1000.
Maintenant il faut creuser pour rechercher et utiliser les
autres données et fonctions disponibles.
Remarque 2 : la fonction système IOCTL utilise des codes particuliers (ici variable IOWR) pour accéder à chaque périphérique. J'ai trouvé cette fois ci le code pour accéder au vcio mais je n'ai pas trouvé les autres codes disponibles.
Aucun commentaire:
Enregistrer un commentaire