mercredi 25 avril 2018

Chapitre 26: accès au Firmware du GPU du Raspberry


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 1 : d’après certaines documentations, la réponse à la requête peut durer un certain temps et donc à la place de tester le code retour à 0x80000000, il faut mettre une boucle d’attente qui se terminera quand le code retour est différent de zéro puis tester la valeur 0x8000000 pour savoir si la réponse est OK.

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