Archives par mot-clé : Embedded

La carte CPU – TS7800 – Présentation

C’est la carte principale de Mybot, elle contient les logiciels majeurs et contrôle l’ensemble des autres cartes.

La carte TS7800

La TS-7800 est une carte basée sur le processeur  ARM9 Marvell MV88F5182 500MHz. Voici quelques liens sur le Marvell utilisé par la carte TS-7800.

Et quelques liens sur la carte {{TS7800}} elle même.

Un bus PCI 32 permettant d’y connecté  un ensemble de périphériques tels qu’un port ethernet  10/100/1000 , un double SATA et un double port USB 2.0 host/slave.

Ses principales caractéristiques sont :

  • 500Mhz ARM9 CPU
  • Internal PCI bus, PC/104 connecteur
  • 128MB DDR-RAM <emb72|right>
  • 512MB NAND Flash (17MB/s)
  • 12,000 LUT programmable FPGA
  • 2 SD Card slots (1 micro-SD, 1 full-SD)
  • 2 SATA ports
  • 2 USB 2.0 480Mbit/s host/slave
  • Gigabit Ethernet, vitesse 10/100/1000
  • 5 canaux ADC 10-bit
  • 10 ports serie, 2 optionels RS-485
  • 110 GPIO (86 as a PC/104 bus)
  • Support de clacier matriciel et LCD texte
  • Sensor de température optionel, RTC and WiFi
  • Low-power (4W @ 5V)
  • Mode Sleep (uses 200 microamps)
  • Timer Watchdog
  • Fanless Operation from -20°C to +70°C
  • Boots Linux in 0.69s from Flash
  • Kernel 2.6 and Linux Debian

Les Jumpers de configuration

JP1 (boot select)

Il est lu au démarrage, quand le strap est présent, la carte essayera de démarrer sur la microSD puis sur la SD enfin sur la flash on-board. Quand le strap est absent, la carte démarre seulement sur la flash on-board.

La valeur du jumper peut être lue à l’adresse {{0xE8000004}}, Le bit 30 indique :

  • 1 pour JP1 ON (Présent)
  • 0 pour JP1 OFF (Absent)

JP2

Il est lu au démarrage, quand le strap est absent, le BootRom n’émettra pas de messages vers le port console COM1. Quand le strap est présent les messages sont émis. A noter que ceci est vrai jusqu’à ce que le kernel soit chargé et qu’il émette ou non les messages vers le port console. Pour cela, on peut utiliser le paramètre kernel CONFIG_CMDLINE qui contrôle le niveau de messages.

La valeur du jumper peut être lue à l’adresse 0xE8000004. Le bit 31 indique :

  • 1 pour JP2 ON (Présent)
  • 0 pour JP2 OFF (Absent)

JP3

Il est lu au démarrage, quand le strap est absent, la fréquence CPU est fixée à 500MHz. Quand le strap est présent, la fréquence CPU est fixée à 333MHz.

Les LEDs

La carte TS-7800 dispose de deux LEDs, une rouge (D2) et une verte (D1). Lors du démarrage de la carte, la LED verte clignote momentanément puis s’éteint. Elle peut ensuite être commandée par logiciel. Elle est accessible à l’adresse 0xE8000008 bit 31 (un ‘1‘ allume la LED).

La LED rouge peut être contrôlée par l’utilitaire ts7800ctl. Lancer ‘ts7800ctl – help‘ pour plus d’informations.

Le File System

File System Debian

Le plus simple pour commencer est de récupérer une arborescence de File System dans le répertoire Distributions dédié à la carte TS7800 de chez Technologic System. J’en ai essayé 2 , une Lenny et une sarge.

$> cd ~/Download <br>
$> wget ftp://ftp.embeddedarm.com/ts-arm-sbc/ts-7800-linux/distributions/debian-sarge-udev-512MB-apr282010.tar.gz <br>

Après, on le recopie sur le média que l’on veut. Ici, je mets le file system sur une clé USB.

$> cd /media/disk <br>
$> tar xzvf ~/Download/debian-sarge-udev-512MB-apr282010.tar.gz <br>
$> sync

Par la suite, lorsque l’on voudra exécuter les programmes développés pour MyBot, il suffira

  • soit branche la clé USB sur le PC de développement et on les recopie directement dans /bin.
  • soit on laisse la clé USB en place, sur la carte TS7800, et on se connecte par ssh et on les recopie aussi dans /bin.

Adaptation du File System pour MyBot

Les services inutiles

Si on regarde dans /etc/rc5.d, qui correspond au répertoire qui contient tous les scripts qui vont démarrer en runlevel 5, on voit qu’il y a des services qui ne vont pas me servir.

$> ls -l
 lrwxrwxrwx 1 root root   16 janv. 22 17:08 S01devfsd -> ../init.d/devfsd
 lrwxrwxrwx 1 root root   18 janv. 22 17:08 S10sysklogd -> ../init.d/sysklogd
 lrwxrwxrwx 1 root root   15 janv. 22 17:08 S11klogd -> ../init.d/klogd
 lrwxrwxrwx 1 root root   23 janv. 22 17:08 S17mysql-ndb-mgm -> ../init.d/mysql-ndb-mgm
 lrwxrwxrwx 1 root root   19 janv. 22 17:08 S18mysql-ndb -> ../init.d/mysql-ndb
 lrwxrwxrwx 1 root root   17 janv. 22 17:08 S18portmap -> ../init.d/portmap
 lrwxrwxrwx 1 root root   15 janv. 22 17:08 S20exim4 -> ../init.d/exim4
 lrwxrwxrwx 1 root root   15 janv. 22 17:08 S20inetd -> ../init.d/inetd
 lrwxrwxrwx 1 root root   17 janv. 22 17:08 S20makedev -> ../init.d/makedev
 lrwxrwxrwx 1 root root   15 janv. 22 17:08 S20mysql -> ../init.d/mysql
 lrwxrwxrwx 1 root root   17 janv. 22 17:08 S20ntpdate -> ../init.d/ntpdate
 lrwxrwxrwx 1 root root   13 janv. 22 17:08 S20ssh -> ../init.d/ssh
 -rwxr-xr-x 1 root root 1974 oct. 19  2007 S20wpasupplicant
 lrwxrwxrwx 1 root root   20 janv. 22 17:08 S21nfs-common -> ../init.d/nfs-common
 lrwxrwxrwx 1 root root   17 janv. 22 17:08 S50wu-ftpd -> ../init.d/wu-ftpd
 lrwxrwxrwx 1 root root   14 janv. 22 17:08 S89cron -> ../init.d/cron
 lrwxrwxrwx 1 root root   17 janv. 22 17:08 S91apache2 -> ../init.d/apache2
 lrwxrwxrwx 1 root root   20 janv. 22 17:08 S91apache-ssl -> ../init.d/apache-ssl
 lrwxrwxrwx 1 root root   19 janv. 22 17:08 S99rmnologin -> ../init.d/rmnologin
 lrwxrwxrwx 1 root root   23 janv. 22 17:08 S99stop-bootlogd -> ../init.d/stop-bootlogd

Pour l’instant, j’enlève :

$> rm S17mysql-ndb-mgm
$> rm S18mysql-ndb
$> rm S20mysql
$> rm S91apache2
$> rm S91apache-ssl

Le réseau

On peut configurer l’@ IP de l’interface ethernet eth0 dans /etc/network/interfaces. On ajoute les lignes suivantes.

iface eth0 inet static
address 192.168.2.2
network 192.168.2.0
netmask 255.255.255.0
broadcast 192.168.2.255
gateway 192.168.2.1

Dans /etc/hostname, on indique le nom de la machine que l’on veut. {Note}: il se retrouvera aussi dans le prompt du shell.

La liaison série

Une fois que le kernel a démarré, le programme init est exécuté. Il s’aide du fichier inittab qui décrit l’ensemble des processus qui doivent être lancés au démarrage du système (ou à l’arrêt)

Dans /etc/inittab, on choisit la configuration de la liaison série que l’on veut.

T0:23:respawn:/sbin/getty -L ttyAM0 115200 vt100

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

Générer un compilateur pour ARM

Pour développer des applications ou même pour générer un nouveau kernel pour ma carte CPU TS7200 ou TS7800, il me faut un compilateur. J’ai choisi pour le générer crosstool-ng.

crosstool-ng sert à construire des ToolChains. Les Toolchains (ou chaines de compilation) sont un élément essentiel dans un projet de développement logiciel. Elle servent à compiler, assembler et lier le code qui est en cours d’élaboration et qui sera exécuté par le processeur.

crosstool-ng

On télécharge crosstool-ng depuis : http://crosstool-ng.org/

J’ai choisi la dernière version lorsque au moment ou j’ai générer mon compilateur. C’était la version  http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.5.2.tar.bz2. La première chose à faire est d’extraire ce fichier dans un répertoire ou l’on veut générer l’outils.

$> cd ~/Projet
$> tar xjvz ~/Download/crosstool-ng-1.5.2.tar.bz2
$> cd crosstool-ng-1.5.2

Ensuite, on indique l’endroit ou l’on veut que crosstool-ng soit installé.

$> ./configure --prefix=/opt/crosstool-ng

Puis,

$> make
$> sudo make install

Enfin, on modifie le PATH pour avoir le répertoire « bin » dans la recherche des exécutables.
Le programme qui a été généré s’appelle {{ct-ng}}.

$> export PATH="${PATH}:/opt/crosstool-ng/bin"

Le compilateur arm-unknown-linux-gnueabi

J’utilise donc crosstool-ng pour générer un compilateur ARM pour ma cible TS7x00

Avec ct-ng, on a à disposition plusieurs exemples de configuration. On connait leur nom à l’aide de la commande

$> ct-ng help

On obtient une liste d’exemple:

  • alphaev56-unknown-linux-gnu
  • arm-cortex_a8-linux-gnueabi
  • arm-iphone-linux-gnueabi
  • arm-unknown-eabi
  • arm-unknown-elf
  • arm-unknown-linux-gnu
  • arm-unknown-linux-gnueabi
  • arm-unknown-linux-uclibc
  • arm-unknown-linux-uclibcgnueabi
  • armeb-unknown-eabi
  • armeb-unknown-linux-gnu
  • armeb-unknown-linux-gnueabi
  • armeb-unknown-linux-uclibc
  • armeb-unknown-linux-uclibcgnueabi
  • avr32-unknown-none
  • i586-geode-linux-uclibc
  • i686-nptl-linux-gnu
  • ia64-unknown-linux-gnu
  • mingw32,i686-none-linux-gnu
  • mips-ar2315-linux-gnu
  • mips-unknown-elf
  • mips-unknown-linux-uclibc
  • mipsel-unknown-linux-gnu
  • powerpc-405-linux-gnu
  • powerpc-860-linux-gnu
  • powerpc-e500v2-linux-gnuspe
  • powerpc-unknown-linux-gnu
  • powerpc-unknown-linux-uclibc
  • powerpc-unknown_nofpu-linux-gnu
  • powerpc64-unknown-linux-gnu
  • sh4-unknown-linux-gnu
  • x86_64-unknown-linux-gnu
  • x86_64-unknown-linux-uclibc

Je choisis arm-unknown-linux-gnueabi

$> ct-ng arm-unknown-linux-gnueabi

Puis je configure ct-ng

$> ct-ng menuconfig

Voici les modifications que j’ai fait dans la configuration standard.

  • Le répertoire ou je veux mettre le compilateur.
  • Le type d’architecture,
  • Le processeur
  • Non au debugger sur la cible
  • Pas de Fortran
  • Pas de Java
Paths and misc options  --->
 Prefix directory : {{/opt/x-toolx/${CT_TARGET} }}
 Target options  --->
 Architecture level : {{armv4t}}
 Emit assembly for CPU : {{arm920t}}
 Tune for CPU : {{arm920t}}
 C Compiler  --->
 [ ]  Fortran
 [ ] Java
 Debug facilities  --->
 [*] gdb  --->
 [ ]   Native gdb

Enfin, je lance la compilation du compilateur 😉

 $> ct-ng build

Et voila, on peut maintenant utiliser tous les outils se trouvant sous /opt/x-toolx/arm-unknown-linux-gnueabi/bin/ .On peut par exemple compiler le fichier lcdmesg.c comme ca :

/opt/x-toolx/arm-unknown-linux-gnueabi/bin/arm-unknown-linux-gnueabi-gcc lcdmesg.c -o lcdmesg