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
- Installation d’une chaine de cross-compilation sur une station de développement fonctionnant de préférence sous GNU/Linux Debian Squeeze,
- Compilation et installation d’un ‘bootloader’ : dans notre cas U-Boot,
- Compilation et installation d’un noyau linux personnalisé,
- 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,
- 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 :
1 |
root@casimir:~# aptitude install emdebian-archive-keyring |
il faut ensuite rajouter le dépôt suivant et mettre à jour la base des paquets:
1 2 |
root@casimir:~# echo "deb http://www.emdebian.org/debian/ squeeze main" >> /etc/apt/sources.list root@casimir:~# aptitude update |
on installe alors les paquets suivants:
1 2 3 4 5 6 7 8 9 10 11 12 |
root@casimir:~# aptitude install linux-libc-dev-armel-cross libc6-armel-cross libc6-dev-armel-cross binutils-arm-linux-gnueabi gcc-4.4-arm-linux-gnueabi g++-4.4-arm-linux-gnueabi Les NOUVEAUX paquets suivants vont être installés : binutils{a} binutils-arm-linux-gnueabi cpp-4.4-arm-linux-gnueabi{a} g++-4.4-arm-linux-gnueabi gcc-4.4-arm-linux-gnueabi gcc-4.4-arm-linux-gnueabi-base{a} gcc-4.4-base-armel-cross{a} libc-bin-armel-cross{a} libc-dev-bin-armel-cross{a} libc6-armel-cross libc6-dev-armel-cross libgcc1-armel-cross{a} libgomp1-armel-cross{a} libstdc++6-4.4-dev-armel-cross{a} libstdc++6-armel-cross{a} linux-libc-dev-armel-cross 0 paquets mis à jour, 16 nouvellement installés, 0 à enlever et 2 non mis à jour. Il est nécessaire de télécharger 23,8 Mo d'archives. Après dépaquetage, 56,5 Mo seront utilisés. Voulez-vous continuer ? [Y/n/?] y |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
root@casimir:~# arm-linux-gnueabi- arm-linux-gnueabi-addr2line arm-linux-gnueabi-gcov-4.4 arm-linux-gnueabi-ar arm-linux-gnueabi-gprof arm-linux-gnueabi-as arm-linux-gnueabi-ld arm-linux-gnueabi-c++filt arm-linux-gnueabi-nm arm-linux-gnueabi-cpp arm-linux-gnueabi-objcopy arm-linux-gnueabi-cpp-4.4 arm-linux-gnueabi-objdump arm-linux-gnueabi-g++ arm-linux-gnueabi-ranlib arm-linux-gnueabi-g++-4.4 arm-linux-gnueabi-readelf arm-linux-gnueabi-gcc arm-linux-gnueabi-size arm-linux-gnueabi-gcc-4.4 arm-linux-gnueabi-strings arm-linux-gnueabi-gcov arm-linux-gnueabi-strip root@casimir:~# arm-linux-gnueabi-gcc -v Using built-in specs. Target: arm-linux-gnueabi Configured with: ../src/configure -v --with-pkgversion='Debian 4.4.5-8' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.4 --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/arm-linux-gnueabi/include/c++/4.4.5 --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --disable-sjlj-exceptions --enable-checking=release --program-prefix=arm-linux-gnueabi- --includedir=/usr/arm-linux-gnueabi/include --build=i486-linux-gnu --host=i486-linux-gnu --target=arm-linux-gnueabi --with-headers=/usr/arm-linux-gnueabi/include --with-libs=/usr/arm-linux-gnueabi/lib Thread model: posix gcc version 4.4.5 (Debian 4.4.5-8) |
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’:
1 2 3 4 5 6 7 8 9 10 11 12 |
root@casimir:~# aptitude install git root@casimir:~# mkdir u-boot-TQ6410 root@casimir:~# cd u-boot-TQ6410/ root@casimir:~/u-boot-TQ6410# git clone git://git.denx.de/u-boot-samsung.git Cloning into u-boot-samsung... remote: Counting objects: 146388, done. remote: Compressing objects: 100% (36699/36699), done. remote: Total 146388 (delta 118824), reused 135758 (delta 108242) Receiving objects: 100% (146388/146388), 38.18 MiB | 30 KiB/s, done. Resolving deltas: 100% (118824/118824), done. root@casimir:~/u-boot-TQ6410# cd u-boot-samsung/ root@casimir:~/u-boot-TQ6410/u-boot-samsung# more 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:
1 |
root@casimir:~/u-boot-TQ6410/u-boot-samsung# aptitude install make gcc g++ |
On configure la génération de code pour une carte smdk6400 et on lance la cross-compilation:
1 2 |
root@casimir:~/u-boot-TQ6410/u-boot-samsung# make smdk6400_config root@casimir:~/u-boot-TQ6410/u-boot-samsung# make CROSS_COMPILE=arm-linux-gnueabi- |
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:
1 2 3 |
root@casimir:~/u-boot-TQ6410# cp /multimedia/Electronique/TQ6410/DVD/linux/u-boot-tq6410-20100829.tar.gz . root@casimir:~/u-boot-TQ6410# tar xzvf u-boot-tq6410-20100829.tar.gz root@casimir:~/u-boot-TQ6410# cd 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:
1 2 3 |
root@casimir:~/u-boot-TQ6410# make CROSS_COMPILE=arm-linux-gnueabi- distclean root@casimir:~/u-boot-TQ6410# make CROSS_COMPILE=arm-linux-gnueabi- tq6410_config root@casimir:~/u-boot-TQ6410# make CROSS_COMPILE=arm-linux-gnueabi- |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
##### U-Boot 1.1.6 B01 for 6410, by esky-sh ##### ##### Modif. par O. DARTOIS pour BTS IRIS ##### [f] Format the nand flash [v] Download u-boot.bin [k] Download Linux/Android kernel [y] Download root yaffs2 image [a] Download Absolute User Application [n] Download Nboot.nb0 for WinCE [w] Download WinCE NK.nb0 [s] Set the boot parameter of Linux [b] Boot Linux [q] Quit to shell NAND Flash size: 256 MiB Enter your Selection: |
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:
1 2 3 4 5 |
root@casimir:~# mkdir Noyau_Linux root@casimir:~# cd Noyau_Linux root@casimir:~/Noyau_Linux# cp /multimedia/Electronique/TQ6410/DVD/linux/linux-2.6.28.6-20110319.tar.gz . root@casimir:~/Noyau_Linux# tar xzvf linux-2.6.28.6-20110319.tar.gz root@casimir:~/Noyau_Linux# cd linux-2.6.28.6 |
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:
1 2 3 4 |
root@casimir:~/Noyau_Linux/linux-2.6.28.6# aptitude install ncurses-bin root@casimir:~/Noyau_Linux/linux-2.6.28.6# make mrproper root@casimir:~/Noyau_Linux/linux-2.6.28.6# cp config_tq6410_a70 .config root@casimir:~/Noyau_Linux/linux-2.6.28.6# make arch=arm menuconfig |
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’:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
root@casimir:~/Noyau_Linux/linux-2.6.28.6# aptitude install uboot-mkimage root@casimir:~/Noyau_Linux/linux-2.6.28.6# make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm CFLAGS="-march=armv6" CXXFLAGS="-march=armv6" uImage ... Kernel: arch/arm/boot/Image is ready Kernel: arch/arm/boot/zImage is ready UIMAGE arch/arm/boot/uImage Image Name: Linux-2.6.28.6-IRIS-Turgot-O.Dar Created: Wed Aug 3 11:43:54 2011 Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 1478116 Bytes = 1443.47 kB = 1.41 MB Load Address: 0x50008000 Entry Point: 0x50008000 Image arch/arm/boot/uImage is ready |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Enter your Selection:k Downloading Linux/Android Kernel from USB... Insert a OTG cable into the connector! OTG cable Connected! Download address 0xc0000000 Download Done!! Download Address: 0xc0000000, Download Filesize:0x168e24 Checksum is being calculated.. Checksum O.K. Downloading Linux/Android Kernel successed Writing Linux/Android Kernel into NAND... Erasing at 0x560000 -- 100% complete. Writing data at 0x1ff800 -- 100% complete. Writing Linux/Android Kernel successed |
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).
1 |
console=ttySAC0,115200 root=/dev/mmcblk0p1 init=/sbin/init rootwait |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
Starting kernel ... Uncompressing Linux............................................................................. done, booting the kernel. Linux version 2.6.28.6-IRIS-Turgot-O.Dartois (root@casimir) (gcc version 4.4.5 (Debian 4.4.5-8) ) #10 PREEMPT Thu Aug 4 10:53:55 CEST 2011 CPU: ARMv6-compatible processor [410fb766] revision 6 (ARMv7), cr=00c5387f CPU: VIPT nonaliasing data cache, VIPT nonaliasing instruction cache Machine: SMDK6410 Memory policy: ECC disabled, Data cache writeback CPU S3C6410 (id 0x36410101) S3C24XX Clocks, (c) 2004 Simtec Electronics S3C64XX: PLL settings, A=532000000, M=532000000, E=24000000 S3C64XX: HCLKx2=266000000, HCLK=133000000, PCLK=66500000 div1: 00000555 mout_apll: source is fout_apll (1), rate is 532000000 mout_epll: source is fout_epll (1), rate is 24000000 mout_mpll: source is mpll (1), rate is 532000000 mmc_bus: source is dout_mpll (1), rate is 44333333 mmc_bus: source is dout_mpll (1), rate is 44333333 mmc_bus: source is dout_mpll (1), rate is 44333333 usb-host-bus: source is mout_epll (0), rate is 24000000 uclk1: source is dout_mpll (1), rate is 66500000 spi-bus: source is mout_epll (0), rate is 24000000 spi-bus: source is mout_epll (0), rate is 24000000 audio-bus0: source is mout_epll (0), rate is 24000000 audio-bus1: source is mout_epll (0), rate is 24000000 audio-bus2: source is mout_epll (0), rate is 24000000 irda-bus: source is mout_epll (0), rate is 24000000 Built 1 zonelists in Zone order, mobility grouping on. Total pages: 32512 Kernel command line: console=ttySAC0,115200 root=/dev/mmcblk0p1 rootwait int=/sbin/init printk.time=1 [ 0.000000] PID hash table entries: 512 (order: 9, 2048 bytes) [21474536.480000] Console: colour dummy device 80x30 [21474536.480000] s3c24xx_serial_init_ports: initialising ports=4... [21474536.480000] console [ttySAC0] enabled [21474536.485000] Dentry cache hash table entries: 16384 (order: 4, 65536 bytes) [21474536.495000] Inode-cache hash table entries: 8192 (order: 3, 32768 bytes) [21474536.510000] Memory: 128MB = 128MB total [21474536.510000] Memory: 127216KB available (2132K code, 286K data, 96K init) [21474536.515000] SLUB: Genslabs=12, HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1 [21474536.520000] Calibrating delay loop... 353.89 BogoMIPS (lpj=884736) [21474536.635000] Mount-cache hash table entries: 512 [21474536.635000] CPU: Testing write buffer coherency: ok [21474536.640000] net_namespace: 288 bytes [21474536.645000] NET: Registered protocol family 16 [21474536.670000] S3C6410: Initialising architecture [21474536.670000] S3C DMA-pl080 Controller Driver, (c) 2006-2007 Samsung Electronics [21474536.675000] Total 32 DMA channels will be initialized. [21474536.720000] NET: Registered protocol family 2 [21474536.765000] IP route cache hash table entries: 1024 (order: 0, 4096 bytes) [21474536.765000] TCP established hash table entries: 4096 (order: 3, 32768 bytes) [21474536.770000] TCP bind hash table entries: 4096 (order: 2, 16384 bytes) [21474536.775000] TCP: Hash tables configured (established 4096 bind 4096) [21474536.780000] TCP reno registered [21474536.800000] NET: Registered protocol family 1 [21474536.825000] yaffs Aug 4 2011 10:49:48 Installing. [21474536.830000] msgmni has been set to 248 [21474536.830000] io scheduler noop registered (default) [21474536.835000] S3C_LCD clock got enabled :: 133.000 Mhz [21474536.850000] LCD TYPE :: LTE480WV will be initialized [21474536.850000] Window[0] - FB1: map_video_memory: clear ff000000:000bb800 [21474536.855000] FB1: map_video_memory: dma=57100000 cpu=ff000000 size=000bb800 [21474536.860000] Window[0] - FB2: map_video_memory: clear ff05dc00:0005dc00 [21474536.865000] FB2: map_video_memory: dma=5715dc00 cpu=ff05dc00 size=0005dc00 [21474536.880000] Console: switching to colour frame buffer device 100x30 [21474536.890000] fb0: s3cfb frame buffer device [21474536.895000] backlight initialized [21474536.900000] backlight: 60 [21474536.940000] leds initialized [21474536.940000] buttons initialized [21474536.940000] pwm initialized [21474536.940000] s3c6400-uart.0: s3c2410_serial0 at MMIO 0x7f005000 (irq = 16) is a S3C6400/10 [21474536.945000] s3c6400-uart.1: s3c2410_serial1 at MMIO 0x7f005400 (irq = 20) is a S3C6400/10 [21474536.950000] s3c6400-uart.2: s3c2410_serial2 at MMIO 0x7f005800 (irq = 24) is a S3C6400/10 [21474536.955000] s3c6400-uart.3: s3c2410_serial3 at MMIO 0x7f005c00 (irq = 28) is a S3C6400/10 [21474536.960000] dm9000 Ethernet Driver [21474536.965000] dm9000: dm9000_probe, init GPIO/EINT. [21474536.970000] dm9000: dm9000_probe2 [21474536.975000] dm9000: dm9000_probe3 [21474536.980000] eth0: dm9000 at f7b00300,f7b00304 IRQ 108 MAC: 08:90:90:90:90:90 [21474536.985000] S3C NAND Driver, (c) 2008 Samsung Electronics [21474536.990000] S3C NAND Driver is using hardware ECC. [21474536.995000] NAND device: Manufacturer ID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-bit) [21474537.000000] Creating 3 MTD partitions on "NAND 256MiB 3,3V 8-bit": [21474537.005000] 0x00000000-0x00080000 : "Bootloader" [21474537.015000] 0x00080000-0x00580000 : "Kernel" [21474537.020000] 0x00580000-0x10000000 : "File System" [21474537.065000] mice: PS/2 mouse device common for all mice [21474537.065000] S3C Touchscreen driver, (c) 2008 Samsung Electronics [21474537.070000] S3C TouchScreen got loaded successfully : 12 bits [21474537.080000] input: S3C TouchScreen as /class/input/input0 [21474537.125000] S3C24XX RTC, (c) 2004,2006 Simtec Electronics [21474537.125000] s3c2410_rtc: tick irq 34, alarm irq 92 [21474537.130000] s3c2410-rtc s3c2410-rtc: rtc disabled, re-enabling [21474537.135000] s3c2410-rtc s3c2410-rtc: rtc core: registered s3c as rtc0 [21474537.140000] S3C2410 Watchdog Timer, (c) 2004 Simtec Electronics [21474537.145000] s3c2410-wdt s3c2410-wdt: watchdog inactive, reset disabled, irq enabled [21474537.150000] sdhci: Secure Digital Host Controller Interface driver [21474537.155000] sdhci: Copyright(c) Pierre Ossman [21474537.155000] s3c-sdhci s3c-sdhci.0: clock source 0: hsmmc (133000000 Hz) [21474537.160000] s3c-sdhci s3c-sdhci.0: clock source 1: hsmmc (133000000 Hz) [21474537.165000] s3c-sdhci s3c-sdhci.0: clock source 2: mmc_bus (44333333 Hz) [21474537.170000] [SDHCI]to add external irq as a card detect signal...... [21474537.175000] [SDHCI]if (pdata->cfg_ext_cd)...... [21474537.180000] mmc0: SDHCI controller on samsung-hsmmc [s3c-sdhci.0] using ADMA [21474537.185000] [SDHCI]request_irq...... [21474537.190000] sdhci: card inserted. [21474537.205000] TCP cubic registered [21474537.205000] NET: Registered protocol family 17 [21474537.205000] VFP support v0.3: implementor 41 architecture 1 part 20 variant b rev 5 [21474537.225000] s3c2410-rtc s3c2410-rtc: setting system clock to 2011-08-04 09:50:52 UTC (1312451452) [21474537.225000] Waiting for root device /dev/mmcblk0p1... [21474537.250000] mmc0: new high speed SD card at address 0007 [21474537.250000] mmcblk0: mmc0:0007 SD02G 1.83 GiB [21474537.255000] mmcblk0: p1 [21474537.340000] EXT3-fs warning: maximal mount count reached, running e2fsck is recommended [21474537.340000] kjournald starting. Commit interval 5 seconds [21474537.475000] EXT3 FS on mmcblk0p1, internal journal [21474537.475000] EXT3-fs: mounted filesystem with ordered data mode. [21474537.480000] VFS: Mounted root (ext3 filesystem). [21474537.485000] Freeing init memory: 96K INIT: version 2.88 booting Using makefile-style concurrent boot in runlevel S. Starting the hotplug events dispatcher: udevd. Synthesizing the initial hotplug events...done. Waiting for /dev to be fully populated...done. Activating swap...done. Cleaning up ifupdown.... Setting up networking.... Activating lvm and md swap...done. Checking file systems...fsck from util-linux-ng 2.17.2 done. Mounting local filesystems...done. Activating swapfile swap...done. Cleaning up temporary files.... Configuring network interfaces...[21474550.970000] eth0: link down done. Cleaning up temporary files.... Setting kernel variables ...done. INIT: Entering runlevel: 2 Using makefile-style concurrent boot in runlevel 2. Starting enhanced syslogd: rsyslogd. Starting periodic command scheduler: cron. Starting system message bus: dbus. Debian GNU/Linux 6.0 TQ6410-Iris s3c2410_serial0 TQ6410-Iris login: |
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) :
1 2 3 4 5 6 7 8 9 10 11 12 13 |
root@casimir:~# fdisk /dev/sdd ...création d'une partition primaire de type linux non bootable de la taille de la carte SD root@casimir:~# mkfs.ext3 -L rootfs -m 0 /dev/sdd1 root@casimir:~# tune2fs -c 200 -C 0 /dev/sdd1 root@casimir:~# tune2fs -l /dev/sdd1 root@casimir:~# mount /dev/sdd1 /mnt root@casimir:~# aptitude install debootstrap root@casimir:~# debootstrap --arch=armel --foreign squeeze /mnt http://www.emdebian.org/grip/ root@casimir:~# echo "deb http://www.emdebian.org/grip/ squeeze main" >> /mnt/etc/apt/sources.list root@casimir:~# echo "proc /proc proc none 0 0" >> /mnt/etc/fstab root@casimir:~# echo "TQ6410-Iris" > /mnt/etc/hostname root@casimir:~# mkdir -p /mnt/usr/share/man/man1/ root@casimir:~# umount /mnt |
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:
1 |
ttySAC0,115200 root=/dev/mmcblk0p1 rootwait init=/bin/sh |
On passe à la deuxième phase d’installation du système de fichiers racine, cette fois ci directement sur la carte:
1 2 3 4 5 6 7 |
# /debootstrap/debootstrap --second-stage [... ...] #echo s3c2410_serial0 >> /etc/securetty #printf "T0:123:respawn:/sbin/getty 115200 s3c2410_serial0\n" >> /etc/inittab #printf "auto eth0\niface eth0 inet dhcp\n" >> /etc/network/interfaces #passwd #reboot |
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:
1 |
console=ttySAC0,115200 root=/dev/mmcblk0p1 init=/sbin/init rootwait |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 |
Opening serial port /dev/ttyS0 115200:8N1:xonxoff=0:rtcdtc=0 Printing timing information for each line Matching pattern 'Starting kernel.*' to set base time Use Control-C to stop... [ 0.000004] [ 0.288957] [ 0.289171] U-Boot 1.1.6 (Aug 5 2011 - 11:50:17) for TQ6410 [ 0.293743] [ 0.293901] [ 0.294050] CPU: S3C6410@532MHz [ 0.296300] Fclk = 532MHz, Hclk = 133MHz, Pclk = 66MHz, Serial = CLKUART (SYNC Mode) [ 0.303853] Board: TQ6410 [ 0.305418] DRAM: 128 MB [ 0.306917] Flash: 0 kB [ 0.308178] NAND: 256 MB [ 0.403949] In: serial [ 0.405456] Out: serial [ 0.406855] Err: serial [ 0.483983] MAC: 08:90:90:90:90:90 [ 0.486081] Hit any key to stop autoboot: 3 2 1 0 [ 3.471948] [ 3.472140] NAND read: device 0 offset 0x80000, size 0x140000 [ 3.476632] [ 3.476805] Reading data from 0x80000 -- 0% complete.... [ 4.712153] 1310720 bytes read: OK [ 4.714419] ## Booting image at c0008000 ... [ 4.717525] Image Name: Linux-2.6.28.6-IRIS-Turgot-O.Dar [ 4.722157] Image Type: ARM Linux Kernel Image (uncompressed) [ 4.727189] Data Size: 1246092 Bytes = 1.2 MB [ 4.730954] Load Address: 50008000 [ 4.733404] Entry Point: 50008000 [ 5.039941] OK [ 5.040271] [ 5.040459] Starting kernel ... [ 0.001796] [ 0.007486] Uncompressing Linux................................................................................. done, booting the kernel. [ 0.567520] [ 0.000000] Linux version 2.6.28.6-IRIS-Turgot-O.Dartois (root@casimir) (gcc version 4.4.5 (Debian 4.4.5-8) ) #23 PREEMPT Sun Aug 7 13:22:45 CEST 2011 [ 0.581501] [ 0.000000] CPU: ARMv6-compatible processor [410fb766] revision 6 (ARMv7), cr=00c5387f [ 0.589758] [ 0.000000] CPU: VIPT nonaliasing data cache, VIPT nonaliasing instruction cache [ 0.597419] [ 0.000000] Machine: SMDK6410 [ 0.600475] [ 0.000000] Memory policy: ECC disabled, Data cache writeback [ 0.606403] [ 0.000000] CPU S3C6410 (id 0x36410101) [ 0.614901] [ 0.000000] S3C24XX Clocks, (c) 2004 Simtec Electronics [ 0.616787] [ 0.000000] S3C64XX: PLL settings, A=532000000, M=532000000, E=24000000 [ 0.621468] [ 0.000000] S3C64XX: HCLKx2=266000000, HCLK=133000000, PCLK=66500000 [ 0.627644] [ 0.000000] div1: 00000555 [ 0.628648] [ 0.000000] mout_apll: source is fout_apll (1), rate is 532000000 [ 0.635804] [ 0.000000] mout_epll: source is fout_epll (1), rate is 24000000 [ 0.640155] [ 0.000000] mout_mpll: source is mpll (1), rate is 532000000 [ 0.647749] [ 0.000000] mmc_bus: source is dout_mpll (1), rate is 44333333 [ 0.652045] [ 0.000000] mmc_bus: source is dout_mpll (1), rate is 44333333 [ 0.657073] [ 0.000000] mmc_bus: source is dout_mpll (1), rate is 44333333 [ 0.664213] [ 0.000000] usb-host-bus: source is mout_epll (0), rate is 24000000 [ 0.671772] [ 0.000000] uclk1: source is dout_mpll (1), rate is 66500000 [ 0.676240] [ 0.000000] spi-bus: source is mout_epll (0), rate is 24000000 [ 0.683605] [ 0.000000] spi-bus: source is mout_epll (0), rate is 24000000 [ 0.688184] [ 0.000000] audio-bus0: source is mout_epll (0), rate is 24000000 [ 0.695644] [ 0.000000] audio-bus1: source is mout_epll (0), rate is 24000000 [ 0.700284] [ 0.000000] audio-bus2: source is mout_epll (0), rate is 24000000 [ 0.707533] [ 0.000000] irda-bus: source is mout_epll (0), rate is 24000000 [ 0.712576] [ 0.000000] Built 1 zonelists in Zone order, mobility grouping on. Total pages: 32512 [ 0.720433] [ 0.000000] Kernel command line: console=ttySAC0,115200 root=/dev/mmcblk0p1 rootwait init=/sbin/init [ 0.731529] [ 0.000000] PID hash table entries: 512 (order: 9, 2048 bytes) [ 0.745040] [21474536.480000] Console: colour dummy device 80x30 [ 0.746652] [21474536.480000] s3c24xx_serial_init_ports: initialising ports=4... [ 0.752795] [21474536.480000] console [ttySAC0] enabled [ 0.754150] [21474536.485000] Dentry cache hash table entries: 16384 (order: 4, 65536 bytes) [ 0.760837] [21474536.490000] Inode-cache hash table entries: 8192 (order: 3, 32768 bytes) [ 0.771485] [21474536.505000] Memory: 128MB = 128MB total [ 0.775965] [21474536.505000] Memory: 127088KB available (2276K code, 286K data, 96K init) [ 0.780887] [21474536.510000] SLUB: Genslabs=12, HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1 [ 0.791570] [21474536.515000] Calibrating delay loop... 353.89 BogoMIPS (lpj=884736) [ 0.896457] [21474536.625000] Mount-cache hash table entries: 512 [ 0.900846] [21474536.625000] CPU: Testing write buffer coherency: ok [ 0.908049] [21474536.630000] net_namespace: 288 bytes [ 0.911823] [21474536.635000] NET: Registered protocol family 16 [ 0.916045] [21474536.645000] S3C6410: Initialising architecture [ 0.920419] [21474536.645000] S3C DMA-pl080 Controller Driver, (c) 2006-2007 Samsung Electronics [ 0.928430] [21474536.650000] Total 32 DMA channels will be initialized. [ 0.947479] [21474536.675000] NET: Registered protocol family 2 [ 0.991496] [21474536.720000] IP route cache hash table entries: 1024 (order: 0, 4096 bytes) [ 0.996502] [21474536.720000] TCP established hash table entries: 4096 (order: 3, 32768 bytes) [ 1.004716] [21474536.725000] TCP bind hash table entries: 4096 (order: 2, 16384 bytes) [ 1.013681] [21474536.730000] TCP: Hash tables configured (established 4096 bind 4096) [ 1.021195] [21474536.735000] TCP reno registered [ 1.031494] [21474536.755000] NET: Registered protocol family 1 [ 1.043492] [21474536.765000] JFFS2 version 2.2. (NAND) (SUMMARY) © 2001-2006 Red Hat, Inc. [ 1.049080] [21474536.770000] yaffs Aug 7 2011 00:09:52 Installing. [ 1.057092] [21474536.775000] msgmni has been set to 248 [ 1.058617] [21474536.775000] io scheduler noop registered (default) [ 1.063791] [21474536.780000] S3C_LCD clock got enabled :: 133.000 Mhz [ 1.068993] [21474536.795000] LCD TYPE :: LTE480WV will be initialized [ 1.075952] [21474536.795000] Window[0] - FB1: map_video_memory: clear ff000000:000bb800 [ 1.080818] [21474536.800000] FB1: map_video_memory: dma=57100000 cpu=ff000000 size=000bb800 [ 1.091572] [21474536.805000] Window[0] - FB2: map_video_memory: clear ff05dc00:0005dc00 [ 1.099483] [21474536.810000] FB2: map_video_memory: dma=5715dc00 cpu=ff05dc00 size=0005dc00 [ 1.123509] [21474536.825000] Console: switching to colour frame buffer device 100x30 [ 1.131343] [21474536.835000] fb0: s3cfb frame buffer device [ 1.137452] [21474536.840000] backlight initialized [ 1.143489] [21474536.845000] backlight: 60 [ 1.144485] [21474536.860000] leds initialized [ 1.148332] [21474536.860000] pwm initialized [ 1.151957] [21474536.860000] s3c6400-uart.0: s3c2410_serial0 at MMIO 0x7f005000 (irq = 16) is a S3C6400/10 [ 1.160224] [21474536.870000] s3c6400-uart.1: s3c2410_serial1 at MMIO 0x7f005400 (irq = 20) is a S3C6400/10 [ 1.168514] [21474536.875000] s3c6400-uart.2: s3c2410_serial2 at MMIO 0x7f005800 (irq = 24) is a S3C6400/10 [ 1.176715] [21474536.880000] s3c6400-uart.3: s3c2410_serial3 at MMIO 0x7f005c00 (irq = 28) is a S3C6400/10 [ 1.186421] [21474536.885000] dm9000 Ethernet Driver [ 1.190548] [21474536.885000] dm9000: dm9000_probe, init GPIO/EINT. [ 1.197018] [21474536.890000] dm9000: dm9000_probe2 [ 1.201072] [21474536.895000] dm9000: dm9000_probe3 [ 1.202422] [21474536.900000] eth0: dm9000 at f7b00300,f7b00304 IRQ 108 MAC: 08:90:90:90:90:90 [ 1.208523] [21474536.905000] S3C NAND Driver, (c) 2008 Samsung Electronics [ 1.215927] [21474536.915000] S3C NAND Driver is using hardware ECC. [ 1.220201] [21474536.915000] NAND device: Manufacturer ID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-bit) [ 1.230312] [21474536.920000] Creating 3 MTD partitions on "NAND 256MiB 3,3V 8-bit": [ 1.236422] [21474536.925000] 0x00000000-0x00080000 : "Bootloader" [ 1.241708] [21474536.930000] 0x00080000-0x00580000 : "Kernel" [ 1.247327] [21474536.935000] 0x00580000-0x10000000 : "File System" [ 1.287488] [21474536.980000] S3C Touchscreen driver, (c) 2008 Samsung Electronics [ 1.293536] [21474536.980000] S3C TouchScreen got loaded successfully : 12 bits [ 1.299182] [21474536.985000] input: S3C TouchScreen as /devices/virtual/input/input0 [ 1.311489] [21474537.005000] S3C24XX RTC, (c) 2004,2006 Simtec Electronics [ 1.318452] [21474537.005000] s3c2410_rtc: tick irq 34, alarm irq 92 [ 1.324809] [21474537.010000] s3c2410-rtc s3c2410-rtc: rtc disabled, re-enabling [ 1.332221] [21474537.015000] s3c2410-rtc s3c2410-rtc: rtc core: registered s3c as rtc0 [ 1.340306] [21474537.020000] S3C2410 Watchdog Timer, (c) 2004 Simtec Electronics [ 1.347792] [21474537.030000] s3c2410-wdt s3c2410-wdt: watchdog inactive, reset disabled, irq enabled [ 1.357097] [21474537.035000] sdhci: Secure Digital Host Controller Interface driver [ 1.364903] [21474537.040000] sdhci: Copyright(c) Pierre Ossman [ 1.370816] [21474537.045000] s3c-sdhci s3c-sdhci.0: clock source 0: hsmmc (133000000 Hz) [ 1.379047] [21474537.050000] s3c-sdhci s3c-sdhci.0: clock source 1: hsmmc (133000000 Hz) [ 1.387309] [21474537.055000] s3c-sdhci s3c-sdhci.0: clock source 2: mmc_bus (44333333 Hz) [ 1.395645] [21474537.060000] [SDHCI]to add external irq as a card detect signal...... [ 1.403593] [21474537.065000] [SDHCI]if (pdata->cfg_ext_cd)...... [ 1.409657] [21474537.070000] mmc0: SDHCI controller on samsung-hsmmc [s3c-sdhci.0] using ADMA [ 1.418297] [21474537.075000] [SDHCI]request_irq...... [ 1.423347] [21474537.080000] sdhci: card inserted. [ 1.428779] [21474537.085000] TCP cubic registered [ 1.434598] [21474537.090000] NET: Registered protocol family 17 [ 1.436263] [21474537.095000] VFP support v0.3: implementor 41 architecture 1 part 20 variant b rev 5 [ 1.441529] [21474537.105000] s3c2410-rtc s3c2410-rtc: setting system clock to 2011-08-07 20:03:34 UTC (1312747414) [ 1.446252] [21474537.115000] Waiting for root device /dev/mmcblk0p1... [ 1.839493] [21474537.520000] mmc0: new high speed SD card at address 0002 [ 1.844010] [21474537.520000] mmcblk0: mmc0:0002 00000 1.86 GiB [ 1.847723] [21474537.525000] mmcblk0: p1 [ 1.859526] [21474537.545000] kjournald starting. Commit interval 5 seconds [ 1.867483] [21474537.550000] EXT3 FS on mmcblk0p1, internal journal [ 1.872305] [21474537.550000] EXT3-fs: mounted filesystem with ordered data mode. [ 1.879762] [21474537.555000] VFS: Mounted root (ext3 filesystem). [ 1.885848] [21474537.560000] Freeing init memory: 96K [ 2.135521] INIT: version 2.88 booting [ 2.335501] Using makefile-style concurrent boot in runlevel S. [ 2.951538] Starting the hotplug events dispatcher: udevd. [ 3.439497] Synthesizing the initial hotplug events...done. [ 3.843493] Waiting for /dev to be fully populated...done. [ 5.083503] Activating swap...done. [ 7.415484] Cleaning up ifupdown.... [ 7.523493] Setting up networking.... [ 8.247491] Activating lvm and md swap...done. [ 8.287498] Checking file systems...fsck from util-linux-ng 2.17.2 [ 8.403493] done. [ 8.455494] Mounting local filesystems...done. [ 8.487493] Activating swapfile swap...done. [ 8.563490] Cleaning up temporary files.... [ 8.935547] Configuring network interfaces...[21474544.705000] eth0: link down [ 9.119495] done. [ 9.211492] Cleaning up temporary files.... [ 9.531489] Setting kernel variables ...done. [ 9.807515] INIT: Entering runlevel: 2 [ 9.875529] Using makefile-style concurrent boot in runlevel 2. [ 10.495507] Starting enhanced syslogd: rsyslogd[21474546.705000] eth0: link up, 100Mbps, full-duplex, lpa 0xC5E1 [ 11.647491] . [ 11.715496] Starting periodic command scheduler: cron. [ 13.063506] [ 13.067494] Debian GNU/Linux 6.0 TQ6410-Iris s3c2410_serial0 [ 13.072671] [ 13.079498] TQ6410-Iris login: |
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:
1 2 3 4 |
root@TQ6410-Iris:~# aptitude install libts-bin root@TQ6410-Iris:~# export TSLIB_TSDEVICE=/dev/input/event0 root@TQ6410-Iris:~# ts_calibrate root@TQ6410-Iris:~# ts_test |
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 :
1 2 3 4 |
root@TQ6410-Iris:~# aptitude install xorg root@TQ6410-Iris:~# aptitude install xserver-xorg-input-tslib root@TQ6410-Iris:~# X -retro &; root@TQ6410-Iris:~# xeyes -display :0.0 |
Si vous voulez directement lancer l’interface graphique, il faut installer le paquetage nodm :
1 |
root@TQ6410-Iris:~# aptitude install nodm |
Puis faire les modifications suivantes dans son fichier de configuration /etc/default/nodm:
1 2 3 |
NODM_ENABLE = true NODM_FIRST_VT=2 car j'ai désactivé les autes terminaux virtuels dans /etc/inittab NODM_X_OPTIONS = 'vt2 -nolisten tcp' |
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 !
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
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