dimanche 25 juin 2017

02-Linux Device Drivers on Embedded System (crosstool chain)

Dans la première partie de cette série, on a installé crosstool-ng l'outil qui nous permettra "d'installer" la chaîne de compilation croisée.

Dans cette partie nous allons générer la chaîne de compilation croisée et la testée.



Génération de la chaîne de compilation croisée


Configuration de Crosstool-ng

Vous rappelez-vous la petite histoire de la première partie (communication entre un francophone et un anglophone) et le lien avec le processeur, il est question de générer les outils qui fonctionneront avec le processeur spécifié.

Le processeur de la carte SAMA5D3 Xplained  est est un ARM cortex A5. Il nous faut donc générer la chaîne de compilation pour un processeur ARM Cortex A5.

L'outil ct-ng est installé avec un certain nombre de fichier de configuration prêt à l'emploi. La liste peut être parcourue via la commande ci-dessous

elyham@elyham-GL553VD:~/Embedded/Linux/toolchain-src/crosstool-ng-1.23.0$ ct-ng list-samples

Commande pour afficher les exemples de configuration

En regardant cette image de plus prêt et en remontant la liste depuis le bas, on arrive a un exemple de configuration pour "arm cortex A5".

Arm Cortex A5

Si on se promène davantage dans cette liste on verra celui de Intel 32bits pour Ubuntu et ensuite celui de Intel 64bits.

 Intel 32bits pour Ubuntu

Intel 64 bits pour Ubuntu 

Configurons donc l'outil avec l'exemple qui nous intéresse.

elyham@elyham-GL553VD:~/Embedded/Linux/toolchain-src/crosstool-ng-1.23.0$ ct-ng arm-cortexa5-linux-uclibcgnueabihf

Commande Cortex A5, début

Commande Cortex A5, fin

Comme c'est conseillé, (voir WARNING) raffinons la configuration.

elyham@elyham-GL553VD:~/Embedded/Linux/toolchain-src/crosstool-ng-1.23.0$ ct-ng menuconfig

ct-ng menuconfig

L’exécution de la commande nous conduira à modifier certaines options
Paths and Misc options
Dans cette option il sera question de modifier le sous menu "Maximum log level to see". Par défaut il est à EXTRA. Étant donne que nous voulons avoir plus d'info de debug, sa valeur sera mise à DEBUG.

Ouverture de menuconfig (fichier .config)

 Ouverture du sous menu 'Path and Misc options'

 Sélection de 'Maximum log to see'

Entrée dans le sous menu 'maximum log to see'

avec les touches de direction, descendre à l'option qui nous intéresse et valider pour la modifier

Sous menu 'maximum log to see' mis à jour

 Vérification de la mise à jour du sous menu 'maximum log to see'

Sortie du menu Path and Misc options

Toolchain options
Dans cette option il sera question de spécifier l'alias pour le compilateur.
Il sera plus pratique d’utiliser arm-linux-gcc que d'utiliser arm-cortexa5-linux-uclibcgnueabihf-gcc qui est plus long à saisir et a plusieurs risques d’erreur. Par défaut cette option est vide.

Sélection du menu 'Toolchain options'

Selection de 'Tuple's alias'

Mise à jour de l'alias

Sortie du sous menu 'Tuple's alias'

C-library
Via cette option nous allons ajouter le support pour IPv6. Ceci est surtout requis par Buildroot. Par défaut cette option n'est pas sélectionnée.

Sélection du menu C-library

Sélection option à modifier

NB: pour la mise a jour, une fois que l'option est sélectionnée, appuyer sur la barre d'espace pour sélectionner ou alors désélectionner 

Option mise à jour

C compiler
Au cas où Buildroot ne supporterait pas encore gcc 6, il serait conseillé d’utiliser gcc 5.4.x. Par mesure de prudence et surtout pour des raisons de compatibilité ascendante, je choisirai gcc 5.4.

Sélection du menu C compiler

Sélection du sous-menu gcc version du menu C compiler

Sous-menu gcc version à modifier

Sous-menu gcc version mis à jour

Gcc version modifié et sortie

A ce niveau on peut sauvegarder la mise à jour du fichier .config et lancer ensuite la génération de notre toolchain

 Exit menuconfig

Sauvegarde des modifications

Retour à la console


Construction de la toolchain

Une fois la configuration terminée, voici la commande pour construire la chaîne de compilation. NB: En fonction de la puissance de votre station de travail cette étape peut varier de 30 mins à plus de 2h.

elyham@elyham-GL553VD:~/Embedded/Linux/toolchain-src/crosstool-ng-1.23.0$ ct-ng build

execution de la commande build

Fin d’exécution de la commande build

N'ayant pas eu d'erreur on en déduit probablement que tout s'est bien passé.
Avant d'aller plus loin il peut être adéquat de tester la chaîne que nous venons de construire.


Test de la toolchain

Le test de la toolchain se fera en 3 étapes.
Tout d’abord nous allons créer un fichier simple HelloWorld.c, ensuite nous allons le compiler avec la nouvelle chaîne et enfin nous allons vérifier l'exécutable obtenu.

Fichier HelloWorld.c
On va créer un répertoire Test à la racine de '~/Embedded/Linux'
Ce répertoire contiendra plus tard le fichier de test HelloWorld.c

elyham@elyham-GL553VD:~/Embedded/Linux/toolchain-src/crosstool-ng-1.23.0$ mkdir ../../Test

Création du répertoire Test

Vérifions que le répertoire est bien créé.

elyham@elyham-GL553VD:~/Embedded/Linux/toolchain-src/crosstool-ng-1.23.0$ ls ../../

 Vérification de la création de Test

 Créons à présent le fichier HelloWorld.c

elyham@elyham-GL553VD:~/Embedded/Linux/toolchain-src/crosstool-ng-1.23.0$ gedit ../../Test/HelloWorld.c &

 Création du fichier HelloWorld.c

Contenu du fichier HelloWorld.c

Sauvegardons puis  fermons le fichier et passons à la deuxième étape à savoir la compilation.

Compilation
Attention
Souvenez que nous voulons compiler ce fichier non pour l'executer sur notre pc mais sur la plateforme embarquée. pour cela nous utiliserons le compilateur arm-linux-gcc.
Actuellemet le répertoire généré par l'outil ct-ng lors du build n'est pas dans dans notre PATH.
Rajoutons ce répertoire a notre PATH et ensuite compilons notre fichier

elyham@elyham-GL553VD:~/Embedded/Linux/toolchain-src/crosstool-ng-1.23.0$ export PATH="${PATH}:/home/elyham/x-tools/arm-cortexa5-linux-uclibcgnueabihf/bin/"

Notons que le répertoire courant a changé.

elyham@elyham-GL553VD:~/Embedded/Linux/Test$ arm-linux-gcc HelloWorld.c -o hello

Compilation du fichier test

Test du résultat
En essayant d’exécuter ce fichier sur cette station Linux on a un échec ce qui est normal étant donne que ce n'est pas fait pour cette plateforme

elyham@elyham-GL553VD:~/Embedded/Linux/Test$ ./hello

La commande ci-dessous nous montre que notre fichier est bien compile pour une plateforme arm.

elyham@elyham-GL553VD:~/Embedded/Linux/Test$ file hello

file hello

Voici ce qui conclut cette deuxième partie. Dans la prochaine partie nous allons faire le tour des outils mis à notre disposition pour travailler sur notre plateforme.

La construction de la toolchain a généré une grande quantité de donnée. Il est conseillé de ne pas les supprimer pour gagner du temps au cas ou l'on voudrait régénérer cette toolchain suite a une mise a jour.





lundi 19 juin 2017

01-Linux Device Drivers on Embedded System (Intro + crosstool)

Voici plusieurs mois déjà que ma petite sœur Gracy m'a offert cette carte électronique, afin que je puisse apprendre à développer les drivers sous Linux, ce dont je rêve d’être capable depuis des années.
Merci pour le cadeau!
La première tentative de développement Linux embarqué s'est soldée par un échec.
Cette fois je m'y remets, et espère que ce sera la bonne.



Sama5D3 Xpld


Contenu de la boite

Les images ci-dessous nous montrent le contenu de la boite





Présentation de la carte

Sur cette page on a une brève présentation de la carte.
http://www.atmel.com/tools/ATSAMA5D3-XPLD.aspx

Parmi les points importants on peut retenir
  • SAMA5D36 Cortex-A5 Microprocessor
  • 256MBytes DDR2
  • 256MBytes NAND Flash
  • LCD connectors
  • Dual Ethernet (GMAC + EMAC) with PHY and connectors
  • Three USB connectors (2 Host + 1 Device)
  • 1x SD/eMMC and 1x MicroSD slots
  • Expansions headers, Arduino R3 Shield compatible
  • Power measurement straps

Le lien ci-dessus contient beaucoup d'informations utiles. Ceci vaut la peine d'y jeter un coup d'oeil. Parmi elles, on trouve, la datasheet, le user guide, le linux 4 sam, les logiciels, les revendeurs, les exemples et bien d'autres choses.


Environnement de travail.

Pour ceci j'utilise comme matériel :
un ordinateur portable ROG qui fonctionne sous Linux Ubuntu, la carte de développement Sama5D3 Xplained

Sur cet ordinateur à la racine de mon 'home' je vais créer l'organisation suivante
Embedded/Linux/toolchain-src


Les autres répertoires seront créer au fur et à mesure du process.

La chaîne de compilation

Cette étape est importante à cause de la différence entre les processeurs, car ce dernier est le 'cerveau' d'un ordinateur.

Par exemple : Un francophone qui veut communiquer avec un anglophone par courrier postal doit le faire en anglais, autrement l'anglophone ne comprendra pas le courrier. Ceci sous-entend aussi que le francophone a des outils pour écrire dans le langage que l'anglophone peut comprendre.

De même mon système d’exploitation Linux compilé pour Intel 64bits ne fonctionnera pas sur un ARM 32 ou 64 bits car les deux architectures sont différentes et leur jeu d’instructions aussi.

Pour corriger cela, il nous faut des outils sur notre ordinateur, qui vont nous permettre de générer un programme que notre système embarqué comprendra, saura interpréter. Dans notre cas c'est elle la chaîne de compilation croisée.

Sans elle il ne nous serait pas possible de générer du code qui serait compris par le système embarqué.

Il en existe des toutes prête pour notre ARM sur le serveur de linaro.
mais c'est aussi important de voir comment utile ça peut être, de créer sa propre chaîne.


Installation des outils.

Il s'agit ici de tous les logiciels qu'il nous faut en plus avant de continuer,  c'est-à-dire de télécharger la chaîne de compilation.

Une autre façon consiste à télécharger la chaîne de compilation, de lancer sa compilation et de résoudre au fur et à mesure les dépendances ou les erreurs de logiciels manquants en les téléchargeant et en les installant.

pour ma part je choisirai pour ce moment la première étape car en fonction des caractéristiques du PC, ceci peut prendre des heures pour la génération.

elyham@elyham-GL553VD:~/Embedded/Linux/toolchain-src$ sudo apt-get install automake

Installation de automake

Vérification de l'installation

Suivant le même modèle on installera les autres éléments.

elyham@elyham-GL553VD:~/Embedded/Linux/toolchain-src$ sudo apt-get install automake autoconf libtool libexpat1-dev libncurses5-dev bison flex patch curl cvs texinfo git bc build-essential subversion gawk python-dev gperf unzip pkg-config help2man wget

Installation des outils

La chaîne de compilation utilisera la librairie C "uClibc"


Téléchargement de Crosstool-ng

elyham@elyham-GL553VD:~/Embedded/Linux/toolchain-src$ wget http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.23.0.tar.bz2

Crosstol-ng 1.23.0

Download complete

Installation de Crosstool-ng

On peut vérifier le contenu du répertoire avec la commande 'ls'.

Vérification

Une fois l'archive téléchargée, on peut l'extraire avec la commande suivante

elyham@elyham-GL553VD:~/Embedded/Linux/toolchain-src$ tar xf crosstool-ng-1.23.0.tar.bz2

Décompression de l'archive

En se déplaçant dans le répertoire on peut vérifier son contenu.

Présentation de Crosstool-ng

Le répertoire 'docs' contient ce dont on a besoin pour comprendre comment configurer et installer l'outil Crosstool-ng.

elyham@elyham-GL553VD:~/Embedded/Linux/toolchain-src/crosstool-ng-1.23.0$ ls docs/manual/

elyham@elyham-GL553VD:~/Embedded/Linux/toolchain-src/crosstool-ng-1.23.0$ gedit docs/manual/2_Installation.md &

Crosstool docs

Plusieurs méthodes d'installation y sont indiquées.

Choix d'installation par défaut

Choix d'installation spécifique

Je choisi celle qui me permettra de spécifier le préfixe, choix d’installation spécifique. Pour ce faire voici le préfixe que je choisi :
/home/elyham/Embedded/Linux/Crosstool

Bien sur le répertoire Crosstool devrait exister au moment de l’exécution de la commande de génération de l'outil.

elyham@elyham-GL553VD:~/Embedded/Linux/toolchain-src/crosstool-ng-1.23.0$ ./configure --prefix=/home/elyham/Embedded/Linux/Crosstool

Début de l’exécution de la commande "configure"

Fin de l’exécution de la commande "configure"

Exécution a présent de la commande 'make' puis 'make install'

elyham@elyham-GL553VD:~/Embedded/Linux/toolchain-src/crosstool-ng-1.23.0$ make

 Début de l’exécution de la commande "make"

Fin de l’exécution de la commande "make"

elyham@elyham-GL553VD:~/Embedded/Linux/toolchain-src/crosstool-ng-1.23.0$ make install

Exécution de la commande "make install"

Il ne reste plus qu'à mettre à jour le PATH afin de pouvoir utiliser notre nouvel outil pour générer la chaîne de compilation croisée pour notre carte.

Il peut être prudent d’avoir une sauvegarde de la valeur actuelle de PATH.
Avec la commande suivante vous pouvez afficher PATH dans la console, ensuite copier et sauvegarder dans un fichier

elyham@elyham-GL553VD:~/Embedded/Linux/toolchain-src/crosstool-ng-1.23.0$ echo $PATH

A ce niveau, l’exécution de la commande "ct-ng help" ne fonctionnera pas, et retournera le message 'ct-ng: command not found'.

"echo" et "ct-ng" cmd

Ce qui est normal. Mettons à présent à jour la variable d’environnement PATH

elyham@elyham-GL553VD:~/Embedded/Linux/toolchain-src/crosstool-ng-1.23.0$ export PATH="${PATH}:/home/elyham/Embedded/Linux/Crosstool/bin"

Mise à jour de PATH

En exécutant de nouveau la commande 'echo $PATH', on remarque une différence dans le résultat.
Et comme on peut le voir sur limage ci-dessus l'execution de la commande "ct-ng help" retourne un resultat different du precedent.

Ceci conclut la première parti de cette série.
La partie 2 consistera a configurer ct-ng pour générer la chaîne de compilation croisée.

Toutes mes excuses pour les fautes car je n'utilise pas un clavier AZERTY pour le moment.
Merci pour votre compréhension.