Cross-Compile QT 5.12.3 / Raspberry Pi 3

 QT  Kommentare deaktiviert für Cross-Compile QT 5.12.3 / Raspberry Pi 3
Mrz 172019
 

Running Raspbian Stretch on Raspberry Pi 3A/B+

[on RPi] Install a bunch of development files (for simplicity we use build-dep, not everything is really needed, but it is easier this way).

Edit sources list in /etc/apt/sources.list and uncomment the deb-src line:

sudo nano /etc/apt/sources.list

Update your system and install required libraries:

sudo apt-get update
sudo apt-get build-dep qt4-x11
sudo apt-get build-dep libqt5gui5
sudo apt-get install libudev-dev libinput-dev libts-dev libxcb-xinerama0-dev libxcb-xinerama0

Optional depending on your project:

sudo apt-get install wiringpi libnfc-bin libnfc-dev fonts-texgyre

Optional depending if you want to use QtMultimedia:

sudo apt-get install gstreamer1.0-omx libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libopenal-data libsndio6.1 libopenal1 libopenal-dev

 

[on RPi] Prepare our target directory

sudo mkdir /usr/local/qt5pi
sudo chown pi:pi /usr/local/qt5pi

 

[onRPi] Correct links to EGL and GLES Drivers

sudo rm /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0
sudo rm /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0
sudo ln -s /opt/vc/lib/libbrcmEGL.so /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0
sudo ln -s /opt/vc/lib/libbrcmGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0

 

[on host] Create our working directory and get a toolchain:

mkdir ~/raspi
cd ~/raspi
git clone https://github.com/raspberrypi/tools

 

[on host] Create a sysroot. Using rsync we can properly keep things synchronized in the future as well.

mkdir sysroot sysroot/usr sysroot/opt
rsync -avz pi@yourpi:/lib sysroot
rsync -avz pi@yourpi:/usr/include sysroot/usr
rsync -avz pi@yourpi:/usr/lib sysroot/usr
rsync -avz pi@yourpi:/opt/vc sysroot/opt

 

[on host] Adjust symlinks to be relative. Use provided script, because the old fixQualifiedLibraryPaths is not working properly:

wget https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py
chmod +x sysroot-relativelinks.py
./sysroot-relativelinks.py sysroot

 

[on host] Get QT (start with qtbase first)

git clone git://code.qt.io/qt/qtbase.git -b 5.12.3
cd qtbase

 

[on host] Modify the qmake.conf  –> mkspecs/devices/linux-rasp-pi3-g++/qmake.conf

nano ~/raspi/qtbase/mkspecs/devices/linux-rasp-pi3-g++/qmake.conf
VC_LIBRARY_PATH = $$[QT_SYSROOT]/opt/vc/lib
VC_INCLUDE_PATH = $$[QT_SYSROOT]/opt/vc/include

VC_LINK_LINE = -L$${VC_LIBRARY_PATH}

QMAKE_LIBDIR_OPENGL_ES2 = $${VC_LIBRARY_PATH}
QMAKE_LIBDIR_EGL = $$QMAKE_LIBDIR_OPENGL_ES2
QMAKE_LIBDIR_OPENVG = $$QMAKE_LIBDIR_OPENGL_ES2

 

[on host] Compile, make, make install

./configure -release -opengl es2 -device linux-rasp-pi3-g++ -device-option CROSS_COMPILE=~/raspi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf- -sysroot ~/raspi/sysroot -opensource -confirm-license -make libs -prefix /usr/local/qt5pi -extprefix ~/raspi/qt5pi -hostprefix ~/raspi/qt5 -no-use-gold-linker -v -no-gbm
make -j4
make install

If you failed build –>

git clean -dfx

 

[on host] Deploy Qt to the device. We simply sync everything from ~/raspi/qt5pi to the prefix we configured above.

rsync -avz qt5pi pi@yourpi:/usr/local

 

[on RPi] Update the device to let the linker find the Qt libs:

echo /usr/local/qt5pi/lib | sudo tee /etc/ld.so.conf.d/qt5pi.conf
sudo ldconfig

 

[on host] Build other Qt modules as desired, the steps are always the same:

git clone git://code.qt.io/qt/<qt-module>.git -b <qt-version>
cd <qt-module>

~/raspi/qt5/bin/qmake

make 
make install

My Modules:

  • qtbase
  • qtxmlpatterns
  • qtsvg
  • qtdeclarative
  • qtimageformats
  • qtgraphicaleffects
  • qtquickcontrols
  • qtquickcontrols2
  • qtvirtualkeyboard
  • qtwebsockets
  • qtwebglplugin
  • qtcharts
  • qtconnectivity
  • qtmultimedia
  • qtlocation

Then deploy new files by running:

rsync -avz qt5pi pi@yourpi:/usr/local

Cross-Compile QT 5.11.3 / Raspberry Pi 3

 QT  Kommentare deaktiviert für Cross-Compile QT 5.11.3 / Raspberry Pi 3
Dez 232018
 

Running Raspbian Stretch on Raspberry Pi 3A/B+

[on RPi] Install a bunch of development files (for simplicity we use build-dep, not everything is really needed, but it is easier this way).

Edit sources list in /etc/apt/sources.list and uncomment the deb-src line:

sudo nano /etc/apt/sources.list

Update your system and install required libraries:

sudo apt-get update
sudo apt-get build-dep qt4-x11
sudo apt-get build-dep libqt5gui5
sudo apt-get install libudev-dev libinput-dev libts-dev libxcb-xinerama0-dev libxcb-xinerama0

Optional depending on your project:

sudo apt-get install wiringpi libnfc-bin libnfc-dev fonts-texgyre

Optional depending if you want to use QtMultimedia:

sudo apt-get install gstreamer1.0-omx libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libopenal-data libsndio6.1 libopenal1 libopenal-dev

 

[on RPi] Prepare our target directory

sudo mkdir /usr/local/qt5pi
sudo chown pi:pi /usr/local/qt5pi

 

[on host] Create our working directory and get a toolchain:

mkdir ~/raspi
cd ~/raspi
git clone https://github.com/raspberrypi/tools

 

[on host] Create a sysroot. Using rsync we can properly keep things synchronized in the future as well.

mkdir sysroot sysroot/usr sysroot/opt
rsync -avz pi@yourpi:/lib sysroot
rsync -avz pi@yourpi:/usr/include sysroot/usr
rsync -avz pi@yourpi:/usr/lib sysroot/usr
rsync -avz pi@yourpi:/opt/vc sysroot/opt

 

[on host] Adjust symlinks to be relative. Use provided script, because the old fixQualifiedLibraryPaths is not working properly:

wget https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py
chmod +x sysroot-relativelinks.py
./sysroot-relativelinks.py sysroot

 

[on host] Get QT (start with qtbase first)

git clone git://code.qt.io/qt/qtbase.git -b 5.11.3
cd qtbase

 

[on host] Compile, make, make install

./configure -release -opengl es2 -device linux-rasp-pi3-g++ -device-option CROSS_COMPILE=~/raspi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf- -sysroot ~/raspi/sysroot -opensource -confirm-license -make libs -prefix /usr/local/qt5pi -extprefix ~/raspi/qt5pi -hostprefix ~/raspi/qt5 -v -no-use-gold-linker -no-kms
make -j4
make install

If you failed build –>

git clean -dfx

 

[on host] Deploy Qt to the device. We simply sync everything from ~/raspi/qt5pi to the prefix we configured above.

rsync -avz qt5pi pi@yourpi:/usr/local

 

[on RPi] Update the device to let the linker find the Qt libs:

echo /usr/local/qt5pi/lib | sudo tee /etc/ld.so.conf.d/qt5pi.conf
sudo ldconfig

 

[on host] Build other Qt modules as desired, the steps are always the same:

git clone git://code.qt.io/qt/<qt-module>.git -b <qt-version>
cd <qt-module>

~/raspi/qt5/bin/qmake (for QtMultimedia --> ~/raspi/qt5/bin/qmake -r GST_VERSION=1.0)

make 
make install

My Modules:

  • qtbase
  • qtxmlpatterns
  • qtsvg
  • qtdeclarative
  • qtimageformats
  • qtgraphicaleffects
  • qtquickcontrols
  • qtquickcontrols2
  • qtvirtualkeyboard
  • qtwebsockets
  • qtwebglplugin
  • qtcharts
  • qtconnectivity
  • qtmultimedia

Then deploy new files by running:

rsync -avz qt5pi pi@yourpi:/usr/local

Screenshot einer QT Anwendung erstellen

 QT  Kommentare deaktiviert für Screenshot einer QT Anwendung erstellen
Nov 052016
 

Die QT Anwendung muss unter dem Benutzer „pi“ mit folgendem Parameter gestartet werden

./<PROGRAMM> -platform linuxfb:fb=/dev/fb0

Der Screenshot kann dann mit folgendem Befehl aufgenommen werden:

sudo fbgrab -c 1 screen.png

HOWTO Setup QTCreator für ARM Embedded

 QT  Kommentare deaktiviert für HOWTO Setup QTCreator für ARM Embedded
Jan 202015
 

Aktuelle Version des QtCreator herunterladen: http://www.qt.io/download-open-source/

Das Paket nach /opt  installieren:

chmod 755 qt-creator-opensource-linux-x86_64-3.3.0.run
sudo ./qt-creator-opensource-linux-x86_64-3.3.0.run

Bevor wir mit dem QTCreator arbeiten, müssen wir noch das Image unseres Embedded Rechners lokal auf dem Entwicklungsrechner mounten.
Das Image wird unter /mnt/a20/ mit der Root-Partition eingehangen und später dem QTCreator als SysRoot des Zielsystems bekannt gemacht.

Herausfinden ab welchem Block die Root Partition beginnt:

sudo fdisk -lu A20_OLinuxino_Micro_debian_34_90_release_10.img

Der Startsektor der 2. Partition 34816 wird mit der Sektorgröße 512 Bytes multipliziert –> 17825792

Dann wird der Mountpunkt erstellt

sudo mkdir /mnt/a20

Danach wird die 2. Partition mit dem errechneten Offset nach /mnt/a20 gemountet:

sudo mount -o loop,offset=17825792 A20-Micro-3490-wapi-ladeterminal-2015-01-08.img /mnt/a20/

Mit einem Wechsel in den Mountpunkt „cd /mnt/a20“ kann man mit einem „ls“ prüfen ob  die bekannten Verzeichnisse des Images da sind.
(bin,boot,Desktop,dev,etc,home,lib,media,mnt,opt,proc,………)

 

Ein Shortcut findet man nun im Menü –> Programm starten.

qt1

 

Nachdem ein neues Projekt erstellt wurde kann man unter „Projekte“ –> „Kits verwalten“ die Einstellungen für das Zielsystem vornehmen.

qt2

 

 

 

 

 

 

 

 

 

Unter „Einstellung und Ausführung“ wird im Reiter „Kit“ mit „Hinzufügen“ ein neues benutzerdefiniertes Kit angelegt.
Hier als Beispiel das Kit „wapi-a20-1“.

qt3

 

 

 

 

 

 

 

 

 

 

 

 

Die für ARM compilierte QT Version wird angelegt:

qt4

 

 

 

 

 

 

 

 

 

 

 

 

Der ARM Compiler wird konfiguriert:

qt5

 

 

 

 

 

 

 

 

 

 

 

 

Der ARM Debugger wird konfiguriert:

qt6

 

 

 

 

 

 

 

 

 

 

 

 

Das Zielsystem, unser Embedded Linux, wird unter dem Menüpunkt „Geräte“ konfiguriert:

qt7

 

 

 

 

 

 

 

 

 

 

 

 

Nach dem Compilieren und Kopieren des Projektes können wir nun noch die Ausführung einstellen:

qt8

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Hier in diesem Beispiel wird das Programm „ladeterminal“ aufgerufen mit einem zusätzlichem Parameter „-plugin Tslib“
für ein Touchdisplay. Vor dem Ausführen wird das Zielsystem auf genügend Speicherplatz geprüft und alte „ladeterminal“
Prozesse werden mit einem „kill“ Befehl beendet bevor die neue Version per sftp hochgeladen wird.

HOWTO Cross-compile QT5 auf einem Olimex A20

 QT  Kommentare deaktiviert für HOWTO Cross-compile QT5 auf einem Olimex A20
Jan 102015
 

Vorbereiten des „target“ Boards Olimex A20 Micro

Standard Olimex Debian Image auf die Micro SD Karte kopieren:
dd bs=4M if=A20_OLinuxino_Micro_debian_34_90_release_10.img of=/home/sdx

Beim ersten Start von der Mirco SD Karte muss ein Monitor über HDMI angeschlossen sein.
Über das Menü der LXDE Oberfläche kann ein LXterminal geöffnet werden.

Einstellen der Ausgabe auf das LCD Display:
cd /root
./change_display_olimex_A20.sh
Grafische Oberfläche abschalten:

In der Datei /etc/X11/default-display-manager folgendes ändern

# /usr/bin/slim
/usr/bin/true
Netzwerk manuell aktivieren:
dhclient eth0
Netzwerk dauerhaft automatisch per DHCP einschalten:

In der Datei /etc/network/interfaces die Zeile ändern

iface eth0 inet static

in

iface eth0 inet dhcp
Zeitzone einstellen:
dpkg-reconfigure tzdata
Sprache auf Deutsch stellen:
dpkg-reconfigure locales

In der Datei /etc/environment folgende Variable abändern:

LC_ALL="de_DE.utf8"
Partition 2 erweitern um die ganze Micro SD Karte zu nutzen:
cd /root
./resize_sd.sh /dev/mmcblk0 2
Hostnamen ändern:

In de Datei /etc/hostname den Hostnamen in der ersten Zeile eintragen -> reboot

Update der Debian Installation:
apt-get update
apt-get upgrade
Wichtige Paket Anhängigkeiten für QT installieren:
apt-get install libfontconfig1-dev libdbus-1-dev libfreetype6-dev libudev-dev libasound2-dev libavcodec-dev libavformat-dev libswscale-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev gstreamer-tools gstreamer0.10-plugins-good gstreamer0.10-plugins-bad libicu-dev libsqlite3-dev libxslt1-dev libssl-dev gdbserver
Mali Grafikchipsatz Treiber neu bauen um unter QT eglfs nutzen zu können:
cd /opt
git clone https://github.com/linux-sunxi/sunxi-mali.git
cd sunxi-mali
git submodule init
git submodule update
make config ABI=armhf VERSION=r3p0 EGL_TYPE=framebuffer
make install

Module laden:

modprobe mali
modprobe drm
modprobe mali_drm

Um die richtige Version des Kernel Treibers zu ermitteln gibt es ein kleines Script:

cd /opt/sunxi-mali/version
make
./version

In dem Verzeichnis /opt/sunxi-mail/test liegt ein Test:

cd /opt/sunxi-mali/test
make
./test
Blinkenden Cursor auf der Konsole ausschalten:

In de Datei /root/.bashrc folgende Zeile hinzufügen.

echo 0 > /sys/class/graphics/fbcon/cursor_blink
Bildschirmschoner der Konsole ausschalten:

In der Datei /root/.bashrc folgende Zeile hinzufügen.

setterm -blank 0
Autologin Benutzer:

In der Datei /etc/inittab

#1:2345:respawn:/sbin/getty 38400 tty1
1:2345:respawn:/bin/login -f root </dev/tty1 >/dev/tty1 2>&1
#T0:2345:respawn:/sbin/getty -L -a root ttyS0 115200 linux
Automastischer Programmstart (Beispiel):

In der Datei /root/.bashrc folgende Zeile hinzufügen.

/root/ladeterminal/ladeterminal -plugin Tslib

Das Plugin Tslib ist für die Funktion des LCD Touch.

Touch LCD Display calibrieren:
ts_calibrate
Environment ergänzen:

Unter /etc/environment zwei Zeilen hinzufügen

LD_LIBRARY_PATH=/usr/local/qt5a20/lib
QT_QPA_EGLFS_DISABLE_INPUT=1

Vorbereiten des „cross-compile“ Rechners.

 Auf einem 64Bit System wird die 32 Bit Laufzeitumgebung benötigt:

Unter Debian:

dpkg --add-architecture i386
apt-get install ia32-libs
Mount des „target“ Dateisystems an den Cross-Compile Rechner:
sudo sshfs -o allow_other root@192.168.0.100:/ /mnt/a20/
Linaro Toolchain herunterladen und entpacken:
cd /opt
wget https://releases.linaro.org/14.01/components/toolchain/binaries/gcc-linaro-arm-linux-gnueabihf-4.8-2014.01_linux.tar.bz2
tar xvfj gcc-linaro-arm-linux-gnueabihf-4.8-2014.01_linux.tar.bz2
mv gcc-linaro-arm-linux-gnueabihf-4.8-2014.01_linux toolchain
Cross-Compile-Tools herunterladen und installieren:
cd /opt
git clone git://gitorious.org/cross-compile-tools/cross-compile-tools.git
cd cross-compile-tools
./fixQualifiedLibraryPaths /mnt/a20 /opt/toolchain/gcc-linaro-arm-linux-gnueabihf-4.8-2013.09_linux/bin/arm-linux-gnueabihf-gcc
QT Everywhere herunterladen und entpacken:
cd /opt
wget http://download.qt.io/official_releases/qt/5.5/5.5.1/single/qt-everywhere-opensource-src-5.5.1.tar.gz
tar -xvzf qt-everywhere-opensource-src-5.5.1.tar.gz
mv qt-everywhere-opensource-src-5.5.1 qt5
Eine Device Datei für den Olimex A20 anlegen:
cd /opt/qt5/qtbase/mkspecs/devices
cp -r linux-beagleboard-g++ linux-a20olimex-g++
cd linux-a20olimex-g++

Die Datei qmake.conf mit diesem Inhalt füllen:

#
# 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)
Pfade für dbus und glib setzen:
cd /opt/qt5/qtbase

Die Datei configure bearbeiten:

# flags for libdbus-1
QT_CFLAGS_DBUS="-I/mnt/a20/usr/include/dbus-1.0/ -I/mnt/a20/usr/lib/arm-linux-gnueabihf/dbus-1.0/include/"
QT_LIBS_DBUS=-ldbus-1
# flags for Glib (X11 only)
QT_CFLAGS_GLIB="-I/mnt/a20/usr/include/glib-2.0/ -I/mnt/a20/usr/lib/arm-linux-gnueabihf/glib-2.0/include/"
QT_LIBS_GLIB=-lglib-2.0
Ein Patch für den Mali Grafiktreiber:
cd /opt/qt5/qtbase/src/plugins/platforms/eglfs

Folgenden Abschnitt in der Datei qeglfsdeviceintegration.cpp (QT 5.5.1) ersetzen / ändern:


EGLNativeWindowType QEGLDeviceIntegration::createNativeWindow(QPlatformWindow *platformWindow,
                                                    const QSize &size,
                                                    const QSurfaceFormat &format)
{
    Q_UNUSED(platformWindow);
    Q_UNUSED(size);
    Q_UNUSED(format);
    // return 0;
    static struct mali_native_window native_window = {
        .width = (short unsigned int)size.width(),
        .height = (short unsigned int)size.height(),
    };
    return &native_window;
}
 Compile, make, make install:
./configure -opengl es2 -device linux-a20olimex-g++ -device-option CROSS_COMPILE=/opt/toolchain/bin/arm-linux-gnueabihf- -sysroot /mnt/a20/ -opensource -confirm-license -optimized-qmake -release -make libs -prefix /usr/local/qt5a20 -tslib -no-pch -nomake examples -nomake tests -no-xcb -eglfs -v
make
make install