Pour pouvoir utiliser QtQuick et autres gadgets, j’avais besoin de Qt 5 sur le BBB, avec le support d’OpenGL Es 2.
J’ai déjà compilé Qt5 sur linux, mais allons-y pour la même chose sous OSx.
Sur un des BBB, j’ai un écran tactile de 7″ qui vient de chez 4D Systems. Il fonctionne bien, mais comme la plupart des écrans tactiles pour le Beagle Bone, la partie tactile utilise les convertisseurs AD du BeagleBone. La partie tactile est utilisable, mais pas de manière optimale. Dans un exemple de Qt, Calculator, souvent il faut s’y reprendre à plusieurs fois pour qu’une touche soit détectée. J’ai cherché, et je ne suis pas le seul à avoir remarqué ça. Donc, j’utilise un module à part pour l’écran tactile:un Egalax en USB acheté en Chine à pas cher avec une dalle tactile supplémentaire.
Tout ça pour en venir à une constatation: avec ce module, bien que sous Qt 4.8 en QWS tout fonctionne, lorsque qu’on lance un programme compilé sous Qt5, l’axe des Y est renversé. Apparemment cela vient de la librairie TSLib.
La solution est donc de recompiler cette librairie et de l’inclure dans la compilation de Qt5 en partant du repo sur github.
Prérequis: automake, autoconf et libtool avec
sudo port install automake autoconf libtool
Bien entendu la toolchain de cross-compilation qui va bien ( ici la 4.8 ) de chez Knut: ici
Il peut aussi manquer le GCC.
Dans ce cas là:
sudo port install gcc48
Puis pour sélectionner la version de gcc à utiliser:
port select --list gcc
Available versions for gcc: mp-gcc48 none (active)
sudo port select --set gcc mp-gcc48
Pour compiler TSlib:
export CC=/usr/local/linaro/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc export CXX=/usr/local/linaro/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++ export CONFIG_SITE=arm-linux.autogen ./autogen.sh ./configure --host=arm-linux-gnueabihf --prefix /usr/local/opt/qt5.4/tslib -enable-static=yes -enable-shared=yes make make install
cd /usr/local/opt/qt5.4/tslib/ tar czvf tslib.tar.gz bin include lib scp tslib.tar.gz root@192.168.10.85:/usr/
Et sur le BBB:
cd /usr/ tar zxvf tslib.tar.gz rm tslib.tar.gz
On se retrouve donc avec la TSlib fraichement compilée.
Pour ce qui est de OpenGL, j’ai pris un raccourci.
Sous ma machine virtuelle debian, sur laquelle je génère des images pour le BBB, j’ai copié le répertoire du SDK pour la partie graphique sgx.
Rendons à César ce qui lui appartient, j’ai suivi les préceptes de Robert Nelson qui sont ici: https://eewiki.net/display/linuxonarm/BeagleBone+Black pour pouvoir obtenir une image avec un kernel 3.15, justement à cause de l’openGL ( tout du moins à l’époque où je me suis embarqué là dedans ).
Robert est très sympa et on a eu quelques échanges pour pouvoir intégrer la cape 4D Systems pour l’écran tactile.
Je ne vais pas développer ici, car ça a été un peu tordu à faire au début quand on est béotien comme moi en ce qui concerne les Device Trees, et qu’il faut intégrer le LCD et le pinmux des ports dont j’ai besoin.
Revenons à la partie OpenGL.
Donc après avoir téléchargé le dépot de Robert, il suffit de placer le répertoire SDK_BIN à un endroit qui vous convient. Je l’ai mis dans /Users/cedric/Development/BeagleBone dans mon cas.
La configuration pour pouvoir compiler Qt5
J’ai copié /Users/cedric/Qt/5.4/Src/qtbase/mkspecs/linux-arm-gnueabi-g++
vers : /Users/cedric/Qt/5.4/Src/qtbase/mkspecs/linux-arm-gnueabihf-g++
Le qmake.conf se retrouve être:
# # qmake configuration for building with arm-linux-gnueabi-g++ # MAKEFILE_GENERATOR = UNIX CONFIG += incremental QMAKE_INCREMENTAL_STYLE = sublib include(../common/linux.conf) include(../common/gcc-base-unix.conf) include(../common/g++-unix.conf) # modifications to g++.conf QMAKE_CC = arm-linux-gnueabi-gcc QMAKE_CXX = arm-linux-gnueabi-g++ QMAKE_LINK = arm-linux-gnueabi-g++ QMAKE_LINK_SHLIB = arm-linux-gnueabi-g++ # modifications to linux.conf QMAKE_AR = arm-linux-gnueabi-ar cqs QMAKE_OBJCOPY = arm-linux-gnueabi-objcopy QMAKE_NM = arm-linux-gnueabi-nm -P QMAKE_STRIP = arm-linux-gnueabi-strip load(qt_config)
Ensuite, il faut créer un répertoire linux-beaglebone-g++ sous /Users/cedric/Qt/5.4/Src/qtbase/mkspecs/devices.
Le fichier qmake.conf contient:
# # qmake configuration for the BeagleBoard and BeagleBoard xM boards # http://beagleboard.org/ MAKEFILE_GENERATOR = UNIX CONFIG += incremental 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 # cross compiler CROSS_COMPILE = /usr/local/linaro/arm-linux-gnueabihf/bin/arm-linux-gnueabihf- SGX_SDK_ROOT = /Users/cedric/Development/BeagleBone/SDK_BIN/Graphics_SDK_setuplinux_5_01_01_01 # 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-a8 -mfpu=neon -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 = $$[QT_SYSROOT]/usr/include #QMAKE_LIBDIR_EGL = $$[QT_SYSROOT]/usr/lib QMAKE_INCDIR_EGL = $$SGX_SDK_ROOT/GFX_Linux_SDK/OGLES2/SDKPackage/Builds/OGLES2/Include/ QMAKE_INCDIR_EGL += $$SGX_SDK_ROOT/GFX_Linux_SDK/OGLES2/SDKPackage/Builds/OGLES2/LinuxARMV7/Include/ QMAKE_INCDIR_EGL += $$SGX_SDK_ROOT/include/ QMAKE_INCDIR_EGL += $$SGX_SDK_ROOT/include/OGLES2/ QMAKE_INCDIR_EGL += $$SGX_SDK_ROOT/include/pvr2d/ QMAKE_INCDIR_EGL += $$SGX_SDK_ROOT/GFX_Linux_SDK/OGLES/SDKPackage/Builds/OGLES/Include/ QMAKE_LIBDIR_EGL = $$SGX_SDK_ROOT/gfx_dbg_es8.x/ QMAKE_INCDIR_OPENGL_ES2 = $${QMAKE_INCDIR_EGL} QMAKE_LIBDIR_OPENGL_ES2 = $${QMAKE_LIBDIR_EGL} QMAKE_INCDIR_OPENVG = $${QMAKE_INCDIR_EGL} QMAKE_LIBDIR_OPENVG = $${QMAKE_LIBDIR_EGL} QMAKE_LIBS_EGL = -lEGL -lIMGegl -lsrv_um QMAKE_LIBS_OPENGL_ES2 = -lGLESv2 $${QMAKE_LIBS_EGL} QMAKE_LIBS_OPENVG = -lOpenVG $${QMAKE_LIBS_EGL} # Pour Tslib QMAKE_INCDIR += /usr/local/opt/qt5.4/tslib/include QMAKE_LIBDIR += /usr/local/opt/qt5.4/tslib/lib QMAKE_LFLAGS += -Wl,-rpath-link=/usr/local/opt/qt5.4/tslib/lib # Sanity check deviceSanityCheckCompiler() load(qt_config)
et le fichier qplatformdefs.h contient uniquement:
#include "../../linux-g++/qplatformdefs.h"
Tout est prêt pour lancer la compilation de Qt5.
Voici le configure que j’ai utilisé:
./configure \ -opensource \ -confirm-license \ -prefix /usr/local/opt/qt5.4 \ -no-largefile \ -no-accessibility \ -qt-zlib \ -no-gif \ -qt-libpng \ -qt-libjpeg \ -no-nis \ -no-cups \ -xplatform linux-arm-gnueabihf-g++ \ -device linux-beaglebone-g++ \ -opengl es2 \ -no-xcb \ -no-wayland \ -nomake examples \ -nomake tests \ -release \ -make libs \ -skip qtwebkit \ -tslib \ -no-use-gold-linker
Si tout est correct, on peut y aller avec un make suivi d’un make install.
J’ai eu quelques déboires pour compiler ça correctement du premier coup, car il me sortait des erreurs plutot étranges sur le lQtDesigner5: « /usr/local/linaro/arm-linux-gnueabihf/bin/../lib/gcc/arm-linux-gnueabihf/4.9.1/../../../../arm-linux-gnueabihf/bin/ld.gold: error: cannot find -lQt5Designer »
La réponse se trouve en partie dans le -no-use-gold-linker, le gold linker étant apparu après le gcc 4.7, il me semble, et Qt veut absolument l’inclure même si il n’est pas supporté par la plateforme.
Et si vous tombez sur la même erreur, il faut modifier le Makefile dans ~/Qt/5.4/Src/qtquick1/src/declarative en supprimant tout lien avec Qt5Designer.
Pour l’envoyer sur le BBB:
cd /usr/local/opt/qt5.4/ tar czvf qt5.4.tar.gz lib plugins qml scp qt5.4.tar.gz root@192.168.10.85:/usr/local/opt/qt5.4/
Sur le BBB:
cd /usr/local/opt/qt5.4/ tar zxvf qt5.4.tar.gz
Nous voilà avec Qt5.4 sur le BBB.
Une dernière chose pour la route.
Voici ce que j’ai sur mon BBB de test pour pouvoir utiliser l’écran tactile.
Fichier /etc/profile.d/TS_QT.sh:
export TSLIB_TSDEVICE=/dev/input/event2 # Choisir la bonne interface export TSLIB_CALIBFILE=/etc/pointercal export TSLIB_CONFFILE=/etc/ts.conf export TSLIB_PLUGINDIR=/usr/lib/ts export TSLIB_FBDEVICE=/dev/fb0 export TSLIB_CONSOLEDEVICE=none export QT_QPA_EGLFS_HIDECURSOR=1 export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event2 #export QT_QPA_EGLFS_DISABLE_INPUT=1 #pour utiliser tslib avec program -plugin tslib echo 0 > /sys/class/graphics/fbcon/cursor_blink
Note sur export QT_QPA_EGLFS_DISABLE_INPUT=1.
Cette ligne sert à désactiver le support interne de l’écran tactile et en lançant le programme suivi de -plugin tslib, on peut utiliser l’écran tactile en passant par la bibliothèque Tslib.
Cette variable va aussi désactiver la souris. Suivant ce que je veux faire, j’active cette variable ou pas.
This article was written by Cédric