Salut à tous.
Je viens de terminer mon premier programme assembleur de type "Bare Metal".
J'ai fait mes tests sur la raspberry Pi Zero W.
En quoi consiste-t-il ? Rien de très extraordinaire, je fais clignoter deux leds :
--> celle que je dois installer sur une breadboard, reliée à la GPIO21 (Broche 40).
--> celle qui se nomme LED ACT, dont la couleur est verte, et qui indique l'activité de la raspberry. Elle se trouve sur la GPIO47.
Attention, ce programme ne fonctionne que sur la Raspberry Pi Zero W.
Quelques remarques avant de donner les sources :
1) voici ce dont j'ai besoin :
--> une nouvelle carte Micro SD genre celle de 4Go pour démarrer la RPi 2.
--> une raspberry Pi Zero W pour le test.
--> une breadboard.
--> des cavaliers mâle/femelle pour les jonctions.
--> une led rouge.
--> un transistor NPN.
--> une résistance de 1k ohms pour la led.
--> une résistance de 10k ohms pour le transistor.
--> prendre l'alimentation sur la Raspberry Pi Zero : GND (broche 6) et 3.3Vcc (broche 1).
--> branchement sur la GPIO 21 (broche 40).
Il n'est pas nécessaire d'utiliser un transistor.
2) dans le source assembleur, j'ai indiqué le type de processeur qui est utilisé :
--> Raspberry Pi Zero W : cortex-a7
--> Raspberry Pi 2B & 3B+ : cortex-a53
--> Raspberry Pi 4B : cortex-a72
Pour cela, il faut utiliser la pseudo instruction ".cpu" en début du programme.
3) Avant la partie "main", j'ai déclaré "bootstrap".
Cette partie sert à l'initialisation du processeur, ainsi que du programme avant son démarrage.
Dans cet exemple, j'initialise l'adresse de la pile (push & pop).
4) L'adresse de la base des GPIO est différente selon la version de la raspberry que vous utilisez.
--> RPi zero W : 0x20200000
--> RPi 2B & 3B+ : 0x3F200000
--> RPi 4B : 0xFE200000
C'est la même adresse pour les RPi 2B, 3A, 3B, 3A+ et 3B+.
5) il fait en premier sélectionner une GPIO.
Il y a cinquante-trois GPIO pour la Raspberry Pi Zero W.
Il faut trois bits pour sélectionner une GPIO.
Pour un registre de 32 bits, on ne peut gérer que 10 GPIO à la fois.
Soit au total six registres qui sont : GPSEL0, GPSEL1, GPSEL2, GPSEL3, GPSEL4 et GPSEL5.
Dans le bloc de trois bits, c'est le premier bit qui est positionné à 1 pour indiquer que la GPIO est en OUTPUT.
Voire la documentation sur le broadcom 2835.
6) Puis faire un ON ou un OFF de la GPIO.
Pour faire le ON, on sélectionne le registre GPSET et pour le OFF, on sélectionne le registre GPCLR.
Il faut seulement deux registres pour contenir nos cinquante-trois GPIO.
Le premier registre va gérer les 32 premiers GPIO, et le second, les 21 suivants.
Ils sont notés GPSET0 & GPSET1 pour le ON, et GPCLR0 & GPCLR1 pour le OFF.
7) à quoi correspond la LED ACT de couleur verte, selon le type de Raspberry utilisé ?
--> Pour la RPi A & B, c'est la GPIO16.
--> Pour la RPi A+ & B+, c'est la GPIO47.
--> Pour la RPi zero v1.3 & W, c'est aussi la GPIO47.
--> Pour la RPi 2B, c'est encore la GPIO47.
--> Pour la RPi 3B, ce n'est pas géré par les GPIO, mais par un extenseur du port I2C.
--> Pour la RPi 3A+ et 3B+, c'est la GPIO29.
Je n'ai testé que sur la Raspberry Pi zero W.
8) nous avons besoin d'un éditeur de liens pour créer le programme "Bare Metal".
Celui-ci va indiquer où mettre chaque section dans la mémoire.
Pour ce programme, j'utilise une section pour la pile (.stack) et une autre section pour le programme (.text).
En principe, j'ai aussi deux autres sections (.data & .bss) que je n'utilise pas ici.
9) j'ai aussi besoin du fichier makefile pour créer le fichier objet et l'exécutable.
Donc aupréalable, je dois installer l'outil pour faire l'assemblage en mode "Bare Metal" :
10) j'ai besoin de ces trois outils :
--> AS = @arm-none-eabi-as
--> LD = @arm-none-eabi-ld
--> CPY = @arm-none-eabi-objcopy
11) sur la carte micro SD, vous devez recopier aupréalable les fichiers suivants :
--> bootcode.bin
--> start.elf
--> fixup.dat
Pour la raspberry Pi 4B, vous devez mettre ceux-ci ;
--> bootcode.bin
--> start4.elf
--> fixup4.dat
Pour le fichier exécutable, il doit se nommer :
--> kernel.img
Pour la raspberry Pi 4B, en 32 bits, il doit se nommer :
--> kernel71.img
12) je me suis créé un script bash qui réaliser la création de la carte micro SD, celle que je vais introduire dans la raspberry pi zero W.
@+