Librairie BCM2835

BCM2835 est le nom du processeur BROADCOM à base ARM utilisé initialement par les cartes Raspberry Pi. Selon la version de Raspberry Pi utilisée, ce ne sera pas ce composant qui est installé, mais un de ses descendants. A titre d'exemple, sur le Raspberry Pi 4 il s'agit du BCM2711. Il a plus d'unités de traiement, fonctionne à des vitesses d'horloge plus élevées, etc...


Vous trouverez les diverses versions de processeurs ARM utilisés par les Raspberry Pi selon leur évolution ici.


Tous ces processeurs exposent aussi les interfaces mettant à disposition les diverses ressources matérielles disponibles sur la prise 40 broches GPIO du Raspberry Pi. Ce sont eux qui exposent les bus SPI, I2C, série (UART), entrées et sorties numériques et PWM, etc... Et quelle que soit votre version du Raspberry Pi, toutes ces interfaces n'ont pas évoluées depuis le BCM2835 d'origine. Tout du moins en ce qui concerne, ce que le Raspberry Pi met à votre disposition. La seule rupture étant survenue est apparue lors du passage du Pi II au PI III. Le port GPIO est passé de 26 broches à 40 broches. Mais les 26 premières broches du connecteur 40 broches des PI III et IV sont strictement identiques aux 26 broches de leurs prédecesseurs.


Bref, quand on parle de BCM2835, et plus précisement de librairie BCM2835, on parle de choses qui concerne toutes les versions de Raspberry Pi depuis la version I. Seuls ne sont pas concernés les Raspberri Pi Zero et Raspberry Pi Pico qui utilisent des microcontroleurs différents. Ca c'est une autre histoire...


Une des choses qui a été reprochée aux développeurs du Raspberry Pi est de ne pas avoir mis à disposition une librairie permettant aux développeurs d'utiliser les ressources présentes sur le port GPIO 40 broches. On peut toujours se retourner vers la documentation technique du composant BCM2835, mais dans ce cas, mieux vaut être formé, et à ce type de lecture, et à ce type de développement. Fort heureusement, de bonnes âmes se sont chargées de développer ces librairies.


Il en existe une poignée disponible en téléchargement. Celle que je vous propose est bcm2835 développé par Mike Mc Cauley. J'ai essayé toutes ces librairies, et c'est cette librairie qui m'a parue offrir le meilleur rapport taux de couverture/simplicité. C'est aussi celle qui met le moins de couches logicielles (d'autres librairies) entre vos programmes et le matériel.


La documentation de cette librairie est ici.

Pour les débutants : C'est quoi une librairie ?

Une librairie est un code exécutable par un ordinateur qui expose des fonctions que les programmes accessibles à l'utilisateur peuvent utiliser pour mettre en service certaines de leur fonctionnalités. A titre d'exemple, dans la plupart des cas, un logiciel qui lit et joue des fichiers audio comme des MP3 utilisent une librairie qui peut exposer une fonction "Play". Un exemple classique, se produit lors d'opérations de copier/coller entre applications. Si vous êtes sous Windows, que vous copiez des données dans le presse papier par la commande "Copier", puis que vous les collez dans une autre application via la commande "Coller", ces deux applications utilisent une librairie nommée "ole32.dll". Elle même s'appuyant sur autre petite dizaine de librairies.


Dans des systèmes comme Linux ou Windows, il y a des centaines, des milliers de librairies. Allez donc jeter un coup d'oeil dans des répertoires comme "/usr/lib" sous Linux, ou "C:/windows/system32" sous Windows. Il y a des dizaines de librairies et de sous répertoires contenant des librairies.


Il existe des librairies privées et des librairies publiques. Vos programmes ne pourront, en temps normal, n'accéder qu'aux librairies publiques. Celles ci disposent d'une documentation et, pour les languages C/C++, de ce que l'on appelle un "header file", fichier d'entête avec l'extension ".h".


Il existe deux types de librairies :


 - Les librairies statiques : Leur code est directement copié dans celui de vos programmes. Pour les repérer : Sous windows ce sont des fichiers avec l'extension ".lib", sous Linux, ce sont fichiers avec l'extension ".a".
 - Les librairies partagées : La grande majorité. Ce qui est inséré dans vos programmes, ce sont de simples liens vers les fonctions de ces librairies que vous utilisez. Pour les repérer : Sous windows ce sont des fichiers avec l'extension ".dll", sous Linux, ce sont fichiers avec l'extension ".so".


Ces deux types de librairies présentent chacune des avantages et inconvénients. L'avantage des librairies statiques est que lorsque vous copiez votre programme d'un ordinateur à un autre (ou que vous le distribuez à d'autres utilisateurs), vous n'avez pas à vous soucier de copier avec la librairie statique car elle fait partie de votre programme. L'inconvénient étant qu'à chaque fois qu'un programme utilise cette librairie, son code est dupliquée sur vos disques durs. Dix programmes utilisant une librairie de 10 MO, ça mange tout de suite 100 MO sur vos disques. Bien sur, l'avantage et l'inconvénient des librairies partagées sont strictement inverses. Lorsque vous copierez votre programme sur un autre ordinateur, et que celui-ci utilise une ou plusieurs librairies partagées, il faudra penser à copier celles-ci en même temps. Et ça, c'est pas toujours simple. De nos jours, force est de constater que les librairies partagée sont de très loin les plus répandues. Et cela semble raisonnable.

La librairie

La librairie "bcm2835" est fournie sous forme de librairie statique. Cela semble du au fait qu'elle reste relativement petite en taille. Il y a peut-être d'autres raisons liée au matériel, mais si cela est vrai, je les ignore. En tous cas, cela simplifie la distribution de programmes l'utilisant.


Lorsque vous l'aurez installée, vous la trouverez ici :


  - Librairie : dans le répertoire "/usr/local/lib", fichier "libbcm2835.a",
  - Fichier d'entête : dans le répertoire "/usr/local/include", fichier "bcm2835.h",


C'est donc une librairie statique publique. Chouette !

Installation

Contrairement à tout ce que nous avons installé jusqu'ici, la librairie "bcm2835" ne s'installe pas comme un paquet Linux via une commande "sudo apt-get install etc...". Cette librairie est fournie sous forme de son code source, et vous devez vous même la compiler. Le fait qu'elle soit fournie avec son code source est une aubaine pour les curieux qui pourront aller le visiter et voir comment elle fonctionne en interne.


Elle est fournie en licence "Open Source Licensing GPL V3", donc son source est accessible. Si vous souhaitez distribuer des programmes utilisant cette librairie vous devrez vous conformer à ce type de licence. Sinon, vous devrez acheter une licence. Toutes les informations détaillées à ce sujet sont disponibles ici. Bon, en ce qui concerne la majorité d'entre nous avec leur Raspberry à la maison, tout cela n'a pas d'impact.


L'installation de cette librairie est typique de librairies fournies sous forme de code source. Cela reste simple, mais il peut toutefois survenir quelques erreurs de compilation. Si cela survient c'est que quelques paquets sont manquants sur votre Raspberry Pi. Pour ceux qui ont precedemmant installés Qt comme décrit à la page Qt et QtCreator, il ne devrai pas y avoir de pépins. Pour les autres, les paquets manquants peuvent être "libc6-dev, libgcc-s-dev et libstdc++-staticdev". Pour ceux la, assurez le coup en ouvrant un terminal et en exécutant :


sudo apt-get install libc6-dev libgcc-s-dev libstdc++-staticdev


Procédure

Pour les débutants, je tenterai d'expliquer chacune des commandes de la procédure. La première chose à faire est de télécharger le code source. Il est fourni sous la forme d'un fichier compressé de type ".tar.gz". La dernière version disponible à la date de rédaction de cette page est la version 1.71. Son nom est "bcm2835-1.71.tar.gz". Vous trouverez le nom de la dernière version et le lien de téléchargement ici.


Pour télécharger la version 1.71, sur votre Raspberry Pi, ouvrez l'explorateur internet et copiez dans la barre d'adresses internet le lien suivant :


  - http://www.airspayce.com/mikem/bcm2835/bcm2835-1.71.tar.gz


Si la dernière version n'est par la "1.71", remplacez dans la ligne précédente et tout ce qui suit le 71 par le bon numéro de version.


Le fichier est chargé dans votre répertoire "/home/pi/Téléchargements".Il est bon de créer un répertoire spécifique pour ce fichier afin de ne pas mélanger les choses en compilant la librairie dans le répertoire de téléchargements.. Exécuter les commandes suivantes dans un terminal. Ces commandes créent un répertoire "/home/pi/bcm2835", copient le fichier téléchargé dans ce répertoire, et enfin positionne le terminal dans ce répertoire :


mkdir bcm2835
cp /home/pi/Téléchargements/bcm2835-1.71.tar.gz /home/pi/bcm2835/bcm2835-1.71.tar.gz
cd bcm2835


Toujours dans le même terminal. La prochaine commande décompresse le fichier reçu :


tar zxvf bcm2835-1.71.tar.gz


Cette commande crée un sous répertoire nommée "bcm2835-1.71". On doit se positionner dans ce répertoire, donc exécutez la commande :


cd bcm2835-1.71


Nous pouvons maintenant générer notre librairie. La première étape consiste à créer un fichier "makefile" qui contient tous les ordres de compilation. Pour cela exécutez la commande suivante :


./configure


On peut désormais compiler notre fichier. Pour cela on utilise la commande "make" qui lit le fichier "makefile" créé précedemment et invoque le compilateur, l'éditeur de liens, etc... pour créer notre librairie exécutable :


make


On peut vérifier que tout s'est bien passé avec "sudo make check" (Notez la présence de "sudo") :


sudo make check


On peut maintenant installer le tout dans les répertoires cibles avec "sudo make install" (Notez la présence de "sudo") :


sudo make install


A ce stade les fichiers ".a et .h" ont été copiés au bon endroit tel qu'il est décrit plus haut dans cette page. La librairie est prête à être utlisée. Vous pouvez, si vous le souhaitez, effacer tous les fichiers et répertoires du répertoire "/home/pi/bcm2835". Vous n'en aurez plus besoin. Vous pouvez également supprimer le fichier "bcm2835-1.71.tar.gz" du répertoire "/home/pi/Téléchargements". Personellement, je le garde toujours... Au cas ou....


Vous aurez pu également constaté que le fichier "makefile" est utilisé par le programme "make" non seulement pour compiler, mais également pour installer.


La prochaine étape : PYTHON et CIRCUITPYTHON.

Vérification

Ce paragraphe est optionel. Je le recommande toutefois aux nouveaux venus à Qt et/ou bcm2835. Il leurs permettra de mettre le pied à l'étrier car j'en profiterai pour donner des détails sur l'architecture des programmes C++ sous Qt. En tous cas les trois grands concepts sous jacents de Qt : QMAKE, QWidget et le concept de signal/slot.


Ce programme de vérification est documentée à la page : Qt et bcm2835 : Vérification.


La prochaine étape : PYTHON et CIRCUITPYTHON.