Maintenant les étapes de la partie logicielle :
Installer
les logiciels pour compiler et linker les programmes assembleur ARM sur
l’ordinateur à partir du site (ou d’un autre du même type) : https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads
Les
programmes sont installés sur le disque C : répertoire Program Files(X86)
et donc j’ai préférer recopier les exécutables as, ld, make et objcopy dans un
répertoire outils du développement Raspberry.
Créer
un projet test avec comme source un programme assembleur d’un des chapitre
précèdent, créer un fichier makefile (à partir d’un exemple) pour générer un
exécutable sur l’ordinateur. Transférer cet exécutable sur le raspberry (et
bien sûr sous Linux comme vous avez l’habitude) dans un répertoire adhoc et
l’exécuter ( suivant l’outil de transfert, il sera peut être nécessaire de
modifier les droits par chmod). Si le résultat est correct, bravo votre chaine
de compilation sur l’ordinateur est correcte sinon il faut trouver l’erreur et
corriger !!! (pensez au nom du processeur !!! vérifier dans le plan
de chargement du linker que l’adresse de chargement est 0X10000 Etc etc.)
Tant que la liaison du câble n’est pas assurée (voir chapitre précédent) et que la
chaine de compilation ne fournit pas un exécutable correct, il est inutile
d’aller plus loin.
Sinon continuer (et toutes les étapes précédentes ne
seront plus à refaire):
Installer
dans un répertoire, les fichiers du répertoire début1 (ici) et les modifier
éventuellement avec vos propres données suivant le type de Raspberry. Mettre
les sources dans un répertoire src et créer un répertoire build.
Pour ce
premier projet nous trouvons un programme boot.s qui effectue l’initialisation
à zéro de la zone .bss et l’initialisation du pointeur de la pile. Eh oui sans
OS, c’est à nous à tout faire !!!! Ce programme appelle le programme
principal kernel_main (kernel.s) qui appelle l’initialisation de la mini uart,
l’envoi du message de bienvenue puis qui boucle indéfiniment sur la réception
d’un caractère et l’envoi de celui çi par l’uart vers le microordinateur
connecté à l’autre bout du câble.
Les programmes util.s, utilgpio.s et mini_uart.s contiennent
les fonctions nécessaires à ce petit projet. Les nombreux commentaires (et ceux
du tutoriel indiqué dans le chapitre précèdent) permettent de comprendre les
instructions. Les fonctions du GPIO sont les mêmes que celles déjà vues dans un
chapitre précèdent.
Attention, suivant le modèle du Raspberry, il vous faudra
modifier les adresses de base de la mini uart et du gpio contenues dans le
fichier des constantes.
Installer
le fichier makeFile.txt et le modifier éventuellement avec les répertoires des
outils as, ld, copyobj et le répertoire des sources. (attention suivant le
modèle l’image binaire finale s’appelle kernel.img ou kernel7.img ou
kernel8.img). Modifier aussi les options de compil avec celles déterminées lors du premier test de la chaine de compilation
Lancer
le tout avec l’utilitaire make (dans le répertoire debut1, il y a un .bat qui
effectue ce lancement).
Corriger
les erreurs éventuelles, vérifier la présence du fichier kernel.img et examiner
le plan de chargement contenu dans map1.txt. C’est instructif.
Maintenant
il faut préparer la carte SD. Si elle n’est pas formatée, suivre les mêmes
instructions que pour la prise en compte de l’installation de base du Rapsberry.
Puis n’installer que les fichiers bootcode.bin, config.txt et start.elf nécessaires
au boot du GPU.
Le fichier config.txt ne contient que cela :
kernel_old=1disable_commandline_tags=1disable_overscan=1framebuffer_swap=0
L’instruction la plus importante est la première qui va
indiquer que l’image du kernel doit être chargé à partir de l’adresse 00000000.
Recopier le fichier kernel.img crée par le make sur la carte
SD. Enlever la carte et la mettre dans le Raspberry à la place de votre carte
habituelle, connecter le cable TTL USB entre le Gpio du Raspberry et
l’ordinateur, lancer putty avec la connexion série telle que définie précédemment,
allumer le Raspberry et ……..
Soit ça marche et vous avez le message de bienvenue qui
apparait sur l’écran de connexion Putty et vous pouvez taper des caractères sur
le clavier de l’ordinateur et qui vont s’afficher sur l’écran de connexion.
Bravo !!
Soit rien ne s’affiche et vous avez la led activité qui
clignote à un certain rythme : Par exemple 7 éclairs cela veut dire que le
GPU n’a pas trouvé le kernel.img (ou le kernel7 ou le kernel8). Donc vous
corrigez !!
Soit rien rien du tout et il faut recommencer toutes les
vérifications (en particulier les adresses de base du GPIO et la miniUART
(attention il y a 2 uarts sur le BCM2835)). Si vous avez modifié les sources
des programmes, il faut vérifier la bonne programmation car il n’y a aucune
possibilité de savoir ou le programme bugge !!. Ma solution pour la mise
au point a été de développer un programme de test sous Linux avec les outils
des chapitres précédents mais cela oblige de mapper les registres du GPIO et
ceux de la mini uart pour pouvoir y accéder (voir le chapitre sur l’accès au
timer ).
Et maintenant que faire ? D’abord pour arrêter notre programme, il faut
éteindre le raspberry car le processeur ne peut pas être arrêté !!!! il
boucle sans fin.
Puis modifier le programme kernel.s par exemple le libellé
du message, relancer la création de l’image par make, recopier kernel.img sur
la carte SD, remettre la carte dans le raspberry, le rallumer et voir si la
modification est OK.
Ce sera la seule procédure à appliquer par la suite pour
toute évolution future (avec bien sûr brancher le câble TTL USB et lancer Putty
connexion série).
Puis il faut continuer en adaptant les procédures
d’affichage d’un registre (et de tous les registres) vues dans les chapitres
précédents pour remplacer les call system par l’envoi de chaine par la mini
uart. Comme cela nous aurons une visibilité de ce qui se passe sur notre
raspberry sans Os.
Avec beaucoup d'attention et de vérification, tout cela fonctionne !!!!!
Aucun commentaire:
Enregistrer un commentaire