Outils pour utilisateurs

Outils du site


tuto_a20-olinuxino-micro_generation_d_image_a_base_du_noyau_3.4.79

Génération d'image à base de noyau 3.4.79+ pour la carte A20-OLinuXino


Introduction

Pour faire suite aux articles précédents (http://fablab-robert-houdin.org/wiki/doku.php?id=tuto_a20-olinuxino-micro_decouverte_de_la_carte_de_developement_a20-olinuxino-micro & Un serveur d'application Web en python, avec Flask, et parceque j'avais envie d'essayer de générer ma propre image systeme pour ma carte A20-OLinuXino, je vous propose un pur plagia de cette page web decrivant la generation de l'image. J'ai qd meme fait l'effort de traduire ^_^.

L'oeil du lecteur avertit pourra voir tout de meme quelques commandes GIT, un peu de compil, et tout ce qu'il faut faire pour générer ces images : un amorceur (µBoot), un noyau, et un systeme (rootfs).

Bonne lecture !


Prérequis

Avant de commencer, sur une ditribution Debian 7 “Wheezy”, il convient de procéder à l'ajout des dépôts nécessaires de “emdebian”.

$ sudo vi /etc/apt/sources.list

Et ajouter la ligne suivante.

deb http://www.emdebian.org/debian/ unstable main

Il convient ensuite de proceder a une mise a jour des depots.

$ sudo apt-get update

Sur une distribution Ubuntu 14.04 LTS, il n'est pas necessaire de proceder a l'ajout de depot.

sIl est ensuite necesaaire d'installer les paquets suivants.

$ sudo apt-get install gcc-4.7-arm-linux-gnueabihf ncurses-dev uboot-mkimage build-essential git

Afin de travailler de maniere organiser, il est possible de se mettre a l'aise dans un espace de travail. Tout le monde travaillant selon sa methode, cette etape est facultative :

$ cd Workspaces
$ mkdir workspace-Olimex
$ cd worspace-Olimex
$ mkdir a20_kernel_3.4
$ cd a20_kernel_3.4

le retour de la commande “pwd” devrait donner ceci :

$ pwd
/home/<user>/Workspaces/workspace-Olimex/a20_kernel_3.4

Compilation de l'amorceur U-Boot

Afin de générer l'amorceur pour la carte A20-OLinuXino, il convient de télécharger les sources du repo distant à l'aide de GIT.

$ git clone -b sunxi https://github.com/linux-sunxi/u-boot-sunxi.git
Cloning into 'u-boot-sunxi'...
remote: Reusing existing pack: 261378, done.
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 261383 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (261383/261383), 72.81 MiB | 148.00 KiB/s, done.
Resolving deltas: 100% (205487/205487), done.
Checking connectivity... done.

Une fois le téléchargement des sources terminé, le répertoire “u-boot-sunxi” est créé et contient le code source de U-Boot.

$ cd u-boot-sunxi

Le code source téléchargé est en date du dernier commit. On parle de la version “HEAD”. La commande suivante indique le hash SHA-1 du dernier “commit”.

[sunxi] $ git rev-parse --verify HEAD
39b2fdd0339091ae9b2e8f30d61e8f5d1413c10b

Les instructions cette page sont valables pour le commit “8a4621c488f33089d831168bfa5bae210a5684c8”. Il convient de se placer a ce commit via la commande suivante :

[sunxi] $ git reset --hard 8a4621c488f33089d831168bfa5bae210a5684c8
HEAD is now at 8a4621c sunxi: Add EU3000 board

La compilation se fait a l'aide de la commande suivante ; cela configurera et compilera U-Boot pour notre carte.

$ make a20-olinuxino_micro CROSS_COMPILE=arm-linux-gnueabihf-

A la fin de la compilation, il est possible de verifier que tout s'est bien déroulé.

[sunxi] $ ls u-boot.bin u-boot-sunxi-with-spl.bin spl/sunxi-spl.bin
spl/sunxi-spl.bin  u-boot.bin  u-boot-sunxi-with-spl.bin

Si tout les fichiers listés sont présents, alors tout s'est bien passé.

Nous en avons terminée avec U-Boot, pour le moment…

$ cd ..

Ce qui devrait nous ramener dans le répertoire “a20_kernel_3.4”.


Compilation du noyau

Recuperation des sources

Nous allons ensuite récupérer les sources du noyau linux-sunxi. Il s'agit d'un noyau specifique pour la famille de SoC (System-on-Chip) ARM concus par la firme Alwinner. L'opération est un peu chronophage, cela a pris 1h42 chez moi…

$ git clone https://github.com/linux-sunxi/linux-sunxi
Cloning into 'linux-sunxi'...
remote: Counting objects: 3923602, done.
remote: Compressing objects: 100% (669444/669444), done.
remote: Total 3923602 (delta 3222326), reused 3923513 (delta 3222246)
Receiving objects: 100% (3923602/3923602), 1.18 GiB | 357.00 KiB/s, done.
Resolving deltas: 100% (3222326/3222326), done.
Checking connectivity... done.
Checking out files: 100% (43049/43049), done.

Une fois le téléchargement des sources du noyau terminé, le répertoire “linux-sunxi” est créé et contient les sources du noyau.

$ cd linux-sunxi

Il s'agit là de la derniere version (HEAD). La commande suivante indique le hash SHA-1 du dernier “commit”.

[sunxi-3.4] $ git rev-parse --verify HEAD
39b2fdd0339091ae9b2e8f30d61e8f5d1413c10b

Les instructions de la page sus-mentionnée, indiquent de se placer au niveau du commit “a7350cb6a9ec1aae510e26cdc730f05f12e13f9f”, on peut proceder ainsi :

[sunxi-3.4] $ git reset --hard a7350cb6a9ec1aae510e26cdc730f05f12e13f9f
HEAD is now at a7350cb Merge branch 'reference-3.4' into sunxi-3.4

Configuration du noyau

La configuration est l'ultime etape avant la compilation du noyau, c'est ou on specifie quels modules, et quelle fonctionnalitées on souhaite avoir dans le noyau. C'est une etape importante permettant de “tuner” le coeur d'un systeme linux. Mais alors, quels modules allons nous mettre dans notre noyau ?

Pas de panique, Les gens d'Olimex fournissent un fichier defconfig telechargeable ici : https://docs.google.com/file/d/0B-bAEPML8fwlNzBNN1N2SGpmblk/edit?pli=1. Il convient de le telecharger, puis de le copier dans arch/arm/configs

[sunxi-3.4] $ cp /home/<user>/Downloads/a20_defconfig arch/arm/configs

On demande ensuite de configurer le noyau sur la base du contenu du fichier defconfig.

[sunxi-3.4] $ make ARCH=arm a20_defconfig
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/kconfig/conf.o
  SHIPPED scripts/kconfig/zconf.tab.c
  SHIPPED scripts/kconfig/zconf.lex.c
  SHIPPED scripts/kconfig/zconf.hash.c
  HOSTCC  scripts/kconfig/zconf.tab.o
  HOSTLD  scripts/kconfig/conf
#
# configuration written to .config
#

Il est possible de faire quelques ajustements dans la configuration du noyau, a la main :

[sunxi-3.4] $ make ARCH=arm menuconfig

L'outil menuconfig aporte des changements a un fichier .config existant ; Il est aussi possible de l'editer avec des outils comme vi ou nano. A l'aide de cet outil, il est possible d'ajouter ou d'enlever le support de certains peripheriques. Il convient d'observer une certaine vigilance quand a l'utilisation de cet outil. Une configuration erroné peut aboutir a un noyau qui ne fonctionnerait pas corectement.

Nous pouvons a présent proceder a la compilation proprement dite du noyau.

Patch I2C (facultatif)

Olimex a créé quelques modules pouvant se chainer les uns derrieres les autres a l'aide du bus I2C. Ces modules sont labelisés UEXT. On peut donc adjoindre a notre carte favorite un accelerometre, une webcam, et que sais-je encore (https://www.olimex.com/Products/Modules/).

Afin de pouvoir interfacer ces modules, il faut baisser la frequence de l'I2C de 200kHz à 100kHz. c'est le role du patch disponible a cette adresse : https://docs.google.com/file/d/0B-bAEPML8fwlSW44ZGdOUDUxRzA/edit?pli=1. Il convient de le télécharger, si toutefois cette fonctionnalité vous interresse.

[sunxi-3.4] $ cp /home/nuptse/Downloads/sunxi-i2c.patch .
[sunxi-3.4] $ patch -p0 < sunxi-i2c.patch
patching file arch/arm/plat-sunxi/include/plat/i2c.h

Pour ma part, je ne prevoit pas d'utiliser de modules UEXT pour le moment…

Moi vouloir compiler !

Il peut etre utile, pour eviter tout problemes de droits lors du deploiement, de passer en mode super-utilisateur.

$ sudo su

La compilation est ensuite une formalité. Elle se lance a l'aide de la commande suivante :

[sunxi-3.4] $ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4 uImage

Une fois la compilation terminée, une image du noyau est générée, et le resultat devrait etre le suivant.

Image Name:   Linux-3.4.67
Created:      Thu Jul 10 12:52:50 2014
Image Type:   ARM Linux Kernel Image (uncompressed)
Data Size:    4519072 Bytes = 4413.16 kB = 4.31 MB
Load Address: 40008000
Entry Point:  40008000
  Image arch/arm/boot/uImage is ready

Il convient ensuite de procéder a la compilation des module du noyau et à leur installation.

$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4 INSTALL_MOD_PATH=out modules
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4 INSTALL_MOD_PATH=out modules_install

Tada ! Nous avons a présent un bootloader (U-Boot), un noyau (uImage) ainsi que tout les modules.

Le fichier uImage se trouve dans le repetoire linux-sunxi/arch/arm/boot/

les fichiers de modules du noyau se trouvent dans linux-sunxi/out/lib/modules/3.x.xx

ou 3.x.xx est le numeror de version du noyau.

Dans notre cas le repertoire est linux-sunxi/out/lib/modules/3.4.90+


Préparation de la carte SD

Il faut à present préparer la carte SD qui accueillera le systeme.

Avant de commencer, il nous faut identifier notre carte SD. Quel est son nom de device ? Il y a plusieurs methodes.

On peut y aller a tâtons en utilisant la commande “ls” :

[sunxi-3.4] $ ls /dev/sda
completing files
sda#   sda1#  sda2#  sda5#  sda6#

Ce qui nous donne une liste des devices dont le noms commence par “sd”. Cependant, me concernant, je ne trouve que mon disque systeme, avec mes differentes partitions.

La commande suivante me donne une meilleure indication :

[sunxi-3.4] % dmesg | tail
[139218.637959] mmcblk0: error -84 transferring data, sector 0, nr 8, cmd response 0x900, card status 0xb00
[139218.637962] mmcblk0: retrying using single block read
[139218.640706] mmcblk0: error -84 transferring data, sector 0, nr 8, cmd response 0x900, card status 0x0
[139218.643456] mmcblk0: error -84 transferring data, sector 1, nr 7, cmd response 0x900, card status 0x0
[139218.646205] mmcblk0: error -84 transferring data, sector 2, nr 6, cmd response 0x900, card status 0x0
[139218.648973] mmcblk0: error -84 transferring data, sector 3, nr 5, cmd response 0x900, card status 0x0
[139218.651744] mmcblk0: error -84 transferring data, sector 4, nr 4, cmd response 0x900, card status 0x0
[139218.654494] mmcblk0: error -84 transferring data, sector 5, nr 3, cmd response 0x900, card status 0x0
[139218.657294] mmcblk0: error -84 transferring data, sector 6, nr 2, cmd response 0x900, card status 0x0
[139218.660041] mmcblk0: error -84 transferring data, sector 7, nr 1, cmd response 0x900, card status 0x0

Ha tiens ? Mince, il y a l'air d'y avoir des erreurs… OK. Passons, nous avons notre nom de device.

Lancons donc l'utilitaire de partitionnement des disques. Pour ce faire, il peut etre necessaire de le faire en mode super-utilisateur. De meme, avant toute intervention sur la table des partitions d'un disque, il faut s'assurer que ce dernier n'est pas “monté” ; ce qui est souvent fait automatiquement lorsque l'on insere une carte SD ou une clef USB.

[sunxi-3.4] $ fdisk /dev/mmcblk0 
fdisk: unable to open /dev/mmcblk0: Permission denied
1 [sunxi-3.4] $ sudo su
[sunxi-3.4] % mount
[...]
/dev/mmcblk0p1 on /media/nuptse/82CB-4D0F type vfat (rw,nosuid,nodev,uid=1000,gid=1000,shortname=mixed,dmask=0077,utf8=1,showexec,flush,uhelper=udisks2)
/dev/mmcblk0p2 on /media/nuptse/9741b782-6c0b-4b83-8a39-bbfcd8826f2f type ext3 (rw,nosuid,nodev,uhelper=udisks2)
[sunxi-3.4] % umount /dev/mmcblk0p*
[sunxi-3.4] % fdisk /dev/mmcblk0

FDisk est un utilitaire de partitionement des disque interactif en ligne de commande. Une fois fdisk lancé, taper “p” pour imprimer la liste des partitions. Puis supprimer toutes les partitions (“d”).

Command (m for help): p
 
Disk /dev/mmcblk0: 8053 MB, 8053063680 bytes
4 heads, 16 sectors/track, 245760 cylinders, total 15728640 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0006bc79
 
        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1            2048       34815       16384   83  Linux
/dev/mmcblk0p2           34816    15728639     7846912   83  Linux
 
Command (m for help): d
Partition number (1-4): 1
 
Command (m for help): d
Selected partition 2

Voila toutes les partitions supprimées. Créons-en de nouvelles. La premiere sera petite (16M) et servira a l'amorcage du systeme. La seconde prendra le reste de la place, et contiendra le systeme de fichier racine.

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1): 
Using default value 1
First sector (2048-15728639, default 2048): 
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-15728639, default 15728639): +16M
 
Command (m for help): n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): 
Using default response p
Partition number (1-4, default 2): 
Using default value 2
First sector (34816-15728639, default 34816): 
Using default value 34816
Last sector, +sectors or +size{K,M,G} (34816-15728639, default 15728639): 
Using default value 15728639

l'ecriture sur la carte se fait en tapant “w” puis entrée.

Command (m for help): w
The partition table has been altered!
 
Calling ioctl() to re-read partition table.
Syncing disks.

Il convient ensuite de formater nos toutes nouvelles partitions. Là encore, un demontage préalable peut etre necessaire, dans la mesure ou l'ecriture de la table des partitions a provoqué une resynchronisation ainsi qu'une relecture des systemes de fichiers.

[sunxi-3.4] % umount /dev/mmcblk0p*
[sunxi-3.4] % mkfs.vfat /dev/mmcblk0p1
mkfs.fat 3.0.26 (2014-03-07)
[sunxi-3.4] % mkfs.ext3 /dev/mmcblk0p2
mke2fs 1.42.9 (4-Feb-2014)
Discarding device blocks: done                            
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
490560 inodes, 1961728 blocks
98086 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2009071616
60 block groups
32768 blocks per group, 32768 fragments per group
8176 inodes per group
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
 
Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done 

Deploiement du systeme sur la carte SD

Bootloader

Il est temps a present de deployer le systeme sur la carte SD. Commencons par l'amorceur (on parle aussi de bootloader).

commencons par nous placer dans le bon repertoire. Nous devrions etre dans le repertoire suivant :

% pwd
/home/<user>/Workspaces/workspace-Olimex/a20_kernel_3.4

On ecrit ensuite le bootloader sur la carte SD. On remarquera l'utilisation de la commande “dd”. En effet, souvenez vous, nous avons créé la premiere partition a partir du block 2048. Les blocs 0 à 2048 contiennent le secteur d'amorcage. La commande “dd” ecrira directement.

% dd if=u-boot-sunxi/u-boot-sunxi-with-spl.bin of=/dev/mmcblk0 bs=1024 seek=8
259+1 records in
259+1 records out
265320 bytes (265 kB) copied, 0,114387 s, 2,3 MB/s

Noyau

Afin de deployer le noyau, nous allons créer un point de montage dans /mnt.

% mkdir /mnt/mmcblk

Nous pouvons a présent monter un systeme de fichier sur ce point de montage. Cela se fait a l'aide de la commande “mount”.

% mount /dev/mmcblk0p1 /mnt/mmcblk

L'image noyau est ensuite simplement copiée a la racine du systeme de fichier nouvelement monté.

% cp linux-sunxi/arch/arm/boot/uImage /mnt/mmcblk

Il faut ensuite recupérer le fichier script.bin a l'adresse suivante : https://docs.google.com/file/d/0B-bAEPML8fwlekZySFRTZEN6eXM/edit?pli=1. Il s'agit là d'un fichier tres important comportant des parametres de configuration comme l'assignation des ports GPIO, parametres de la memoire DDR, resolution de la Video, etc…

Idem, on le copie a la racine, a coté de l'image noyau.

% cp /home/nuptse/Downloads/script.bin /mnt/mmcblk

On synchronise puis demonte la carte SD.

% sync
% umount /dev/mmcblk0p1

Deploiement du rootfs

Le noyau et le bootloader sont prets. Il faut a present deployer une ditribution Linux rootfs.

La contruction d'un rootfs est un autre sujet, qui pourrait faire l'objet d'un tuto a part entiere. Il faut savoir qu'il en existe des deja pre-contruits que l'on peut utiliser comme bon nous semble.

Olimex fournit un rootfs debian : https://drive.google.com/file/d/0B-bAEPML8fwlXzRobTBrbldmUEE/edit?usp=sharing

Il convient donc de monter la seconde partition, celle en ext3, qui accueillera le systeme.

% mount /dev/mmcblk0p2 /mnt/mmcblk

L'archive rootfs téléchargée peut ensuite etre decompressée de la maniere suivante.

% tar xzvf /home/<user>/Downloads/debian_34_67_fs.tgz -C /mnt/mmcblk
% ls /mnt/mmcblk
bin   dev  home  lost+found  mnt  proc  run   selinux  sys  usr
boot  etc  lib   media       opt  root  sbin  srv      tmp  var

Il faut ensuite remplacer les modules noyau par ceux que l'on a compilé.

% rm -rf /mnt/mmcblk/lib/modules/*
% cp -rfv linux-sunxi/out/lib/modules/3.4.79+/ /mnt/mmcblk/lib/modules/

On procede de meme pour les firmwares.

% rm -rf /mnt/mmcblk/lib/firmware/
% cp -rfv linux-sunxi/out/lib/firmware/ /mnt/mmcblk/lib/

On synchronise puis demonte la carte SD.

% sync
% umount /dev/mmcblk0p2

Mise en route

Il convient ensuite de retirer la carte du lecteur de cartes, puis de l'inserer dans la A20-OLinuXino, dans son emplacement ; et de mettre sous tension.

On aura auparavant connecté la carte à un ecran a l'iade d'un cable HDMI, ou bien a l'aide d'une liaison serie.

Le user/password par defaut est : root/olimex. Il convient de le changer rapidement avant de la connecter au reseau ; et par extension a internet.


Remarques, Propositions d'améliorations, Questions

Vous pouvez poster vos remarques, propositions d’amélioration, et questions sur le forum, dans la discussion prévue a cet effet : http://fablab-robert-houdin.org/fablab/phpBB-3.0.11-fr/phpBB3/viewtopic.php?f=5&t=43


tuto_a20-olinuxino-micro_generation_d_image_a_base_du_noyau_3.4.79.txt · Dernière modification: 2014/07/10 12:58 par spelle