Personnalisation de la carte TQ6410 (noyau Linux et système de fichiers racine emDebian Squeeze)

Après la découverte de cette carte, nous allons passer à l’étape de personnalisation. Nous souhaitons faire de cette carte une plateforme de développement générique pour développer des applications en C/C++ et QT. Dans un proche avenir cela peut être complètement autre chose (Python et GTK+ par exemple). Aussi pour avoir une base solide et facilement maintenable, nous allons installer la version embarqué de la distribution Debian : emDebian. Par la même occasion, nous allons recompiler le noyau pour l’adapter à nos besoins (pas de multimédia par exemple). Ces différentes étapes sont décrites dans la suite de l’article…

Lectures enrichissantes voire obligatoires !!

Non vous n’êtes pas seul, des dizaines de personnes sur Internet ont déjà rédigé des tutoriaux sur la mise en place d’un noyau personnalisé ou la réalisation d’un ‘rootfs’. Pour ma part je livre les liens qui m’ont réellement permis d’avancer sur cette carte :

  • Le forum du vendeur de la carte et en particulier les sections S3C6410, S3C2440 et Linux,
  • Les forums du site FriendlyARM,
  • Le blog de Bill (Bill’s Blog) : très bon ‘HowTo’ et un excellent forum. Bill se définit lui même comme un ‘installeur’ et pas comme un ‘programmeur’,
  • Le site de la distribution Emdebian : Debian facilite énormément la création d’un ‘rootfs’ pour l’embarqué !,
  • Un bon tutoriel sur la mise en place d’emdebian sur une mini6410 ainsi que le site voisin pour une mini2440,
  • Le site BoundaryDevice qui m’a permis de régler une bonne fois pour toute mes problèmes de calibration du touchscreen sous Xorg !
  • Et enfin je réserve la place d’honneur pour l’article en FRANÇAIS qui m’a donné envie de travailler avec cette carte : l’article de Denis Bodor dans le magazine OpenSilicium N°1 : Plateforme FriendlyARM Mini2440

Les étapes de la personnalisation de la carte TQ6410

  1. Installation d’une chaine de cross-compilation sur une station de développement fonctionnant de préférence sous GNU/Linux Debian Squeeze,
  2. Compilation et installation d’un ‘bootloader’ : dans notre cas U-Boot,
  3. Compilation et installation d’un noyau linux personnalisé,
  4. Génération, installation et configuration d’un système de fichiers racine (rootfs en anglais). Dans notre cas, ce rootfs sera basé sur emdebian squeeze Grip,
  5. Développement d’applications sur la plateforme…

1. Installation d’une chaine de cross-compilation

Avant de poursuivre, on considère que votre machine de développement est fonctionnelle et que vous avez un minimum de connaissance d’un système GNU/Linux. La distribution choisie est, comme indiqué ci-dessus, une debian 6.0 (Squeeze). La carte est équipée d’un SoC Samsung S3C6410. C’est donc un cœur ARM11 qui équipe cette puce. La chaine de compilation sera donc une chaine arm-linux-gnueabi. Pour installer cette chaine de cross compilation, il faut tout d’abord importer les clés des archives emdebian :

il faut ensuite rajouter le dépôt suivant et mettre à jour la base des paquets:

on installe alors les paquets suivants:

Après l’installation des différents paquets vous disposez alors d’une chaine de compilation croisée pour processeur ARM. Une petite vérification pour la route:

Cela semble correct ! La première étape est complétée… Nous allons pouvoir compiler pour notre carte TQ6410.

2. Compilation du chargeur U-Boot et installation sur la carte TQ6410

Pour mémoire la carte dispose de deux types de mémoire : Flash NOR et Flash NAND. Ces deux mémoires contiennent à l’achat le chargeur U-Boot. En particulier, si pour une raison ou une autre, le chargeur de la flash NAND est défectueux, vous pouvez le réinstaller en démarrant sur la flash NOR. Donc normalement vous ne pouvez pas bloquer la carte (la ‘bricker’). Dans tous les cas, on peut réinstaller le chargeur U-Boot avec un programmateur type OpenOCD par le port JTAG mais je ne dispose pas d’une sonde JTAG. Le boot de la carte sur la flash NOR ou NAND se fait par l’intermédiaire des mini-interrupteurs présents dans le coin inférieur gauche de la carte. On dispose de trois choix pour le boot:

La version de U-Boot livrée sur le DVD fourni avec la carte est nommé ‘u-boot-tq6410-20100829.tar.gz’ ce qui me parait un peu ancien. Je décide donc de me rendre sur le site de U-Boot et de télécharger une version plus récente. La gestion des sources se fait avec Git et de plus il y a un dépot pour les SoC de Samsung. On va donc rapatrier tout ça et en profiter pour jeter un coup d’oeil au ‘README’:

Dans ce README, vous aurez la liste de tous les paramètres de configuration ainsi que la méthode de compilation (entre autres). En fouillant dans la liste des cartes, je ne trouve qu’une carte SMDK6400, je vais donc compiler pour cette cible…

Je n’ai pas d’installer ni la commande ‘make’, ni les compilateurs gcc et g++, donc on installe le tout:

On configure la génération de code pour une carte smdk6400 et on lance la cross-compilation:

Au bout de quelques minutes, on obtient un fichier u-boot.bin. Je démarre ensuite la carte sur la flash NAND et je choisis l’option ‘Download u-boot.bin’ (lettre ‘v’) dans le menu de U-Boot. Par l’intermediaire du logiciel DNW sous Windows je télécharge le u-boot.bin fraichement compilé dans la NAND de la carte. Je redémarre la carte et… cela ne fonctionne pas !!

Ce n’est pas très étonnent en soi car on a compilé pour un s3c6400 et pas s3c6410. Pour revenir à une situation normale, il faut démarrer sur la flash NOR, choisir la lettre ‘v’ dans le menu de U-Boot puis transférer le fichier u-boot.bin du DVD fourni avec la carte grace au logiciel DNW. Ouf…Situation redevenu normale !

Je ne peux pas compiler directement un u-boot à partir du site, donc je me rabat sur l’archive fournie sur le DVD du nom de ‘u-boot-tq6410-20100829.tar.gz’ dans le répertoire ‘linux’. Je copie cette archive dans le répertoire u-boot-TQ6410 sur ma machine de travail puis je désarchive l’ensemble et enfin je rentre dans le répertoire ‘u-boot-tq6410:

Avant de me lancer dans la compilation de u-boot, je parcours les répertoires de cette archive…Ce qui est rassurant c’est de trouver un changelog de chez Samsung, dans le Makefile on trouve des entrées pour smdk2440, smdk6410, tq6410,etc…On nettoie l’ensemble puis on lance la compilation:

Au bout de quelques minutes, vous obtenez un nouveau fichier u-boot.bin qu’il faut transférer sur la carte avec l’utilitaire DNW. Au lancement de la carte, le menu est identique seul la date de compilation à changer (dans mon cas Aug 1 2011). Le menu de U-Boot est personnalisé, j’aimerai modifier ce menu, je cherche donc dans les codes sources. En fait il faut éditer le fichier ‘common/main.c’ et modifier la fonction ‘FriendlyARMMenu’. Je fais juste une modification cosmétique pour vérifier que l’on peut modifier ce menu. Je recompile le tout et j’obtient:

Cela semble correct, si vous devez modifier de manière plus conséquente le menu, vous pourrez donc le faire…

Conclusion: même si l’on a réussi à compiler et à installer un nouveau U-Boot sur la carte, je ne suis qu’à moitié satisfait. J’aurais voulu pouvoir compiler les nouvelles versions de U-Boot pour cette carte. De plus malgré ma demande sur le site de samsung pour obtenir un accès au code opensource de leurs SoCs, je n’ai pas eu de réponse de leur part. Donc je ne sais pas si Samsung maintient toujours un ‘U-Boot personnalisé’ pour leurs cartes SMDK. Je passe donc maintenant à la troisième étape : la compilation d’un noyau linux personnalisé.

3. Compilation d’un noyau linux personnalisé pour la carte TQ6410

Cette carte sera utilisée dans un milieu industriel, nous ne nous servirons donc pas de toutes ces capacités ‘multimédia’ et de supports externes (USB, carte SD,etc…). Par contre il faut impérativement garder les GPIOs, l’ethernet  et les ports séries.

Cette fois-ci je prends le noyau linux livré sur le DVD. Le fichier s’appelle « linux-2.6.28.6-20110319.tar.gz » dans le répertoire linux. Je créé un répertoire ‘Noyau_Linux’ puis je désarchive le noyau:

Dans le répertoire vous trouverez les configurations du vendeur de la carte (config_tq6410_xx avec xx fonction de la taille de l’écran tactile). Nous disposons de l’écran 7 pouces donc la configuration à prendre sera config_tq6410_a70 et nous allons la prendre comme configuration par défaut. Pour configurer votre noyau, nous allons utiliser l’interface texte (menuconfig), il faut donc installer les paquets suivants:

Choix dans la configuration du noyau:

  • Pas de « ramdisk » initial
  • Désactivation du chargements des modules : noyau monolitique
  • Dans « System type » prendre le SoC Samsung S3C64XX
  • Dans « Floating Point Emulation » je prends l’option VFP car le S3C6410 dispose d’une telle unité de calcul
  • Désactivation du convertisseur analogique numérique du SoC car erreur de compilation
  • Désactivation complète du support SCSI
  • Désactivation du « S3C Keybord » : les boutons poussoirs sur la carte
  • Désactivation du support SPI et I2C
  • Désactivation de la partie « Multimédia » : V4L
  • Dans la gestion du framebuffer du S3C6410, je met le nombre de framebuffer à 1
  • Pas de support pour les cartes sons, pas de support HID, pas de support de l’USB
  • Support du système de fichier ext3, yaffs2, ubifs (pas de support ext4, dos, vfat)
  • Pas de support de NFS car le système racine ne sera pas exporté par ce moyen, en conséquence je désactive aussi l’IP Kernel autoconfiguration’
  • Diverses optimisations pour réduire la taille du noyau…(allocation mémoire par SLUB)

Cette configuration minimum est disponible au téléchargement en fin d’article sous le nom ‘config_TQ6410_OD_mini’.

U-Boot nécessite un noyau spécialement préparé pour lui, il faut donc installer la commande ‘mkimage’ puis lancez la compilation pour une image ‘uImage’:

Le noyau est disponible dans le répertoire arch/arm/boot/ sous le nom uImage. Il faut maintenant transférer ce noyau dans la flash NAND de la carte. Lancez minicom, arrêtez U-Boot puis choisissez l’option ‘Download Linux/Android Kernel’ (lettre ‘k’) puis transférer le noyau avec l’utilitaire DNW:

Il faut maintenant démarrer ce nouveau noyau même sans système de fichiers racine pour le tester. Pour cela on va modifier la ligne de paramètres que l’on passe au noyau avec l’option ‘Set the boot parameter of Linux’ (lettre ‘s’). Tapez alors la ligne suivante pour obtenir la sortie du noyau vers la voie série, préciser le futur ‘root-fs’ (ici sur une carte SD) et attendre que celui-ci soit prêt lors du montage de la carte (rootwait), l’exécutable à lancer aprés le noyau (ici /sbin/init).

Normalement tout doit bien se passer. La taille, après optimisation, de mon noyau est de 1,1Mo. Cette petite taille permet un chargement rapide depuis la flash, une décompression rapide et un boot du noyau jusqu’au passage à INIT en moins de 4s. Si j’ai le temps je ferais un article sur l’optimisation du boot. Ci-dessous les messages de boot du noyau:

Remarque: vous pouvez voir que le boot noyau prend environ 1s aprés décompression ! Ici le ‘rootfs’ existe c’est pour cette raison que l’on arrive à un ‘login’. Toutes les optimisations de temps de boot ne sont pas exploitées ici…

Puisque l’on parle de système de fichiers racine, voyons comment le réaliser…

4. Création du système de fichiers racine (ou ‘rootfs’) basé sur Debian Squeeze  Grip

On part d’une distribution Debian pour la stabilité et le système de gestion des paquets. Dans un premier temps, on ne va pas faire de l’embarqué pur, on va faire en sorte d’avoir une plateforme de test assez souple. Par la suite on pourra optimiser le ‘rootfs’ en travaillant avec BusyBox. Tout commence sur la machine de développement, on va construire le système de fichiers racine avec l’utilitaire ‘Debootstrap’. En résumé on va :

  • formater en ext3 une carte SD de 2Go
  • créer sur cette carte un système de fichier racine avec debootstrap
  • effectuer quelques modifications pour démarrer sur ce système
  • démarrer sur cette carte SD depuis la carte TQ6410 et terminer l’installation
  • faire les modifications finales sur le système

Les traces de ces étapes sont présentés ci-dessous (sdd est à remplacer avec le bon périphérique : affichez les messages du  noyau avec dmesg et lisez les dernières lignes après avoir inséré votre carte) :

Maintenant insérez la carte SD sur la TQ6410, démarrez puis arrêtez U-Boot. Changez les paramètres de chargement du noyau (lettre ‘s’) pour démarrer sur la carte SD avec un shell minimum pour terminer l’installation:

On passe à la deuxième phase d’installation du système de fichiers racine, cette fois ci directement sur la carte:

Explications des commandes qui précèdent : suite de l’installation des paquetages (second stage install) soyez patient…puis on rajoute à securetty (terminaux sur lesquels on peut se connecter)  le port série par lequel on va se logger. Ici vous n’avez plus ttySAC0 car udev est passé par là et à donc changer les noms des ports séries (regardez les messages du noyau). On rajoute aussi dans /etc/inittab une ligne qui permet de lancer automatiquement une console sur le port série dans les niveaux d’exécution 1,2 et 3. On configure le réseau en mode automatique (DHCP) en rajoutant les lignes dans le fichier /etc/network/interfaces. On fixe le mot de passe root et enfin on redémarre.

Encore une fois il faudra modifier la ligne de commande que U-Boot passe au noyau en:

Vous allez observer les messages du noyau, puis le lancement de INIT qui va amorcer le système jusqu’à l’obtention d’un login. Identifiez-vous ‘root’ avec le mot de passe que vous avez saisi précédemment. Si pendant le démarrage noyau le démon udevd se plaint que le répertoire .udev/ existe déjà dans le répertoire /dev, il faudra redémarrer avec init=/bin/sh puis supprimer ce répertoire.

Vous avez donc maintenant une plateforme debian qui fonctionne sur un système embarqué. Ce système de base utilise près de 80Mo (ce qui est déjà lourd) mais vous avez toutes les fonctionnalités d’une debian classique. Le système est donc facilement administrable par la suite, l’ajout/suppression de paquets se fera très simplement avec aptitude.

Pour mémoire, cette carte doit être utilisé dans le cadre du développement d’une application graphique pour superviser un process industriel. Dans un premier temps, on facilite donc la tache des programmeurs en ayant une plateforme ressemblant à une station de travail avec de l’espace disque (on travaille avec une carte SD de 2G0). Une fois l’application développée et testée, on optimisera le système (utilisation de busybox, binaire statique, rootfs réduit au minimum sur flash NAND).

Pour terminer cette partie, une trace complète du boot de la carte réalisé avec GrabSerial pour faire des tests de temps de démarrage:

On remarquera que le compteur de temps est remis à 0 lorsque la chaine « Starting Kernel » apparait. Le boot de noyau (décompression comprise) jusqu’au passage à INIT prend 2,1s. Le login apparait lui après 13s. Dans ce cas la configuration IP était fixé donc pas de requête DHCP.

5. Développement d’applications graphiques sur plateforme TQ6410

Comme je ne sais pas encore avec « quoi » on va programmer pour faire une application graphique, je reste une fois de plus générique : on va compléter l’installation précédente par l’installation de X.org et de l’écran tactile. Peut-être X ne sera pas utilisé et on travaillera directement avec le framebuffer sous Qt Embedded…

Il existe sous GNU/Linux deux manières de gérer les écrans tactiles evtouch et tslib. Comme je n’ai jamais pu faire fonctionner correctement evtouch, nous allons installer tslib. Il faut juste installer un paquetage, exporter une variable qui indique le périphérique qui pointe vers l’écran tactile (ici /dev/input/event0 car les boutons poussoirs de la carte sont désactivés) et enfin on lance l’utilitaire de calibration puis de tests:

On se lance alors dans l’installation de X.org par la commande suivante (attention pas du tout optimisé on installe en ‘gros’) puis on installe le gestionnaire de l’écran tactile pour X, on lance le client X à l’ancienne mode (fond d’écran ‘hachuré’) et un petit xeyes pour la route :

Si vous voulez directement lancer l’interface graphique, il faut installer le paquetage nodm :

Puis faire les modifications suivantes dans son fichier de configuration /etc/default/nodm:

Redémarrez et vous allez obtenir au bout de quelques secondes un écran ‘graphique’ avec un terminal qui prend tout l’écran. Donc ca fonctionne correctement mais c’est pas top…il faudrait installer un gestionnaire de fenêtre voire de bureau…

Alors je ne vous encourage pas à installer gnome ou kde mais plutôt matchbox…et exporter la variable DISPLAY=:0.0 !

2 réflexions au sujet de « Personnalisation de la carte TQ6410 (noyau Linux et système de fichiers racine emDebian Squeeze) »

  1. Ping : Electronique Innovante » Optimisation du temps de ‘Boot’ et choix du système de fichiers parmi ext3, jffs2, yaffs2 et ubifs pour le ‘rootfs’ de la carte TQ6410

  2. david

    bonjour,

    je possede un mini6410
    j’ai installé debian sqeeze via le tuto http://code.google.com/p/mini6410-debian/wiki/Tutorial
    n’ayant pas encore découvert ce tuto

    mon probleme est qu’il m’est impossible de faire fonctionner l’ ecran tactile 7″
    faisant #od /dev/touchscreen-1wire
    j’ai bien des donné qui me parvienne
    mais pas sur event0

    cela fait plusieur jour que j’essais mas la je bloque
    avez vous une idée

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *