Le kernel Linux sur une carte TS7800

Kernel 2.6.32.7

Contrairement aux cartes TS7200, les TS7800 sont livrés avec un kernel 2.6.21. Au lieu d’utiliser les cartes comme ca, j’ai décidé aussi qu’il serait mieux de pouvoir utiliser un kernel plus récent. Dans les derniers kernels, on a la chance d’avoir la carte TS7800 qui est prise en charge. On prendra la configuration dans arch/arm/configs/orion5x_defconfig.

On commence par récupérer le kernel dans The Linux Kernel Archives. J’ai récupéré la dernière version stable 2.6.32.7 puis on la décompresse

$> cd ~/Projets/MyBot/Logiciel
$> wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.7.tar.bz2
$> tar xzvf linux-2.6.32.7.tar.bz2
$> cd linux-2.6.32.7

Maintenant, on peut commencer la compilation proprement dit.

Si l’on veut effacer une configuration précédente et repartir d’une configuration intacte.

$> make ARCH=arm CROSS_COMPILE=/opt/x-toolx/arm-unknown-linux-gnueabi/bin/arm-unknown-linux-gnueabi- distclean

On applique la configuration correspondant à la carte orion5x_defconfig.

$> make ARCH=arm CROSS_COMPILE=/opt/x-toolx/arm-unknown-linux-gnueabi/bin/arm-unknown-linux-gnueabi- orion5x_defconfig

Ensuite, on peut modifier la configuration

$> make ARCH=arm CROSS_COMPILE=/opt/x-toolx/arm-unknown-linux-gnueabi/bin/arm-unknown-linux-gnueabi- menuconfig

Comme modifications, on peut :

  • Changer la ligne de commande, dans Boot Options/Default kernel command string
root=/dev/sda1 rw init=/sbin/init lpj=1662976 console=ttyS0,115200 rootdelay=5
  • OProfile system profiling : No

Ensuite, on lance la compilation

$> make ARCH=arm CROSS_COMPILE=/opt/x-toolx/arm-unknown-linux-gnueabi/bin/arm-unknown-linux-gnueabi-

Si on en reste la, lors de l’exécution de ce kernel on obtiendra le message d’erreur suivant :

>> TS-BOOTROM - built Dec  4 2008
>> Copyright (c) 2008, Technologic Systems
>> Booting from SD card...
 .
 .
 .
 .
 Uncompressing Linux........................................................................................................................................... done, booting the kernel.
Error: unrecognized/unsupported machine ID (r1 = 0x0000020e).
Available machine support:
ID (hex)        NAME
 00000674        Technologic Systems TS-78xx SBC
Please check your kernel config and/or bootloader.

 

Ce message indique que la machine n’est pas reconnue. Sur les architectures ARM, le bootloader qui charge puis exécute le kernel lui fournit certaines informations. Les registres R1 et R2 contiennent respectivement l’ID de l’architecture et le pointeur sur les structures atags.

Pour connaitre les identifiants connus, il existe le fichier {arch/arm/tools/mach-types}. La valeur qui nous intéresse est la suivante.

ts78xx                  MACH_TS78XX             TS78XX                  1652

Il faut maintenant initialiser le registre R1 juste avant la première instruction du kernel. Pour ca, j’utilise le programme devio. Donc si ce programme n’est pas disponible sur votre distribution, il faut le récupérer sur http://sourceforge.net/projects/devio/ puis on le compile

$> cd ~/Projets/
$> tar xzvf ~/Download/devio-1.2.tar.gz
$> cd devio-1.2
$> ./configure
$> make

Il ne reste plus qu’a recopie l’exécutable devio dans un répertoire accessible dans le PATH. On utilise alors devio pour générer les quelques octets qui seront mis en début du fichier kernel. Pour rappel, l’ID pour la TS7800 est 1652 0x674

$> cd ~/Projets/MyBot/Logiciel/linux-2.6.32.7
$> cd arch/arm/boot
$> devio > foo 'wl 0xe3a01c06,4' 'wl 0xe3811074,4'
$> cat foo zImage > zImage.fix

On pourra ensuite utiliser le fichier zImage.fix comme image à utiliser.

Puis l’on recopie les modules dans l’arboresence correspondante de notre « File System ».

$> sudo make ARCH=arm CROSS_COMPILE=/opt/x-toolx/arm-unknown-linux-gnueabi/bin/arm-unknown-linux-gnueabi- INSTALL_MOD_PATH=/media/disk modules_install

Une fois que l’on a un kernel, on peut le recopier dans le répertoire accessible par tftp.

$> cp arch/arm/boot/zImage.fix /tftpboot

Le File System sur une Compact Flash

La carte TS7200 est équipé d’un lecteur de Compact Flash. On en profitera pour mettre le File System dessus.

Il faut dans un premier temps, il faut créer une partition sur la carte CF. On connect la carte mémoire sur le PC.

Sur un PC linux, si la carte Flash est montée automatiquement, on la démonte.

$> umount /dev/sdc1

Puis on utilise l’outils fdisk.

$> fdisk /dev/sdc1

puis

  1. d (pour effacer les partitions existantes. A répéter pour toutes les partitions)
  2. n (Pour les nouvelles partitions)
  3. p (Pour les partitions primaires)
  4. 1 (Faire la partition primaire n°1)

Touche {{Enter}} pour le premier cylindre par défaut

Touche {{Enter}} pour le dernier cylindre par défaut

p (Afficher la table des partitions)

Si la première partition n’a pas d’étoile sur le champ Boot,

  1. Appuyer sur la touche ‘a’ puis ‘1’ pour mettre la première partition comme bootable.
  2. Pour valider ces changements, appuyer sur ‘w’ pour écrire la nouvelle table sur le disque.

Puis on crée le système de fichier, EXT2 dans notre cas, pour qu’il soit accessible par redboot.

$> mkfs.ext2 /dev/sdc1

Une fois la mémoire Compact Flash formatée, on compresse le file system.

$> cd ~/Projets/ts7200/rootfs-debian
 $> tar cjvf ../rootfs-debian.bz2 *

Puis on le décompresse dans la Compact Flash

$> mount /dev/sda1 /media/disk
 $> cd /media/disk
 $> tar -xjvf ~/Projets/ts7200/rootfs-debian.bz2

Pour vérifier l’intégrité de la Flash, on peut utiliser

$> fsck /dev/sdc1