QT5- SD création - Olimex [FR]

Started by habanas, January 22, 2015, 12:20:30 PM

Previous topic - Next topic

habanas

Voila un petit tuto certainement pas parfais, résumant toutes les étapes pour obtenir un environnement complet pour développer des application QT5 compatible avec les carte Olimex
le process complet a était réaliser sur une carte A20-Lime donc a adapter selon votre carte ;)
j'ai essayer de créer un environnement sur debian 64bits mais rien a faire je bloque au niveaux de la cross compilation des source QT donc ce sera sur un environnement Debian 32bits
bonne lecture  8)




habanas

Install VM Debian
Conf debian
création SD
conf SD
conf SD QT
conf debian QT
conf QT
autres


Installation VM

Télécharger
virtualbox
à l'adresse suivante
http://download.virtualbox.org/virtualbox/4.3.20/VirtualBox-4.3.20-96997-Win.exe

et
debian (32bits) i382 (amd64) etant la version 64bits
http://cdimage.debian.org/debian-cd/7.8.0/i386/iso-cd/debian-7.8.0-i386-netinst.iso


installer virtualbox et créer une Machine virtuelle (VM)

nom : [votre choix]
type : Linux
Version : Debian (32 bit)
quantité mémoire 1024 minimum
créer un disque dur virtuel maintenant
format : VDI
Dynamiquement alloué
taille disque dur : 80 go minimum


installation Debian :
suivre les indication lors de l'installation
Attention a bien faire attention lors de l'attribution du mdp administrateur pour ne pas l'oublier
et pour plus de confort bien choisir votre langue pour avoir un clavier correctement mappé .

configuration Debian :
Pour résoudre le problème de résolution il faut installer les additions invitées
@virtualbox : Périphériques -> Insérer l'image CD des additions invité

démarrer un terminal en administrateur Application -> accessoire → terminal administrateur
ou sur un console normal tapez : su – et le mot de passe administrateur

Nous installons maintenant les paquet utils
#apt-get install linux-headers-`uname -r` build-essential
Se placer dans /media
#cd /media/
Monter le CD des additions invitées
#mount cdrom0

habanas

Se placer dans le répertoire du CD
#cd cdrom
Lancer le script
#sh VboxLinuxAddition-XXXX.run

il faut maintenant mettre a jour notre environnement avec les commandes suivante

#apt-get update
#apt-get upgrade

Dans certain cas il y a des problème de clef il faut faire la manipulation suivante
# apt-get install emdebian-archive-keyring

configuration clavier
il faut utiliser l'outil console-data
#apt-get install console-data
pour modifier plus tard le mappage il faut utiliser
#dpkg console-data

Pour les opération de compilation il peut être intéressant de supprimer le mode veille de la VM pour plus de confort
Utilisez les commandes
#xset s 0 0
#xset dpms 0 0 0
-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_--_-_-_-_-_-_-_-

habanas

Création SD

Processus complet pour créer une carte SD pour carte OLIMEX avec kernel 3.4.90 et Linux Debian

toutes les étapes seront réalisé en console et en mode administrateur

1. Installation de la toolchain

Avant d'installer la ToolChain il faut ajouter un dépôt a ceux existant pour notre VM:
#nano /etc/apt/sources.list
et ajouter à la fin
deb http://www.emdebian.org/debian squeeze main
deb http://www.emdebian.org/debian sid main (Pour la version wheezy de Debian)

puis ctrl-x
et o ou y selon la langue pour enregistrer

Installer la ToolChain avec les commande suivante

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

cela va installer les outils pour : configurer le kernel, compiler le kernel, le uboot  et finalement créer une image de ces éléments .
Git permet de télécharger des paquets sur Github

Vous avez maintenant les outils essentiel a la réalisation d'un noyau pour A20

2. construction du UBOOT

Nous allons créer un dossier pour ne pas mélanger les éléments.
# cd /home
# mkdir a20-olimex
# cd a20-olimex

Télécharger les source de uboot sur github
# git clone -b sunxi https://github.com/linux-sunxi/u-boot-sunxi.git

après le téléchargement vous avez un nouveaux répertoire
# cd u-boot-sunxi/

choisir dans les différente commande suivante celle correspondant a la carte A20 visé pour configurer le uboot
Les noms des différent fichier de configuration peuvent être trouvé dans le fichier boards.cfg

2.1 A20-OLinuXino_Lime2 board

# make A20-OLinuXino_Lime2_config ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

2.2 A20-SOM board

Il existe deux type de A20-SOM avec comme principale différence la vitesse du bus pour la

habanas

#4
mémoire DDR3

A20-SOM  rev.B  - DDR3 vitesse du bus 384MHz(6 layer PCB)

A20-SOM après rev.D - DDR3 vitesse du bus 480MHz(8 layer PCB)

A20-SOM up to rev.B type

# make Olimex_A20-SOM_config ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

A20-SOM after rev.D il est posible d'utiliser le configuration du Lime2

# make A20-OLinuXino_Lime2_config ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

2.3 A20-OLinuXino-MICRO board

# make A20-OLinuXino_Micro_config ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

2.4 A20-OLinuXino-LIME board

# make A20-OLinuXino_Lime_config ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

Pour construire le uboot utiliser les commandes suivante
se placer dans /usr/bin
# cd /usr/bin
Modifier le lien vers le compilateur avec la commande suivante
# ln -sf arm-linux-gnueabihf-gcc-4.7 arm-linux-gnueabihf-gcc
ensuite retourner dans le dossier uboot
# cd /home/a20-olimex/u-boot-sunxi/
# make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

A la fin du processus, vous pouvez vérifier si tout s'est bien passé

# ls u-boot.bin u-boot-sunxi-with-spl.bin spl/sunxi-spl.bin

Si le retour correspond a ça :
→ spl/sunxi-spl.bin  u-boot.bin  u-boot-sunxi-with-spl.bin
tout est OK !
# cd ..

Vous devez vous trouver dans le dossier suivant
/home/a20-olimex#

3. Construction du kernel

Les source du kernel sont disponible sur github
télécharger les avec :
# git clone https://github.com/linux-sunxi/linux-sunxi    (étape longue ~ 30 min a 1M/sec)

après le téléchargement allez dans le dossier
# cd linux-sunxi/

habanas

Pour ajouter le support SPI il faut
télécharger le fichier spi-sun7i.c

# wget https://raw.githubusercontent.com/OLIMEX/OLINUXINO/master/SOFTWARE/A20/A20-build/spi-sun7i.c

et le copier dans drivers/spi directory
# cp spi-sun7i.c drivers/spi

Télécharger les patch SPI.patch
# wget https://raw.githubusercontent.com/OLIMEX/OLINUXINO/master/SOFTWARE/A20/A20-build/SPI.patch

et appliquer le patch:
# patch -p0 < SPI.patch

Ils faut maintenant récupéré le fichier de configuration pour le kernel a20_olimex_defconfig
# wget https://raw.githubusercontent.com/OLIMEX/OLINUXINO/master/SOFTWARE/A20/A20-build/a20_olimex_defconfig

copier le fichier a20_olimex_defconfig dans le répertoire de configuration:
# cp a20_olimex_defconfig  arch/arm/configs/

et make:
# make ARCH=arm a20_olimex_defconfig

le résultat devrait être:

→ configuration written to .config

si vous voulez changer la configuration du kernel :
(Attention a avoir une console en pleine écran pour permettre l'ouverture de l'utilitaire)
# make ARCH=arm menuconfig

Maintenant vous pouvez continuer avec la compilation du kernel

# make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4 uImage

lorsque c'est fini vous avez un uImage et le message suivant qui confirme le bon déroulement:

Kernel: arch/arm/boot/zImage is ready
UIMAGE  arch/arm/boot/uImage
Image Name:   Linux-3.4.90+
Created:      Tue Aug 19 16:23:22 2014
Image Type:   ARM Linux Kernel Image (uncompressed)
Data Size:    4596072 Bytes = 4488.35 kB = 4.38 MB
Load Address: 40008000
Entry Point:  40008000
Image arch/arm/boot/uImage is ready

la prochaine étape et la construction des module du kernel:

habanas

# 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

A ce point vous disposé de l'uboot et des modules kernel compilé pour votre cible.
Le fichier uImage est dans linux-sunxi/arch/arm/boot/

Les modules kernel sont dans
linux-sunxi/out/lib/modules/3.x.xx

Ou 3.x.xx est la version du kernel. Dans notre cas
linux-sunxi/out/lib/modules/3.4.90+

4. formatage et préparation de la carte SD

il est recommandé d'utiliser une carte SD entre 2 et 16 Go en classe 10 .
Premièrement il faut créer une table de partitions adapter a notre SD avec l'outil fdisk
brancher SD dans un lecteur de carte SD sur la machine hôte .
Il faut activer le périphériques pour la VM dans le option virtualbox
@virtualbox → périphériques →  périphériques USB
Pour connaître le périphérique reconnus par notre VM il faut tester en branchant et débranchant la carte sd et en regarde le retour de
# ls /dev/sd avec un <TAB> <TAB> pour voir la différence en général le périphérique est le sdb

Lorsque vous connaissez le périphérique vous pouvez commencer les étapes pour le formater
# fdisk /dev/sdX

ensuite
# p

s'il existent des partitions, il faut les supprimer avec la commande suivante.
Répété l'opération jusqu'à ce qu'il n'y est plus de partitions
d enter

création de la première partition
# n enter p enter 1 enter enter +16M

Création de la seconde partition
# n enter p enter 2 enter enter enter

lister les partition créé
# p enter

Si vous avez correctement réaliser les étapes, vous devriez avoir pour une carte 4Go le message suivant

Disk /dev/sdg: 3980 MB, 3980394496 bytes
123 heads, 62 sectors/track, 1019 cylinders, total 7774208 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

habanas

Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sdg1            2048       34815       16384   83  Linux
/dev/sdg2           34816     7774207     3869696   83  Linux

Écrivais les partitions
press w

Si cette étape rate  il faut démonter la carte SD
#umount /media/[indicatif de la carte]
Refaite un fdisk puis w.

Maintenant nous allons formater le système de fichier de la carte
partition 1 → vfat
partition 2 → ext3
X etant la lettre correspondant a notre carte.
# mkfs.vfat /dev/sdX1
# mkfs.ext3 /dev/sdX2


5. Écrire le Uboot et u-boot-sunxi-with-spl.bin


Vous devez êtres dans  /home/a20-olimex# 
Attention il faut écrire ces blocs dans /dev/sdX et pas sdb1 ou sdb2

# dd if=u-boot-sunxi/u-boot-sunxi-with-spl.bin of=/dev/sdX bs=1024 seek=8

6. Écrire kernel uImage sur la carte SD
se placer dans le dossier a20-olimex
cd /home/a20-olimex#

créer un fichier pour monter les partitions de la carte SD
# mkdir /mnt/sd

monter la première partition de la carte SD
# mount /dev/sdX1 /mnt/sd

copier le Kernel uImage dans la première partition
# cp linux-sunxi/arch/arm/boot/uImage /mnt/sd

7. Écrire le fichier script.bin

Le script.bin contient la configuration des paramètres concernant les GPIO assignement, mémoire DRR , écran utilisé ... .

7.1 Pour A20-OLinuXino_Lime2 board,  télécharger le script.bin suivant
# wget https://github.com/OLIMEX/OLINUXINO/raw/master/SOFTWARE/A20/A20-build/scripts_a20_Lime2_34_90_camera_rel_2/script.bin

7.2 Pour A20-SOM board télécharger le script.bin suivant

habanas

# wget https://github.com/OLIMEX/OLINUXINO/raw/master/SOFTWARE/A20/A20-build/A20-SOM-3.4.90_camera_scripts_rel_3/script_a20_SOM_HDMI_720p50/script.bin

7.3 Pour A20-OLinuXino-MICRO board télécharger le script.bin suivant
# wget https://github.com/OLIMEX/OLINUXINO/raw/master/SOFTWARE/A20/A20-build/script_a20_OLinuXino-micro_3.4.90_camera_rel_10/script.bin

7.4 Pour A20-OLinuXino-LIME board télécharger le script.bin suivant
# wget https://github.com/OLIMEX/OLINUXINO/raw/master/SOFTWARE/A20/A20-build/script_a20_lime_3.4.90_camera_rel_3/script.bin

Enfin, copier le script.bin dans la partition monter de la carte
# cp script.bin /mnt/sd
# sync
# umount /dev/sdX1

8. Debian rootfs

Le noyaux Linux et Uboot sont prêt, maintenant nous allons installer sur la deuxième partition le rootfs.
Il serais possible de le construire mais cela serais trop long (voir multistrap). Nous préférons en prendre un déjà réalisé
nous quittons le repertoire kernel

# cd ..
Vous devriez être dans le dossier a20-olimex

# /home/user/a20-olimex

télécharger le Debian rootfs avec le nom "debian_FS_34_90_camera_A20-olimex.tgz" ,il vous faudra un client torrent  (Azureus, uTorrent, qBittorrent,Rtorrent etc).
Apt-get install rtorrent
Le liens du torrent:
https://www.olimex.com/wiki/images/2/29/Debian_FS_34_90_camera_A20-olimex.torrent

monter maintenant la deuxième partition:
# mount /dev/sdX2 /mnt/sd

et décompresser l'archive dans la SD

# tar zxvf debian_FS_34_90_camera_A20-olimex.tgz -C /mnt/sd
# ls /mnt/sd

le résultat devrais ressembler a ceci
bin   dev  home  lost+found  mnt  proc  run   selinux  sys  usr
boot  etc  lib   media       opt  root  sbin  srv      tmp  var

Il faut maintenant remplacer les module kernel par ceux compilé
# rm -rf /mnt/sd/lib/modules/*
# cp -rfv linux-sunxi/out/lib/modules/3.x.xx+/ /mnt/sd/lib/modules/

dans notre cas:

habanas

# cp -rfv linux-sunxi/out/lib/modules/3.4.90+/ /mnt/sd/lib/modules/

remplacer /lib/firmware folder with the generated /linux-sunxi/out/firmware
#cp -rfv linux-sunxi/out/lib/firmware/ /mnt/sd/lib/
# sync
# umount /mnt/sdX2

A ce point vous avez une carte prête a être utilisé .
Login et mot de passe par défaut →  root / olimex

-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_

habanas

Configuration SD
démarrage
Pour le premier démarrage il est intéressant d'utiliser la sortie debug sur UART pour vérifier que le démarrage se passe bien et récupérer quelque informations
branche la carte sur uart pour accéder lors du premier démarrage a la console et activer le mode DHCP pour pouvoir accéder a la carte par ssh (plus simple pour contrôler la carte)

réseaux
Avant d'établir une IP fixe il est utile d'utiliser le DHCP pour intégrer la route vers la Boxe internet
ou attribuer directement la route :
#route add -net 192.168.55.0 netmask 255.255.255.0 gw 192.168.1.254 dev eth0 (exemple a adapter a votre reseaux)
pour afficher l'IP attribuer dans la console
# ifconfig eth0
et pour modifier les paramètres de l'interface réseaux il faut éditer le fichier interfaces
nano /etc/network/interfaces
ensuite pour redémarrer une interfaces on effectue
ifdown eth0
ifup eth0
ou
/etc/init.d/networking restart    (celle-ci redémarre toute les interfaces)

FEX
(A venir)
http://linux-sunxi.org/Fex_Guide

choix écran
Olimex fourni un script qui permet de choisir quelle écran utiliser (HDMI, LCD 4,5,11 pouces) dans  /root
# cd /root 
# ./change_display_olimex_a20.sh

calibration tactile
une fonction est directement intégrer au noyaux et il est possible de l'appeler avec l'instruction suivante
#ts_calibrate

-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_

habanas

Configuration SD pour QT5

Pour exécuter les application QT5 il faut installer les bon outils ainsi que les librairie qui seront utile a Qt tel que les driver graphique les lib multimédia et les pilotes openGL pour le module Mali (processeur graphique de nos carte)

Installation mali

La configuration par défaut impose que le module mali soit désactiver. Pour le réactiver il faut soit l'appeler :
#modprobe mali
ou pour l'activer au boot éditer le fichier /etc/modules
#nano /etc/modules
et dé-commenter le module en supprimant le « # » devant

Pour qu'un user normal puisse utiliser ce module il faut lui donner la permission avec :

KERNEL=="mali", MODE="0660", GROUP="video"
KERNEL=="ump", MODE="0660", GROUP="video"

il faut maintenant installer lib-UMP
prérequis
# apt-get install git build-essential autoconf libtool

récupérer le dépôt libUMP
#git clone https://github.com/linux-sunxi/libump.git
#cd libump

build de libump
#apt-get install debhelper dh-autoreconf pkg-config
#dpkg-buildpackage -b
#dpkg -i ../libump_*.deb


#autoreconf -i
#./configure
#make
#make install


Installation Mali

#apt-get install git build-essential autoconf automake
pour installer la version x11, ajouter
#apt-get install xutils-dev

récupéré le dépôt
#git clone --recursive https://github.com/linux-sunxi/sunxi-mali.git
#cd sunxi-mali

Il reste a compiler avec la configuration voulu
# make config (avec auto détection de la configuration)
Pour choisir l'environnement (exemple framebuffer)

habanas

#make config VERSION=r3p0 ABI=armhf EGL_TYPE=framebuffer

pour X11 seulement
# apt-get install libx11-dev libxext-dev libdrm-dev
# git clone https://github.com/robclark/libdri2
# cd libdri2
# ./autogen.sh
# ./configure
# make
# make install
# ldconfig

Enfin pour terminer l'installation des composant il faut se placer dans le dossier sunxi-mali puis
#make install

pour tester il faut aller dans le dossier sunxi-mali et compiler le test
#make test
# cd test
#./test

Doit afficher un triangle dans une fenêtre sur x11 ou en console .

-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_

habanas

#13
Configuration Debian 02 (compilation LibQT):

installer sshfs
#apt-get install ssh
#apt-get install sshfs

créer un dossier dans /mnt
#mkdir /mnt/a20

se connecter a la carte cible
#sshfs -o allow_other root@193.253.231.61:/ /mnt/a20
il vous sera normalement demandé le mot de passe administrateur de la carte cible
vérifier que le lien est bien réaliser en regardant dans /mnt/a20

Ensuite, il faut téléchargé la chaîne de cross compilation
https://releases.linaro.org/13.09/components/toolchain/binaries
et chercher gcc-linaro-arm-linux-gnueabihf-4.8-2013.09_linux.tar.xz

#wget https://releases.linaro.org/13.09/components/toolchain/binaries/gcc-linaro-arm-linux-gnueabihf-4.8-2013.09_linux.tar.xz
et décompresser le :
#tar xvfJ gcc-linaro-arm-linux-gnueabihf-4.8-2013.09_win32.tar.xz

ensuite il faut récupérer les patch pour le compilateur :

#apt-get install git
#git clone https://gitorious.org/cross-compile-tools/cross-compile-tools.git
#cd cross-compile-tools
--remplacer [chemin compilateur linaro] par le chemin du compilateur Linaro--
#./fixQualifiedLibraryPaths /mnt/a20/ /[chemin du compilateur linaro]/gcc-linaro-arm-linux-gnueabihf-4.8-2013.09_linux/bin/arm-linux-gnueabihf-g++


il faut maintenant télécharger QT_everywhere
http://download.qt.io/archive/qt/5.3/5.3.2/single/

#wget http://download.qt.io/archive/qt/5.3/5.3.2/single/qt-everywhere-opensource-src-5.3.2.tar.gz
décompresser l'archive :
#tar -zxvf qt-everywhere-opensource-src-5.3.2.tar.gz
entrer dans le dossier qt-everywhere
#cd qt-everywhere-opensource-src-5.3.2

et effectuer les instruction suivante

#mkdir qtbase/mkspecs/devices/linux-a20olimex-g++/
#cp qtbase/mkspecs/devices/linux-beagleboard-g++/qplatformdefs.h qtbase/mkspecs/devices/linux-a20olimex-g++/

il va falloir éditer le fichier qmake.conf avec :
#nano qtbase/mkspecs/devices/linux-a20olimex-g++/qmake.conf

copier coller la configuration suivante:

habanas


///////////////////////////////////////////////////////////////////
#
# qmake configuration for the A20_OlinuxinO boards
# http://www.olimex.com/

MAKEFILE_GENERATOR      = UNIX
CONFIG                 += incremental gdb_dwarf_index
QMAKE_INCREMENTAL_STYLE = sublib

include(../../common/linux.conf)
include(../../common/gcc-base-unix.conf)
include(../../common/g++-unix.conf)

load(device_config)

QT_QPA_DEFAULT_PLATFORM = eglfs
#EGLFS_PLATFORM_HOOKS_SOURCES = $$PWD/qeglfshooks_a20.cpp
# modifications to g++.conf
QMAKE_CC                = $${CROSS_COMPILE}gcc
QMAKE_CXX               = $${CROSS_COMPILE}g++
QMAKE_LINK              = $${QMAKE_CXX}
QMAKE_LINK_SHLIB        = $${QMAKE_CXX}

# modifications to linux.conf
QMAKE_AR                = $${CROSS_COMPILE}ar cqs
QMAKE_OBJCOPY           = $${CROSS_COMPILE}objcopy
QMAKE_NM                = $${CROSS_COMPILE}nm -P
QMAKE_STRIP             = $${CROSS_COMPILE}strip

COMPILER_FLAGS          = -march=armv7-a -mtune=cortex-a7 -mfpu=neon -DLINUX=1 -DEGL_API_FB=1 -mfloat-abi=hard

#modifications to gcc-base.conf
QMAKE_CFLAGS           += $${COMPILER_FLAGS}
QMAKE_CXXFLAGS         += $${COMPILER_FLAGS}
QMAKE_CXXFLAGS_RELEASE += -O3

QMAKE_LIBS             += -lrt -lpthread -ldl

# Extra stuff (OpenGL, DirectFB, ...)
QMAKE_INCDIR_EGL        = /mnt/a20/usr/include/EGL
QMAKE_LIBDIR_EGL        = /mnt/a20/usr/lib
QMAKE_INCDIR_OPENGL_ES2 = /mnt/a20/usr/include/GLES2
QMAKE_LIBDIR_OPENGL_ES2 = /mnt/a20/usr/lib
#QMAKE_INCDIR_OPENVG     = $${QMAKE_INCDIR_EGL}
#QMAKE_LIBDIR_OPENVG     = $${QMAKE_LIBDIR_EGL}

QMAKE_LIBS_EGL          = -lEGL
QMAKE_LIBS_OPENGL_ES2   = -lGLESv2 $${QMAKE_LIBS_EGL}
#QMAKE_LIBS_OPENVG       = -lOpenVG $${QMAKE_LIBS_EGL}

# Sanity check
deviceSanityCheckCompiler()

load(qt_config)


////////////////////////////////////////////////////////////////////////////