Construire son système personnel sur une carte Pandaboard (1)

Publié par cpb
Mai 06 2011

J’ai enfin trouvé le temps de faire un essai d’installation d’un système totalement personnalisé (très incomplet pour le moment) sur ma carte Pandaboard reçue depuis quelques semaines.Panda Board

Rappelons que la Pandaboard est une carte, disponible depuis l’automne dernier, dont les performances alléchantes font un terrain de jeu rêvé pour le développeur Linux embarqué. On peut la commander chez Digikey aux États-Unix pour 174 $ auxquels s’ajoutent des frais de livraisons et environ 40 € de frais de douane. Depuis peu un distributeur la propose également depuis l’Allemagne : Watterott Electronic pour environ 160 € (plus les frais de port).

Le processeur est un OMAP 4 (Texas Instruments) contenant deux coeurs Cortex A9 cadencés à 1 GHz chacun. Cette carte dispose d’un gigaoctet de mémoire, d’une sortie full-HD 1080p, d’une connectivité USB, Ethernet, série RS/232, audio in/out, etc.

Il est possible de télécharger des images de Linux prêtes à booter, tant en version réduite (minimum d’utilitaires systèmes) que sous forme enrichie de distribution Ubuntu ajustée.

Toutefois, ce qui m’intéresse dans cet article est de pouvoir construire un environnement minimal « from scratch » en compilant manuellement tous les composants du système.

Dans ce premier article nous allons nous intéresser au boot de la carte. Nous devrons donc compiler et installer un bootloader, dont le rôle sera de trouver une image du noyau Linux (que nous compilerons également), de la placer en mémoire et de lui passer le contrôle.

Compilation du bootloader

Tout d’abord nous devons compiler le bootloader supportant les processeurs Texas Instruments : X-loader qui devra à son tour charger le bootloader de niveau supérieur : U-boot.

Téléchargeons une copie des sources de X-loader :

[~]$ mkdir ~/Projets/Panda
[~]$ cd ~/Projets/Panda/
[Panda]$ git clone git://gitorious.org/x-loader/x-loader.git
Cloning into x-loader...
[...]
Resolving deltas: 100% (1475/1475), done.
[Panda]$ cd x-loader/

Préparons la configuration de X-loader – il existe déjà une commande de configuration propre à notre carte :

[x-loader]$ make omap4430panda_config
rm -f include/config.h include/config.mk
Configuring for omap4430panda board...
$

Puis démarrons la compilation

[x-loader]$ make CROSS_COMPILE=/cross-arm-linux/usr/bin/arm-linux- ift
[...]
./signGP x-load.bin 0x40304350 1
warning: fclose: Success
warning: fclose: Success
cp x-load.bin.ift MLO
[x-loader]$

La chaîne de compilation dont nous indiquons le préfixe dans l’option CROSS_COMPILE doit être installée au préalable. Si vous souhaitez compiler vous-même votre chaîne de compilation croisée, vous pouvez vous référer à cet article.

La deuxième étape consiste à générer le bootloader de second niveau : U-boot. Téléchargeons les sources :

[x-loader]$ cd ~/Projets/Panda/
[Panda]$ git clone git://git.denx.de/u-boot.git
Cloning into u-boot...
[...]
Resolving deltas: 100% (115879/115879), done.
[Panda]$ cd u-boot/
[u-boot]$

Depuis le noyau 2.6.37, les ports séries de l’OMAP 4 ont été renommés de ttySxx en ttyOxx (avec la lettre O, pas un zéro). Toutefois ceci n’a pas été corrigé immédiatement dans U-boot. Si vous compilez une ancienne version de ce bootloader, il vous faut éditer le fichier include/configs/omap4_panda.h et rechercher la ligne

        "console=ttyS2,115200n8" 

pour la remplacer par

        "console=ttyO2,115200n8" 

Mais cette modification n’est pas nécessaire dans les versions à jour.

Préparons la compilation de U-boot, en utilisant la configuration existante :

[u-boot]$ make omap4_panda_config
awk '(NF && $1 !~ /^#/) { print $1 ": " $1 "_config; $(MAKE)" }' boards.cfg > .boards.depend
Configuring for omap4_panda board...
[u-boot]$

Puis lançons la compilation de U-boot

[u-boot]$ make CROSS_COMPILE=/cross-arm-linux/usr/bin/arm-linux- 
[...]
/cross-arm-linux/usr/bin/arm-linux-objcopy -O srec u-boot u-boot.srec
/cross-arm-linux/usr/bin/arm-linux-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin
[u-boot]$

Compilation du noyau Linux

J’ai choisi de travailler avec la dernière version « Release Candidate » de Linux 2.6.39, le noyau (presque) stable le plus récent disponible à ce jour. Toutefois les procédures ci-dessous devraient fonctionner pour n’importe quel noyau 2.6 des dernières versions. Attention toutefois à ne pas renommer ttyS2 en ttyO2 comme nous l’avons fait ci-dessus si vous choisissez un noyau antérieur au 2.6.37.

[u-boot]$ cd ~/Projets/Panda/
[Panda]$ wget http://www.kernel.org/pub/linux/kernel/v2.6/testing/linux-2.6.39-rc5.tar.bz2
[Panda$ tar -xjf linux-2.6.39-rc5.tar.bz2

Copions le fichier de configuration config-linux-2.6.39-rc5-pandaboard-cpb (à télécharger au préalable).

[Panda]$ cd linux-2.6.39.5
[linux-2.6.39.5]$ cp ~/config-linux-2.6.39-rc5-pandaboard-cpb  ./.config

Vérifions la configuration du noyau

[linux-2.6.39.5]$ make ARCH=arm menuconfig

Puis lançons la compilation :

[linux-2.6.39.5]$ PATH=$PATH:../u-boot/tools/
[linux-2.6.39.5]$ make ARCH=arm CROSS_COMPILE=/cross-arm-linux/usr/bin/arm-linux- -j 16 uImage
[...]
Image Type:   ARM Linux Kernel Image (uncompressed)
Data Size:    3060584 Bytes = 2988.85 kB = 2.92 MB
Load Address: 80008000
Entry Point:  80008000
Image arch/arm/boot/uImage is ready
[linux-2.6.39.5]$

La modification de la variable d’environnement PATH a pour but d’ajouter un répertoire dans la liste de ceux que le système parcourt lorsqu’il recherche une commande. Ici nous avons besoin (pour obtenir une uImage adaptée pour U-boot) de la commande mkimage. Celle-ci n’est généralement pas livrée par les distributions. Toutefois elle est fournie avec U-boot et devient donc disponible pour compiler le noyau.

Préparation de la carte Micro-SD

Le formatage de la carte flash Micro-SD sur laquelle nous allons booter est assez sensible. Insérez la carte Micro-SD sur votre poste hôte. Sur ma machine, la carte est reconnue comme /dev/sdf et sa partition /dev/sdf1 est montée automatiquement dans /media/xxxx (un numéro de série).

Vous devrez vérifier (avec dmesg) sur votre système, quel périphérique représente la carte micro-SD et remplacer toutes les occurrences de /dev/sdf ci-dessous par le périphérique vous concernant. Les commandes suivantes sont dangereuses, relisez toujours votre ligne complète avant de presser « Entrée » et vérifiez que vous n’avez pas saisi machinalement /dev/sdf.

Il nous faut les droits root :

[linux-2.6.39.5]$ cd ~/Projets/Panda/
[Panda]$ su
Password:
[Panda]#

Si vous utilisez une distribution qui ne veut pas vous fournir de commande su, utilisez :

[linux-2.6.39.5]$ sudo bash
Password:
[~]# cd /home/votre-login/Projets/Panda/
[Panda]#

Tout d’abord, effaçons totalement la table des partitions :

[Panda]# dd if=/dev/zero of=/dev/sdf bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.238374 s, 4.4 MB/s
[Panda]#

Puis nous allons scinder notre carte micro-SD en deux partitions : la première contiendra le bootloader et l’image du kernel, la seconde contiendra le système de fichiers principal.

[Panda]# fdisk /dev/sdf
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
[...]
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

Créons une première partition de quelques Mo (afin de pouvoir y stocker confortablement quelques images du noyau Linux lors des futures expérimentations) :

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4, default 1): 1
First sector (2048-3842047, default 2048): Entrée
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-3842047, default 3842047): +64M

Puis une seconde partition pour le système de fichiers (tout le reste de la carte Micro-SD par exemple) :

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4, default 2): 2
First sector (133120-3842047, default 133120): Entrée
Using default value 133120
Last sector, +sectors or +size{K,M,G} (133120-3842047, default 3842047): Entrée
Using default value 3842047

Rendons la première partition bootable au format Fat 32 :

Command (m for help): t
Partition number (1-4): 1
Hex code (type L to list codes): c
Changed system type of partition 1 to c (W95 FAT32 (LBA))
Command (m for help): a
Partition number (1-4): 1
Command (m for help): w
The partition table has been altered!
[...]
Syncing disks.
[Panda]#

Formattons à présent les deux partitions :

[Panda]# mkfs.vfat -n boot /dev/sdf1
mkfs.vfat 3.0.9 (31 Jan 2010)
[Panda]# mkfs.ext3 -L root /dev/sdf2
mke2fs 1.41.12 (17-May-2010)
Filesystem label=root
[...]
This filesystem will be automatically checked every 38 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
[Panda]#

Le choix du format Ext 3 pour la partition contenant le système de fichier est dû à la configuration de U-boot. Dans le fichier
u-boot/include/configs/omap4_panda.h que nous avons édité plus haut, on rencontre les lignes :

        "mmcroot=/dev/mmcblk0p2 rw" 
        "mmcrootfstype=ext3 rootwait" 
        "mmcargs=setenv bootargs console=${console} " 
                "vram=${vram} " 
                "root=${mmcroot} " 
                "rootfstype=${mmcrootfstype}" 

qui indiquent que le noyau Linux va recevoir en argument les options root= et rootfstype= qui précisent l’emplacement et le format du système de fichiers principal. Ici, la partition est mmcblk0p2 (deuxième partition de la première carte Micro-SD) et le format Ext 3.

Installation du bootloader et du kernel sur la carte micro-SD

Nous montons notre partition de boot (si ce n’est pas fait automatiquement) :

[Panda]# mkdir /mnt/boot
[Panda]# mount /dev/sdf1 /mnt/boot/

Copions sur la carte les trois fichiers nécessaires pour le chargement de U-boot :

[Panda]# cp x-loader/MLO /mnt/boot/
[Panda]# cp x-loader/x-load.bin /mnt/boot/
[Panda]# cp u-boot/u-boot.bin /mnt/boot/
[Panda]#

Puis copions le noyau lui-même et démontons la carte Micro-SD.

[Panda]# cp linux-2.6.39-rc5/arch/arm/boot/uImage /mnt/boot/
[Panda]# umount /mnt/boot

Premier boot de notre système

Insérons la carte Micro-SD dans l’emplacement prévu sur la Pandaboard. Pour pouvoir observer les traces du démarrage, il faut utiliser une console connectée sur le port série de la Pandaboard. Ce port est prévu pour être directement relié au port série RS/232 d’un PC (sans besoin de câble croisé null-modem). La plupart des PC de nos jours n’ayant plus de port RS/232 classique, il faudra utiliser un adaptateur USB/Série que l’on connecte directement depuis le port USB de l’ordinateur hôte vers le port série de la Pandaboard.

Pandaboard et câble USB / Série

Sur le PC, nous utiliserons l’émulateur de terminal minicom configuré pour dialoguer sur le port /dev/ttyUSB0, vitesse 115200 pas de parité ni de contrôle de flux (ce paramétrage provient encore du fichier omap4_panda.h de U-boot décrit plus haut. Voici les traces de boot relevées sur minicom :

Texas Instruments X-Loader 1.5.0 (May  3 2011 - 07:49:31)
Reading boot sector
Loading u-boot.bin from mmc

Le bootloader de premier niveau X-loader a bien démarré et trouvé l’image de U-boot, puis l’a chargée et lui passe le contrôle

U-Boot 2011.03-00398-ga621b16-dirty (May 03 2011 - 08:42:19)
CPU  : OMAP4430
Board: OMAP4 Panda
I2C:   ready
DRAM:  1 GiB
MMC:   OMAP SD/MMC: 0
Using default environment

In:    serial
Out:   serial
Err:   serial
Hit any key to stop autoboot:  0

U-boot détecte le matériel, et nous propose un décompte de 3 secondes pendant lesquelles on peut l’interrompre pour modifier ses paramètres. Laissons l’autoboot continuer :

reading boot.scr

** Unable to read "boot.scr" from mmc 0:1 **
reading uImage

3060648 bytes read
Booting from mmc0 ...
## Booting kernel from Legacy Image at 82000000 ...
   Image Name:   Linux-2.6.39-rc5-cpb
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    3060584 Bytes = 2.9 MiB
   Load Address: 80008000
   Entry Point:  80008000
   Verifying Checksum ... OK
   Loading Kernel Image ... OK
OK

U-boot a trouvé une image au format uImage sur la première partition de la carte mmc0, il l’identifie comme un noyau Linux, la charge en mémoire et lui transfère le contrôle

Starting kernel ...
Uncompressing Linux... done, booting the kernel.

Le noyau Linux est compressé, il exécute un petit auto-décompresseur en mémoire avant le démarrage réel

[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Linux version 2.6.39-rc5-cpb (cpb@tr-a-0) (gcc version 4.3.5 (Buildroot 2010.08) ) #1 SMP Tue May 3 11:14:47 1

Nous pouvons voir passer notre numéro de version du kernel

[    0.000000] CPU: ARMv7 Processor [411fc092] revision 2 (ARMv7), cr=10c5387f
[    0.000000] CPU: VIPT nonaliasing data cache, VIPT aliasing instruction cache
[    0.000000] Machine: OMAP4 Panda board
[    0.000000] Reserving 16777216 bytes SDRAM for VRAM
[    0.000000] Memory policy: ECC disabled, Data cache writealloc
[    0.000000] Truncating RAM at 80000000-bfffffff to -afffffff (vmalloc region overlap).
[    0.000000] OMAP4430 ES2.1
[    0.000000] SRAM: Mapped pa 0x40300000 to va 0xfe400000 size: 0xe000
[    0.000000] powerdomain: waited too long for powerdomain dss_pwrdm to complete transition
[    0.000000] PERCPU: Embedded 7 pages/cpu @c113b000 s7808 r8192 d12672 u32768
[    0.000000] Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 195072
[    0.000000] Kernel command line: console=ttyO2,115200n8 vram=16M root=/dev/mmcblk0p2 rw rootfstype=ext3 rootwait
[    0.000000] PID hash table entries: 4096 (order: 2, 16384 bytes)
[    0.000000] Dentry cache hash table entries: 131072 (order: 7, 524288 bytes)
[    0.000000] Inode-cache hash table entries: 65536 (order: 6, 262144 bytes)
[    0.000000] Memory: 1008MB = 1008MB total
[    0.000000] Memory: 767940k/767940k available, 18492k reserved, 0K highmem
[    0.000000] Virtual kernel memory layout:
[    0.000000]     vector  : 0xffff0000 - 0xffff1000   (   4 kB)
[    0.000000]     fixmap  : 0xfff00000 - 0xfffe0000   ( 896 kB)
[    0.000000]     DMA     : 0xffc00000 - 0xffe00000   (   2 MB)
[    0.000000]     vmalloc : 0xf0800000 - 0xf8000000   ( 120 MB)
[    0.000000]     lowmem  : 0xc0000000 - 0xf0000000   ( 768 MB)
[    0.000000]     modules : 0xbf000000 - 0xc0000000   (  16 MB)
[    0.000000]       .init : 0xc0008000 - 0xc003e000   ( 216 kB)
[    0.000000]       .text : 0xc003e000 - 0xc05a6248   (5537 kB)
[    0.000000]       .data : 0xc05a8000 - 0xc05f95a0   ( 326 kB)
[    0.000000] Hierarchical RCU implementation.
[    0.000000]  RCU-based detection of stalled CPUs is disabled.
[    0.000000] NR_IRQS:410
[    0.000000] omap_hwmod: dpll_mpu_m2_ck: missing clockdomain for dpll_mpu_m2_ck.
[    0.000000] OMAP clockevent source: GPTIMER1 at 32768 Hz
[    0.000000] sched_clock: 32 bits at 32kHz, resolution 30517ns, wraps every 131071999ms
[    0.000000] Console: colour dummy device 80x30
[    0.000000] Lock dependency validator: Copyright (c) 2006 Red Hat, Inc., Ingo Molnar
[    0.000000] ... MAX_LOCKDEP_SUBCLASSES:  8
[    0.000000] ... MAX_LOCK_DEPTH:          48
[    0.000000] ... MAX_LOCKDEP_KEYS:        8191
[    0.000000] ... CLASSHASH_SIZE:          4096
[    0.000000] ... MAX_LOCKDEP_ENTRIES:     16384
[    0.000000] ... MAX_LOCKDEP_CHAINS:      32768
[    0.000000] ... CHAINHASH_SIZE:          16384
[    0.000000]  memory used by lock dependency info: 3695 kB
[    0.000000]  per task-struct memory footprint: 1152 bytes
[    0.000671] Calibrating delay loop... 2007.19 BogoMIPS (lpj=7839744)
[    0.062499] pid_max: default: 32768 minimum: 301
[    0.063110] Security Framework initialized
[    0.063415] Mount-cache hash table entries: 512
[    0.066802] CPU: Testing write buffer coherency: ok
[    0.067535] Calibrating local timer... 491.91MHz.
[    0.109619] hw perfevents: enabled with ARMv7 Cortex-A9 PMU driver, 7 counters available
[    0.109741] L310 cache controller enabled
[    0.109741] l2x0: 16 ways, CACHE_ID 0x410000c4, AUX_CTRL 0x7e470000, Cache size: 1048576 B
[    0.111877] CPU1: Booted secondary processor
[    0.111907] CPU1: Unknown IPI message 0x1
[    0.140228] Brought up 2 CPUs
[    0.140228] SMP: Total of 2 processors activated (3963.96 BogoMIPS).
[    0.146911] omap_hwmod: _populate_mpu_rt_base found no _mpu_rt_va for emif_fw
[    0.146911] omap_hwmod: _populate_mpu_rt_base found no _mpu_rt_va for l3_instr
[    0.146942] omap_hwmod: _populate_mpu_rt_base found no _mpu_rt_va for l3_main_1
[    0.146942] omap_hwmod: _populate_mpu_rt_base found no _mpu_rt_va for l3_main_2
[    0.146972] omap_hwmod: _populate_mpu_rt_base found no _mpu_rt_va for l4_abe
[    0.146972] omap_hwmod: _populate_mpu_rt_base found no _mpu_rt_va for l4_cfg
[    0.146972] omap_hwmod: _populate_mpu_rt_base found no _mpu_rt_va for l4_per
[    0.147003] omap_hwmod: _populate_mpu_rt_base found no _mpu_rt_va for l4_wkup
[    0.147003] omap_hwmod: _populate_mpu_rt_base found no _mpu_rt_va for mpu_private
[    0.147003] omap_hwmod: _populate_mpu_rt_base found no _mpu_rt_va for dsp
[    0.147033] omap_hwmod: _populate_mpu_rt_base found no _mpu_rt_va for ipu
[    0.147277] omap_hwmod: l3_div_ck: missing clockdomain for l3_div_ck.
[    0.152404] print_constraints: dummy:
[    0.152984] NET: Registered protocol family 16
[    0.153442] GPMC revision 6.0
[    0.156372] omap_device: omap_gpio.0: new worst case activate latency 0: 30517
[    0.156707] OMAP GPIO hardware version 0.1
[    0.157012] OMAP GPIO hardware version 0.1
[    0.157257] OMAP GPIO hardware version 0.1
[    0.157531] OMAP GPIO hardware version 0.1
[    0.157775] OMAP GPIO hardware version 0.1
[    0.158050] OMAP GPIO hardware version 0.1
[    0.162841] omap_mux_init: Add partition: #1: core, flags: 2
[    0.164154] omap_mux_init: Add partition: #2: wkup, flags: 2
[    0.166717] omap_device: omap_uart.0: new worst case activate latency 0: 30517
[    0.172576] hw-breakpoint: found 6 breakpoint and 1 watchpoint registers.
[    0.172576] hw-breakpoint: 1 breakpoint(s) reserved for watchpoint single-step.
[    0.172607] hw-breakpoint: maximum watchpoint size is 4 bytes.
[    0.175689] pm_dbg_init: only OMAP3 supported
[    0.175903] OMAP DMA hardware revision 0.0
[    0.201141] bio: create slab  at 0
[    0.202880] print_constraints: vwl1271: 1800 mV
[    0.205871] SCSI subsystem initialized
[    0.207122] omap_device: omap2_mcspi.2: new worst case deactivate latency 0: 30517
[    0.207550] omap_device: omap2_mcspi.4: new worst case activate latency 0: 30517
[    0.209106] usbcore: registered new interface driver usbfs
[    0.209533] usbcore: registered new interface driver hub
[    0.209838] usbcore: registered new device driver usb
[    0.224060] omap_i2c omap_i2c.1: bus 1 rev4.0 at 400 kHz
[    0.240173] Skipping twl internal clock init and using bootloader value (unknown osc rate)
[    0.241027] twl6030: PIH (irq 39) chaining IRQs 368..387
[    0.263305] print_constraints: VMMC: 1200 <--> 3000 mV at 3000 mV normal standby
[    0.264495] print_constraints: VPP: 1800 <--> 2500 mV at 1900 mV normal standby
[    0.265411] print_constraints: VANA: 2100 mV normal standby
[    0.266296] print_constraints: VCXIO: 1800 mV normal standby
[    0.267150] print_constraints: VDAC: 1800 mV normal standby
[    0.268218] print_constraints: VAUX2_6030: 1200 <--> 2800 mV at 1800 mV normal standby
[    0.269317] print_constraints: VAUX3_6030: 1000 <--> 3000 mV at 1200 mV normal standby
[    0.270233] print_constraints: CLK32KG:
[    0.270538] omap_device: omap_i2c.1: new worst case deactivate latency 0: 30517
[    0.284881] omap_i2c omap_i2c.2: bus 2 rev4.0 at 400 kHz
[    0.285278] omap_device: omap_i2c.3: new worst case activate latency 0: 30517
[    0.300109] omap_i2c omap_i2c.3: bus 3 rev4.0 at 100 kHz
[    0.315338] omap_i2c omap_i2c.4: bus 4 rev4.0 at 400 kHz
[    0.320556] Switching to clocksource 32k_counter
[    0.320953] cfg80211: Calling CRDA to update world regulatory domain
[    0.322998] Switched to NOHz mode on CPU #0
[    0.325256] Switched to NOHz mode on CPU #1

Le noyau a détecté tous les périphériques qu’il connaît, il passe à l’initialisation des éléments logiciels (piles réseau, USB, etc.)

[    0.346801] NET: Registered protocol family 2
[    0.347167] IP route cache hash table entries: 32768 (order: 5, 131072 bytes)
[    0.347442] IPv4 FIB: Using LC-trie version 0.409
[    0.348205] TCP established hash table entries: 131072 (order: 8, 1048576 bytes)
[    0.350372] TCP bind hash table entries: 65536 (order: 9, 2359296 bytes)
[    0.365234] TCP: Hash tables configured (established 131072 bind 65536)
[    0.365356] TCP reno registered
[    0.365386] UDP hash table entries: 512 (order: 3, 40960 bytes)
[    0.365661] UDP-Lite hash table entries: 512 (order: 3, 40960 bytes)
[    0.366455] NET: Registered protocol family 1
[    0.367187] RPC: Registered udp transport module.
[    0.367187] RPC: Registered tcp transport module.
[    0.367187] RPC: Registered tcp NFSv4.1 backchannel transport module.
[    0.367889] NetWinder Floating Point Emulator V0.97 (double precision)
[    0.369384] omap_init_opp_table: no hwmod or odev for iva, [6] cannot add OPPs.
[    0.372375] VFS: Disk quotas dquot_6.5.2
[    0.372589] Dquot-cache hash table entries: 1024 (order 0, 4096 bytes)
[    0.373687] JFFS2 version 2.2. (NAND) (SUMMARY)  �© 2001-2006 Red Hat, Inc.
[    0.374114] msgmni has been set to 1499
[    0.376251] io scheduler noop registered
[    0.376251] io scheduler deadline registered
[    0.376342] io scheduler cfq registered (default)
[    0.438018] OMAP DSS rev 4.0
[    0.828460] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
[    1.024414] omap_uart.0: ttyO0 at MMIO 0x4806a000 (irq = 104) is a OMAP UART0
[    1.070800] omap_uart.1: ttyO1 at MMIO 0x4806c000 (irq = 105) is a OMAP UART1
[    1.133300] omap_uart.2: ttyO2 at MMIO 0x48020000 (irq = 106) is a OMAP UART2
[    1.995269] console [ttyO2] enabled
[    2.055175] omap_uart.3: ttyO3 at MMIO 0x4806e000 (irq = 102) is a OMAP UART3
[    2.139251] brd: module loaded
[    2.149353] loop: module loaded
[    2.154937] mtdoops: mtd device (mtddev=name/number) must be supplied
[    2.164123] usbcore: registered new interface driver asix
[    2.169982] usbcore: registered new interface driver cdc_ether
[    2.176330] usbcore: registered new interface driver smsc95xx
[    2.182373] cdc_ncm: 7-Feb-2011
[    2.185852] usbcore: registered new interface driver cdc_ncm
[    2.192993] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[    2.200164] ehci-omap ehci-omap.0: OMAP-EHCI Host Controller
[    2.208160] ehci-omap ehci-omap.0: new USB bus registered, assigned bus number 1
[    2.235137] ehci-omap ehci-omap.0: irq 109, io mem 0x4a064c00
[    2.250518] ehci-omap ehci-omap.0: USB 2.0 started, EHCI 1.00
[    2.257019] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002
[    2.264129] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    2.271667] usb usb1: Product: OMAP-EHCI Host Controller
[    2.277221] usb usb1: Manufacturer: Linux 2.6.39-rc5-cpb ehci_hcd
[    2.283599] usb usb1: SerialNumber: ehci-omap.0
[    2.290405] hub 1-0:1.0: USB hub found
[    2.294403] hub 1-0:1.0: 3 ports detected
[    2.328796] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
[    2.335388] ohci-omap3 ohci-omap3.0: OMAP3 OHCI Host Controller
[    2.342285] ohci-omap3 ohci-omap3.0: new USB bus registered, assigned bus number 2
[    2.367828] ohci-omap3 ohci-omap3.0: irq 108, io mem 0x4a064800
[    2.450042] usb usb2: New USB device found, idVendor=1d6b, idProduct=0001
[    2.457153] usb usb2: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    2.464691] usb usb2: Product: OMAP3 OHCI Host Controller
[    2.470336] usb usb2: Manufacturer: Linux 2.6.39-rc5-cpb ohci_hcd
[    2.476684] usb usb2: SerialNumber: ohci-omap3.0
[    2.482604] hub 2-0:1.0: USB hub found
[    2.486572] hub 2-0:1.0: 3 ports detected
[    2.491943] usbcore: registered new interface driver cdc_wdm
[    2.497863] Initializing USB Mass Storage driver...
[    2.503540] usbcore: registered new interface driver usb-storage
[    2.509857] USB Mass Storage support registered.
[    2.515228] usbcore: registered new interface driver libusual
[    2.625488] usb 1-1: new high speed USB device number 2 using ehci-omap
[    3.016265] usb 1-1: New USB device found, idVendor=0424, idProduct=9514
[    3.023254] usb 1-1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
[    3.032196] hub 1-1:1.0: USB hub found
[    3.036315] hub 1-1:1.0: 5 ports detected
[    3.064025] usbcore: registered new interface driver usbtest
[    3.071502] mousedev: PS/2 mouse device common for all mice
[    3.079742] omap_device: omap_i2c.1: new worst case activate latency 0: 61035
[    3.088928] twl_rtc twl_rtc: rtc core: registered twl_rtc as rtc0
[    3.095581] twl_rtc twl_rtc: Power up reset detected.
[    3.102020] twl_rtc twl_rtc: Enabling TWL-RTC.
[    3.107238] i2c /dev entries driver
[    3.113098] Driver for 1-wire Dallas network protocol.
[    3.120147] OMAP Watchdog Timer Rev 0x00: initial timeout 60 sec
[    3.126464] omap_device: omap_wdt.-1: new worst case deactivate latency 0: 30517
[    3.142059] usbcore: registered new interface driver usbhid
[    3.147888] usbhid: USB HID core driver
[    3.152221] TCP cubic registered
[    3.155578] Initializing XFRM netlink socket
[    3.160125] NET: Registered protocol family 17
[    3.164855] NET: Registered protocol family 15
[    3.169738] lib80211: common routines for IEEE802.11 drivers
[    3.175689] Registering the dns_resolver key type
[    3.180877] VFP support v0.3: implementor 41 architecture 3 part 30 variant 9 rev 1
[    3.189422] ThumbEE CPU extension supported.
[    3.193908] Registering SWP/SWPB emulation handler
[    3.205566] omap2_set_init_voltage: Invalid parameters!
[    3.211059] omap2_set_init_voltage: Unable to put vdd_iva to its init voltage
[    3.220092] Power Management for TI OMAP4.
[    3.241333] clock: disabling unused clocks to save power
[    3.249389] omapfb omapfb: no driver for display
[    3.254302] omapfb omapfb: failed to setup omapfb
[    3.255310] mmc0: host does not support reading read-only switch. assuming write-enable.
[    3.257354] mmc0: new high speed SD card at address 1234
[    3.259185] mmcblk0: mmc0:1234 SA02G 1.83 GiB
[    3.263610]  mmcblk0: p1 p2
[    3.281646] regulator_init_complete: CLK32KG: incomplete constraints, leaving on
[    3.289733] regulator_init_complete: VAUX3_6030: incomplete constraints, leaving on
[    3.298004] regulator_init_complete: VAUX2_6030: incomplete constraints, leaving on
[    3.306243] regulator_init_complete: VDAC: incomplete constraints, leaving on
[    3.313903] regulator_init_complete: VCXIO: incomplete constraints, leaving on
[    3.321624] regulator_init_complete: VANA: incomplete constraints, leaving on
[    3.329284] regulator_init_complete: VPP: incomplete constraints, leaving on
[    3.367218] twl_rtc twl_rtc: setting system clock to 2000-01-01 00:00:00 UTC (946684800)
[    3.692810] EXT3-fs (mmcblk0p2): using internal journal
[    3.698303] EXT3-fs (mmcblk0p2): recovery complete
[    3.703613] EXT3-fs (mmcblk0p2): mounted filesystem with ordered data mode
[    3.711273] VFS: Mounted root (ext3 filesystem) on device 179:2.
[    3.717681] Freeing init memory: 216K
[    3.723968] Kernel panic - not syncing: No init found.  Try passing init= option to kernel. See Linux Documentation/init..
[    3.737152] CPU1: stopping
[    3.740020] [] (unwind_backtrace+0x0/0xec) from [] (do_IPI+0xb0/0x124)
[    3.748718] [] (do_IPI+0xb0/0x124) from [] (__irq_svc+0x38/0xc0)
[    3.756866] Exception stack(0xef871f90 to 0xef871fd8)
[    3.762176] 1f80:                                     00000001 ef86f8c8 00000000 0000a306
[    3.770751] 1fa0: ef870000 c05c1f2c c05c1d10 c05f96a8 c04395ac 411fc092 00000000 00000000
[    3.779357] 1fc0: ef870000 ef871fd8 c00a7210 c004a668 20000113 ffffffff
[    3.786315] [] (__irq_svc+0x38/0xc0) from [] (default_idle+0x28/0x30)
[    3.794891] [] (default_idle+0x28/0x30) from [] (cpu_idle+0x90/0xe8)
[    3.803405] [] (cpu_idle+0x90/0xe8) from [<8042fe4c>] (0x8042fe4c)

Nous observons (à l’instant 3.723968) un message familier aux développeurs Linux embarqué :

Kernel panic - not syncing: No init found. Try passing init=option to kernel. See Linux Documentation/init

Et contrairement à ce qu’il semble au premier abord c’est une excellente nouvelle !

Conclusion

Reprenons ce que nous avons obtenu :

  • Les deux bootloaders fonctionnent parfaitement et chargent l’image du noyau
  • Le noyau Linux démarre, reconnait le matériel de base (nous devrons peut-être ajouter d’autres drivers par la suite mais nous avons déjà l’essentiel des périphériques)
  • une fois le matériel reconnu, le kernel a fait toute son initialisation logicielle correctement
  • le périphérique contenant le système de fichier initial a été trouvé et monté sans erreur : (‘instant 3.711273)

Il ne reste « plus qu’à » démarrer le premier processus dans l’espace utilisateur. Ce processus doit s’appeler init et se trouver dans /bin, /etc, ou /sbin. Naturellement nous n’avons rien installé encore sur le système de fichiers aussi le noyau échoue-t-il dans cette dernière opération. Il s’agit bien de la dernière opération du boot en mode noyau, juste avant de démarrer la partie utilisateur.

Donc, ce message est une très bonne nouvelle, car notre noyau Linux a été correctement installé sur la Pandaboard. Dans le prochain article nous installerons le reste du système de fichiers (ce qui, par ailleurs, ne dépend que très peu du matériel proprement dit).

27 Réponses

  1. Gallois dit :

    Bonjour,

    Merci pour cette excellent article (comme tous les autres d’ailleurs sur votre site :-), je souhaite me lancer dans l’embarqué et je ne sais pas quelle board acheté pour faire des experimentations et étudier?

    Voila ce que j’ai vu ailleurs comme « learning kit » pour debutants:

    1. Le livre : « Embedded Linux Primer: A Practical Real-World Approach (2nd Edition) » de Christopher hallinan.

    2. Une Beagleboard-XM.

    Qu’est ce que vous en pensez?

    J’hésite entre la BeagleBorad-XM et la Pandaboard(influencé par votre article :-), parce que la difference de prix est moindre entre les deux et les performances sont supérieurs je pense du coté de la PandaBoard. Mais d’un autre coté j’ai l’impression qu’il y a plus de tutos du coté de la communauté de la BeagleBoard.

    Je vous remercie et j’attends avec impatience votre avis :).

    Merci.

    • cpb dit :

      Bonsoir,

      J’ai eu une Beagleboard (la première version, pas la Xm) en prêt pendant quelques semaines, et j’ai bidouillé un peu sur cette carte avec plaisir. Du fait de son ancienneté (sans aspect péjoratif !) elle est bien documentée, explorée, tutorialisée, etc.

      Toutefois, lorsque j’ai eu besoin de reprendre une nouvelle carte il y a quelques mois, pour remplacer l’IGEPv2 dont j’ai grillé le port série :-/ j’ai choisi la Pandaboard pour deux raisons :

      le processeur à base Cortex A9, donc double coeur, ce qui peut permettre de paralléliser efficacement certains traitements, notamment lorsqu’on veut réserver un coeur pour des traitements temps-réel et l’autre pour gérer les tâches temps-partagé courantes
      le wifi disponible sans extension supplémentaire, ce qui permet une intégration plus aisée dans les projets de type robotique Au final, mon utilisation du wifi s’est faite via une distribution Ubuntu pour Pandaboard et je n’ai pas encore creusé plus que ça ce sujet.

      Tout dépend de l’utilisation que l’on veut en faire…

      PS: Et la Snowball Board ? Dans la même gamme de prix elle dispose en plus d’un accéléromètre, capteur de pression, gyroscope, magnétomètre et même d’un GPS pour les versions les plus complètes. C’est alléchant et le terrain de jeu est encore assez vierge…

  2. Gallois dit :

    Bonsoir,

    Merci pour la réponse, j’ai cherché la Snowball Board (un peu plus chers que les deux autres), mais je n’ai pas trouvé beaucoup de docs la dessus…

    Vu ce que vous venez de me dire, je vais m’orienter vers une PandaBoard, et j’espere trouver d’autres articles sur cette carte sur votre site:-.

    Merci beaucoup.

  3. Yvo dit :

    Salut,

    J’utilise une carte d’éval’ ATMEL AT91SAM9RL_EK et je tente d’intégrer un noyau linux en essayant d’utiliser votre tutorial et celui de chez linux4SAM mais pour le moment, j’en suis qu’à l’étape du bootstrap. Plusieurs étape se ressemble et notamment celle de la compilation. J’intègre le fichier « dataflash_at91sam9rlek.bin » via le SAM-BA2.11 dans la partie dataflash de la carte qui doit être à mon avis le fichier permettant d’initialiser la carte et en fin de tuto’ pour cette partie d’intégration, il décrit une étape de compilation commençant par la fonction ‘make clean’ dans le dossier dataflash du dossier bootstap-v1.16. En exécutant cette tache dans le dossier dataflash, il détruit le fichier .bin, .elf et .map et laisse le fichier .h et le makefile. Et ensuite, demande de taper à nouveau make mais en retour, j’ai un message d’erreur:

    make: arm-elf-gcc : commande introuvable
    make: *** [crt0_gnu.o] Erreur 127

    Dans le makefile, il y a un bout de code:

    ifndef CROSS_COMPILE
    CROSS_COMPILE=arm-elf-
    endif

    – Pouvez-vous me dire pourquoi j’ai ce message d’erreur ?
    – Pouvez-vous m’expliquer à quoi sert le CROSS_COMPILE ?
    – Est ce que je dois obligatoirement passer par cette étape vu que j’ai déjà intégrer le fichier « dataflash_at91sam9rlek.bin » sur la carte ?

    Salutation,

    Yvo.

    • cpb dit :

      Bonjour,

      Apparemment, le make n’arrive pas à trouver le cross-compiler qui devrait être installé sur votre poste de développement pour produire du code pour processeur Arm. On doit renseigner, sur la ligne de commande de make la variable CROSS_COMPILE avec un préfixe permettant de trouver le cross-compiler. Par exemple si le cross compiler est :
      /usr/local/arm-generic-gcc,
      il faut préciser sur la ligne de commande de make CROSS_COMPILE=/usr/local/arm-generic-
      Ainsi make pourra ajouter gcc derrière ce préfixe.

      Maintenant, si vous avez déjà le fichier dataflash_at91sam9rlek.bin, il n’est peut être pas utile de le recompiler pour le moment.

  4. Yvo dit :

    Bonjour,

    Suite à vos indications, j’ai pu compiler mon premier fichier sous linux au format .bin ! Merci.
    J’ai voulu passer à l’étape d’après qui consiste à compiler le chargeur d’amorçage « u-Boot » et j’ai donc téléchargé le dossier u-boot-1.3.4. Avec le terminal, j’utilise la commande « cd » pour me rendre dans le ‘dossier u-boot-1.3.4’ mais il n’y a pas de fichier ‘…_config’. Il y a des fichiers ‘…_config.mk’ et d’autre alors j’ai quand même tenté de compiler en faisant « make clean », « make » mais j’ai un message d’erreur:

    make: *** [all] Erreur 1

    J’essaye de faire un « make arm_config.mk » et j’ai ce message:

    make: Rien à faire pour « arm_config.mk »

    En faisant « make CROSS_COMPILER=/…/arm-linux-« , j’ai ce message:

    make: *** Pas de règle pour fabriquer la cible « make ». Arrêt.

    J’utilise donc la commande « cd » pour me rendre dans un dossier contenant des fichiers spécifiques à ma carte d’éval’ (at91sam9rlek.c, config.mk, led.c, Makefile, nand.c, partition.c) toujours dans le dossier u-boot-1.3.4 et quelque soit la commande utilisée « make clean, make » ou « make CROSS_COMPILER=/…/arm-linux-« , j’ai le message suivant:

    Makefile:28: /config.mk: Aucun fichier ou dossier de ce type
    Makefile:53: /rules.mk: Aucun fichier ou dossier de ce type
    make: *** Pas de règle pour fabriquer la cible « rules.mk ». Arrêt.

    En regardant dans le fichier Makefile, j’ai les lignes suivantes:

    include $(TOPDIR)/config.mk
    include $(SRCTREE)/rules.mk

    – Pourquoi je ne peux pas compiler mon fichier u-Boot-1.3.4 ?
    – Est-il possible de fabriquer un fichier u-Boot-1.3.4 personnalisé( afficher un texte, une image et activer ou désactiver certain périphérique) ?

    Salutation,

    Yvo.

    • cpb dit :

      Bonjour Yvo,

      Pour préparer la configuration après avoir téléchargé et décompressé l’archive de u-boot.

      cd u-boot-1.3.4/ [u-boot-1.3.4]$ make at91sam9rlek_config Configuring for at91sam9rlek board… [u-boot-1.3.4]$ Puis pour compiler (attention au chemin du cross compiler qui n’est surement pas le même sur votre poste.
      [u-boot-1.3.4]$ make CROSS_COMPILE=~/cross-arm-linux/usr/bin/arm-linux-
      Generating include/autoconf.mk.dep
      for dir in tools examples api_examples ; do make -C $dir _depend ; done
      [...]
      /home/cpb/cross-arm-linux/usr/bin/arm-linux-objcopy --gap-fill=0xff -O srec u-boot u-boot.srec
      /home/cpb/cross-arm-linux/usr/bin/arm-linux-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin
      [u-boot-1.3.4]$ ls -l u-boot*
      -rwxrwxr-x 1 cpb cpb 483635 2012-03-26 07:33 u-boot
      -rwxrwxr-x 1 cpb cpb 143936 2012-03-26 07:33 u-boot.bin
      -rw-rw-r-- 1 cpb cpb 108801 2012-03-26 07:33 u-boot.map
      -rwxrwxr-x 1 cpb cpb 431922 2012-03-26 07:33 u-boot.srec
      [u-boot-1.3.4]$ 

      Bon courage ! 😉

  5. Yvo dit :

    Bonjour,

    Je tente de compiler le noyau linux « linux-2.6.36 » en suivant vos indications et je créé bien les fichiers image dans le dossier boot du linux-2.6.36 « Image » et « zImage » mais pas de fichier image.bin. Je veux compiler un fichier image.bin pour l’intégrer directement sur la carte d’éval’.

    – Comment dois-je faire ?

    Salutation,

    Yvo.

    • Yvo dit :

      Bonjour CPB,

      J’ai enfin réussi à générer une image linux « uImage » et l’intégrer sur la carte d’éval’ mais j’ai un kernel panic de ce type:

      VFS: Cannot open root device « mtdblock0 » or unknown-block(31,0)
      please append a correct « root= » boot option; here are the available partitions:

      1f00 …mtdblock0
      1f01 …mtdblock1
      1f02 …mtdblock2
      Kernel panic – not syncing: VFS: Unable to mount root fs on unknown-block(31,0)

      En observant les différentes lignes sur minicom lors du lancement du noyau, j’ai bien une ligne avec l’indication suivante ‘Kernel command line: console=ttyS0,115200 root=/dev/mtdblock0 mtdparts=at91_nan2…’ mais il n’y a pas de fichier « mtdblock0 » dans le répertoire /dev du poste de travail. Et dans le dossier linux-2.6.36(dossier du noyau compilé pour la carte d’éval’), il y a bien un dossier fs avec différent sous-dossier mais je ne vois pas pourquoi j’ai cette erreur.

      – Est ce que j’ai mal compilé mon noyau linux ?

      Salutation,

      Yvo.

  6. Rémy dit :

    Bonjour,

    Tout d’abord merci pour votre tutoriel qui a été d’une grande instruction pour mes début sur la compilation croisé sous linux.
    J’ai pu réaliser la compilation des x-loader, u-boot ainsi que du kernel linux et maintenant je souhaite pouvoir démarrer ubuntu à partir de mes binaires générés. J’ai tenté la compilation de plusieurs versions de kernel jusqu’à la dernière ainsi que testé avec plusieurs versions d’ubuntu mais sans aboutir au démarrage de l’os.
    Je pense manquer d’information sur la manière de procéder pour faire ainsi, peut-être pourriez-vous m’aider? Pour infos j’ai une version d’ubuntu 12.04 installée avec des prébuilt sur la carte SD qui fonctionne et je me contente de remplacer les binaires compilés. Cela fonctionne correctement quand je remplace le MLO et le uboot.bin mais pas le uImage et uInitrd.
    Salutations,
    Rémy.

  7. Stanis dit :

    Bonjour,

    Super tutoriel, néanmoins j’ai un petit soucis .. Je coince au niveau de :  » Uncopressing Linux .. Done, booting the kernel  » Apres cela .. plus rien ne se passe.

    Stanis

    • cpb dit :

      Bonjour,

      Ce problème se pose souvent lorsque le driver série n’est pas dans le noyau. Pour vérifier :
      make ARCH=arm menuconfig
      menu « Device drivers »
      –> « Character devices »
      –> « Serial drivers »
      [*] « OMAP serial port support »
      [*] « Console on OMAP serial port »

      • Stanis dit :

        Merci de votre réponse. Malheureusement
        make ARCH=arm menuconfig
        menu « Device drivers »
        –> « Character devices »
        –> « Serial drivers »
        Jusque la je suis mais après .. impossible de trouver:
        [*] « OMAP serial port support »
        [*] « Console on OMAP serial port »
        je suis en kernel 2.6.37 cela peut-il venir de la ?

        • cpb dit :

          Bonjour,

          Pour que les options soient visibles, il faut que les architectures OMAP soient sélectionnées.

          Essayez d’utiliser ce fichier de configuration (je n’ai pas pu le tester mais ça donne une bonne base de départ).

          Il faut copier ce fichier à la racine des sources du noyau et le renommer en .config avant de lancer make ARCH=arm menuconfig.

          Y a-t-il une raison spéciale pour utiliser un noyau 2.6.37 ?

          • Hatsuharu dit :

            Bonjour,

            Comme pour Stanis, je n’ai plus d’affichage après « Uncompressing Linux… done, booting the kernel. »

            Je suis pour ma part en kernel 2.6.39.4 et
            [*] « OMAP serial port support »
            [*] « Console on OMAP serial port »
            sont bien sélectionné.

            Mes propres recherche mon amené à activer « Kernel low-level debugging functions » dans « Kernel hacking » sans grand changement non plus!

            Avez-vous une idée ?

            Merci d’avance pour votre aide

          • cpb dit :

            Bonsoir

            Pouvez-vous essayer la compilation avec ce fichier de configuration, pour vérifier s’il y a un changement ?

            Quelle est la version de U-boot ? Est-elle bien configurée pour utiliser ttyO1 (la lettre O, pas le zéro) et non ttyS1 ?

  8. Thomas S. dit :

    Bonjour,
    Je voulais signaler que c’est le fichier u-boot.img est necessaire pour pouvoir booter 🙂
    le fichier .bin en l’occurrence non.

    Du moins, ma carte (une pandaboard es) ne boot pas sans. Peut etre que u-boot a evolué depuis.

    Bonne journée

  9. Hatsuharu dit :

    J’ai trouvé un lien sympa qui m’a permis de trouver le problème: http://www.linuxembedded.fr/2011/02/utilisation-de-printascii-pour-la-mise-au-point-du-noyau-linux-arm/
    Sinon, j’utilise ttyO2 et u-boot est la version la plus récente soit la 2013.01-rc2 😉
    Je suis en train d’étudier les messages affichés sur ma console mais je sais déjà que j’ai une fatal error :s

    • Hatsuharu dit :

      Après recompilation avec votre fichier config, maintenant (toujours avec la modification du printk.c sinon je n’ai pas d’affichage), je bloque sur:
      Unhandled fault: alignment exception (0x001) at 0xe0b1379a
      Je n’ai pas trouvé de solution pour le moment… Peut-être une erreur de mon cross-compilateur ?

  10. Hatsuharu dit :

    Désolé de flooder mais voici le boot en entier:
    http://pastebin.com/kRQvQLJz

    Si vous avez une idée, merci d’avance!

  11. mkp dit :

    bonjour;

    le noyau Linux s’arrête au point: Freeing init memory: 400K , après ça j ai pas aucun message
    je suis bloqué et je sais pas ou réside le problème,

    Avez-vous une idée ?

    Merci d’avance pour votre aide

  12. klm dit :

    Bonjour,
    je suis un étudiant débutant en systèmes embarques et je cherche des livres me permettant d’apprendre à utiliser et à programmer le PandaBoard,
    Que me conseillez vous?

    Merci d’avance.

    • cpb dit :

      Bonjour si vous cherchez un livre pour comprendre le fonctionnement des systèmes embarqués basés sur Linux, je vous conseille celui de mon ami Pierre Ficheux « Linux embarqué » aux éditions Eyrolles.

      Pour la programmation système plus générale sous Linux, je ne peux que vous conseiller ceci : « Développement système sous Linux ». La nouvelle édition présente des exemples en langage C et en Python.

      • klm dit :

        Bonjour Monsieur,
        Merci pour votre réponse mais les livres que vous m’avez conseillé sont ils pour le PandaBoard ou bien pour le Raspberry Pi ou bien les deux (la manière de programmer le Raspberry Pi est la même que le PandaBoard? ) ? parce que dans mes TPs, on programmera que le PandaBoard !!!
        et quelle est la différence entre le PandaBoard et le Raspberry Pi?
        est ce que la programmation du PandaBoard est la même que le Raspberry Pi ?
        Peut on dire que celui qui sait programmer le Raspberry Pi peut parfaitement programmer le PandaBoard? parce que j’ai trouvé beaucoup de livre qui montre comment programmer le Raspberry Pi mais presque rien sur le PandaBoard ?

        Je vous remercie d’avance Monsieur

        • cpb dit :

          Les livres indiqués ne parlent pas de la Pandaboard mais de Linux embarqué. Je n’en connais aucun qui soit propre à la Pandaboard.
          Si vous avez des TP à faire sur Pandaboard, vous disposez certainement des informations propres à la Pandaboard dans votre cours.
          Le reste n’est que généralisations et analogies avec les exemples que vous trouverez pour d’autres cartes.

URL de trackback pour cette page