Browse Source

wrk gfa-k44104-qt-57

Reinhard Russinger 7 năm trước cách đây
mục cha
commit
3fd0e9c1a7
60 tập tin đã thay đổi với 6653 bổ sung740 xóa
  1. 1 1
      .gitignore
  2. 7 0
      Config.in
  3. 2611 0
      GfA-buildroot-qt57_on_Kernel_4_4_104.patch
  4. 8 10
      Make-bb-kernel_Qt5.7.sh
  5. 1 1
      board/GfA/Display001/BUILD
  6. 1 1
      board/GfA/Display001/rootfs/etc/init.d/rcS
  7. 1 1
      board/GfA/Display001/rootfs/etc/inittab
  8. BIN
      board/GfA/Display001/rootfs/opt/di-soric/HMI/VISU_di-soric
  9. BIN
      board/GfA/Display001/rootfs/usr/lib/qt/plugins/platforminputcontexts/libFreeVirtualKeyboard.so
  10. 0 36
      board/GfA/Display001/rootfs/usr/qml/ApplicationLauncher/applicationlauncher.qmltypes
  11. BIN
      board/GfA/Display001/rootfs/usr/qml/ApplicationLauncher/libApplicationLauncher.so
  12. 0 4
      board/GfA/Display001/rootfs/usr/qml/ApplicationLauncher/qmldir
  13. BIN
      board/GfA/Display001/rootfs/usr/qml/QtQuick/FreeVirtualKeyboard/FontAwesome.otf
  14. 0 263
      board/GfA/Display001/rootfs/usr/qml/QtQuick/FreeVirtualKeyboard/InputPanel.qml
  15. 0 149
      board/GfA/Display001/rootfs/usr/qml/QtQuick/FreeVirtualKeyboard/KeyButton.qml
  16. 0 191
      board/GfA/Display001/rootfs/usr/qml/QtQuick/FreeVirtualKeyboard/KeyModel.qml
  17. 0 81
      board/GfA/Display001/rootfs/usr/qml/QtQuick/FreeVirtualKeyboard/KeyPopup.qml
  18. 0 2
      board/GfA/Display001/rootfs/usr/qml/QtQuick/FreeVirtualKeyboard/qmldir
  19. 453 0
      configs/Display001_4.4.104_rt21_Qt5.7_defconfig
  20. 6 0
      package/libgfaipc/Config.in
  21. 31 0
      package/libgfaipc/libgfaipc.mk
  22. 58 0
      package/libgfaipc/src/Makefile
  23. 33 0
      package/libgfaipc/src/defines.h
  24. 36 0
      package/libgfaipc/src/gfaipc.h
  25. 333 0
      package/libgfaipc/src/ipcshm.cpp
  26. 87 0
      package/libgfaipc/src/locmtx.cpp
  27. 222 0
      package/libgfaipc/src/mutex.cpp
  28. 66 0
      package/libgfaipc/src/mutex.h
  29. 459 0
      package/libgfaipc/src/sema.cpp
  30. 113 0
      package/libgfaipc/src/sema.h
  31. 378 0
      package/libgfaipc/src/shm.cpp
  32. 73 0
      package/libgfaipc/src/shm.h
  33. 299 0
      package/libgfaipc/src/shmrot.cpp
  34. 99 0
      package/libgfaipc/src/shmrot.h
  35. 79 0
      package/libgfaipc/src/shmstrvar.cpp
  36. 69 0
      package/libgfaipc/src/uuid.c
  37. 49 0
      package/libgfaipc/src/uuid.h
  38. 6 0
      package/libgfatimer/Config.in
  39. 31 0
      package/libgfatimer/libgfatimer.mk
  40. 58 0
      package/libgfatimer/src/Makefile
  41. 69 0
      package/libgfatimer/src/gfatimer.cpp
  42. 77 0
      package/libgfatimer/src/gfatimer.h
  43. 66 0
      package/libgfatimer/src/mutex.h
  44. 421 0
      package/libgfatimer/src/timer.cpp
  45. 74 0
      package/libgfatimer/src/timer.h
  46. 49 0
      package/libgfatimer/src/uuid.h
  47. 21 0
      package/liborcania/0001-makefile.patch
  48. 5 0
      package/liborcania/Config.in
  49. 23 0
      package/liborcania/liborcania.mk
  50. 35 0
      package/libulfius/0001-makefile.patch
  51. 7 0
      package/libulfius/Config.in
  52. 25 0
      package/libulfius/libulfius.mk
  53. 24 0
      package/libyder/0001-makefile.patch
  54. 6 0
      package/libyder/Config.in
  55. 24 0
      package/libyder/libyder.mk
  56. 4 0
      package/python-ufw/Config.in
  57. 32 0
      package/python-ufw/python-ufw.mk
  58. 4 0
      package/qmlplugins/Config.in
  59. BIN
      package/qmlplugins/GFAQMLPlugins.tar.gz
  60. 19 0
      package/qmlplugins/qmlplugins.mk

+ 1 - 1
.gitignore

@@ -1,2 +1,2 @@
-GfAkernel.tar.gz
+GfAkernel*.tar.gz
 *~

+ 7 - 0
Config.in

@@ -1,4 +1,11 @@
 source "$BR2_EXTERNAL_GFA_Display001_PATH/package/wt/Config.in"
 source "$BR2_EXTERNAL_GFA_Display001_PATH/package/network_interfaces_script/Config.in"
 source "$BR2_EXTERNAL_GFA_Display001_PATH/package/gfa_addons/Config.in"
+source "$BR2_EXTERNAL_GFA_Display001_PATH/package/libgfaipc/Config.in"
+source "$BR2_EXTERNAL_GFA_Display001_PATH/package/libgfatimer/Config.in"
+source "$BR2_EXTERNAL_GFA_Display001_PATH/package/qmlplugins/Config.in"
+source "$BR2_EXTERNAL_GFA_Display001_PATH/package/python-ufw/Config.in"
+source "$BR2_EXTERNAL_GFA_Display001_PATH/package/libulfius/Config.in"
+source "$BR2_EXTERNAL_GFA_Display001_PATH/package/libyder/Config.in"
+source "$BR2_EXTERNAL_GFA_Display001_PATH/package/liborcania/Config.in"
 

+ 2611 - 0
GfA-buildroot-qt57_on_Kernel_4_4_104.patch

@@ -0,0 +1,2611 @@
+diff --git a/package/qt5/Config.in b/package/qt5/Config.in
+index aeec188143..fb57d2574a 100644
+--- a/package/qt5/Config.in
++++ b/package/qt5/Config.in
+@@ -1,15 +1,15 @@
+ config BR2_PACKAGE_QT5_GL_AVAILABLE
+ 	bool
+-	default y
+ 	depends on BR2_PACKAGE_HAS_LIBGL || BR2_PACKAGE_HAS_LIBGLES
++	default y
+ 
+ config BR2_PACKAGE_QT5_JSCORE_AVAILABLE
+ 	bool
+-	default y
+ 	# Javascript engine is only available on certain architectures
+ 	depends on BR2_arm || BR2_i386 || BR2_x86_64 || BR2_mipsel
+ 	# ARM needs BLX, so v5t+
+ 	depends on !BR2_ARM_CPU_ARMV4
++	default y
+ 
+ comment "Qt5 needs a toolchain w/ wchar, NPTL, C++, dynamic library"
+ 	depends on !BR2_PACKAGE_QT
+@@ -30,36 +30,8 @@ menuconfig BR2_PACKAGE_QT5
+ 	  http://qt.io
+ 
+ if BR2_PACKAGE_QT5
+-
+-choice
+-	prompt "Qt5 version"
+-
+-config BR2_PACKAGE_QT5_VERSION_LATEST
+-	bool "Latest (5.8)"
+-	depends on BR2_TOOLCHAIN_GCC_AT_LEAST_4_8 # C++11
+-	depends on BR2_HOST_GCC_AT_LEAST_4_8 # C++11
+-	depends on !BR2_ARM_CPU_ARMV4 # needs ARMv5+
+-	# no built-in double-conversion support
+-	depends on !BR2_arc && !BR2_nios2 && !BR2_xtensa
+-	help
+-	  This option builds Qt 5.8, which is licensed under
+-	  (L)GPL-3.0+.
+-
+-comment "Latest Qt version needs host/toolchain w/ gcc >= 4.8"
+-	depends on !BR2_TOOLCHAIN_GCC_AT_LEAST_4_8 || !BR2_HOST_GCC_AT_LEAST_4_8
+-	depends on !BR2_ARM_CPU_ARMV4
+-	depends on !BR2_arc && !BR2_nios2 && !BR2_xtensa
+-
+-config BR2_PACKAGE_QT5_VERSION_5_6
+-	bool "LTS (5.6)"
+-	help
+-	  This option builds Qt 5.6, which is licensed under
+-	  (L)GPL-2.0+.
+-
+-endchoice
+-
+-source "package/qt5/qt53d/Config.in"
+ source "package/qt5/qt5base/Config.in"
++source "package/qt5/qt53d/Config.in"
+ source "package/qt5/qt5canvas3d/Config.in"
+ source "package/qt5/qt5connectivity/Config.in"
+ source "package/qt5/qt5declarative/Config.in"
+@@ -69,20 +41,22 @@ source "package/qt5/qt5imageformats/Config.in"
+ source "package/qt5/qt5location/Config.in"
+ source "package/qt5/qt5multimedia/Config.in"
+ source "package/qt5/qt5quickcontrols/Config.in"
+-source "package/qt5/qt5quickcontrols2/Config.in"
+-source "package/qt5/qt5script/Config.in"
+ source "package/qt5/qt5sensors/Config.in"
+-source "package/qt5/qt5charts/Config.in"
+-source "package/qt5/qt5virtualkeyboard/Config.in"
+-source "package/qt5/qt5wayland/Config.in"
+ source "package/qt5/qt5serialbus/Config.in"
+ source "package/qt5/qt5serialport/Config.in"
++source "package/qt5/qt5wayland/Config.in"
+ source "package/qt5/qt5svg/Config.in"
+ source "package/qt5/qt5tools/Config.in"
+ source "package/qt5/qt5webchannel/Config.in"
+-source "package/qt5/qt5webkit/Config.in"
+-source "package/qt5/qt5webengine/Config.in"
+ source "package/qt5/qt5websockets/Config.in"
+ source "package/qt5/qt5x11extras/Config.in"
++source "package/qt5/qt5webengine/Config.in"
+ source "package/qt5/qt5xmlpatterns/Config.in"
++source "package/qt5/qt5virtualkeyboard/Config.in"
++source "package/qt5/qt5charts/Config.in"
++source "package/qt5/qt5datavis3d/Config.in"
++source "package/qt5/qt5quickcontrols2/Config.in"
++comment "legacy compatibility"
++source "package/qt5/qt5script/Config.in"
++source "package/qt5/qt5webkit/Config.in"
+ endif
+diff --git a/package/qt5/qt5.mk b/package/qt5/qt5.mk
+index 5c7af3926e..0710ef432c 100644
+--- a/package/qt5/qt5.mk
++++ b/package/qt5/qt5.mk
+@@ -1,21 +1,8 @@
+-################################################################################
+-#
+-# qt5
+-#
+-################################################################################
+-
+-ifeq ($(BR2_PACKAGE_QT5_VERSION_LATEST),y)
+-QT5_VERSION_MAJOR = 5.8
++QT5_VERSION_MAJOR = 5.7
+ QT5_VERSION = $(QT5_VERSION_MAJOR).0
+ QT5_SITE = http://download.qt.io/official_releases/qt/$(QT5_VERSION_MAJOR)/$(QT5_VERSION)/submodules
+-QT5_SNAPSHOTS_SITE = http://download.qt.io/snapshots/qt/$(QT5_VERSION_MAJOR)/$(QT5_VERSION)/latest_src/submodules
+-else
+-QT5_VERSION_MAJOR = 5.6
+-QT5_VERSION = $(QT5_VERSION_MAJOR).2
+-QT5_SITE = http://download.qt.io/official_releases/qt/$(QT5_VERSION_MAJOR)/$(QT5_VERSION)/submodules
+-QT5_SNAPSHOTS_SITE = http://download.qt.io/snapshots/qt/$(QT5_VERSION_MAJOR)/$(QT5_VERSION)/latest_src/submodules
+-endif
+-
++##QT5_VERSION = $(QT5_VERSION_MAJOR).1
++##QT5_SITE = http://download.qt.io/snapshots/qt/$(QT5_VERSION_MAJOR)/$(QT5_VERSION)/latest_src/submodules
+ include $(sort $(wildcard package/qt5/*/*.mk))
+ 
+ define QT5_LA_PRL_FILES_FIXUP
+diff --git a/package/qt5/qt53d/Config.in b/package/qt5/qt53d/Config.in
+index f776da2c87..ff50204fc8 100644
+--- a/package/qt5/qt53d/Config.in
++++ b/package/qt5/qt53d/Config.in
+@@ -1,21 +1,17 @@
+ config BR2_PACKAGE_QT53D
+ 	bool "qt53d"
+-	depends on BR2_PACKAGE_QT5_JSCORE_AVAILABLE # qt5declarative
+-	depends on BR2_PACKAGE_QT5_GL_AVAILABLE # qt5declarative_quick
+ 	select BR2_PACKAGE_QT5BASE
+ 	select BR2_PACKAGE_QT5BASE_GUI
+ 	select BR2_PACKAGE_QT5DECLARATIVE
+ 	select BR2_PACKAGE_QT5DECLARATIVE_QUICK
++	depends on BR2_PACKAGE_QT5_JSCORE_AVAILABLE # qt5declarative
++	depends on BR2_PACKAGE_QT5_GL_AVAILABLE # qt5declarative_quick
+ 	help
+ 	  Qt is a cross-platform application and UI framework for
+ 	  developers using C++.
+ 
+ 	  This package corresponds to the qt53d module.
+ 
+-
+-	  This module was in tech preview in Qt 5.6, and promoted
+-	  to a core module in Qt 5.7.0.
+-
+ 	  Enable the assimp package to gain the assimp sceneparser plugin.
+ 
+ 	  http://doc.qt.io/qt-5/qt3d-index.html
+diff --git a/package/qt5/qt53d/qt53d.mk b/package/qt5/qt53d/qt53d.mk
+index d66923677e..5dac5b0b62 100644
+--- a/package/qt5/qt53d/qt53d.mk
++++ b/package/qt5/qt53d/qt53d.mk
+@@ -14,8 +14,13 @@ ifeq ($(BR2_PACKAGE_ASSIMP),y)
+ QT53D_DEPENDENCIES += assimp
+ endif
+ 
+-QT53D_LICENSE = GPL-2.0 or GPL-3.0 or LGPL-3.0
++ifeq ($(BR2_PACKAGE_QT5BASE_LICENSE_APPROVED),y)
++QT53D_LICENSE = GPLv2 or GPLv3 or LGPLv3
+ QT53D_LICENSE_FILES = LICENSE.GPL LICENSE.GPLv3 LICENSE.LGPLv3
++else
++QT53D_LICENSE = Commercial license
++QT53D_REDISTRIBUTE = NO
++endif
+ 
+ define QT53D_CONFIGURE_CMDS
+ 	(cd $(@D); $(TARGET_MAKE_ENV) $(HOST_DIR)/usr/bin/qmake)
+diff --git a/package/qt5/qt5base/5.6.2/0001-eglfs-rasp-pi-header-inclusion.patch b/package/qt5/qt5base/5.6.2/0001-eglfs-rasp-pi-header-inclusion.patch
+deleted file mode 100644
+index f1f6d9b0b7..0000000000
+--- a/package/qt5/qt5base/5.6.2/0001-eglfs-rasp-pi-header-inclusion.patch
++++ /dev/null
+@@ -1,45 +0,0 @@
+-From 91c3b111e45dd476aba057836b1b618eacf90f3f Mon Sep 17 00:00:00 2001
+-From: Julien Corjon <corjon.j@ecagroup.com>
+-Date: Tue, 21 Jul 2015 09:58:14 +0200
+-Subject: [PATCH] eglfs - fix rasp-pi header inclusion
+-
+-eglplateform.h include headers for low level instruction and fail on brcm
+-headers inclusion
+-  For the brcm presence test we use egl pkg-config file
+-  For the eglfs-plugin compilation we use the egl configuration
+-
+-Upstream-Status: https://bugreports.qt.io/browse/QTBUG-47339
+-Signed-off-by: Julien Corjon <corjon.j@ecagroup.com>
+----
+- config.tests/qpa/eglfs-brcm/eglfs-brcm.pro   | 2 ++
+- src/plugins/platforms/eglfs/eglfs-plugin.pro | 1 +
+- 2 files changed, 3 insertions(+)
+-
+-diff --git a/config.tests/qpa/eglfs-brcm/eglfs-brcm.pro b/config.tests/qpa/eglfs-brcm/eglfs-brcm.pro
+-index ce16a3a..192a8ad 100644
+---- a/config.tests/qpa/eglfs-brcm/eglfs-brcm.pro
+-+++ b/config.tests/qpa/eglfs-brcm/eglfs-brcm.pro
+-@@ -1,6 +1,8 @@
+- SOURCES = eglfs-brcm.cpp
+- 
+- CONFIG -= qt
+-+CONFIG += link_pkgconfig
+-+PKGCONFIG += egl
+- 
+- INCLUDEPATH += $$QMAKE_INCDIR_EGL
+- 
+-diff --git a/src/plugins/platforms/eglfs/eglfs-plugin.pro b/src/plugins/platforms/eglfs/eglfs-plugin.pro
+-index 0f493fd..8479496 100644
+---- a/src/plugins/platforms/eglfs/eglfs-plugin.pro
+-+++ b/src/plugins/platforms/eglfs/eglfs-plugin.pro
+-@@ -6,6 +6,7 @@ PLUGIN_CLASS_NAME = QEglFSIntegrationPlugin
+- load(qt_plugin)
+- 
+- QT += platformsupport-private eglfs_device_lib-private
+-+CONFIG += egl
+- 
+- SOURCES += $$PWD/qeglfsmain.cpp
+- 
+--- 
+-2.1.0
+-
+diff --git a/package/qt5/qt5base/5.6.2/0002-eglfs-fix-eglfs_mali-compile-for-odroid-mali.patch b/package/qt5/qt5base/5.6.2/0002-eglfs-fix-eglfs_mali-compile-for-odroid-mali.patch
+deleted file mode 100644
+index cbafb397bb..0000000000
+--- a/package/qt5/qt5base/5.6.2/0002-eglfs-fix-eglfs_mali-compile-for-odroid-mali.patch
++++ /dev/null
+@@ -1,53 +0,0 @@
+-From b6c602e4264021f98ec2c72316e2a2000bf35e82 Mon Sep 17 00:00:00 2001
+-From: Peter Seiderer <ps.report@gmx.net>
+-Date: Mon, 14 Nov 2016 23:42:25 +0100
+-Subject: [PATCH] eglfs: fix eglfs_mali compile for odroid-mali
+-
+-Avoid duplicated struct fbdev_window definition (introduced by [1]) by
+-renaming struct fbdev_window to shadow_fbdev_window.
+-
+-Fixes the following buildroot compile failure ([2]):
+-
+-qeglfsmaliintegration.cpp:45:8: error: redefinition of 'struct fbdev_window'
+- struct fbdev_window {
+-        ^
+-In file included from /accts/mlweber1/rc-buildroot-test/scripts/instance-0/output/host/usr/aarch64-buildroot-linux-gnu/sysroot/usr/include/EGL/eglplatform.h:28:0,
+-                 from /accts/mlweber1/rc-buildroot-test/scripts/instance-0/output/host/usr/aarch64-buildroot-linux-gnu/sysroot/usr/include/EGL/egl.h:36,
+-                 from ../../../eglfs/qeglfsglobal.h:45,
+-                 from ../../../eglfs/qeglfsdeviceintegration.h:48,
+-                 from qeglfsmaliintegration.h:37,
+-                 from qeglfsmaliintegration.cpp:34:
+-
+-[1] https://code.qt.io/cgit/qt/qtbase.git/commit/?h=dev&id=58bed4cda98e8e25db8adc61c7db73b6853077dc
+-[2] http://autobuild.buildroot.net/results/48c/48c458c035162169e8ca7c34ae65e9064822f25a
+-
+-Signed-off-by: Peter Seiderer <ps.report@gmx.net>
+----
+- .../eglfs/deviceintegration/eglfs_mali/qeglfsmaliintegration.cpp      | 4 ++--
+- 1 file changed, 2 insertions(+), 2 deletions(-)
+-
+-diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_mali/qeglfsmaliintegration.cpp b/src/plugins/platforms/eglfs/deviceintegration/eglfs_mali/qeglfsmaliintegration.cpp
+-index 43decdf..aeba83f 100644
+---- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_mali/qeglfsmaliintegration.cpp
+-+++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_mali/qeglfsmaliintegration.cpp
+-@@ -42,7 +42,7 @@
+- 
+- QT_BEGIN_NAMESPACE
+- 
+--struct fbdev_window {
+-+struct shadow_fbdev_window {
+-     unsigned short width;
+-     unsigned short height;
+- };
+-@@ -85,7 +85,7 @@ EGLNativeWindowType QEglFSMaliIntegration::createNativeWindow(QPlatformWindow *w
+-     Q_UNUSED(window);
+-     Q_UNUSED(format);
+- 
+--    fbdev_window *fbwin = reinterpret_cast<fbdev_window *>(malloc(sizeof(fbdev_window)));
+-+    shadow_fbdev_window *fbwin = reinterpret_cast<shadow_fbdev_window *>(malloc(sizeof(shadow_fbdev_window)));
+-     if (NULL == fbwin)
+-         return 0;
+- 
+--- 
+-2.8.1
+-
+diff --git a/package/qt5/qt5base/5.8.0/0001-fix-parallel-builds-with-qt-freetype-system-libpng.patch b/package/qt5/qt5base/5.8.0/0001-fix-parallel-builds-with-qt-freetype-system-libpng.patch
+deleted file mode 100644
+index 8548ef0e25..0000000000
+--- a/package/qt5/qt5base/5.8.0/0001-fix-parallel-builds-with-qt-freetype-system-libpng.patch
++++ /dev/null
+@@ -1,34 +0,0 @@
+-From 74af93f5298b54bc2327843f390bf202776f2f48 Mon Sep 17 00:00:00 2001
+-From: Oswald Buddenhagen <oswald.buddenhagen@qt.io>
+-Date: Tue, 10 Jan 2017 14:18:02 +0100
+-Subject: [PATCH] fix parallel builds with -qt-freetype -system-libpng
+-
+-freetype has no dependency on gui, so it needs to pull in gui's
+-configuration manually, as that's where the system libpng is found.
+-
+-Task-number: QTBUG-58038
+-Change-Id: I881495f7d2a8f7c1a45d7d4c9e7698ff1d30f2a9
+-Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
+-Reviewed-by: Joni Poikelin <joni.poikelin@qt.io>
+-
+-Upstream: https://code.qt.io/cgit/qt/qtbase.git/commit/?id=4dcfd90e4fd7d4c49138038dbbcbda8794a9fbff
+-Signed-off-by: Peter Seiderer <ps.report@gmx.net>
+----
+- src/3rdparty/freetype/freetype.pro | 1 +
+- 1 file changed, 1 insertion(+)
+-
+-diff --git a/src/3rdparty/freetype/freetype.pro b/src/3rdparty/freetype/freetype.pro
+-index 5b1eb92e..390a6da7 100644
+---- a/src/3rdparty/freetype/freetype.pro
+-+++ b/src/3rdparty/freetype/freetype.pro
+-@@ -69,6 +69,7 @@ DEFINES += FT_CONFIG_OPTION_SYSTEM_ZLIB
+- include(../zlib_dependency.pri)
+- 
+- DEFINES += FT_CONFIG_OPTION_USE_PNG
+-+include($$OUT_PWD/../../gui/qtgui-config.pri)
+- QMAKE_USE_PRIVATE += libpng
+- 
+- DEFINES += TT_CONFIG_OPTION_SUBPIXEL_HINTING
+--- 
+-2.11.0
+-
+diff --git a/package/qt5/qt5base/5.8.0/0002-fix-VNC-platform-plugin-build-on-big-endian-machines.patch b/package/qt5/qt5base/5.8.0/0002-fix-VNC-platform-plugin-build-on-big-endian-machines.patch
+deleted file mode 100644
+index e7d7ee3600..0000000000
+--- a/package/qt5/qt5base/5.8.0/0002-fix-VNC-platform-plugin-build-on-big-endian-machines.patch
++++ /dev/null
+@@ -1,97 +0,0 @@
+-From 35ee8b53549fab6ebffe289417e1d94298447af7 Mon Sep 17 00:00:00 2001
+-From: Shawn Rutledge <shawn.rutledge@digia.com>
+-Date: Fri, 10 Feb 2017 13:56:58 +0100
+-Subject: [PATCH] fix VNC platform plugin build on big-endian machines
+-
+-Task-number: QTBUG-58734
+-Change-Id: I3e44ee4be5003acaba2f1b8ed2658a3ff1bd700e
+-Reviewed-by: Lars Knoll <lars.knoll@qt.io>
+-Reviewed-by: Dmitry Shachnev <mitya57@gmail.com>
+-
+-Upstream: http://code.qt.io/cgit/qt/qtbase.git/patch/?id=6f64bfa654fb7e20bb75ec3b0544b81482babb44
+-Signed-off-by: Peter Seiderer <ps.report@gmx.net>
+----
+- src/plugins/platforms/vnc/qvncclient.cpp | 6 +++---
+- src/plugins/platforms/vnc/qvncscreen.cpp | 7 ++++++-
+- src/plugins/platforms/vnc/qvncscreen.h   | 2 +-
+- 3 files changed, 10 insertions(+), 5 deletions(-)
+-
+-diff --git a/src/plugins/platforms/vnc/qvncclient.cpp b/src/plugins/platforms/vnc/qvncclient.cpp
+-index dae3e83f..58dcfc9b 100644
+---- a/src/plugins/platforms/vnc/qvncclient.cpp
+-+++ b/src/plugins/platforms/vnc/qvncclient.cpp
+-@@ -142,7 +142,7 @@ void QVncClient::convertPixels(char *dst, const char *src, int count) const
+-         case 16: {
+-             quint16 p = *reinterpret_cast<const quint16*>(src);
+- #if Q_BYTE_ORDER == Q_BIG_ENDIAN
+--            if (swapBytes)
+-+            if (m_swapBytes)
+-                 p = ((p & 0xff) << 8) | ((p & 0xff00) >> 8);
+- #endif
+-             r = (p >> 11) & 0x1f;
+-@@ -484,7 +484,7 @@ void QVncClient::setPixelFormat()
+-         m_sameEndian = (QSysInfo::ByteOrder == QSysInfo::BigEndian) == !!m_pixelFormat.bigEndian;
+-         m_needConversion = pixelConversionNeeded();
+- #if Q_BYTE_ORDER == Q_BIG_ENDIAN
+--        m_swapBytes = qvnc_screen->swapBytes();
+-+        m_swapBytes = server()->screen()->swapBytes();
+- #endif
+-     }
+- }
+-@@ -639,7 +639,7 @@ bool QVncClient::pixelConversionNeeded() const
+-         return true;
+- 
+- #if Q_BYTE_ORDER == Q_BIG_ENDIAN
+--    if (qvnc_screen->swapBytes())
+-+    if (server()->screen()->swapBytes())
+-         return true;
+- #endif
+- 
+-diff --git a/src/plugins/platforms/vnc/qvncscreen.cpp b/src/plugins/platforms/vnc/qvncscreen.cpp
+-index 34def457..64f1bc0b 100644
+---- a/src/plugins/platforms/vnc/qvncscreen.cpp
+-+++ b/src/plugins/platforms/vnc/qvncscreen.cpp
+-@@ -43,6 +43,7 @@
+- #include <QtFbSupport/private/qfbcursor_p.h>
+- 
+- #include <QtGui/QPainter>
+-+#include <QtGui/QScreen>
+- #include <QtCore/QRegularExpression>
+- 
+- 
+-@@ -172,14 +173,18 @@ QPixmap QVncScreen::grabWindow(WId wid, int x, int y, int width, int height) con
+- }
+- 
+- #if Q_BYTE_ORDER == Q_BIG_ENDIAN
+--bool QVNCScreen::swapBytes() const
+-+bool QVncScreen::swapBytes() const
+- {
+-+    return false;
+-+
+-+    /* TODO
+-     if (depth() != 16)
+-         return false;
+- 
+-     if (screen())
+-         return screen()->frameBufferLittleEndian();
+-     return frameBufferLittleEndian();
+-+    */
+- }
+- #endif
+- 
+-diff --git a/src/plugins/platforms/vnc/qvncscreen.h b/src/plugins/platforms/vnc/qvncscreen.h
+-index 785abd6d..0b42c3c7 100644
+---- a/src/plugins/platforms/vnc/qvncscreen.h
+-+++ b/src/plugins/platforms/vnc/qvncscreen.h
+-@@ -73,7 +73,7 @@ public:
+-     void clearDirty() { dirtyRegion = QRegion(); }
+- 
+- #if Q_BYTE_ORDER == Q_BIG_ENDIAN
+--    bool swapBytes() const
+-+    bool swapBytes() const;
+- #endif
+- 
+-     QStringList mArgs;
+--- 
+-2.11.0
+-
+diff --git a/package/qt5/qt5base/5.8.0/0003-QAtomic-pass-explicit-failure-mode-to-std-atomic-com.patch b/package/qt5/qt5base/5.8.0/0003-QAtomic-pass-explicit-failure-mode-to-std-atomic-com.patch
+deleted file mode 100644
+index 3a43584eeb..0000000000
+--- a/package/qt5/qt5base/5.8.0/0003-QAtomic-pass-explicit-failure-mode-to-std-atomic-com.patch
++++ /dev/null
+@@ -1,65 +0,0 @@
+-From c5d7425f8ad391112758db161e3e08f18dc9d299 Mon Sep 17 00:00:00 2001
+-From: Marc Mutz <marc.mutz@kdab.com>
+-Date: Thu, 26 May 2016 08:30:26 +0200
+-Subject: [PATCH] QAtomic: pass explicit failure mode to
+- std::atomic::compare_exchange_strong
+-
+-... in an attempt to avoid GCC 4.8 errors such as
+-
+-  bits/atomic_base.h:577:70: error: failure memory model cannot be stronger than success memory model for '__atomic_compare_exchange'
+-  return __atomic_compare_exchange_n(&_M_i, &__i1, __i2, 0, __m1, __m2);
+-                                                                      ^
+-
+-as seen on Android.
+-
+-Change-Id: If046e735888cf331d2d6506d8d5ca9aa7402f9ad
+-[Bug report: https://bugreports.qt.io/browse/QTBUG-59399
+- Patch sent upstream: https://codereview.qt-project.org/#/c/187980/]
+-Signed-off-by: Vicente Olivert Riera <Vincent.Riera@imgtec.org>
+----
+- src/corelib/arch/qatomic_cxx11.h |    8 ++++----
+- 1 file changed, 4 insertions(+), 4 deletions(-)
+-
+-diff --git a/src/corelib/arch/qatomic_cxx11.h b/src/corelib/arch/qatomic_cxx11.h
+-index bb49aae..d6731ec 100644
+---- a/src/corelib/arch/qatomic_cxx11.h
+-+++ b/src/corelib/arch/qatomic_cxx11.h
+-@@ -153,7 +153,7 @@ template <typename X> struct QAtomicOps
+-     template <typename T>
+-     static bool testAndSetRelaxed(std::atomic<T> &_q_value, T expectedValue, T newValue, T *currentValue = Q_NULLPTR) Q_DECL_NOTHROW
+-     {
+--        bool tmp = _q_value.compare_exchange_strong(expectedValue, newValue, std::memory_order_relaxed);
+-+        bool tmp = _q_value.compare_exchange_strong(expectedValue, newValue, std::memory_order_relaxed, std::memory_order_relaxed);
+-         if (currentValue)
+-             *currentValue = expectedValue;
+-         return tmp;
+-@@ -162,7 +162,7 @@ template <typename X> struct QAtomicOps
+-     template <typename T>
+-     static bool testAndSetAcquire(std::atomic<T> &_q_value, T expectedValue, T newValue, T *currentValue = Q_NULLPTR) Q_DECL_NOTHROW
+-     {
+--        bool tmp = _q_value.compare_exchange_strong(expectedValue, newValue, std::memory_order_acquire);
+-+        bool tmp = _q_value.compare_exchange_strong(expectedValue, newValue, std::memory_order_acquire, std::memory_order_acquire);
+-         if (currentValue)
+-             *currentValue = expectedValue;
+-         return tmp;
+-@@ -171,7 +171,7 @@ template <typename X> struct QAtomicOps
+-     template <typename T>
+-     static bool testAndSetRelease(std::atomic<T> &_q_value, T expectedValue, T newValue, T *currentValue = Q_NULLPTR) Q_DECL_NOTHROW
+-     {
+--        bool tmp = _q_value.compare_exchange_strong(expectedValue, newValue, std::memory_order_release);
+-+        bool tmp = _q_value.compare_exchange_strong(expectedValue, newValue, std::memory_order_release, std::memory_order_relaxed);
+-         if (currentValue)
+-             *currentValue = expectedValue;
+-         return tmp;
+-@@ -180,7 +180,7 @@ template <typename X> struct QAtomicOps
+-     template <typename T>
+-     static bool testAndSetOrdered(std::atomic<T> &_q_value, T expectedValue, T newValue, T *currentValue = Q_NULLPTR) Q_DECL_NOTHROW
+-     {
+--        bool tmp = _q_value.compare_exchange_strong(expectedValue, newValue, std::memory_order_acq_rel);
+-+        bool tmp = _q_value.compare_exchange_strong(expectedValue, newValue, std::memory_order_acq_rel, std::memory_order_acquire);
+-         if (currentValue)
+-             *currentValue = expectedValue;
+-         return tmp;
+--- 
+-1.7.10.4
+-
+diff --git a/package/qt5/qt5base/5.8.0/0003-eglfs-fix-x11-header-related-compile-failure.patch b/package/qt5/qt5base/5.8.0/0003-eglfs-fix-x11-header-related-compile-failure.patch
+deleted file mode 100644
+index 0e8bcffa2e..0000000000
+--- a/package/qt5/qt5base/5.8.0/0003-eglfs-fix-x11-header-related-compile-failure.patch
++++ /dev/null
+@@ -1,36 +0,0 @@
+-From 8902f4d7b7c532592d1a34ad117698d3e380e9e1 Mon Sep 17 00:00:00 2001
+-From: Peter Seiderer <ps.report@gmx.net>
+-Date: Fri, 10 Mar 2017 22:23:06 +0100
+-Subject: [PATCH] eglfs: fix x11 header related compile failure
+-
+-Add egl config and QT_EGL_NO_X11 define (as all other eglfs project
+-files do).
+-
+-Task-number: QTBUG-59427
+-Change-Id: Ifbb11eae0fdf0e58c0b7feecb9a7914a889c8f77
+-
+-Upstream: https://codereview.qt-project.org/188158
+-Signed-off-by: Peter Seiderer <ps.report@gmx.net>
+----
+- src/plugins/platforms/eglfs/eglfs-plugin.pro | 5 +++++
+- 1 file changed, 5 insertions(+)
+-
+-diff --git a/src/plugins/platforms/eglfs/eglfs-plugin.pro b/src/plugins/platforms/eglfs/eglfs-plugin.pro
+-index cf4863975a..ec229796e5 100644
+---- a/src/plugins/platforms/eglfs/eglfs-plugin.pro
+-+++ b/src/plugins/platforms/eglfs/eglfs-plugin.pro
+-@@ -2,6 +2,11 @@ TARGET = qeglfs
+- 
+- QT += eglfsdeviceintegration-private
+- 
+-+CONFIG += egl
+-+
+-+# Avoid X11 header collision, use generic EGL native types
+-+DEFINES += QT_EGL_NO_X11
+-+
+- SOURCES += $$PWD/qeglfsmain.cpp
+- 
+- OTHER_FILES += $$PWD/eglfs.json
+--- 
+-2.11.0
+-
+diff --git a/package/qt5/qt5base/5.8.0/0004-examples-fix-compile-without-gui-module.patch b/package/qt5/qt5base/5.8.0/0004-examples-fix-compile-without-gui-module.patch
+deleted file mode 100644
+index 148ced8004..0000000000
+--- a/package/qt5/qt5base/5.8.0/0004-examples-fix-compile-without-gui-module.patch
++++ /dev/null
+@@ -1,42 +0,0 @@
+-From fe8a9bacf781fcf290e04a08f2b8e37d881d58bb Mon Sep 17 00:00:00 2001
+-From: Peter Seiderer <ps.report@gmx.net>
+-Date: Thu, 27 Apr 2017 22:41:28 +0200
+-Subject: [PATCH] examples: fix compile without gui module
+-
+-Fixes:
+-
+-  Project ERROR: Could not find feature opengl.
+-
+-Signed-off-by: Peter Seiderer <ps.report@gmx.net>
+----
+- examples/gui/gui.pro         | 2 +-
+- examples/widgets/widgets.pro | 2 +-
+- 2 files changed, 2 insertions(+), 2 deletions(-)
+-
+-diff --git a/examples/gui/gui.pro b/examples/gui/gui.pro
+-index a4d960d3f5..b8080c2075 100644
+---- a/examples/gui/gui.pro
+-+++ b/examples/gui/gui.pro
+-@@ -6,5 +6,5 @@ CONFIG += no_docs_target
+- 
+- SUBDIRS += analogclock
+- SUBDIRS += rasterwindow
+--qtConfig(opengl): \
+-+qtHaveModule(gui):qtConfig(opengl): \
+-     SUBDIRS += openglwindow
+-diff --git a/examples/widgets/widgets.pro b/examples/widgets/widgets.pro
+-index 513ddc91f2..cef4936d32 100644
+---- a/examples/widgets/widgets.pro
+-+++ b/examples/widgets/widgets.pro
+-@@ -22,7 +22,7 @@ SUBDIRS       = \
+-                 tutorials \
+-                 widgets
+- 
+--qtConfig(opengl): \
+-+qtHaveModule(gui):qtConfig(opengl): \
+-     SUBDIRS += windowcontainer
+- 
+- contains(DEFINES, QT_NO_CURSOR): SUBDIRS -= mainwindows
+--- 
+-2.11.0
+-
+diff --git a/package/qt5/qt5base/Config.in b/package/qt5/qt5base/Config.in
+index 5d1ff1339c..64a7f65386 100644
+--- a/package/qt5/qt5base/Config.in
++++ b/package/qt5/qt5base/Config.in
+@@ -16,16 +16,17 @@ config BR2_PACKAGE_QT5BASE
+ 
+ if BR2_PACKAGE_QT5BASE
+ 
+-config BR2_PACKAGE_QT5BASE_CUSTOM_CONF_OPTS
+-	string "Custom configuration options"
++config BR2_PACKAGE_QT5BASE_LICENSE_APPROVED
++	bool "Approve free license"
+ 	help
+-	  Define custom qt5 configuration options which can be used to
+-	  enable or disable options not managed by buildroot. These
+-	  options are appended to the ones generated by buildroot and
+-	  passed to qt5base during configuration.
++	  Select this if you approve one of the available free licenses for the
++	  Qt5 library.
++	  By doing this you will not be asked while the library is compiled.
++	  Please read and understand the license terms before approving this.
+ 
+-	  E.g. to remove the Windows Vista style option, add the option
+-	  -no-feature-style_windowsvista.
++	  LGPL: http://doc.qt.io/qt-5/lgpl.html
++
++	  See also http://doc.qt.io/qt-5/licensing.html
+ 
+ config BR2_PACKAGE_QT5BASE_CONFIG_FILE
+ 	string "Config file"
+@@ -61,19 +62,19 @@ config BR2_PACKAGE_QT5BASE_SQL
+ if BR2_PACKAGE_QT5BASE_SQL
+ config BR2_PACKAGE_QT5BASE_MYSQL
+ 	bool "MySQL Plugin"
+-	depends on BR2_USE_MMU # mysql
+ 	select BR2_PACKAGE_MYSQL
+ 	select BR2_PACKAGE_NCURSES
+ 	select BR2_PACKAGE_READLINE
++	depends on BR2_USE_MMU # mysql
+ 	help
+ 	  Build MySQL plugin
+ 	  If unsure, say n.
+ 
+ config BR2_PACKAGE_QT5BASE_PSQL
+ 	bool "PostgreSQL Plugin"
++	select BR2_PACKAGE_POSTGRESQL
+ 	depends on BR2_USE_MMU # postgresql
+ 	depends on !BR2_STATIC_LIBS
+-	select BR2_PACKAGE_POSTGRESQL
+ 	help
+ 	  Build PostgreSQL plugin
+ 	  If unsure, say n.
+@@ -116,7 +117,6 @@ config BR2_PACKAGE_QT5BASE_XML
+ 
+ config BR2_PACKAGE_QT5BASE_GUI
+ 	bool "gui module"
+-	select BR2_PACKAGE_FREETYPE
+ 	# At least one graphic backend must be enabled, so enable
+ 	# linuxfb if nothing is enabled.
+ 	select BR2_PACKAGE_QT5BASE_LINUXFB if \
+@@ -180,7 +180,7 @@ config BR2_PACKAGE_QT5BASE_DIRECTFB
+ 	bool "directfb support"
+ 	depends on BR2_PACKAGE_DIRECTFB
+ 
+-comment "directfb backend available if directfb is enabled"
++comment "directfb backend if directb is enabled"
+ 	depends on !BR2_PACKAGE_DIRECTFB
+ 
+ config BR2_PACKAGE_QT5BASE_XCB
+@@ -198,9 +198,9 @@ comment "X.org XCB backend available if X.org is enabled"
+ 
+ config BR2_PACKAGE_QT5BASE_EGLFS
+ 	bool "eglfs support"
++	select BR2_PACKAGE_QT5BASE_OPENGL
+ 	depends on BR2_PACKAGE_HAS_LIBEGL
+ 	depends on BR2_PACKAGE_QT5_GL_AVAILABLE
+-	select BR2_PACKAGE_QT5BASE_OPENGL
+ 
+ comment "eglfs backend available if OpenGL and EGL are enabled"
+ 	depends on !BR2_PACKAGE_HAS_LIBEGL || !BR2_PACKAGE_QT5_GL_AVAILABLE
+@@ -250,16 +250,16 @@ endif
+ 
+ config BR2_PACKAGE_QT5BASE_DBUS
+ 	bool "DBus module"
++	select BR2_PACKAGE_DBUS
+ 	depends on BR2_TOOLCHAIN_HAS_THREADS
+ 	depends on BR2_USE_MMU
+-	select BR2_PACKAGE_DBUS
+ 	help
+ 	  This option enables the D-Bus module.
+ 
+ config BR2_PACKAGE_QT5BASE_ICU
+ 	bool "Enable ICU support"
+-	depends on !BR2_BINFMT_FLAT # icu
+ 	select BR2_PACKAGE_ICU
++	depends on !BR2_BINFMT_FLAT # icu
+ 	help
+ 	  This option enables ICU support in Qt5. This is for example
+ 	  needed for Qt5Webkit.
+diff --git a/package/qt5/qt5base/qmake.conf b/package/qt5/qt5base/qmake.conf
+index 49cf898316..2152d3c7a4 100644
+--- a/package/qt5/qt5base/qmake.conf
++++ b/package/qt5/qt5base/qmake.conf
+@@ -19,7 +19,6 @@ QMAKE_CXXFLAGS_RELEASE += -O3
+ CONFIG                 += nostrip
+ 
+ QMAKE_LIBS             += -lrt -lpthread -ldl
+-QMAKE_CFLAGS_ISYSTEM   =
+ 
+ include(../common/linux_device_post.conf)
+ load(qt_config)
+diff --git a/package/qt5/qt5base/qt5base.mk b/package/qt5/qt5base/qt5base.mk
+index 0c088350e5..81666d6994 100644
+--- a/package/qt5/qt5base/qt5base.mk
++++ b/package/qt5/qt5base/qt5base.mk
+@@ -20,44 +20,31 @@ QT5BASE_INSTALL_STAGING = YES
+ #    want to use the one packaged in Buildroot
+ QT5BASE_CONFIGURE_OPTS += \
+ 	-optimized-qmake \
++	-no-kms \
+ 	-no-cups \
++	-no-nis \
+ 	-no-iconv \
+ 	-system-zlib \
+ 	-system-pcre \
++	-system-harfbuzz \
+ 	-no-pch \
+ 	-shared
+ 
+-QT5BASE_CONFIGURE_OPTS += $(call qstrip,$(BR2_PACKAGE_QT5BASE_CUSTOM_CONF_OPTS))
+-
+-# Uses libgbm from mesa3d
+-ifeq ($(BR2_PACKAGE_MESA3D_OPENGL_EGL),y)
+-QT5BASE_CONFIGURE_OPTS += -kms -gbm
+-QT5BASE_DEPENDENCIES += mesa3d
+-else
+-QT5BASE_CONFIGURE_OPTS += -no-kms
+-endif
+-
+ ifeq ($(BR2_ENABLE_DEBUG),y)
+ QT5BASE_CONFIGURE_OPTS += -debug
+ else
+ QT5BASE_CONFIGURE_OPTS += -release
+ endif
+ 
+-ifeq ($(BR2_PACKAGE_QT5_VERSION_5_6),y)
+ QT5BASE_CONFIGURE_OPTS += -largefile
+-endif
+ 
++ifeq ($(BR2_PACKAGE_QT5BASE_LICENSE_APPROVED),y)
+ QT5BASE_CONFIGURE_OPTS += -opensource -confirm-license
+-ifeq ($(BR2_PACKAGE_QT5_VERSION_LATEST),y)
+-QT5BASE_LICENSE = GPL-2.0+ or LGPL-3.0, GPL-3.0 with exception(tools), GFDL-1.3 (docs)
+-QT5BASE_LICENSE_FILES = LICENSE.GPL2 LICENSE.GPLv3 LICENSE.GPL3-EXCEPT LICENSE.LGPLv3 LICENSE.FDL
+-else
+-QT5BASE_LICENSE = GPL-3.0 or LGPL-2.1 with exception or LGPL-3.0, GFDL-1.3 (docs)
++QT5BASE_LICENSE = GPLv3 or LGPLv2.1 with exception or LGPLv3, GFDLv1.3 (docs)
+ QT5BASE_LICENSE_FILES = LICENSE.GPLv3 LICENSE.LGPLv21 LGPL_EXCEPTION.txt LICENSE.LGPLv3 LICENSE.FDL
+-endif
+-ifeq ($(BR2_PACKAGE_QT5BASE_EXAMPLES),y)
+-QT5BASE_LICENSE := $(QT5BASE_LICENSE), BSD-3-Clause (examples)
+-QT5BASE_LICENSE_FILES += header.BSD
++else
++QT5BASE_LICENSE = Commercial license
++QT5BASE_REDISTRIBUTE = NO
+ endif
+ 
+ QT5BASE_CONFIG_FILE = $(call qstrip,$(BR2_PACKAGE_QT5BASE_CONFIG_FILE))
+@@ -66,10 +53,6 @@ ifneq ($(QT5BASE_CONFIG_FILE),)
+ QT5BASE_CONFIGURE_OPTS += -qconfig buildroot
+ endif
+ 
+-ifeq ($(BR2_PACKAGE_HAS_UDEV),y)
+-QT5BASE_DEPENDENCIES += udev
+-endif
+-
+ # Qt5 SQL Plugins
+ ifeq ($(BR2_PACKAGE_QT5BASE_SQL),y)
+ ifeq ($(BR2_PACKAGE_QT5BASE_MYSQL),y)
+@@ -92,16 +75,10 @@ QT5BASE_DEPENDENCIES   += $(if $(BR2_PACKAGE_QT5BASE_SQLITE_SYSTEM),sqlite)
+ QT5BASE_CONFIGURE_OPTS += $(if $(BR2_PACKAGE_QT5BASE_SQLITE_NONE),-no-sql-sqlite)
+ endif
+ 
+-ifeq ($(BR2_PACKAGE_QT5BASE_GUI),y)
+-QT5BASE_CONFIGURE_OPTS += -gui -system-freetype
+-QT5BASE_CONFIGURE_OPTS += $(if $(BR2_PACKAGE_QT5_VERSION_5_6),-I$(STAGING_DIR)/usr/include/freetype2)
+-QT5BASE_DEPENDENCIES += freetype
+-else
+-QT5BASE_CONFIGURE_OPTS += -no-gui -no-freetype
+-endif
+-QT5BASE_CONFIGURE_OPTS += $(if $(BR2_PACKAGE_QT5BASE_WIDGETS),-widgets,-no-widgets)
+ # We have to use --enable-linuxfb, otherwise Qt thinks that -linuxfb
+ # is to add a link against the "inuxfb" library.
++QT5BASE_CONFIGURE_OPTS += $(if $(BR2_PACKAGE_QT5BASE_GUI),-gui,-no-gui)
++QT5BASE_CONFIGURE_OPTS += $(if $(BR2_PACKAGE_QT5BASE_WIDGETS),-widgets,-no-widgets)
+ QT5BASE_CONFIGURE_OPTS += $(if $(BR2_PACKAGE_QT5BASE_LINUXFB),--enable-linuxfb,-no-linuxfb)
+ QT5BASE_CONFIGURE_OPTS += $(if $(BR2_PACKAGE_QT5BASE_DIRECTFB),-directfb,-no-directfb)
+ QT5BASE_DEPENDENCIES   += $(if $(BR2_PACKAGE_QT5BASE_DIRECTFB),directfb)
+@@ -167,7 +144,6 @@ QT5BASE_DEPENDENCIES   += $(if $(BR2_PACKAGE_QT5BASE_ICU),icu)
+ 
+ QT5BASE_CONFIGURE_OPTS += $(if $(BR2_PACKAGE_QT5BASE_EXAMPLES),-make,-nomake) examples
+ 
+-ifeq ($(BR2_PACKAGE_QT5_VERSION_5_6),y)
+ # gstreamer 0.10 support is broken in qt5multimedia
+ ifeq ($(BR2_PACKAGE_GST1_PLUGINS_BASE),y)
+ QT5BASE_CONFIGURE_OPTS += -gstreamer 1.0
+@@ -175,14 +151,6 @@ QT5BASE_DEPENDENCIES   += gst1-plugins-base
+ else
+ QT5BASE_CONFIGURE_OPTS += -no-gstreamer
+ endif
+-endif
+-
+-ifeq ($(BR2_PACKAGE_LIBINPUT),y)
+-QT5BASE_CONFIGURE_OPTS += -libinput
+-QT5BASE_DEPENDENCIES += libinput
+-else
+-QT5BASE_CONFIGURE_OPTS += -no-libinput
+-endif
+ 
+ # Build the list of libraries to be installed on the target
+ QT5BASE_INSTALL_LIBS_y                                 += Qt5Core
+@@ -193,14 +161,7 @@ QT5BASE_INSTALL_LIBS_$(BR2_PACKAGE_QT5BASE_SQL)        += Qt5Sql
+ QT5BASE_INSTALL_LIBS_$(BR2_PACKAGE_QT5BASE_TEST)       += Qt5Test
+ QT5BASE_INSTALL_LIBS_$(BR2_PACKAGE_QT5BASE_XML)        += Qt5Xml
+ QT5BASE_INSTALL_LIBS_$(BR2_PACKAGE_QT5BASE_OPENGL_LIB) += Qt5OpenGL
+-ifeq ($(BR2_PACKAGE_QT5_VERSION_LATEST),y)
+-QT5BASE_INSTALL_LIBS_$(BR2_PACKAGE_QT5BASE_EGLFS)      += Qt5EglFSDeviceIntegration
+-ifeq ($(BR2_PACKAGE_MESA3D_OPENGL_EGL),y)
+-QT5BASE_INSTALL_LIBS_$(BR2_PACKAGE_QT5BASE_EGLFS)      += Qt5EglFsKmsSupport
+-endif
+-else
+ QT5BASE_INSTALL_LIBS_$(BR2_PACKAGE_QT5BASE_EGLFS)      += Qt5EglDeviceIntegration
+-endif
+ 
+ QT5BASE_INSTALL_LIBS_$(BR2_PACKAGE_QT5BASE_GUI)          += Qt5Gui
+ QT5BASE_INSTALL_LIBS_$(BR2_PACKAGE_QT5BASE_WIDGETS)      += Qt5Widgets
+@@ -266,14 +227,12 @@ define QT5BASE_INSTALL_TARGET_PLUGINS
+ 	fi
+ endef
+ 
+-ifeq ($(BR2_PACKAGE_QT5_VERSION_5_6),y)
+ define QT5BASE_INSTALL_TARGET_FONTS
+ 	if [ -d $(STAGING_DIR)/usr/lib/fonts/ ] ; then \
+ 		mkdir -p $(TARGET_DIR)/usr/lib/fonts ; \
+ 		cp -dpfr $(STAGING_DIR)/usr/lib/fonts/* $(TARGET_DIR)/usr/lib/fonts ; \
+ 	fi
+ endef
+-endif
+ 
+ define QT5BASE_INSTALL_TARGET_EXAMPLES
+ 	if [ -d $(STAGING_DIR)/usr/lib/qt/examples/ ] ; then \
+diff --git a/package/qt5/qt5canvas3d/Config.in b/package/qt5/qt5canvas3d/Config.in
+index 04c04730bd..3ae5192844 100644
+--- a/package/qt5/qt5canvas3d/Config.in
++++ b/package/qt5/qt5canvas3d/Config.in
+@@ -1,17 +1,16 @@
+ config BR2_PACKAGE_QT5CANVAS3D
+ 	bool "qt5canvas3d"
+-	depends on BR2_PACKAGE_QT5_GL_AVAILABLE
+-	depends on BR2_PACKAGE_QT5_JSCORE_AVAILABLE
+ 	select BR2_PACKAGE_QT5DECLARATIVE
+ 	select BR2_PACKAGE_QT5DECLARATIVE_QUICK
++	depends on BR2_PACKAGE_QT5_GL_AVAILABLE
++	depends on BR2_PACKAGE_QT5_JSCORE_AVAILABLE
+ 	help
+ 	  Qt is a cross-platform application and UI framework for
+ 	  developers using C++.
+ 
+-	  Qt Canvas 3D module provides a way to make WebGL-like
+-	  3D drawing calls from Qt Quick JavaScript.
++	  This package corresponds to the qt5canvas3d module.
+ 
+-	  http://doc.qt.io/qt-5/qtcanvas3d-index.html
++	  http://qt.io
+ 
+ comment "qt5canvas3d needs an OpenGL-capable backend"
+ 	depends on !BR2_PACKAGE_QT5_GL_AVAILABLE
+diff --git a/package/qt5/qt5canvas3d/qt5canvas3d.mk b/package/qt5/qt5canvas3d/qt5canvas3d.mk
+index c0448cfd54..3f605ab031 100644
+--- a/package/qt5/qt5canvas3d/qt5canvas3d.mk
++++ b/package/qt5/qt5canvas3d/qt5canvas3d.mk
+@@ -10,8 +10,13 @@ QT5CANVAS3D_SOURCE = qtcanvas3d-opensource-src-$(QT5CANVAS3D_VERSION).tar.xz
+ QT5CANVAS3D_DEPENDENCIES = qt5base qt5declarative
+ QT5CANVAS3D_INSTALL_STAGING = YES
+ 
+-QT5CANVAS3D_LICENSE = GPL-2.0 or GPL-3.0 or LGPL-3.0
++ifeq ($(BR2_PACKAGE_QT5BASE_LICENSE_APPROVED),y)
++QT5CANVAS3D_LICENSE = GPLv2 or GPLv3 or LGPLv3
+ QT5CANVAS3D_LICENSE_FILES = LICENSE.GPLv2 LICENSE.GPLv3 LICENSE.LGPLv3
++else
++QT5CANVAS3D_LICENSE = Commercial license
++QT5CANVAS3D_REDISTRIBUTE = NO
++endif
+ 
+ define QT5CANVAS3D_CONFIGURE_CMDS
+ 	(cd $(@D); $(TARGET_MAKE_ENV) $(HOST_DIR)/usr/bin/qmake)
+diff --git a/package/qt5/qt5charts/Config.in b/package/qt5/qt5charts/Config.in
+index bd659878ff..d354bb2fc9 100644
+--- a/package/qt5/qt5charts/Config.in
++++ b/package/qt5/qt5charts/Config.in
+@@ -3,7 +3,6 @@ config BR2_PACKAGE_QT5CHARTS
+ 	select BR2_PACKAGE_QT5DECLARATIVE
+ 	select BR2_PACKAGE_QT5DECLARATIVE_QUICK
+ 	select BR2_PACKAGE_QT5BASE_WIDGETS
+-	depends on BR2_PACKAGE_QT5_VERSION_LATEST
+ 	depends on BR2_PACKAGE_QT5_GL_AVAILABLE
+ 	depends on BR2_PACKAGE_QT5_JSCORE_AVAILABLE
+ 	help
+diff --git a/package/qt5/qt5connectivity/Config.in b/package/qt5/qt5connectivity/Config.in
+index 8bda8de66a..d529ea7f85 100644
+--- a/package/qt5/qt5connectivity/Config.in
++++ b/package/qt5/qt5connectivity/Config.in
+@@ -1,19 +1,21 @@
+ config BR2_PACKAGE_QT5CONNECTIVITY
+ 	bool "qt5connectivity"
+-	depends on BR2_PACKAGE_NEARD || BR2_PACKAGE_BLUEZ_UTILS || BR2_PACKAGE_BLUEZ5_UTILS
++	select BR2_PACKAGE_BLUEZ_UTILS
+ 	select BR2_PACKAGE_QT5BASE
+ 	select BR2_PACKAGE_QT5BASE_CONCURRENT
+ 	select BR2_PACKAGE_QT5BASE_DBUS
++	depends on !BR2_STATIC_LIBS # bluez_utils
++	depends on BR2_USE_WCHAR # bluez_utils
++	depends on BR2_TOOLCHAIN_HAS_THREADS # bluez_utils
++	depends on BR2_USE_MMU # bluez_utils
+ 	help
+ 	  Qt is a cross-platform application and UI framework for
+ 	  developers using C++.
+ 
+-	  Qt Connectivity module provides support for Bluetooth/NFC
+-	  peripherials.
++	  This package corresponds to the qt5connectivity module.
+ 
+-	  http://doc.qt.io/qt-5/qtbluetooth-index.html
+-	  http://doc.qt.io/qt-5/qtnfc-index.html
++	  http://qt.io
+ 
+-comment "qt5connectivity needs neard and/or bluez(5)_utils"
+-	depends on !BR2_PACKAGE_NEARD && !BR2_PACKAGE_BLUEZ_UTILS && \
+-		!BR2_PACKAGE_BLUEZ5_UTILS
++comment "qt5connectivity needs a toolchain w/ wchar, threads, dynamic library"
++	depends on BR2_USE_MMU
++	depends on !BR2_USE_WCHAR || !BR2_TOOLCHAIN_HAS_THREADS || BR2_STATIC_LIBS
+diff --git a/package/qt5/qt5connectivity/qt5connectivity.mk b/package/qt5/qt5connectivity/qt5connectivity.mk
+index d53aa91f22..936bc6f63c 100644
+--- a/package/qt5/qt5connectivity/qt5connectivity.mk
++++ b/package/qt5/qt5connectivity/qt5connectivity.mk
+@@ -7,24 +7,20 @@
+ QT5CONNECTIVITY_VERSION = $(QT5_VERSION)
+ QT5CONNECTIVITY_SITE = $(QT5_SITE)
+ QT5CONNECTIVITY_SOURCE = qtconnectivity-opensource-src-$(QT5CONNECTIVITY_VERSION).tar.xz
+-QT5CONNECTIVITY_DEPENDENCIES = qt5base
++QT5CONNECTIVITY_DEPENDENCIES = bluez_utils qt5base
+ QT5CONNECTIVITY_INSTALL_STAGING = YES
+ 
+-ifeq ($(BR2_PACKAGE_QT5_VERSION_LATEST),y)
+-QT5CONNECTIVITY_LICENSE = GPL-2.0+ or LGPL-3.0, GPL-3.0 with exception(tools), GFDL-1.3 (docs)
+-QT5CONNECTIVITY_LICENSE_FILES = LICENSE.GPLv2 LICENSE.GPLv3 LICENSE.GPL3-EXCEPT LICENSE.LGPLv3 LICENSE.FDL
+-else
+-QT5CONNECTIVITY_LICENSE = GPL-2.0 or GPL-3.0 or LGPL-2.1 with exception or LGPL-3.0, GFDL-1.3 (docs)
++ifeq ($(BR2_PACKAGE_QT5BASE_LICENSE_APPROVED),y)
++QT5CONNECTIVITY_LICENSE = GPLv2 or GPLv3 or LGPLv2.1 with exception or LGPLv3, GFDLv1.3 (docs)
+ QT5CONNECTIVITY_LICENSE_FILES = LICENSE.GPLv2 LICENSE.GPLv3 LICENSE.LGPLv21 LGPL_EXCEPTION.txt LICENSE.LGPLv3 LICENSE.FDL
+-endif
+-ifeq ($(BR2_PACKAGE_QT5BASE_EXAMPLES),y)
+-QT5CONNECTIVITY_LICENSE := $(QT5CONNECTIVITY_LICENSE), BSD-3-Clause (examples)
++else
++QT5CONNECTIVITY_LICENSE = Commercial license
++QT5CONNECTIVITY_REDISTRIBUTE = NO
+ endif
+ 
+-QT5CONNECTIVITY_DEPENDENCIES += $(if $(BR2_PACKAGE_QT5DECLARATIVE),qt5declarative)
+-QT5CONNECTIVITY_DEPENDENCIES += $(if $(BR2_PACKAGE_BLUEZ_UTILS),bluez_utils)
+-QT5CONNECTIVITY_DEPENDENCIES += $(if $(BR2_PACKAGE_BLUEZ5_UTILS),bluez5_utils)
+-QT5CONNECTIVITY_DEPENDENCIES += $(if $(BR2_PACKAGE_NEARD),neard)
++ifeq ($(BR2_PACKAGE_QT5DECLARATIVE),y)
++QT5CONNECTIVITY_DEPENDENCIES += qt5declarative
++endif
+ 
+ define QT5CONNECTIVITY_CONFIGURE_CMDS
+ 	(cd $(@D); $(TARGET_MAKE_ENV) $(HOST_DIR)/usr/bin/qmake)
+@@ -40,48 +36,15 @@ define QT5CONNECTIVITY_INSTALL_STAGING_CMDS
+ endef
+ 
+ ifeq ($(BR2_PACKAGE_QT5DECLARATIVE_QUICK),y)
+-ifneq ($(BR2_PACKAGE_BLUEZ_UTILS)$(BR2_PACKAGE_BLUEZ5_UTILS),)
+-define QT5CONNECTIVITY_INSTALL_TARGET_BLUETOOTH_QMLS
++define QT5CONNECTIVITY_INSTALL_TARGET_QMLS
+ 	cp -dpfr $(STAGING_DIR)/usr/qml/QtBluetooth $(TARGET_DIR)/usr/qml/
+ endef
+ endif
+-ifeq ($(BR2_PACKAGE_NEARD),y)
+-define QT5CONNECTIVITY_INSTALL_TARGET_NFC_QMLS
+-	cp -dpfr $(STAGING_DIR)/usr/qml/QtNfc $(TARGET_DIR)/usr/qml/
+-endef
+-endif
+-endif
+ 
+-ifneq ($(BR2_PACKAGE_BLUEZ_UTILS)$(BR2_PACKAGE_BLUEZ5_UTILS),)
+-define QT5CONNECTIVITY_INSTALL_TARGET_BLUETOOTH
++define QT5CONNECTIVITY_INSTALL_TARGET_CMDS
+ 	cp -dpf $(STAGING_DIR)/usr/lib/libQt5Bluetooth.so.* $(TARGET_DIR)/usr/lib
+ 	cp -dpf $(STAGING_DIR)/usr/bin/sdpscanner $(TARGET_DIR)/usr/bin
+-endef
+-ifeq ($(BR2_PACKAGE_QT5BASE_EXAMPLES),y)
+-define QT5CONNECTIVITY_INSTALL_TARGET_BLUETOOTH_EXAMPLES
+-	cp -dpfr $(STAGING_DIR)/usr/lib/qt/examples/bluetooth $(TARGET_DIR)/usr/lib/qt/examples/
+-endef
+-endif
+-endif
+-
+-ifeq ($(BR2_PACKAGE_NEARD),y)
+-define QT5CONNECTIVITY_INSTALL_TARGET_NFC
+-	cp -dpf $(STAGING_DIR)/usr/lib/libQt5Nfc.so.* $(TARGET_DIR)/usr/lib
+-endef
+-ifeq ($(BR2_PACKAGE_QT5BASE_EXAMPLES),y)
+-define QT5CONNECTIVITY_INSTALL_TARGET_NFC_EXAMPLES
+-	cp -dpfr $(STAGING_DIR)/usr/lib/qt/examples/nfc $(TARGET_DIR)/usr/lib/qt/examples/
+-endef
+-endif
+-endif
+-
+-define QT5CONNECTIVITY_INSTALL_TARGET_CMDS
+-	$(QT5CONNECTIVITY_INSTALL_TARGET_BLUETOOTH)
+-	$(QT5CONNECTIVITY_INSTALL_TARGET_NFC)
+-	$(QT5CONNECTIVITY_INSTALL_TARGET_BLUETOOTH_QMLS)
+-	$(QT5CONNECTIVITY_INSTALL_TARGET_NFC_QMLS)
+-	$(QT5CONNECTIVITY_INSTALL_TARGET_BLUETOOTH_EXAMPLES)
+-	$(QT5CONNECTIVITY_INSTALL_TARGET_NFC_EXAMPLES)
++	$(QT5CONNECTIVITY_INSTALL_TARGET_QMLS)
+ endef
+ 
+ $(eval $(generic-package))
+diff --git a/package/qt5/qt5declarative/0001-examples-photoviewer-needs-widgets-support.patch b/package/qt5/qt5declarative/0001-examples-photoviewer-needs-widgets-support.patch
+deleted file mode 100644
+index aeaaa91770..0000000000
+--- a/package/qt5/qt5declarative/0001-examples-photoviewer-needs-widgets-support.patch
++++ /dev/null
+@@ -1,32 +0,0 @@
+-From b616a7e2a7e03e2eb189dca3dc428c0e19e1652b Mon Sep 17 00:00:00 2001
+-From: Peter Seiderer <ps.report@gmx.net>
+-Date: Thu, 6 Apr 2017 21:53:40 +0200
+-Subject: [PATCH] examples: photoviewer needs widgets support
+-
+-Fixes:
+-
+-  .../qt5declarative-5.8.0/examples/quick/demos/photoviewer/photoviewer.pro
+-  Project ERROR: Unknown module(s) in QT: widgets
+-
+-Signed-off-by: Peter Seiderer <ps.report@gmx.net>
+----
+- examples/quick/demos/demos.pro | 6 ++++--
+- 1 file changed, 4 insertions(+), 2 deletions(-)
+-
+-diff --git a/examples/quick/demos/demos.pro b/examples/quick/demos/demos.pro
+-index 0644b81a2..5a6fd52ba 100644
+---- a/examples/quick/demos/demos.pro
+-+++ b/examples/quick/demos/demos.pro
+-@@ -7,5 +7,7 @@ SUBDIRS = samegame \
+-             photosurface \
+-             stocqt
+- 
+--qtHaveModule(xmlpatterns): SUBDIRS += rssnews photoviewer
+--
+-+qtHaveModule(xmlpatterns) {
+-+    SUBDIRS += rssnews
+-+    qtHaveModule(widgets): SUBDIRS += photoviewer
+-+}
+--- 
+-2.11.0
+-
+diff --git a/package/qt5/qt5declarative/Config.in b/package/qt5/qt5declarative/Config.in
+index 5384b5f187..eba4c8d61d 100644
+--- a/package/qt5/qt5declarative/Config.in
++++ b/package/qt5/qt5declarative/Config.in
+@@ -1,18 +1,16 @@
+ config BR2_PACKAGE_QT5DECLARATIVE
+ 	bool "qt5declarative"
+-	depends on BR2_PACKAGE_QT5_JSCORE_AVAILABLE
+ 	select BR2_PACKAGE_QT5XMLPATTERNS
+ 	select BR2_PACKAGE_QT5BASE
+ 	select BR2_PACKAGE_QT5BASE_GUI
++	depends on BR2_PACKAGE_QT5_JSCORE_AVAILABLE
+ 	help
+ 	  Qt is a cross-platform application and UI framework for
+ 	  developers using C++.
+ 
+-	  Qt Declarative module provides the Qt QML and Qt Quick
+-	  modules for developing UIs with the QML language
++	  This package corresponds to the qt5declarative module.
+ 
+-	  http://doc.qt.io/qt-5/qtqml-index.html
+-	  http://doc.qt.io/qt-5/qtquick-index.html
++	  http://qt.io
+ 
+ if BR2_PACKAGE_QT5DECLARATIVE
+ 
+@@ -21,7 +19,7 @@ comment "quick module needs an OpenGL-capable backend"
+ 
+ config BR2_PACKAGE_QT5DECLARATIVE_QUICK
+ 	bool "quick module"
+-	depends on BR2_PACKAGE_QT5_GL_AVAILABLE
+ 	select BR2_PACKAGE_QT5BASE_OPENGL
++	depends on BR2_PACKAGE_QT5_GL_AVAILABLE
+ 
+ endif
+diff --git a/package/qt5/qt5declarative/qt5declarative.mk b/package/qt5/qt5declarative/qt5declarative.mk
+index f9ed8c7515..be3a7b7d7a 100644
+--- a/package/qt5/qt5declarative/qt5declarative.mk
++++ b/package/qt5/qt5declarative/qt5declarative.mk
+@@ -10,12 +10,12 @@ QT5DECLARATIVE_SOURCE = qtdeclarative-opensource-src-$(QT5DECLARATIVE_VERSION).t
+ QT5DECLARATIVE_DEPENDENCIES = qt5base qt5xmlpatterns
+ QT5DECLARATIVE_INSTALL_STAGING = YES
+ 
+-ifeq ($(BR2_PACKAGE_QT5_VERSION_LATEST),y)
+-QT5DECLARATIVE_LICENSE = GPL-2.0+ or LGPL-3.0, GPL-3.0 with exception(tools), GFDL-1.3 (docs)
+-QT5DECLARATIVE_LICENSE_FILES = LICENSE.GPL2 LICENSE.GPLv3 LICENSE.GPL3-EXCEPT LICENSE.LGPLv3 LICENSE.FDL
+-else
+-QT5DECLARATIVE_LICENSE = GPL-3.0 or LGPL-2.1 with exception or LGPL-3.0, GFDL-1.3 (docs)
++ifeq ($(BR2_PACKAGE_QT5BASE_LICENSE_APPROVED),y)
++QT5DECLARATIVE_LICENSE = GPLv3 or LGPLv2.1 with exception or LGPLv3, GFDLv1.3 (docs)
+ QT5DECLARATIVE_LICENSE_FILES = LICENSE.GPLv3 LICENSE.LGPLv21 LGPL_EXCEPTION.txt LICENSE.LGPLv3 LICENSE.FDL
++else
++QT5DECLARATIVE_LICENSE = Commercial license
++QT5DECLARATIVE_REDISTRIBUTE = NO
+ endif
+ 
+ define QT5DECLARATIVE_CONFIGURE_CMDS
+@@ -23,11 +23,14 @@ define QT5DECLARATIVE_CONFIGURE_CMDS
+ endef
+ 
+ define QT5DECLARATIVE_BUILD_CMDS
+-	$(TARGET_MAKE_ENV) $(MAKE) -C $(@D)
++	$(TARGET_MAKE_ENV) $(MAKE) -C $(@D) \
++		sub-src-all sub-tools-all
+ endef
+ 
+ define QT5DECLARATIVE_INSTALL_STAGING_CMDS
+-	$(TARGET_MAKE_ENV) $(MAKE) -C $(@D) install
++	$(TARGET_MAKE_ENV) $(MAKE) -C $(@D) \
++		sub-src-install_subtargets \
++		sub-tools-install_subtargets
+ 	$(QT5_LA_PRL_FILES_FIXUP)
+ endef
+ 
+@@ -37,9 +40,6 @@ ifeq ($(BR2_PACKAGE_QT5DECLARATIVE_QUICK),y)
+ define QT5DECLARATIVE_INSTALL_TARGET_QUICK_LIBS
+ 	cp -dpf $(STAGING_DIR)/usr/lib/libQt5Quick*.so.* $(TARGET_DIR)/usr/lib
+ endef
+-define QT5DECLARATIVE_INSTALL_TARGET_QUICK_EXAMPLES
+-	cp -dpfr $(STAGING_DIR)/usr/lib/qt/examples/quick/ $(TARGET_DIR)/usr/lib/qt/examples/
+-endef
+ endif
+ 
+ define QT5DECLARATIVE_INSTALL_TARGET_LIBS
+@@ -50,17 +50,9 @@ endef
+ 
+ endif
+ 
+-ifeq ($(BR2_PACKAGE_QT5BASE_EXAMPLES),y)
+-define QT5DECLARATIVE_INSTALL_TARGET_EXAMPLES
+-	cp -dpfr $(STAGING_DIR)/usr/lib/qt/examples/qml* $(TARGET_DIR)/usr/lib/qt/examples/
+-	$(QT5DECLARATIVE_INSTALL_TARGET_QUICK_EXAMPLES)
+-endef
+-endif
+-
+ define QT5DECLARATIVE_INSTALL_TARGET_CMDS
+ 	cp -dpf $(STAGING_DIR)/usr/bin/qml* $(TARGET_DIR)/usr/bin
+ 	cp -dpfr $(STAGING_DIR)/usr/qml $(TARGET_DIR)/usr
+-	$(QT5DECLARATIVE_INSTALL_TARGET_EXAMPLES)
+ 	$(QT5DECLARATIVE_INSTALL_TARGET_LIBS)
+ endef
+ 
+diff --git a/package/qt5/qt5enginio/Config.in b/package/qt5/qt5enginio/Config.in
+index 102058e7c5..fcb866cd6d 100644
+--- a/package/qt5/qt5enginio/Config.in
++++ b/package/qt5/qt5enginio/Config.in
+@@ -8,10 +8,6 @@ config BR2_PACKAGE_QT5ENGINIO
+ 	  Qt is a cross-platform application and UI framework for
+ 	  developers using C++.
+ 
+-	  Enginio is a Backend-as-a-Service solution for simplifying
+-	  backend development of connected and data-driven applications.
++	  This package corresponds to the qt5enginio module.
+ 
+-	  This package has been tagged as deprecated since version
+-	  5.6 and not recommended for new design.
+-
+-	  http://doc.qt.io/archives/qt-5.5/enginio-index.html
++	  http://qt.io
+diff --git a/package/qt5/qt5enginio/qt5enginio.mk b/package/qt5/qt5enginio/qt5enginio.mk
+index bffd1f6274..b858d1cbbf 100644
+--- a/package/qt5/qt5enginio/qt5enginio.mk
++++ b/package/qt5/qt5enginio/qt5enginio.mk
+@@ -6,16 +6,18 @@
+ 
+ # Qt5Enginio does not follow Qt versionning
+ # see https://bugreports.qt.io/browse/QTBUG-50111
+-QT5ENGINIO_VERSION = 1.6.2
++QT5ENGINIO_VERSION = 1.6.0
+ QT5ENGINIO_SITE = $(QT5_SITE)
+ QT5ENGINIO_SOURCE = qtenginio-opensource-src-$(QT5ENGINIO_VERSION).tar.xz
+ QT5ENGINIO_DEPENDENCIES = openssl qt5base
+ QT5ENGINIO_INSTALL_STAGING = YES
+ 
+-QT5ENGINIO_LICENSE = GPL-3.0 or LGPL-2.1 with exception or LGPL-3.0, GFDL-1.3 (docs)
++ifeq ($(BR2_PACKAGE_QT5BASE_LICENSE_APPROVED),y)
++QT5ENGINIO_LICENSE = GPLv3 or LGPLv2.1 with exception or LGPLv3, GFDLv1.3 (docs)
+ QT5ENGINIO_LICENSE_FILES = LICENSE.GPLv3 LICENSE.LGPLv21 LGPL_EXCEPTION.txt LICENSE.LGPLv3 LICENSE.FDL
+-ifeq ($(BR2_PACKAGE_QT5BASE_EXAMPLES),y)
+-QT5ENGINIO_LICENSE := $(QT5ENGINIO_LICENSE), BSD-3-Clause (examples)
++else
++QT5ENGINIO_LICENSE = Commercial license
++QT5ENGINIO_REDISTRIBUTE = NO
+ endif
+ 
+ ifeq ($(BR2_PACKAGE_QT5DECLARATIVE),y)
+diff --git a/package/qt5/qt5graphicaleffects/Config.in b/package/qt5/qt5graphicaleffects/Config.in
+index 69b7fca413..a42e1f8f2a 100644
+--- a/package/qt5/qt5graphicaleffects/Config.in
++++ b/package/qt5/qt5graphicaleffects/Config.in
+@@ -1,18 +1,16 @@
+ config BR2_PACKAGE_QT5GRAPHICALEFFECTS
+ 	bool "qt5graphicaleffects"
+-	depends on BR2_PACKAGE_QT5_GL_AVAILABLE
+-	depends on BR2_PACKAGE_QT5_JSCORE_AVAILABLE
+ 	select BR2_PACKAGE_QT5DECLARATIVE
+ 	select BR2_PACKAGE_QT5DECLARATIVE_QUICK
++	depends on BR2_PACKAGE_QT5_GL_AVAILABLE
++	depends on BR2_PACKAGE_QT5_JSCORE_AVAILABLE
+ 	help
+ 	  Qt is a cross-platform application and UI framework for
+ 	  developers using C++.
+ 
+-	  The Qt Graphical Effects module provides a set of QML types
+-	  for adding visually impressive and configurable effects to
+-	  user interfaces.
++	  This package corresponds to the qt5graphicaleffects module.
+ 
+-	  http://doc.qt.io/qt-5/qtgraphicaleffects-index.html
++	  http://qt.io
+ 
+ comment "qt5graphicaleffects needs an OpenGL-capable backend"
+ 	depends on !BR2_PACKAGE_QT5_GL_AVAILABLE
+diff --git a/package/qt5/qt5graphicaleffects/qt5graphicaleffects.mk b/package/qt5/qt5graphicaleffects/qt5graphicaleffects.mk
+index 929a62e2dd..223374a27c 100644
+--- a/package/qt5/qt5graphicaleffects/qt5graphicaleffects.mk
++++ b/package/qt5/qt5graphicaleffects/qt5graphicaleffects.mk
+@@ -10,12 +10,12 @@ QT5GRAPHICALEFFECTS_SOURCE = qtgraphicaleffects-opensource-src-$(QT5GRAPHICALEFF
+ QT5GRAPHICALEFFECTS_DEPENDENCIES = qt5base qt5declarative
+ QT5GRAPHICALEFFECTS_INSTALL_STAGING = YES
+ 
+-ifeq ($(BR2_PACKAGE_QT5_VERSION_LATEST),y)
+-QT5GRAPHICALEFFECTS_LICENSE = GPL-2.0+ or LGPL-3.0, GPL-3.0 with exception(tools), GFDL-1.3 (docs)
+-QT5GRAPHICALEFFECTS_LICENSE_FILES = LICENSE.GPLv2 LICENSE.GPLv3 LICENSE.GPL3-EXCEPT LICENSE.LGPLv3 LICENSE.FDL
+-else
+-QT5GRAPHICALEFFECTS_LICENSE = GPL-2.0 or GPL-3.0 or LGPL-2.1 with exception or LGPL-3.0, GFDL-1.3 (docs)
++ifeq ($(BR2_PACKAGE_QT5BASE_LICENSE_APPROVED),y)
++QT5GRAPHICALEFFECTS_LICENSE = GPLv2 or GPLv3 or LGPLv2.1 with exception or LGPLv3, GFDLv1.3 (docs)
+ QT5GRAPHICALEFFECTS_LICENSE_FILES = LICENSE.GPLv2 LICENSE.GPLv3 LICENSE.LGPLv21 LGPL_EXCEPTION.txt LICENSE.LGPLv3 LICENSE.FDL
++else
++QT5GRAPHICALEFFECTS_LICENSE = Commercial license
++QT5GRAPHICALEFFECTS_REDISTRIBUTE = NO
+ endif
+ 
+ define QT5GRAPHICALEFFECTS_CONFIGURE_CMDS
+diff --git a/package/qt5/qt5imageformats/Config.in b/package/qt5/qt5imageformats/Config.in
+index 44c85c9b38..4dd848e41f 100644
+--- a/package/qt5/qt5imageformats/Config.in
++++ b/package/qt5/qt5imageformats/Config.in
+@@ -6,7 +6,6 @@ config BR2_PACKAGE_QT5IMAGEFORMATS
+ 	  Qt is a cross-platform application and UI framework for
+ 	  developers using C++.
+ 
+-	  The Qt Image Formats module provides plugins for
+-	  additional image formats: TIFF, MNG, TGA, WBMP
++	  This package corresponds to the qt5imageformats module.
+ 
+-	  http://doc.qt.io/qt-5/qtimageformats-index.html
++	  http://qt.io
+diff --git a/package/qt5/qt5imageformats/qt5imageformats.mk b/package/qt5/qt5imageformats/qt5imageformats.mk
+index f3d9d7427f..921656d0aa 100644
+--- a/package/qt5/qt5imageformats/qt5imageformats.mk
++++ b/package/qt5/qt5imageformats/qt5imageformats.mk
+@@ -10,12 +10,12 @@ QT5IMAGEFORMATS_SOURCE = qtimageformats-opensource-src-$(QT5IMAGEFORMATS_VERSION
+ QT5IMAGEFORMATS_DEPENDENCIES = qt5base
+ QT5IMAGEFORMATS_INSTALL_STAGING = YES
+ 
+-ifeq ($(BR2_PACKAGE_QT5_VERSION_LATEST),y)
+-QT5IMAGEFORMATS_LICENSE = GPL-2.0+ or LGPL-3.0, GPL-3.0 with exception(tools), GFDL-1.3 (docs)
+-QT5IMAGEFORMATS_LICENSE_FILES = LICENSE.GPLv2 LICENSE.GPLv3 LICENSE.GPL3-EXCEPT LICENSE.LGPLv3 LICENSE.FDL
+-else
+-QT5IMAGEFORMATS_LICENSE = GPL-2.0 or GPL-3.0 or LGPL-2.1 with exception or LGPL-3.0, GFDL-1.3 (docs)
++ifeq ($(BR2_PACKAGE_QT5BASE_LICENSE_APPROVED),y)
++QT5IMAGEFORMATS_LICENSE = GPLv2 or GPLv3 or LGPLv2.1 with exception or LGPLv3, GFDLv1.3 (docs)
+ QT5IMAGEFORMATS_LICENSE_FILES = LICENSE.GPLv2 LICENSE.GPLv3 LICENSE.LGPLv21 LGPL_EXCEPTION.txt LICENSE.LGPLv3 LICENSE.FDL
++else
++QT5IMAGEFORMATS_LICENSE = Commercial license
++QT5IMAGEFORMATS_REDISTRIBUTE = NO
+ endif
+ 
+ define QT5IMAGEFORMATS_CONFIGURE_CMDS
+diff --git a/package/qt5/qt5location/Config.in b/package/qt5/qt5location/Config.in
+index e1778182a0..209d134215 100644
+--- a/package/qt5/qt5location/Config.in
++++ b/package/qt5/qt5location/Config.in
+@@ -5,8 +5,6 @@ config BR2_PACKAGE_QT5LOCATION
+ 	  Qt is a cross-platform application and UI framework for
+ 	  developers using C++.
+ 
+-	  The Qt Location API helps you create viable mapping
+-	  solutions using the data available from some of the
+-	  popular location services.
++	  This package corresponds to the qt5location module.
+ 
+-	  http://doc.qt.io/qt-5/qtlocation-index.html
++	  http://qt.io
+diff --git a/package/qt5/qt5location/qt5location.mk b/package/qt5/qt5location/qt5location.mk
+index b31bee7d17..358b1621c5 100644
+--- a/package/qt5/qt5location/qt5location.mk
++++ b/package/qt5/qt5location/qt5location.mk
+@@ -10,12 +10,12 @@ QT5LOCATION_SOURCE = qtlocation-opensource-src-$(QT5LOCATION_VERSION).tar.xz
+ QT5LOCATION_DEPENDENCIES = qt5base
+ QT5LOCATION_INSTALL_STAGING = YES
+ 
+-ifeq ($(BR2_PACKAGE_QT5_VERSION_LATEST),y)
+-QT5LOCATION_LICENSE = GPL-2.0+ or LGPL-3.0, GPL-3.0 with exception(tools), GFDL-1.3 (docs)
+-QT5LOCATION_LICENSE_FILES = LICENSE.GPLv2 LICENSE.GPLv3 LICENSE.GPL3-EXCEPT LICENSE.LGPLv3 LICENSE.FDL
+-else
+-QT5LOCATION_LICENSE = GPL-2.0 or GPL-3.0 or LGPL-2.1 with exception or LGPL-3.0, GFDL-1.3 (docs)
++ifeq ($(BR2_PACKAGE_QT5BASE_LICENSE_APPROVED),y)
++QT5LOCATION_LICENSE = GPLv2 or GPLv3 or LGPLv2.1 with exception or LGPLv3, GFDLv1.3 (docs)
+ QT5LOCATION_LICENSE_FILES = LICENSE.GPLv2 LICENSE.GPLv3 LICENSE.LGPLv21 LGPL_EXCEPTION.txt LICENSE.LGPLv3 LICENSE.FDL
++else
++QT5LOCATION_LICENSE = Commercial license
++QT5LOCATION_REDISTRIBUTE = NO
+ endif
+ 
+ ifeq ($(BR2_PACKAGE_QT5DECLARATIVE),y)
+@@ -57,4 +57,5 @@ define QT5LOCATION_INSTALL_TARGET_CMDS
+ 	$(QT5LOCATION_INSTALL_TARGET_QMLS)
+ endef
+ 
++
+ $(eval $(generic-package))
+diff --git a/package/qt5/qt5multimedia/Config.in b/package/qt5/qt5multimedia/Config.in
+index 5b14ac57f1..59c3984781 100644
+--- a/package/qt5/qt5multimedia/Config.in
++++ b/package/qt5/qt5multimedia/Config.in
+@@ -3,14 +3,10 @@ config BR2_PACKAGE_QT5MULTIMEDIA
+ 	select BR2_PACKAGE_QT5BASE
+ 	select BR2_PACKAGE_QT5BASE_GUI
+ 	select BR2_PACKAGE_QT5BASE_NETWORK
+-	select BR2_PACKAGE_QT5BASE_OPENGL_LIB if BR2_PACKAGE_QT5BASE_OPENGL
+ 	help
+ 	  Qt is a cross-platform application and UI framework for
+ 	  developers using C++.
+ 
+-	  The Qt Multimedia module provides a rich feature set that
+-	  enables you to easily take advantage of a platform's multimedia
+-	  capabilities such as media playback and the use of camera and
+-	  radio devices.
++	  This package corresponds to the qt5multimedia module.
+ 
+-	  http://doc.qt.io/qt-5/multimediaoverview.html
++	  http://qt.io
+diff --git a/package/qt5/qt5multimedia/qt5multimedia.mk b/package/qt5/qt5multimedia/qt5multimedia.mk
+index 133536e1ab..67e79686cb 100644
+--- a/package/qt5/qt5multimedia/qt5multimedia.mk
++++ b/package/qt5/qt5multimedia/qt5multimedia.mk
+@@ -10,12 +10,12 @@ QT5MULTIMEDIA_SOURCE = qtmultimedia-opensource-src-$(QT5MULTIMEDIA_VERSION).tar.
+ QT5MULTIMEDIA_DEPENDENCIES = qt5base
+ QT5MULTIMEDIA_INSTALL_STAGING = YES
+ 
+-ifeq ($(BR2_PACKAGE_QT5_VERSION_LATEST),y)
+-QT5MULTIMEDIA_LICENSE = GPL-2.0+ or LGPL-3.0, GPL-3.0 with exception(tools), GFDL-1.3 (docs)
+-QT5MULTIMEDIA_LICENSE_FILES = LICENSE.GPL2 LICENSE.GPLv3 LICENSE.GPL3-EXCEPT LICENSE.LGPLv3 LICENSE.FDL
+-else
+-QT5MULTIMEDIA_LICENSE = GPL-3.0 or LGPL-2.1 with exception or LGPL-3.0, GFDL-1.3 (docs)
++ifeq ($(BR2_PACKAGE_QT5BASE_LICENSE_APPROVED),y)
++QT5MULTIMEDIA_LICENSE = GPLv3 or LGPLv2.1 with exception or LGPLv3, GFDLv1.3 (docs)
+ QT5MULTIMEDIA_LICENSE_FILES = LICENSE.GPLv3 LICENSE.LGPLv21 LGPL_EXCEPTION.txt LICENSE.LGPLv3 LICENSE.FDL
++else
++QT5MULTIMEDIA_LICENSE = Commercial license
++QT5MULTIMEDIA_REDISTRIBUTE = NO
+ endif
+ 
+ ifeq ($(BR2_PACKAGE_GST1_PLUGINS_BASE),y)
+@@ -59,16 +59,9 @@ define QT5MULTIMEDIA_INSTALL_TARGET_QMLS
+ endef
+ endif
+ 
+-ifeq ($(BR2_PACKAGE_QT5BASE_EXAMPLES),y)
+-define QT5MULTIMEDIA_INSTALL_TARGET_EXAMPLES
+-	cp -dpfr $(STAGING_DIR)/usr/lib/qt/examples/multimedia* $(TARGET_DIR)/usr/lib/qt/examples/
+-endef
+-endif
+-
+ define QT5MULTIMEDIA_INSTALL_TARGET_CMDS
+ 	$(QT5MULTIMEDIA_INSTALL_TARGET_LIBS)
+ 	$(QT5MULTIMEDIA_INSTALL_TARGET_QMLS)
+-	$(QT5MULTIMEDIA_INSTALL_TARGET_EXAMPLES)
+ endef
+ 
+ $(eval $(generic-package))
+diff --git a/package/qt5/qt5quickcontrols/Config.in b/package/qt5/qt5quickcontrols/Config.in
+index 3cc5821b1e..0fe8465e2e 100644
+--- a/package/qt5/qt5quickcontrols/Config.in
++++ b/package/qt5/qt5quickcontrols/Config.in
+@@ -1,17 +1,16 @@
+ config BR2_PACKAGE_QT5QUICKCONTROLS
+ 	bool "qt5quickcontrols"
+-	depends on BR2_PACKAGE_QT5_GL_AVAILABLE
+-	depends on BR2_PACKAGE_QT5_JSCORE_AVAILABLE
+ 	select BR2_PACKAGE_QT5DECLARATIVE
+ 	select BR2_PACKAGE_QT5DECLARATIVE_QUICK
++	depends on BR2_PACKAGE_QT5_GL_AVAILABLE
++	depends on BR2_PACKAGE_QT5_JSCORE_AVAILABLE
+ 	help
+ 	  Qt is a cross-platform application and UI framework for
+ 	  developers using C++.
+ 
+-	  The Qt Quick Controls module provides a set of controls
+-	  that can be used to build complete interfaces in Qt Quick.
++	  This package corresponds to the qt5quickcontrols module.
+ 
+-	  http://doc.qt.io/qt-5/qtquickcontrols-index.html
++	  http://qt.io
+ 
+ comment "qt5quickcontrols needs an OpenGL-capable backend"
+ 	depends on !BR2_PACKAGE_QT5_GL_AVAILABLE
+diff --git a/package/qt5/qt5quickcontrols/qt5quickcontrols.mk b/package/qt5/qt5quickcontrols/qt5quickcontrols.mk
+index 5fee6ff424..b33ff1575e 100644
+--- a/package/qt5/qt5quickcontrols/qt5quickcontrols.mk
++++ b/package/qt5/qt5quickcontrols/qt5quickcontrols.mk
+@@ -10,8 +10,13 @@ QT5QUICKCONTROLS_SOURCE = qtquickcontrols-opensource-src-$(QT5QUICKCONTROLS_VERS
+ QT5QUICKCONTROLS_DEPENDENCIES = qt5base qt5declarative
+ QT5QUICKCONTROLS_INSTALL_STAGING = YES
+ 
+-QT5QUICKCONTROLS_LICENSE = GPL-2.0 or GPL-3.0 or LGPL-3.0, GFDL-1.3 (docs)
++ifeq ($(BR2_PACKAGE_QT5BASE_LICENSE_APPROVED),y)
++QT5QUICKCONTROLS_LICENSE = GPLv2 or GPLv3 or LGPLv3, GFDLv1.3 (docs)
+ QT5QUICKCONTROLS_LICENSE_FILES = LICENSE.GPLv2 LICENSE.GPLv3 LICENSE.LGPLv3 LICENSE.FDL
++else
++QT5QUICKCONTROLS_LICENSE = Commercial license
++QT5QUICKCONTROLS_REDISTRIBUTE = NO
++endif
+ 
+ define QT5QUICKCONTROLS_CONFIGURE_CMDS
+ 	(cd $(@D); $(TARGET_MAKE_ENV) $(HOST_DIR)/usr/bin/qmake)
+@@ -25,24 +30,8 @@ define QT5QUICKCONTROLS_INSTALL_STAGING_CMDS
+ 	$(TARGET_MAKE_ENV) $(MAKE) -C $(@D) install
+ endef
+ 
+-ifeq ($(BR2_PACKAGE_QT5DECLARATIVE_QUICK)$(BR2_PACKAGE_QT5BASE_WIDGETS),yy)
+-define QT5QUICKCONTROLS_INSTALL_TARGET_PRIVATEWIDGETS
+-	cp -dpfr $(STAGING_DIR)/usr/qml/QtQuick/PrivateWidgets $(TARGET_DIR)/usr/qml/QtQuick
+-endef
+-endif
+-
+-ifeq ($(BR2_PACKAGE_QT5_VERSION_5_6),y)
+-define QT5QUICKCONTROLS_INSTALL_TARGET_LAYOUTS
+-	cp -dpfr $(STAGING_DIR)/usr/qml/QtQuick/Layouts $(TARGET_DIR)/usr/qml/QtQuick
+-endef
+-endif
+-
+ define QT5QUICKCONTROLS_INSTALL_TARGET_CMDS
+-	cp -dpfr $(STAGING_DIR)/usr/qml/QtQuick/Controls $(TARGET_DIR)/usr/qml/QtQuick
+-	cp -dpfr $(STAGING_DIR)/usr/qml/QtQuick/Dialogs $(TARGET_DIR)/usr/qml/QtQuick
+-	cp -dpfr $(STAGING_DIR)/usr/qml/QtQuick/Extras $(TARGET_DIR)/usr/qml/QtQuick
+-	$(QT5QUICKCONTROLS_INSTALL_TARGET_PRIVATEWIDGETS)
+-	$(QT5QUICKCONTROLS_INSTALL_TARGET_LAYOUTS)
++	cp -dpfr $(STAGING_DIR)/usr/qml/QtQuick $(TARGET_DIR)/usr/qml
+ endef
+ 
+ $(eval $(generic-package))
+diff --git a/package/qt5/qt5quickcontrols2/Config.in b/package/qt5/qt5quickcontrols2/Config.in
+index 1066b173bd..1e57674dc8 100644
+--- a/package/qt5/qt5quickcontrols2/Config.in
++++ b/package/qt5/qt5quickcontrols2/Config.in
+@@ -1,19 +1,16 @@
+ config BR2_PACKAGE_QT5QUICKCONTROLS2
+ 	bool "qt5quickcontrols2"
+-	depends on BR2_PACKAGE_QT5_GL_AVAILABLE # qt5declarative/quick
+-	depends on BR2_PACKAGE_QT5_JSCORE_AVAILABLE # qt5declarative/quick
+ 	select BR2_PACKAGE_QT5DECLARATIVE
+ 	select BR2_PACKAGE_QT5DECLARATIVE_QUICK
++	depends on BR2_PACKAGE_QT5_GL_AVAILABLE # qt5declarative/quick
++	depends on BR2_PACKAGE_QT5_JSCORE_AVAILABLE # qt5declarative/quick
+ 	help
+ 	  Qt is a cross-platform application and UI framework for
+ 	  developers using C++.
+ 
+ 	  This package corresponds to the qt5quickcontrols2 module.
+ 
+-	  This module was in tech preview in Qt 5.6, and promoted
+-	  to a core module in Qt 5.7.0.
+-
+-	  https://doc.qt.io/qt-5/qtquickcontrols2-index.html
++	  http://qt.io
+ 
+ comment "qt5quickcontrols2 needs an OpenGL-capable backend"
+ 	depends on !BR2_PACKAGE_QT5_GL_AVAILABLE
+diff --git a/package/qt5/qt5quickcontrols2/qt5quickcontrols2.mk b/package/qt5/qt5quickcontrols2/qt5quickcontrols2.mk
+index 23bcbad737..23bbb2cc0d 100644
+--- a/package/qt5/qt5quickcontrols2/qt5quickcontrols2.mk
++++ b/package/qt5/qt5quickcontrols2/qt5quickcontrols2.mk
+@@ -10,8 +10,13 @@ QT5QUICKCONTROLS2_SOURCE = qtquickcontrols2-opensource-src-$(QT5QUICKCONTROLS2_V
+ QT5QUICKCONTROLS2_DEPENDENCIES = qt5base qt5declarative
+ QT5QUICKCONTROLS2_INSTALL_STAGING = YES
+ 
+-QT5QUICKCONTROLS2_LICENSE = GPL-3.0 or LGPL-3.0, GFDL-1.3 (docs)
++ifeq ($(BR2_PACKAGE_QT5BASE_LICENSE_APPROVED),y)
++QT5QUICKCONTROLS2_LICENSE = GPLv3 or LGPLv3, GFDLv1.3 (docs)
+ QT5QUICKCONTROLS2_LICENSE_FILES = LICENSE.GPLv3 LICENSE.LGPLv3 LICENSE.FDL
++else
++QT5QUICKCONTROLS2_LICENSE = Commercial license
++QT5QUICKCONTROLS2_REDISTRIBUTE = NO
++endif
+ 
+ define QT5QUICKCONTROLS2_CONFIGURE_CMDS
+ 	(cd $(@D); $(TARGET_MAKE_ENV) $(HOST_DIR)/usr/bin/qmake)
+@@ -25,30 +30,16 @@ define QT5QUICKCONTROLS2_INSTALL_STAGING_CMDS
+ 	$(TARGET_MAKE_ENV) $(MAKE) -C $(@D) install
+ endef
+ 
+-ifeq ($(BR2_PACKAGE_QT5BASE_EXAMPLES),y)
+-define QT5QUICKCONTROLS2_INSTALL_TARGET_EXAMPLES
+-	cp -dpfr $(STAGING_DIR)/usr/lib/qt/examples/quickcontrols2 $(TARGET_DIR)/usr/lib/qt/examples/
+-endef
+-endif
+-
+-ifeq ($(BR2_PACKAGE_QT5_VERSION_LATEST),y)
+ define QT5QUICKCONTROLS2_INSTALL_TARGET_CMDS
+ 	cp -dpf $(STAGING_DIR)/usr/lib/libQt5QuickTemplates2.so.* $(TARGET_DIR)/usr/lib
+ 	cp -dpf $(STAGING_DIR)/usr/lib/libQt5QuickControls2.so.* $(TARGET_DIR)/usr/lib
+ 	cp -dpfr $(STAGING_DIR)/usr/qml/Qt/labs/calendar $(TARGET_DIR)/usr/qml/Qt/labs
+-	cp -dpfr $(STAGING_DIR)/usr/qml/Qt/labs/platform $(TARGET_DIR)/usr/qml/Qt/labs
++#	cp -dpfr $(STAGING_DIR)/usr/qml/Qt/labs/platform $(TARGET_DIR)/usr/qml/Qt/labs
++	cp -dpfr $(STAGING_DIR)/usr/qml/Qt/labs/folderlistmodel $(TARGET_DIR)/usr/qml/Qt/labs
++	cp -dpfr $(STAGING_DIR)/usr/qml/Qt/labs/settings $(TARGET_DIR)/usr/qml/Qt/labs
+ 	cp -dpfr $(STAGING_DIR)/usr/qml/QtQuick/Controls.2 $(TARGET_DIR)/usr/qml/QtQuick
+ 	cp -dpfr $(STAGING_DIR)/usr/qml/QtQuick/Templates.2 $(TARGET_DIR)/usr/qml/QtQuick
+ 	$(QT5QUICKCONTROLS2_INSTALL_TARGET_EXAMPLES)
+ endef
+-else
+-define QT5QUICKCONTROLS2_INSTALL_TARGET_CMDS
+-	cp -dpf $(STAGING_DIR)/usr/lib/libQt5LabsTemplates.so.* $(TARGET_DIR)/usr/lib
+-	cp -dpfr $(STAGING_DIR)/usr/qml/Qt/labs/controls $(TARGET_DIR)/usr/qml/Qt/labs
+-	cp -dpfr $(STAGING_DIR)/usr/qml/Qt/labs/calendar $(TARGET_DIR)/usr/qml/Qt/labs
+-	cp -dpfr $(STAGING_DIR)/usr/qml/Qt/labs/templates $(TARGET_DIR)/usr/qml/Qt/labs
+-	$(QT5QUICKCONTROLS2_INSTALL_TARGET_EXAMPLES)
+-endef
+-endif
+ 
+ $(eval $(generic-package))
+diff --git a/package/qt5/qt5script/Config.in b/package/qt5/qt5script/Config.in
+index 034b7d2fcb..0d15ef265c 100644
+--- a/package/qt5/qt5script/Config.in
++++ b/package/qt5/qt5script/Config.in
+@@ -1,16 +1,15 @@
+ config BR2_PACKAGE_QT5SCRIPT
+ 	bool "qt5script"
+-	depends on BR2_PACKAGE_QT5_JSCORE_AVAILABLE
+ 	select BR2_PACKAGE_QT5BASE
++	depends on BR2_PACKAGE_QT5_JSCORE_AVAILABLE
+ 	help
+ 	  Qt is a cross-platform application and UI framework for
+ 	  developers using C++.
+ 
+-	  Qt Script provides support for making Qt applications
+-	  scriptable. Provided for Qt 4.x compatibility.
++	  This package corresponds to the qt5script module.
+ 
+ 	  This package has been tagged as deprecated since version
+ 	  5.5.0 and should be replaced by Qt QML module in new
+ 	  design.
+ 
+-	  http://doc.qt.io/qt-5/qtscript-index.html
++	  http://qt.io
+diff --git a/package/qt5/qt5script/qt5script.mk b/package/qt5/qt5script/qt5script.mk
+index 50ee52ad0a..57ba6f0072 100644
+--- a/package/qt5/qt5script/qt5script.mk
++++ b/package/qt5/qt5script/qt5script.mk
+@@ -10,8 +10,13 @@ QT5SCRIPT_SOURCE = qtscript-opensource-src-$(QT5SCRIPT_VERSION).tar.xz
+ QT5SCRIPT_DEPENDENCIES = qt5base
+ QT5SCRIPT_INSTALL_STAGING = YES
+ 
+-QT5SCRIPT_LICENSE = GPL-3.0 or LGPL-2.1 with exception or LGPL-3.0, GFDL-1.3 (docs)
++ifeq ($(BR2_PACKAGE_QT5BASE_LICENSE_APPROVED),y)
++QT5SCRIPT_LICENSE = GPLv3 or LGPLv2.1 with exception or LGPLv3, GFDLv1.3 (docs)
+ QT5SCRIPT_LICENSE_FILES = LICENSE.GPLv3 LICENSE.LGPLv21 LGPL_EXCEPTION.txt LICENSE.LGPLv3 LICENSE.FDL
++else
++QT5SCRIPT_LICENSE = Commercial license
++QT5SCRIPT_REDISTRIBUTE = NO
++endif
+ 
+ define QT5SCRIPT_CONFIGURE_CMDS
+ 	(cd $(@D); $(TARGET_MAKE_ENV) $(HOST_DIR)/usr/bin/qmake)
+diff --git a/package/qt5/qt5sensors/Config.in b/package/qt5/qt5sensors/Config.in
+index 4846a3f95f..741ebba142 100644
+--- a/package/qt5/qt5sensors/Config.in
++++ b/package/qt5/qt5sensors/Config.in
+@@ -5,7 +5,6 @@ config BR2_PACKAGE_QT5SENSORS
+ 	  Qt is a cross-platform application and UI framework for
+ 	  developers using C++.
+ 
+-	  The Qt Sensors API provides access to sensor hardware
+-	  via QML and C++ interfaces.
++	  This package corresponds to the qt5sensors module.
+ 
+-	  http://doc.qt.io/qt-5/qtsensors-index.html
++	  http://qt.io
+diff --git a/package/qt5/qt5sensors/qt5sensors.mk b/package/qt5/qt5sensors/qt5sensors.mk
+index 079f056da7..0dd952a4ca 100644
+--- a/package/qt5/qt5sensors/qt5sensors.mk
++++ b/package/qt5/qt5sensors/qt5sensors.mk
+@@ -10,12 +10,12 @@ QT5SENSORS_SOURCE = qtsensors-opensource-src-$(QT5SENSORS_VERSION).tar.xz
+ QT5SENSORS_DEPENDENCIES = qt5base
+ QT5SENSORS_INSTALL_STAGING = YES
+ 
+-ifeq ($(BR2_PACKAGE_QT5_VERSION_LATEST),y)
+-QT5SENSORS_LICENSE = GPL-2.0+ or LGPL-3.0, GPL-3.0 with exception(tools), GFDL-1.3 (docs)
+-QT5SENSORS_LICENSE_FILES = LICENSE.GPLv2 LICENSE.GPLv3 LICENSE.GPL3-EXCEPT LICENSE.LGPLv3 LICENSE.FDL
+-else
+-QT5SENSORS_LICENSE = GPL-2.0 or GPL-3.0 or LGPL-2.1 with exception or LGPL-3.0, GFDL-1.3 (docs)
++ifeq ($(BR2_PACKAGE_QT5BASE_LICENSE_APPROVED),y)
++QT5SENSORS_LICENSE = GPLv2 or GPLv3 or LGPLv2.1 with exception or LGPLv3, GFDLv1.3 (docs)
+ QT5SENSORS_LICENSE_FILES = LICENSE.GPLv2 LICENSE.GPLv3 LICENSE.LGPLv21 LGPL_EXCEPTION.txt LICENSE.LGPLv3 LICENSE.FDL
++else
++QT5SENSORS_LICENSE = Commercial license
++QT5SENSORS_REDISTRIBUTE = NO
+ endif
+ 
+ ifeq ($(BR2_PACKAGE_QT5DECLARATIVE),y)
+diff --git a/package/qt5/qt5serialbus/Config.in b/package/qt5/qt5serialbus/Config.in
+index 2882d50644..504141c63f 100644
+--- a/package/qt5/qt5serialbus/Config.in
++++ b/package/qt5/qt5serialbus/Config.in
+@@ -1,6 +1,5 @@
+ config BR2_PACKAGE_QT5SERIALBUS
+ 	bool "qt5serialbus"
+-	depends on BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_6 # CAN FD
+ 	select BR2_PACKAGE_QT5BASE
+ 	select BR2_PACKAGE_QT5SERIALPORT
+ 	help
+@@ -9,10 +8,4 @@ config BR2_PACKAGE_QT5SERIALBUS
+ 
+ 	  This package corresponds to the qt5serialbus module.
+ 
+-	  This module was in tech preview in Qt 5.6, and promoted
+-	  to a core module in Qt 5.8.0.
+-
+-	  http://doc.qt.io/qt-5/qtserialbus-index.html
+-
+-comment "qt5serialbus needs headers >= 3.6"
+-	depends on !BR2_TOOLCHAIN_HEADERS_AT_LEAST_3_6
++	  http://qt.io
+diff --git a/package/qt5/qt5serialbus/qt5serialbus.mk b/package/qt5/qt5serialbus/qt5serialbus.mk
+index 24fe8b1506..b188f5d85d 100644
+--- a/package/qt5/qt5serialbus/qt5serialbus.mk
++++ b/package/qt5/qt5serialbus/qt5serialbus.mk
+@@ -10,8 +10,13 @@ QT5SERIALBUS_SOURCE = qtserialbus-opensource-src-$(QT5SERIALBUS_VERSION).tar.xz
+ QT5SERIALBUS_DEPENDENCIES = qt5base qt5serialport
+ QT5SERIALBUS_INSTALL_STAGING = YES
+ 
+-QT5SERIALBUS_LICENSE = GPL-2.0 or GPL-3.0 or LGPL-3.0, GFDL-1.3 (docs)
++ifeq ($(BR2_PACKAGE_QT5BASE_LICENSE_APPROVED),y)
++QT5SERIALBUS_LICENSE = GPLv2 or GPLv3 or LGPLv3, GFDLv1.3 (docs)
+ QT5SERIALBUS_LICENSE_FILES = LICENSE.GPLv2 LICENSE.GPLv3 LICENSE.LGPLv3 LICENSE.FDL
++else
++QT5SERIALBUS_LICENSE = Commercial license
++QT5SERIALBUS_REDISTRIBUTE = NO
++endif
+ 
+ define QT5SERIALBUS_CONFIGURE_CMDS
+ 	(cd $(@D); $(TARGET_MAKE_ENV) $(HOST_DIR)/usr/bin/qmake)
+diff --git a/package/qt5/qt5serialport/Config.in b/package/qt5/qt5serialport/Config.in
+index 3538c52556..c419d17dd0 100644
+--- a/package/qt5/qt5serialport/Config.in
++++ b/package/qt5/qt5serialport/Config.in
+@@ -5,8 +5,6 @@ config BR2_PACKAGE_QT5SERIALPORT
+ 	  Qt is a cross-platform application and UI framework for
+ 	  developers using C++.
+ 
+-	  Qt Serial Port provides the basic functionality, which
+-	  includes configuring, I/O operations, getting and setting
+-	  the control signals of the RS-232 pinouts.
++	  This package corresponds to the qt5serialport module.
+ 
+-	  http://doc.qt.io/qt-5/qtserialport-index.html
++	  http://qt.io
+diff --git a/package/qt5/qt5serialport/qt5serialport.mk b/package/qt5/qt5serialport/qt5serialport.mk
+index cf41019a86..04df021b52 100644
+--- a/package/qt5/qt5serialport/qt5serialport.mk
++++ b/package/qt5/qt5serialport/qt5serialport.mk
+@@ -10,12 +10,12 @@ QT5SERIALPORT_SOURCE = qtserialport-opensource-src-$(QT5SERIALPORT_VERSION).tar.
+ QT5SERIALPORT_DEPENDENCIES = qt5base
+ QT5SERIALPORT_INSTALL_STAGING = YES
+ 
+-ifeq ($(BR2_PACKAGE_QT5_VERSION_LATEST),y)
+-QT5SERIALPORT_LICENSE = GPL-2.0+ or LGPL-3.0, GPL-3.0 with exception(tools), GFDL-1.3 (docs)
+-QT5SERIALPORT_LICENSE_FILES = LICENSE.GPLv2 LICENSE.GPLv3 LICENSE.GPL3-EXCEPT LICENSE.LGPLv3 LICENSE.FDL
+-else
+-QT5SERIALPORT_LICENSE = GPL-2.0 or GPL-3.0 or LGPL-2.1 with exception or LGPL-3.0, GFDL-1.3 (docs)
++ifeq ($(BR2_PACKAGE_QT5BASE_LICENSE_APPROVED),y)
++QT5SERIALPORT_LICENSE = GPLv2 or GPLv3 or LGPLv2.1 with exception or LGPLv3, GFDLv1.3 (docs)
+ QT5SERIALPORT_LICENSE_FILES = LICENSE.GPLv2 LICENSE.GPLv3 LICENSE.LGPLv21 LGPL_EXCEPTION.txt LICENSE.LGPLv3 LICENSE.FDL
++else
++QT5SERIALPORT_LICENSE = Commercial license
++QT5SERIALPORT_REDISTRIBUTE = NO
+ endif
+ 
+ define QT5SERIALPORT_CONFIGURE_CMDS
+diff --git a/package/qt5/qt5svg/Config.in b/package/qt5/qt5svg/Config.in
+index bc80b62674..e1acafbfea 100644
+--- a/package/qt5/qt5svg/Config.in
++++ b/package/qt5/qt5svg/Config.in
+@@ -6,7 +6,6 @@ config BR2_PACKAGE_QT5SVG
+ 	  Qt is a cross-platform application and UI framework for
+ 	  developers using C++.
+ 
+-	  Qt SVG provides classes for rendering and displaying SVG
+-	  drawings in widgets and on other paint devices.
++	  This package corresponds to the qt5svg module.
+ 
+-	  http://doc.qt.io/qt-5/qtsvg-index.html
++	  http://qt.io
+diff --git a/package/qt5/qt5svg/qt5svg.mk b/package/qt5/qt5svg/qt5svg.mk
+index 43959615aa..ebd5cba802 100644
+--- a/package/qt5/qt5svg/qt5svg.mk
++++ b/package/qt5/qt5svg/qt5svg.mk
+@@ -10,12 +10,12 @@ QT5SVG_SOURCE = qtsvg-opensource-src-$(QT5SVG_VERSION).tar.xz
+ QT5SVG_DEPENDENCIES = qt5base
+ QT5SVG_INSTALL_STAGING = YES
+ 
+-ifeq ($(BR2_PACKAGE_QT5_VERSION_LATEST),y)
+-QT5SVG_LICENSE = GPL-2.0+ or LGPL-3.0, GPL-3.0 with exception(tools), GFDL-1.3 (docs)
+-QT5SVG_LICENSE_FILES = LICENSE.GPL2 LICENSE.GPLv3 LICENSE.LGPLv3 LICENSE.FDL
+-else
+-QT5SVG_LICENSE = GPL-3.0 or LGPL-2.1 with exception or LGPL-3.0, GFDL-1.3 (docs)
++ifeq ($(BR2_PACKAGE_QT5BASE_LICENSE_APPROVED),y)
++QT5SVG_LICENSE = GPLv3 or LGPLv2.1 with exception or LGPLv3, GFDLv1.3 (docs)
+ QT5SVG_LICENSE_FILES = LICENSE.GPLv3 LICENSE.LGPLv21 LGPL_EXCEPTION.txt LICENSE.LGPLv3 LICENSE.FDL
++else
++QT5SVG_LICENSE = Commercial license
++QT5SVG_REDISTRIBUTE = NO
+ endif
+ 
+ define QT5SVG_CONFIGURE_CMDS
+diff --git a/package/qt5/qt5tools/Config.in b/package/qt5/qt5tools/Config.in
+index 20f00f6b2f..453913b8ad 100644
+--- a/package/qt5/qt5tools/Config.in
++++ b/package/qt5/qt5tools/Config.in
+@@ -4,10 +4,9 @@ config BR2_PACKAGE_QT5TOOLS
+ 	  Qt is a cross-platform application and UI framework for
+ 	  developers using C++.
+ 
+-	  Qt Tools provides tools facilitate the development
+-	  and design of applications.
++	  This package corresponds to the qt5tools module.
+ 
+-	  http://doc.qt.io/qt-5/qtmodules.html#qt-tools
++	  http://qt.io
+ 
+ if BR2_PACKAGE_QT5TOOLS
+ 
+diff --git a/package/qt5/qt5tools/qt5tools.mk b/package/qt5/qt5tools/qt5tools.mk
+index 7d5353a434..6befb8b2ce 100644
+--- a/package/qt5/qt5tools/qt5tools.mk
++++ b/package/qt5/qt5tools/qt5tools.mk
+@@ -19,12 +19,12 @@ ifeq ($(BR2_PACKAGE_QT5DECLARATIVE),y)
+ QT5TOOLS_DEPENDENCIES += qt5declarative
+ endif
+ 
+-ifeq ($(BR2_PACKAGE_QT5_VERSION_LATEST),y)
+-QT5TOOLS_LICENSE = GPL-2.0+ or LGPL-3.0, GPL-3.0 with exception(tools), GFDL-1.3 (docs)
+-QT5TOOLS_LICENSE_FILES = LICENSE.GPL2 LICENSE.GPLv3 LICENSE.LGPLv3 LICENSE.FDL
+-else
+-QT5TOOLS_LICENSE = GPL-3.0 or LGPL-2.1 with exception or LGPL-3.0, GFDL-1.3 (docs)
++ifeq ($(BR2_PACKAGE_QT5BASE_LICENSE_APPROVED),y)
++QT5TOOLS_LICENSE = GPLv3 or LGPLv2.1 with exception or LGPLv3, GFDLv1.3 (docs)
+ QT5TOOLS_LICENSE_FILES = LICENSE.GPLv3 LICENSE.LGPLv21 LGPL_EXCEPTION.txt LICENSE.LGPLv3 LICENSE.FDL
++else
++QT5TOOLS_LICENSE = Commercial license
++QT5TOOLS_REDISTRIBUTE = NO
+ endif
+ 
+ QT5TOOLS_BUILD_DIRS_$(BR2_PACKAGE_QT5TOOLS_LINGUIST_TOOLS) += \
+diff --git a/package/qt5/qt5virtualkeyboard/Config.in b/package/qt5/qt5virtualkeyboard/Config.in
+index 62a7051877..803b9376ac 100644
+--- a/package/qt5/qt5virtualkeyboard/Config.in
++++ b/package/qt5/qt5virtualkeyboard/Config.in
+@@ -1,7 +1,6 @@
+ config BR2_PACKAGE_QT5VIRTUALKEYBOARD
+ 	bool "qt5virtualkeyboard"
+ 	select BR2_PACKAGE_QT5BASE
+-	depends on BR2_PACKAGE_QT5_VERSION_LATEST
+ 	help
+ 	  Qt is a cross-platform application and UI framework for
+ 	  developers using C++.
+diff --git a/package/qt5/qt5webchannel/Config.in b/package/qt5/qt5webchannel/Config.in
+index e3d840584f..218629a7cc 100644
+--- a/package/qt5/qt5webchannel/Config.in
++++ b/package/qt5/qt5webchannel/Config.in
+@@ -6,8 +6,6 @@ config BR2_PACKAGE_QT5WEBCHANNEL
+ 	  Qt is a cross-platform application and UI framework for
+ 	  developers using C++.
+ 
+-	  Qt WebChannel enables peer-to-peer communication between
+-	  a server (QML/C++ application) and a client
+-	  (HTML/JavaScript or QML application).
++	  This package corresponds to the qt5webchannel module.
+ 
+-	  http://doc.qt.io/qt-5/qtwebchannel-index.html
++	  http://qt.io
+diff --git a/package/qt5/qt5webchannel/qt5webchannel.mk b/package/qt5/qt5webchannel/qt5webchannel.mk
+index 791f4a92f4..3865ced340 100644
+--- a/package/qt5/qt5webchannel/qt5webchannel.mk
++++ b/package/qt5/qt5webchannel/qt5webchannel.mk
+@@ -10,15 +10,12 @@ QT5WEBCHANNEL_SOURCE = qtwebchannel-opensource-src-$(QT5WEBCHANNEL_VERSION).tar.
+ QT5WEBCHANNEL_DEPENDENCIES = qt5base qt5websockets
+ QT5WEBCHANNEL_INSTALL_STAGING = YES
+ 
+-ifeq ($(BR2_PACKAGE_QT5_VERSION_LATEST),y)
+-QT5WEBCHANNEL_LICENSE = GPL-2.0+ or LGPL-3.0, GPL-3.0 with exception(tools), GFDL-1.3 (docs)
+-QT5WEBCHANNEL_LICENSE_FILES = LICENSE.GPLv2 LICENSE.GPLv3 LICENSE.GPL3-EXCEPT LICENSE.LGPLv3 LICENSE.FDL
+-else
+-QT5WEBCHANNEL_LICENSE = GPL-2.0 or GPL-3.0 or LGPL-2.1 with exception or LGPL-3.0, GFDL-1.3 (docs)
++ifeq ($(BR2_PACKAGE_QT5BASE_LICENSE_APPROVED),y)
++QT5WEBCHANNEL_LICENSE = GPLv2 or GPLv3 or LGPLv2.1 with exception or LGPLv3, GFDLv1.3 (docs)
+ QT5WEBCHANNEL_LICENSE_FILES = LICENSE.GPLv2 LICENSE.GPLv3 LICENSE.LGPLv21 LGPL_EXCEPTION.txt LICENSE.LGPLv3 LICENSE.FDL
+-endif
+-ifeq ($(BR2_PACKAGE_QT5BASE_EXAMPLES),y)
+-QT5WEBCHANNEL_LICENSE := $(QT5WEBCHANNEL_LICENSE), BSD-3-Clause (examples)
++else
++QT5WEBCHANNEL_LICENSE = Commercial license
++QT5WEBCHANNEL_REDISTRIBUTE = NO
+ endif
+ 
+ ifeq ($(BR2_PACKAGE_QT5DECLARATIVE),y)
+diff --git a/package/qt5/qt5webengine/5.6.2/001-allow-arm-compiler.__patch b/package/qt5/qt5webengine/5.6.2/001-allow-arm-compiler.__patch
+deleted file mode 100644
+index bb8aa69ed6..0000000000
+--- a/package/qt5/qt5webengine/5.6.2/001-allow-arm-compiler.__patch
++++ /dev/null
+@@ -1,26 +0,0 @@
+-diff '--exclude=*.pyc' '--exclude=*.o' '--exclude=*.h' '--exclude=*.a' '--exclude=*ninja*' -Naur qt5_a/src/3rdparty/chromium/build/common.gypi qt5webengine-5.5.1/src/3rdparty/chromium/build/common.gypi
+---- qt5_a/src/3rdparty/chromium/build/common.gypi	2015-10-13 06:36:43.000000000 +0200
+-+++ qt5webengine-5.5.1/src/3rdparty/chromium/build/common.gypi	2016-02-09 16:37:54.729166157 +0100
+-@@ -2294,7 +2294,7 @@
+-           }],
+-         ],
+-         # Change the default to hard once the armhf transition is complete.
+--        'arm_float_abi%': 'softfp',
+-+        'arm_float_abi%': 'hard',
+-         'arm_thumb%': 1,
+-       }],
+- 
+---- qt5webengine-5.5.1/tools/qmake/mkspecs/features/functions.prf	2015-10-13 06:36:55.000000000 +0200
+-+++ qt5_we_b/tools/qmake/mkspecs/features/functions.prf	2016-02-09 21:44:30.829783885 +0100
+-@@ -12,9 +12,9 @@
+-     return(false)
+-   }
+- 
+--  linux-g++*:!isGCCVersionSupported(): return(false)
+-+  linux*g++*:!isGCCVersionSupported(): return(false)
+-   !isPythonVersionSupported(): return(false)
+--  linux-g++*|win32-msvc2013|macx-clang: return(true)
+-+  linux*g++*|win32-msvc2013|macx-clang: return(true)
+-   boot2qt: return(true)
+- 
+-   skipBuild("Qt WebEngine can currently only be built for Linux (GCC), Windows (MSVC 2013), OS X (XCode 5.1+) or Qt for Device Creation.")
+diff --git a/package/qt5/qt5webengine/5.6.2/001-delegate_frame_node_fence_sync.patch b/package/qt5/qt5webengine/5.6.2/001-delegate_frame_node_fence_sync.patch
+deleted file mode 100644
+index c7bdcffe71..0000000000
+--- a/package/qt5/qt5webengine/5.6.2/001-delegate_frame_node_fence_sync.patch
++++ /dev/null
+@@ -1,20 +0,0 @@
+---- a/src/core/delegated_frame_node.cpp	2016-03-03 17:02:28.000000000 +0100
+-+++ b/src/core/delegated_frame_node.cpp	2016-04-09 21:01:03.502390661 +0200
+-@@ -194,7 +194,7 @@
+-     case gfx::TransferableFence::NoSync:
+-         break;
+-     case gfx::TransferableFence::EglSync:
+--#ifdef EGL_KHR_reusable_sync
+-+#ifdef EGL_KHR_fence_sync
+-     {
+-         static bool resolved = false;
+-         static PFNEGLCLIENTWAITSYNCKHRPROC eglClientWaitSyncKHR = 0;
+-@@ -235,7 +235,7 @@
+-     case gfx::TransferableFence::NoSync:
+-         break;
+-     case gfx::TransferableFence::EglSync:
+--#ifdef EGL_KHR_reusable_sync
+-+#ifdef EGL_KHR_fence_sync
+-     {
+-         static bool resolved = false;
+-         static PFNEGLDESTROYSYNCKHRPROC eglDestroySyncKHR = 0;
+diff --git a/package/qt5/qt5webengine/5.6.2/002-buildroot-python-bz2.patch b/package/qt5/qt5webengine/5.6.2/002-buildroot-python-bz2.patch
+deleted file mode 100644
+index b780f49ec0..0000000000
+--- a/package/qt5/qt5webengine/5.6.2/002-buildroot-python-bz2.patch
++++ /dev/null
+@@ -1,11 +0,0 @@
+---- a/src/3rdparty/chromium/v8/tools/js2c.py	2016-03-03 15:48:36.000000000 +0100
+-+++ b/src/3rdparty/chromium/v8/tools/js2c.py	2016-04-28 15:56:42.219174252 +0200
+-@@ -34,7 +34,7 @@
+- import os, re, sys, string
+- import optparse
+- import jsmin
+--import bz2
+-+##import bz2
+- import textwrap
+- 
+- 
+diff --git a/package/qt5/qt5webengine/5.6.2/002-move_icu_to_56_1.__patch b/package/qt5/qt5webengine/5.6.2/002-move_icu_to_56_1.__patch
+deleted file mode 100644
+index a917a9c140..0000000000
+--- a/package/qt5/qt5webengine/5.6.2/002-move_icu_to_56_1.__patch
++++ /dev/null
+@@ -1,43 +0,0 @@
+---- qt5webengine-5.5.1/src/3rdparty/chromium/third_party/icu/source/common/unicode/uvernum.h	2015-10-13 06:36:26.000000000 +0200
+-+++ qt5_b/src/3rdparty/chromium/third_party/icu/source/common/unicode/uvernum.h	2016-02-11 12:06:28.304679220 +0100
+-@@ -57,7 +57,7 @@
+-  *  This value will change in the subsequent releases of ICU
+-  *  @stable ICU 2.4
+-  */
+--#define U_ICU_VERSION_MAJOR_NUM 52
+-+#define U_ICU_VERSION_MAJOR_NUM 56
+- 
+- /** The current ICU minor version as an integer.
+-  *  This value will change in the subsequent releases of ICU
+-@@ -83,7 +83,7 @@
+-  *  This value will change in the subsequent releases of ICU
+-  *  @stable ICU 2.6
+-  */
+--#define U_ICU_VERSION_SUFFIX _52
+-+#define U_ICU_VERSION_SUFFIX _56
+- 
+- /**
+-  * \def U_DEF2_ICU_ENTRY_POINT_RENAME
+-@@ -118,19 +118,19 @@
+-  *  This value will change in the subsequent releases of ICU
+-  *  @stable ICU 2.4
+-  */
+--#define U_ICU_VERSION "52.1"
+-+#define U_ICU_VERSION "56.1"
+- 
+- /** The current ICU library major/minor version as a string without dots, for library name suffixes.
+-  *  This value will change in the subsequent releases of ICU
+-  *  @stable ICU 2.6
+-  */
+--#define U_ICU_VERSION_SHORT "52"
+-+#define U_ICU_VERSION_SHORT "56"
+- 
+- #ifndef U_HIDE_INTERNAL_API
+- /** Data version in ICU4C.
+-  * @internal ICU 4.4 Internal Use Only
+-  **/
+--#define U_ICU_DATA_VERSION "52.1"
+-+#define U_ICU_DATA_VERSION "56.1"
+- #endif  /* U_HIDE_INTERNAL_API */
+- 
+- /*===========================================================================
+diff --git a/package/qt5/qt5webengine/5.6.2/003-egl_khr_reusable_sync.patch b/package/qt5/qt5webengine/5.6.2/003-egl_khr_reusable_sync.patch
+deleted file mode 100644
+index 8d633d965c..0000000000
+--- a/package/qt5/qt5webengine/5.6.2/003-egl_khr_reusable_sync.patch
++++ /dev/null
+@@ -1,14 +0,0 @@
+---- qt5webengine-5.5.1/src/core/delegated_frame_node.cpp	2015-10-13 06:36:54.000000000 +0200
+-+++ qt5_b/src/core/delegated_frame_node.cpp	2016-02-11 13:27:42.142167151 +0100
+-@@ -76,6 +76,11 @@
+- #include <EGL/eglext.h>
+- #endif
+- 
+-+#ifdef EGL_KHR_reusable_sync
+-+#undef EGL_KHR_reusable_sync
+-+#endif
+-+
+-+
+- namespace QtWebEngineCore {
+- 
+- class MailboxTexture : public QSGTexture, protected QOpenGLFunctions {
+diff --git a/package/qt5/qt5webengine/5.6.2/003-jpeg-codec-external-lib.patch b/package/qt5/qt5webengine/5.6.2/003-jpeg-codec-external-lib.patch
+deleted file mode 100644
+index 4ace97f647..0000000000
+--- a/package/qt5/qt5webengine/5.6.2/003-jpeg-codec-external-lib.patch
++++ /dev/null
+@@ -1,49 +0,0 @@
+-diff --git a/src/3rdparty/chromium/ui/gfx/codec/jpeg_codec.cc b/src/3rdparty/chromium/ui/gfx/codec/jpeg_codec.cc
+-index 6d92637..d34ae33 100644
+---- a/src/3rdparty/chromium/ui/gfx/codec/jpeg_codec.cc
+-+++ b/src/3rdparty/chromium/ui/gfx/codec/jpeg_codec.cc
+-@@ -121,7 +121,7 @@ boolean EmptyOutputBuffer(jpeg_compress_struct* cinfo) {
+-   // tell libjpeg where to write the next data
+-   cinfo->dest->next_output_byte = &(*state->out)[state->image_buffer_used];
+-   cinfo->dest->free_in_buffer = state->out->size() - state->image_buffer_used;
+--  return 1;
+-+  return (boolean)(1);
+- }
+- 
+- // Cleans up the JpegEncoderState to prepare for returning in the final form.
+-@@ -262,7 +262,7 @@ bool JPEGCodec::Encode(const unsigned char* input, ColorFormat format,
+-   cinfo.data_precision = 8;
+- 
+-   jpeg_set_defaults(&cinfo);
+--  jpeg_set_quality(&cinfo, quality, 1);  // quality here is 0-100
+-+  jpeg_set_quality(&cinfo, quality, (boolean)true);  // quality here is 0-100
+- 
+-   // set up the destination manager
+-   jpeg_destination_mgr destmgr;
+-@@ -274,7 +274,7 @@ bool JPEGCodec::Encode(const unsigned char* input, ColorFormat format,
+-   JpegEncoderState state(output);
+-   cinfo.client_data = &state;
+- 
+--  jpeg_start_compress(&cinfo, 1);
+-+  jpeg_start_compress(&cinfo, (boolean)true);
+- 
+-   // feed it the rows, doing necessary conversions for the color format
+- #ifdef JCS_EXTENSIONS
+-@@ -360,7 +360,7 @@ void InitSource(j_decompress_ptr cinfo) {
+- //   set to a positive value if TRUE is returned. A FALSE return should only
+- //   be used when I/O suspension is desired."
+- boolean FillInputBuffer(j_decompress_ptr cinfo) {
+--  return false;
+-+  return (boolean)false;
+- }
+- 
+- // Skip data in the buffer. Since we have all the data at once, this operation
+-@@ -488,7 +488,7 @@ bool JPEGCodec::Decode(const unsigned char* input, size_t input_size,
+-   cinfo.client_data = &state;
+- 
+-   // fill the file metadata into our buffer
+--  if (jpeg_read_header(&cinfo, true) != JPEG_HEADER_OK)
+-+  if (jpeg_read_header(&cinfo, (boolean)true) != JPEG_HEADER_OK)
+-     return false;
+- 
+-   // we want to always get RGB data out
+diff --git a/package/qt5/qt5webengine/5.6.2/004-allow-egl-surface.__patch b/package/qt5/qt5webengine/5.6.2/004-allow-egl-surface.__patch
+deleted file mode 100644
+index 604cb88f36..0000000000
+--- a/package/qt5/qt5webengine/5.6.2/004-allow-egl-surface.__patch
++++ /dev/null
+@@ -1,166 +0,0 @@
+-diff -aur '--exclude=*.pyc' '--exclude=*.o' '--exclude=*.h' '--exclude=*.a' '--exclude=*deps' '--exclude=*log*' '--exclude=*ninja*' '--exclude=*.gyp' '--exclude=*.pak' '--exclude=*.pickle' '--exclude=*.cache' '--exclude=*.py' '--exclude=*.idl' '--exclude=*.gypi' '--exclude=*.tmp' '--exclude=*.in' '--exclude=*.rc' qt5webengine-5.5.1/src/3rdparty/chromium/base/files/file_proxy_unittest.cc qt5_b/src/3rdparty/chromium/base/files/file_proxy_unittest.cc
+---- qt5webengine-5.5.1/src/3rdparty/chromium/base/files/file_proxy_unittest.cc	2015-10-13 06:36:48.000000000 +0200
+-+++ qt5_b/src/3rdparty/chromium/base/files/file_proxy_unittest.cc	2016-02-12 17:58:52.694043375 +0100
+-@@ -142,7 +142,7 @@
+- }
+- 
+- TEST_F(FileProxyTest, CreateOrOpen_AbandonedCreate) {
+--  bool prev = ThreadRestrictions::SetIOAllowed(false);
+-+  bool prev = ThreadRestrictions::SetIOAllowed(true);
+-   {
+-     FileProxy proxy(file_task_runner());
+-     proxy.CreateOrOpen(
+-diff -aur '--exclude=*.pyc' '--exclude=*.o' '--exclude=*.h' '--exclude=*.a' '--exclude=*deps' '--exclude=*log*' '--exclude=*ninja*' '--exclude=*.gyp' '--exclude=*.pak' '--exclude=*.pickle' '--exclude=*.cache' '--exclude=*.py' '--exclude=*.idl' '--exclude=*.gypi' '--exclude=*.tmp' '--exclude=*.in' '--exclude=*.rc' qt5webengine-5.5.1/src/3rdparty/chromium/content/browser/browser_main_loop.cc qt5_b/src/3rdparty/chromium/content/browser/browser_main_loop.cc
+---- qt5webengine-5.5.1/src/3rdparty/chromium/content/browser/browser_main_loop.cc	2015-10-13 06:36:47.000000000 +0200
+-+++ qt5_b/src/3rdparty/chromium/content/browser/browser_main_loop.cc	2016-02-12 17:53:52.118534482 +0100
+-@@ -745,7 +745,7 @@
+- 
+-   // If the UI thread blocks, the whole UI is unresponsive.
+-   // Do not allow disk IO from the UI thread.
+--  base::ThreadRestrictions::SetIOAllowed(false);
+-+  base::ThreadRestrictions::SetIOAllowed(true);
+-   base::ThreadRestrictions::DisallowWaiting();
+-   return result_code_;
+- }
+-diff -aur '--exclude=*.pyc' '--exclude=*.o' '--exclude=*.h' '--exclude=*.a' '--exclude=*deps' '--exclude=*log*' '--exclude=*ninja*' '--exclude=*.gyp' '--exclude=*.pak' '--exclude=*.pickle' '--exclude=*.cache' '--exclude=*.py' '--exclude=*.idl' '--exclude=*.gypi' '--exclude=*.tmp' '--exclude=*.in' '--exclude=*.rc' qt5webengine-5.5.1/src/3rdparty/chromium/content/browser/browser_process_sub_thread.cc qt5_b/src/3rdparty/chromium/content/browser/browser_process_sub_thread.cc
+---- qt5webengine-5.5.1/src/3rdparty/chromium/content/browser/browser_process_sub_thread.cc	2015-10-13 06:36:46.000000000 +0200
+-+++ qt5_b/src/3rdparty/chromium/content/browser/browser_process_sub_thread.cc	2016-02-12 17:52:40.717701092 +0100
+-@@ -39,7 +39,7 @@
+-     // Though this thread is called the "IO" thread, it actually just routes
+-     // messages around; it shouldn't be allowed to perform any blocking disk
+-     // I/O.
+--    base::ThreadRestrictions::SetIOAllowed(false);
+-+    base::ThreadRestrictions::SetIOAllowed(true);
+-     base::ThreadRestrictions::DisallowWaiting();
+-   }
+- }
+-diff -aur '--exclude=*.pyc' '--exclude=*.o' '--exclude=*.h' '--exclude=*.a' '--exclude=*deps' '--exclude=*log*' '--exclude=*ninja*' '--exclude=*.gyp' '--exclude=*.pak' '--exclude=*.pickle' '--exclude=*.cache' '--exclude=*.py' '--exclude=*.idl' '--exclude=*.gypi' '--exclude=*.tmp' '--exclude=*.in' '--exclude=*.rc' qt5webengine-5.5.1/src/3rdparty/chromium/dbus/end_to_end_async_unittest.cc qt5_b/src/3rdparty/chromium/dbus/end_to_end_async_unittest.cc
+---- qt5webengine-5.5.1/src/3rdparty/chromium/dbus/end_to_end_async_unittest.cc	2015-10-13 06:36:51.000000000 +0200
+-+++ qt5_b/src/3rdparty/chromium/dbus/end_to_end_async_unittest.cc	2016-02-12 17:57:04.280777854 +0100
+-@@ -39,7 +39,7 @@
+- 
+-   virtual void SetUp() {
+-     // Make the main thread not to allow IO.
+--    base::ThreadRestrictions::SetIOAllowed(false);
+-+    base::ThreadRestrictions::SetIOAllowed(true);
+- 
+-     // Start the D-Bus thread.
+-     dbus_thread_.reset(new base::Thread("D-Bus Thread"));
+-diff -aur '--exclude=*.pyc' '--exclude=*.o' '--exclude=*.h' '--exclude=*.a' '--exclude=*deps' '--exclude=*log*' '--exclude=*ninja*' '--exclude=*.gyp' '--exclude=*.pak' '--exclude=*.pickle' '--exclude=*.cache' '--exclude=*.py' '--exclude=*.idl' '--exclude=*.gypi' '--exclude=*.tmp' '--exclude=*.in' '--exclude=*.rc' qt5webengine-5.5.1/src/3rdparty/chromium/dbus/object_manager_unittest.cc qt5_b/src/3rdparty/chromium/dbus/object_manager_unittest.cc
+---- qt5webengine-5.5.1/src/3rdparty/chromium/dbus/object_manager_unittest.cc	2015-10-13 06:36:51.000000000 +0200
+-+++ qt5_b/src/3rdparty/chromium/dbus/object_manager_unittest.cc	2016-02-12 17:54:33.659019384 +0100
+-@@ -61,7 +61,7 @@
+- 
+-   virtual void SetUp() {
+-     // Make the main thread not to allow IO.
+--    base::ThreadRestrictions::SetIOAllowed(false);
+-+    base::ThreadRestrictions::SetIOAllowed(true);
+- 
+-     // Start the D-Bus thread.
+-     dbus_thread_.reset(new base::Thread("D-Bus Thread"));
+-diff -aur '--exclude=*.pyc' '--exclude=*.o' '--exclude=*.h' '--exclude=*.a' '--exclude=*deps' '--exclude=*log*' '--exclude=*ninja*' '--exclude=*.gyp' '--exclude=*.pak' '--exclude=*.pickle' '--exclude=*.cache' '--exclude=*.py' '--exclude=*.idl' '--exclude=*.gypi' '--exclude=*.tmp' '--exclude=*.in' '--exclude=*.rc' qt5webengine-5.5.1/src/3rdparty/chromium/dbus/property_unittest.cc qt5_b/src/3rdparty/chromium/dbus/property_unittest.cc
+---- qt5webengine-5.5.1/src/3rdparty/chromium/dbus/property_unittest.cc	2015-10-13 06:36:51.000000000 +0200
+-+++ qt5_b/src/3rdparty/chromium/dbus/property_unittest.cc	2016-02-12 17:57:54.025358691 +0100
+-@@ -51,7 +51,7 @@
+- 
+-   virtual void SetUp() {
+-     // Make the main thread not to allow IO.
+--    base::ThreadRestrictions::SetIOAllowed(false);
+-+    base::ThreadRestrictions::SetIOAllowed(true);
+- 
+-     // Start the D-Bus thread.
+-     dbus_thread_.reset(new base::Thread("D-Bus Thread"));
+-diff -aur '--exclude=*.pyc' '--exclude=*.o' '--exclude=*.h' '--exclude=*.a' '--exclude=*deps' '--exclude=*log*' '--exclude=*ninja*' '--exclude=*.gyp' '--exclude=*.pak' '--exclude=*.pickle' '--exclude=*.cache' '--exclude=*.py' '--exclude=*.idl' '--exclude=*.gypi' '--exclude=*.tmp' '--exclude=*.in' '--exclude=*.rc' qt5webengine-5.5.1/src/3rdparty/chromium/dbus/signal_sender_verification_unittest.cc qt5_b/src/3rdparty/chromium/dbus/signal_sender_verification_unittest.cc
+---- qt5webengine-5.5.1/src/3rdparty/chromium/dbus/signal_sender_verification_unittest.cc	2015-10-13 06:36:51.000000000 +0200
+-+++ qt5_b/src/3rdparty/chromium/dbus/signal_sender_verification_unittest.cc	2016-02-12 17:55:57.519998395 +0100
+-@@ -32,7 +32,7 @@
+-     base::StatisticsRecorder::Initialize();
+- 
+-     // Make the main thread not to allow IO.
+--    base::ThreadRestrictions::SetIOAllowed(false);
+-+    base::ThreadRestrictions::SetIOAllowed(true);
+- 
+-     // Start the D-Bus thread.
+-     dbus_thread_.reset(new base::Thread("D-Bus Thread"));
+-@@ -161,7 +161,7 @@
+-   void SafeServiceStop(TestService* test_service) {
+-     base::ThreadRestrictions::SetIOAllowed(true);
+-     test_service->Stop();
+--    base::ThreadRestrictions::SetIOAllowed(false);
+-+    base::ThreadRestrictions::SetIOAllowed(true);
+-   }
+- 
+-   base::MessageLoop message_loop_;
+-diff -aur '--exclude=*.pyc' '--exclude=*.o' '--exclude=*.h' '--exclude=*.a' '--exclude=*deps' '--exclude=*log*' '--exclude=*ninja*' '--exclude=*.gyp' '--exclude=*.pak' '--exclude=*.pickle' '--exclude=*.cache' '--exclude=*.py' '--exclude=*.idl' '--exclude=*.gypi' '--exclude=*.tmp' '--exclude=*.in' '--exclude=*.rc' qt5webengine-5.5.1/src/3rdparty/chromium/net/base/file_stream_unittest.cc qt5_b/src/3rdparty/chromium/net/base/file_stream_unittest.cc
+---- qt5webengine-5.5.1/src/3rdparty/chromium/net/base/file_stream_unittest.cc	2015-10-13 06:36:53.000000000 +0200
+-+++ qt5_b/src/3rdparty/chromium/net/base/file_stream_unittest.cc	2016-02-12 18:00:05.358889970 +0100
+-@@ -758,7 +758,7 @@
+-   scoped_refptr<base::SequencedWorkerPool> pool(
+-       new base::SequencedWorkerPool(1, "StreamTest"));
+- 
+--  bool prev = base::ThreadRestrictions::SetIOAllowed(false);
+-+  bool prev = base::ThreadRestrictions::SetIOAllowed(true);
+-   scoped_ptr<FileStream> stream(new FileStream(pool.get()));
+-   int flags = base::File::FLAG_OPEN | base::File::FLAG_WRITE |
+-               base::File::FLAG_ASYNC;
+-diff -aur '--exclude=*.pyc' '--exclude=*.o' '--exclude=*.h' '--exclude=*.a' '--exclude=*deps' '--exclude=*log*' '--exclude=*ninja*' '--exclude=*.gyp' '--exclude=*.pak' '--exclude=*.pickle' '--exclude=*.cache' '--exclude=*.py' '--exclude=*.idl' '--exclude=*.gypi' '--exclude=*.tmp' '--exclude=*.in' '--exclude=*.rc' qt5webengine-5.5.1/src/3rdparty/chromium/net/base/network_config_watcher_mac.cc qt5_b/src/3rdparty/chromium/net/base/network_config_watcher_mac.cc
+---- qt5webengine-5.5.1/src/3rdparty/chromium/net/base/network_config_watcher_mac.cc	2015-10-13 06:36:53.000000000 +0200
+-+++ qt5_b/src/3rdparty/chromium/net/base/network_config_watcher_mac.cc	2016-02-12 18:00:56.359484236 +0100
+-@@ -67,7 +67,7 @@
+- void NetworkConfigWatcherMacThread::Init() {
+-   // Disallow IO to make sure NetworkConfigWatcherMacThread's helper thread does
+-   // not perform blocking operations.
+--  base::ThreadRestrictions::SetIOAllowed(false);
+-+  base::ThreadRestrictions::SetIOAllowed(true);
+- 
+-   delegate_->Init();
+- 
+-diff -aur '--exclude=*.pyc' '--exclude=*.o' '--exclude=*.h' '--exclude=*.a' '--exclude=*deps' '--exclude=*log*' '--exclude=*ninja*' '--exclude=*.gyp' '--exclude=*.pak' '--exclude=*.pickle' '--exclude=*.cache' '--exclude=*.py' '--exclude=*.idl' '--exclude=*.gypi' '--exclude=*.tmp' '--exclude=*.in' '--exclude=*.rc' qt5webengine-5.5.1/src/3rdparty/chromium/net/disk_cache/backend_unittest.cc qt5_b/src/3rdparty/chromium/net/disk_cache/backend_unittest.cc
+---- qt5webengine-5.5.1/src/3rdparty/chromium/net/disk_cache/backend_unittest.cc	2015-10-13 06:36:53.000000000 +0200
+-+++ qt5_b/src/3rdparty/chromium/net/disk_cache/backend_unittest.cc	2016-02-12 18:02:24.724514006 +0100
+-@@ -463,7 +463,7 @@
+-       base::Thread::Options(base::MessageLoop::TYPE_IO, 0)));
+-   net::TestCompletionCallback cb;
+- 
+--  bool prev = base::ThreadRestrictions::SetIOAllowed(false);
+-+  bool prev = base::ThreadRestrictions::SetIOAllowed(true);
+-   scoped_ptr<disk_cache::BackendImpl> cache(new disk_cache::BackendImpl(
+-       cache_path_, cache_thread.task_runner(), NULL));
+-   int rv = cache->Init(cb.callback());
+-@@ -1972,7 +1972,7 @@
+-       base::Thread::Options(base::MessageLoop::TYPE_IO, 0)));
+- 
+-   net::TestCompletionCallback cb;
+--  bool prev = base::ThreadRestrictions::SetIOAllowed(false);
+-+  bool prev = base::ThreadRestrictions::SetIOAllowed(true);
+-   base::FilePath path(cache_path_);
+-   int rv = disk_cache::CreateCacheBackend(net::DISK_CACHE,
+-                                           net::CACHE_BACKEND_BLOCKFILE,
+-diff -aur '--exclude=*.pyc' '--exclude=*.o' '--exclude=*.h' '--exclude=*.a' '--exclude=*deps' '--exclude=*log*' '--exclude=*ninja*' '--exclude=*.gyp' '--exclude=*.pak' '--exclude=*.pickle' '--exclude=*.cache' '--exclude=*.py' '--exclude=*.idl' '--exclude=*.gypi' '--exclude=*.tmp' '--exclude=*.in' '--exclude=*.rc' qt5webengine-5.5.1/src/core/gl_surface_qt.cpp qt5_b/src/core/gl_surface_qt.cpp
+---- qt5webengine-5.5.1/src/core/gl_surface_qt.cpp	2015-10-13 06:36:54.000000000 +0200
+-+++ qt5_b/src/core/gl_surface_qt.cpp	2016-02-14 11:38:43.661776602 +0100
+-@@ -513,15 +513,20 @@
+-         return NULL;
+- #endif
+-     }
+--    case kGLImplementationEGLGLES2: {
+-+   case kGLImplementationEGLGLES2: {
+-         scoped_refptr<GLSurface> surface = new GLSurfaceQtEGL(size);
+-         if (!surface->Initialize())
+-             return NULL;
+-         return surface;
+-     }
+--    default:
+--        Q_UNREACHABLE();
+--        return NULL;
+-+    default: {
+-+        scoped_refptr<GLSurface> surface = new GLSurfaceQtEGL(size);
+-+        if (!surface->Initialize())
+-+            return NULL;
+-+        return surface;
+-+    }
+-+//        Q_UNREACHABLE();
+-+//        return NULL;
+-     }
+- }
+- 
+diff --git a/package/qt5/qt5webengine/5.8.0/001-use-neon-per-default.patch b/package/qt5/qt5webengine/5.8.0/001-use-neon-per-default.patch
+deleted file mode 100644
+index 9e865d3d9e..0000000000
+--- a/package/qt5/qt5webengine/5.8.0/001-use-neon-per-default.patch
++++ /dev/null
+@@ -1,13 +0,0 @@
+-diff --git a/src/core/gyp_run.pro b/src/core/gyp_run.pro
+-index dc22d14..161ca9e 100644
+---- a/src/core/gyp_run.pro
+-+++ b/src/core/gyp_run.pro
+-@@ -82,7 +82,7 @@ contains(QT_ARCH, "arm") {
+-         else: GYP_CONFIG += arm_fpu=\"$$MFPU\" arm_neon=0 arm_neon_optional=0
+-     } else {
+-         # Chromium defaults to arm_neon=1, Qt does not.
+--        GYP_CONFIG += arm_neon=0
+-+        GYP_CONFIG += arm_neon=1
+-         !lessThan(MARMV, 7): GYP_CONFIG += arm_neon_optional=1
+-     }
+- 
+diff --git a/package/qt5/qt5webengine/5.8.0/002-EGL_KHR_reusable_sync-disa.patch b/package/qt5/qt5webengine/5.8.0/002-EGL_KHR_reusable_sync-disa.patch
+deleted file mode 100644
+index 2b4b5aad51..0000000000
+--- a/package/qt5/qt5webengine/5.8.0/002-EGL_KHR_reusable_sync-disa.patch
++++ /dev/null
+@@ -1,15 +0,0 @@
+-diff --git a/src/core/delegated_frame_node.cpp b/src/core/delegated_frame_node.cpp
+-index baf0640..0c77eb2 100644
+---- a/src/core/delegated_frame_node.cpp
+-+++ b/src/core/delegated_frame_node.cpp
+-@@ -91,6 +91,10 @@
+- #include <EGL/eglext.h>
+- #endif
+- 
+-+#ifdef EGL_KHR_reusable_sync
+-+#undef EGL_KHR_reusable_sync
+-+#endif
+-+
+- #ifndef GL_TIMEOUT_IGNORED
+- #define GL_TIMEOUT_IGNORED                0xFFFFFFFFFFFFFFFFull
+- #endif
+diff --git a/package/qt5/qt5webengine/5.8.0/003-jpeg-codec-external-lib.patch b/package/qt5/qt5webengine/5.8.0/003-jpeg-codec-external-lib.patch
+deleted file mode 100644
+index 4ace97f647..0000000000
+--- a/package/qt5/qt5webengine/5.8.0/003-jpeg-codec-external-lib.patch
++++ /dev/null
+@@ -1,49 +0,0 @@
+-diff --git a/src/3rdparty/chromium/ui/gfx/codec/jpeg_codec.cc b/src/3rdparty/chromium/ui/gfx/codec/jpeg_codec.cc
+-index 6d92637..d34ae33 100644
+---- a/src/3rdparty/chromium/ui/gfx/codec/jpeg_codec.cc
+-+++ b/src/3rdparty/chromium/ui/gfx/codec/jpeg_codec.cc
+-@@ -121,7 +121,7 @@ boolean EmptyOutputBuffer(jpeg_compress_struct* cinfo) {
+-   // tell libjpeg where to write the next data
+-   cinfo->dest->next_output_byte = &(*state->out)[state->image_buffer_used];
+-   cinfo->dest->free_in_buffer = state->out->size() - state->image_buffer_used;
+--  return 1;
+-+  return (boolean)(1);
+- }
+- 
+- // Cleans up the JpegEncoderState to prepare for returning in the final form.
+-@@ -262,7 +262,7 @@ bool JPEGCodec::Encode(const unsigned char* input, ColorFormat format,
+-   cinfo.data_precision = 8;
+- 
+-   jpeg_set_defaults(&cinfo);
+--  jpeg_set_quality(&cinfo, quality, 1);  // quality here is 0-100
+-+  jpeg_set_quality(&cinfo, quality, (boolean)true);  // quality here is 0-100
+- 
+-   // set up the destination manager
+-   jpeg_destination_mgr destmgr;
+-@@ -274,7 +274,7 @@ bool JPEGCodec::Encode(const unsigned char* input, ColorFormat format,
+-   JpegEncoderState state(output);
+-   cinfo.client_data = &state;
+- 
+--  jpeg_start_compress(&cinfo, 1);
+-+  jpeg_start_compress(&cinfo, (boolean)true);
+- 
+-   // feed it the rows, doing necessary conversions for the color format
+- #ifdef JCS_EXTENSIONS
+-@@ -360,7 +360,7 @@ void InitSource(j_decompress_ptr cinfo) {
+- //   set to a positive value if TRUE is returned. A FALSE return should only
+- //   be used when I/O suspension is desired."
+- boolean FillInputBuffer(j_decompress_ptr cinfo) {
+--  return false;
+-+  return (boolean)false;
+- }
+- 
+- // Skip data in the buffer. Since we have all the data at once, this operation
+-@@ -488,7 +488,7 @@ bool JPEGCodec::Decode(const unsigned char* input, size_t input_size,
+-   cinfo.client_data = &state;
+- 
+-   // fill the file metadata into our buffer
+--  if (jpeg_read_header(&cinfo, true) != JPEG_HEADER_OK)
+-+  if (jpeg_read_header(&cinfo, (boolean)true) != JPEG_HEADER_OK)
+-     return false;
+- 
+-   // we want to always get RGB data out
+diff --git a/package/qt5/qt5webengine/5.8.0/004-on-arm8-set-armv7-type.patch b/package/qt5/qt5webengine/5.8.0/004-on-arm8-set-armv7-type.patch
+deleted file mode 100644
+index 862cb95611..0000000000
+--- a/package/qt5/qt5webengine/5.8.0/004-on-arm8-set-armv7-type.patch
++++ /dev/null
+@@ -1,13 +0,0 @@
+-diff --git a/src/core/gyp_run.pro b/src/core/gyp_run.pro
+-index 161ca9e..6a0eacd 100644
+---- a/src/core/gyp_run.pro
+-+++ b/src/core/gyp_run.pro
+-@@ -69,6 +69,8 @@ contains(QT_ARCH, "arm") {
+-         MARMV = $$split(MARMV,)
+-         MARMV = $$member(MARMV, 0)
+-         lessThan(MARMV, 6): error("$$MARCH architecture is not supported")
+-+	else: equals(MARMV, 7): GYP_CONFIG += arm_version=\"$MARMV\"
+-+	else: GYP_CONFIG += arm_version=\"7\"
+-         GYP_CONFIG += arm_version=\"$$MARMV\"
+-     }
+- 
+diff --git a/package/qt5/qt5webengine/Config.in b/package/qt5/qt5webengine/Config.in
+index dd65983722..b630a852a0 100644
+--- a/package/qt5/qt5webengine/Config.in
++++ b/package/qt5/qt5webengine/Config.in
+@@ -10,7 +10,6 @@ config BR2_PACKAGE_QT5WEBENGINE
+ 	select BR2_PACKAGE_LIBCAP
+ 	select BR2_PACKAGE_QT5DECLARATIVE
+ 	select BR2_PACKAGE_QT5DECLARATIVE_QUICK
+-	select BR2_PACKAGE_WEBP
+ 	help
+ 	Qt is a cross-platform application and UI framework for
+ 	developers using C++.
+diff --git a/package/qt5/qt5webengine/qt5webengine.mk b/package/qt5/qt5webengine/qt5webengine.mk
+index 46cf6853c9..98c67a63be 100644
+--- a/package/qt5/qt5webengine/qt5webengine.mk
++++ b/package/qt5/qt5webengine/qt5webengine.mk
+@@ -20,25 +20,12 @@ QT5WEBENGINE_LICENSE = Commercial license
+ QT5WEBENGINE_REDISTRIBUTE = NO
+ endif
+ 
+-ifneq ($(BR2_GCC_TARGET_CPU),)
+-QT5WEBENGINE_QMAKE_CFLAGS += -mtune=$(BR2_GCC_TARGET_CPU)
+-endif
+-
+-ifneq ($(BR2_GCC_TARGET_FLOAT_ABI),)
+-QT5WEBENGINE_QMAKE_CFLAGS += -mfloat-abi=$(BR2_GCC_TARGET_FLOAT_ABI)
+-endif
+-
+-ifneq ($(BR2_GCC_TARGET_FPU),)
+-QT5WEBENGINE_QMAKE_CFLAGS += -mfpu=$(BR2_GCC_TARGET_FPU)
+-endif
+-
+ ifeq ($(BR2_PACKAGE_QT5DECLARATIVE),y)
+ QT5WEBENGINE_DEPENDENCIES += qt5declarative
+ endif
+ 
+ define QT5WEBENGINE_CONFIGURE_CMDS
+-# (cd $(@D); $(TARGET_MAKE_ENV) $(HOST_DIR)/usr/bin/qmake WEBENGINE_CONFIG+=use_proprietary_codecs)
+- (cd $(@D); $(TARGET_MAKE_ENV) $(HOST_DIR)/usr/bin/qmake)
++ (cd $(@D); $(TARGET_MAKE_ENV) $(HOST_DIR)/usr/bin/qmake WEBENGINE_CONFIG+=use_proprietary_codecs)
+ endef
+ 
+ define QT5WEBENGINE_BUILD_CMDS
+diff --git a/package/qt5/qt5webkit/Config.in b/package/qt5/qt5webkit/Config.in
+index 637996a0de..7add5f95a9 100644
+--- a/package/qt5/qt5webkit/Config.in
++++ b/package/qt5/qt5webkit/Config.in
+@@ -1,33 +1,28 @@
+ config BR2_PACKAGE_QT5WEBKIT
+ 	bool "qt5webkit"
+-	depends on !BR2_STATIC_LIBS
+-	depends on BR2_PACKAGE_QT5_JSCORE_AVAILABLE
+-	depends on !BR2_BINFMT_FLAT # icu
+-	# assumes a FPU is available on MIPS
+-	depends on !BR2_MIPS_SOFT_FLOAT
+ 	select BR2_PACKAGE_QT5BASE
+ 	select BR2_PACKAGE_QT5BASE_ICU
+ 	select BR2_PACKAGE_QT5BASE_GUI
+ 	select BR2_PACKAGE_SQLITE
+ 	select BR2_PACKAGE_XLIB_LIBXEXT if BR2_PACKAGE_QT5BASE_XCB
+ 	select BR2_PACKAGE_XLIB_LIBXRENDER if BR2_PACKAGE_QT5BASE_XCB
++	depends on !BR2_STATIC_LIBS
++	depends on BR2_PACKAGE_QT5_JSCORE_AVAILABLE
++	depends on !BR2_BINFMT_FLAT # icu
+ 	help
+ 	  Qt is a cross-platform application and UI framework for
+ 	  developers using C++.
+ 
+-	  The Qt WebKit module provides the WebView API, which
+-	  allows QML applications to render regions of dynamic
+-	  web content.
++	  This package corresponds to the qt5webkit module.
+ 
+ 	  This package has been removed from the official release packages
+ 	  since Qt5.6.0, but it is still available for users to build it
+ 	  from source. This is useful for platforms without GPU since the
+ 	  successor (QtWebEngine) requires OpenGL support.
+ 
+-	  http://doc.qt.io/archives/qt-5.5/qtwebkit-index.html
++	  http://qt.io
+ 
+ comment "qt5webkit needs a toolchain w/ dynamic library"
+-	depends on BR2_STATIC_LIBS
+-	depends on BR2_PACKAGE_QT5_JSCORE_AVAILABLE
+-	depends on !BR2_BINFMT_FLAT
+-	depends on !BR2_MIPS_SOFT_FLOAT
++        depends on BR2_STATIC_LIBS
++        depends on BR2_PACKAGE_QT5_JSCORE_AVAILABLE
++        depends on !BR2_BINFMT_FLAT
+diff --git a/package/qt5/qt5webkit/qt5webkit.mk b/package/qt5/qt5webkit/qt5webkit.mk
+index d435192994..629e40a3ec 100644
+--- a/package/qt5/qt5webkit/qt5webkit.mk
++++ b/package/qt5/qt5webkit/qt5webkit.mk
+@@ -4,20 +4,24 @@
+ #
+ ################################################################################
+ 
+-QT5WEBKIT_VERSION = $(QT5_VERSION)
+-QT5WEBKIT_SITE = $(QT5_SNAPSHOTS_SITE)
+-QT5WEBKIT_SOURCE = qtwebkit-opensource-src-$(QT5WEBKIT_VERSION).tar.xz
+-QT5WEBKIT_DEPENDENCIES = \
+-	host-bison host-flex host-gperf host-python host-ruby \
+-	qt5base sqlite
++QT5WEBKIT_VERSION = d2ff5a085572b1ee24dcb42ae107063f3142d14e
++# Using GitHub since it supports downloading tarballs from random commits.
++# The http://code.qt.io/cgit/qt/qtwebkit.git/ repo doesn't allow to do so.
++QT5WEBKIT_SITE = $(call github,qtproject,qtwebkit,$(QT5WEBKIT_VERSION))
++QT5WEBKIT_DEPENDENCIES = qt5base sqlite host-ruby host-gperf host-bison host-flex
+ QT5WEBKIT_INSTALL_STAGING = YES
+ 
+ QT5WEBKIT_LICENSE_FILES = Source/WebCore/LICENSE-LGPL-2 Source/WebCore/LICENSE-LGPL-2.1
+ 
+-QT5WEBKIT_LICENSE = LGPL-2.1+, BSD-3-Clause, BSD-2-Clause
++ifeq ($(BR2_PACKAGE_QT5BASE_LICENSE_APPROVED),y)
++QT5WEBKIT_LICENSE = LGPLv2.1+, BSD-3c, BSD-2c
+ # Source files contain references to LGPL_EXCEPTION.txt but it is not included
+ # in the archive.
+ QT5WEBKIT_LICENSE_FILES += LICENSE.LGPLv21
++else
++QT5WEBKIT_LICENSE = LGPLv2.1+ (WebCore), Commercial license
++QT5WEBKIT_REDISTRIBUTE = NO
++endif
+ 
+ ifeq ($(BR2_PACKAGE_QT5BASE_XCB),y)
+ QT5WEBKIT_DEPENDENCIES += xlib_libXext xlib_libXrender
+@@ -27,26 +31,23 @@ ifeq ($(BR2_PACKAGE_QT5DECLARATIVE),y)
+ QT5WEBKIT_DEPENDENCIES += qt5declarative
+ endif
+ 
+-# QtWebkit's build system uses python, but only supports python2. We work
+-# around this by forcing python2 early in the PATH, via a python->python2
+-# symlink.
+-QT5WEBKIT_ENV = PATH=$(@D)/host-bin:$(BR_PATH)
+-define QT5WEBKIT_PYTHON2_SYMLINK
+-	mkdir -p $(@D)/host-bin
+-	ln -sf $(HOST_DIR)/usr/bin/python2 $(@D)/host-bin/python
+-endef
+-QT5WEBKIT_PRE_CONFIGURE_HOOKS += QT5WEBKIT_PYTHON2_SYMLINK
+-
++# Since we get the source from git, generated header files are not included.
++# qmake detects that header file generation (using the syncqt tool) must be
++# done based on the existence of a .git directory (cfr. the git_build config
++# option which is set in qt_build_paths.prf).
++# So, to make sure that qmake detects that header files must be generated,
++# create an empty .git directory.
+ define QT5WEBKIT_CONFIGURE_CMDS
+-	(cd $(@D); $(TARGET_MAKE_ENV) $(QT5WEBKIT_ENV) $(HOST_DIR)/usr/bin/qmake)
++	mkdir -p $(@D)/.git
++	(cd $(@D); $(TARGET_MAKE_ENV) $(HOST_DIR)/usr/bin/qmake)
+ endef
+ 
+ define QT5WEBKIT_BUILD_CMDS
+-	$(TARGET_MAKE_ENV) $(QT5WEBKIT_ENV) $(MAKE) -C $(@D)
++	$(TARGET_MAKE_ENV) $(MAKE) -C $(@D)
+ endef
+ 
+ define QT5WEBKIT_INSTALL_STAGING_CMDS
+-	$(TARGET_MAKE_ENV) $(QT5WEBKIT_ENV) $(MAKE) -C $(@D) install
++	$(TARGET_MAKE_ENV) $(MAKE) -C $(@D) install
+ 	$(QT5_LA_PRL_FILES_FIXUP)
+ endef
+ 
+diff --git a/package/qt5/qt5websockets/Config.in b/package/qt5/qt5websockets/Config.in
+index 0cfde91c8b..385a07c9fa 100644
+--- a/package/qt5/qt5websockets/Config.in
++++ b/package/qt5/qt5websockets/Config.in
+@@ -6,9 +6,6 @@ config BR2_PACKAGE_QT5WEBSOCKETS
+ 	  Qt is a cross-platform application and UI framework for
+ 	  developers using C++.
+ 
+-	  The Qt WebSockets module provides C++ and QML interfaces
+-	  that enable Qt applications to act as a server that can
+-	  process WebSocket requests, or a client that can
+-	  consume data received from the server, or both.
++	  This package corresponds to the qt5websockets module.
+ 
+-	  http://doc.qt.io/qt-5/qtwebsockets-index.html
++	  http://qt.io
+diff --git a/package/qt5/qt5websockets/qt5websockets.mk b/package/qt5/qt5websockets/qt5websockets.mk
+index af87435d6d..609b68e4e7 100644
+--- a/package/qt5/qt5websockets/qt5websockets.mk
++++ b/package/qt5/qt5websockets/qt5websockets.mk
+@@ -10,15 +10,12 @@ QT5WEBSOCKETS_SOURCE = qtwebsockets-opensource-src-$(QT5WEBSOCKETS_VERSION).tar.
+ QT5WEBSOCKETS_DEPENDENCIES = qt5base
+ QT5WEBSOCKETS_INSTALL_STAGING = YES
+ 
+-ifeq ($(BR2_PACKAGE_QT5_VERSION_LATEST),y)
+-QT5WEBSOCKETS_LICENSE = GPL-2.0+ or LGPL-3.0, GPL-3.0 with exception(tools)
+-QT5WEBSOCKETS_LICENSE_FILES = LICENSE.GPL2 LICENSE.GPLv3 LICENSE.GPL3-EXCEPT LICENSE.LGPLv3
+-else
+-QT5WEBSOCKETS_LICENSE = GPL-3.0 or LGPL-2.1 with exception or LGPL-3.0
++ifeq ($(BR2_PACKAGE_QT5BASE_LICENSE_APPROVED),y)
++QT5WEBSOCKETS_LICENSE = GPLv3 or LGPLv2.1 with exception or LGPLv3
+ QT5WEBSOCKETS_LICENSE_FILES = LICENSE.GPLv3 LICENSE.LGPLv21 LGPL_EXCEPTION.txt LICENSE.LGPLv3
+-endif
+-ifeq ($(BR2_PACKAGE_QT5BASE_EXAMPLES),y)
+-QT5WEBSOCKETS_LICENSE := $(QT5WEBSOCKETS_LICENSE), BSD-3-Clause (examples)
++else
++QT5WEBSOCKETS_LICENSE = Commercial license
++QT5WEBSOCKETS_REDISTRIBUTE = NO
+ endif
+ 
+ ifeq ($(BR2_PACKAGE_QT5DECLARATIVE),y)
+diff --git a/package/qt5/qt5x11extras/Config.in b/package/qt5/qt5x11extras/Config.in
+index ff4cc11531..6fc2c0ade6 100644
+--- a/package/qt5/qt5x11extras/Config.in
++++ b/package/qt5/qt5x11extras/Config.in
+@@ -1,12 +1,11 @@
+ config BR2_PACKAGE_QT5X11EXTRAS
+ 	bool "qt5x11extras"
+-	depends on BR2_PACKAGE_QT5BASE_XCB
+ 	select BR2_PACKAGE_QT5BASE_WIDGETS
++	depends on BR2_PACKAGE_QT5BASE_XCB
+ 	help
+ 	  Qt is a cross-platform application and UI framework for
+ 	  developers using C++.
+ 
+-	  Qt X11 Extras enables the Qt programmer to write
+-	  applications for the Linux/X11 platform.
++	  This package corresponds to the qt5x11extras module.
+ 
+-	  http://doc.qt.io/qt-5/qtx11extras-index.html
++	  http://qt.io
+diff --git a/package/qt5/qt5x11extras/qt5x11extras.mk b/package/qt5/qt5x11extras/qt5x11extras.mk
+index 00667c72f3..a0e1209868 100644
+--- a/package/qt5/qt5x11extras/qt5x11extras.mk
++++ b/package/qt5/qt5x11extras/qt5x11extras.mk
+@@ -10,12 +10,12 @@ QT5X11EXTRAS_SOURCE = qtx11extras-opensource-src-$(QT5X11EXTRAS_VERSION).tar.xz
+ QT5X11EXTRAS_DEPENDENCIES = qt5base
+ QT5X11EXTRAS_INSTALL_STAGING = YES
+ 
+-ifeq ($(BR2_PACKAGE_QT5_VERSION_LATEST),y)
+-QT5X11EXTRAS_LICENSE = GPL-2.0+ or LGPL-3.0, GPL-3.0 with exception(tools), GFDL-1.3 (docs)
+-QT5X11EXTRAS_LICENSE_FILES = LICENSE.GPLv2 LICENSE.GPLv3 LICENSE.GPL3-EXCEPT LICENSE.LGPLv3 LICENSE.FDL
+-else
+-QT5X11EXTRAS_LICENSE = GPL-2.0 or GPL-3.0 or LGPL-2.1 with exception or LGPL-3.0, GFDL-1.3 (docs)
++ifeq ($(BR2_PACKAGE_QT5BASE_LICENSE_APPROVED),y)
++QT5X11EXTRAS_LICENSE = GPLv2 or GPLv3 or LGPLv2.1 with exception or LGPLv3, GFDLv1.3 (docs)
+ QT5X11EXTRAS_LICENSE_FILES = LICENSE.GPLv2 LICENSE.GPLv3 LICENSE.LGPLv21 LGPL_EXCEPTION.txt LICENSE.LGPLv3 LICENSE.FDL
++else
++QT5X11EXTRAS_LICENSE = Commercial license
++QT5X11EXTRAS_REDISTRIBUTE = NO
+ endif
+ 
+ define QT5X11EXTRAS_CONFIGURE_CMDS
+diff --git a/package/qt5/qt5xmlpatterns/Config.in b/package/qt5/qt5xmlpatterns/Config.in
+index dd8b54eba1..8c82656c5d 100644
+--- a/package/qt5/qt5xmlpatterns/Config.in
++++ b/package/qt5/qt5xmlpatterns/Config.in
+@@ -5,7 +5,6 @@ config BR2_PACKAGE_QT5XMLPATTERNS
+ 	  Qt is a cross-platform application and UI framework for
+ 	  developers using C++.
+ 
+-	  The Qt XML Patterns module provides support for XPath,
+-	  XQuery, XSLT, and XML Schema validation.
++	  This package corresponds to the qt5xmlpatterns module.
+ 
+-	  http://doc.qt.io/qt-5/qtxmlpatterns-index.html
++	  http://qt.io
+diff --git a/package/qt5/qt5xmlpatterns/qt5xmlpatterns.mk b/package/qt5/qt5xmlpatterns/qt5xmlpatterns.mk
+index fabca21261..31477a7c0b 100644
+--- a/package/qt5/qt5xmlpatterns/qt5xmlpatterns.mk
++++ b/package/qt5/qt5xmlpatterns/qt5xmlpatterns.mk
+@@ -10,15 +10,12 @@ QT5XMLPATTERNS_SOURCE = qtxmlpatterns-opensource-src-$(QT5XMLPATTERNS_VERSION).t
+ QT5XMLPATTERNS_DEPENDENCIES = qt5base
+ QT5XMLPATTERNS_INSTALL_STAGING = YES
+ 
+-ifeq ($(BR2_PACKAGE_QT5_VERSION_LATEST),y)
+-QT5XMLPATTERNS_LICENSE = GPL-2.0+ or LGPL-3.0, GPL-3.0 with exception(tools), GFDL-1.3 (docs)
+-QT5XMLPATTERNS_LICENSE_FILES = LICENSE.GPL2 LICENSE.GPLv3 LICENSE.GPL3-EXCEPT LICENSE.LGPLv3 LICENSE.FDL
+-else
+-QT5XMLPATTERNS_LICENSE = GPL-3.0 or LGPL-2.1 with exception or LGPL-3.0, GFDL-1.3 (docs)
++ifeq ($(BR2_PACKAGE_QT5BASE_LICENSE_APPROVED),y)
++QT5XMLPATTERNS_LICENSE = GPLv3 or LGPLv2.1 with exception or LGPLv3, GFDLv1.3 (docs)
+ QT5XMLPATTERNS_LICENSE_FILES = LICENSE.GPLv3 LICENSE.LGPLv21 LGPL_EXCEPTION.txt LICENSE.LGPLv3 LICENSE.FDL
+-endif
+-ifeq ($(BR2_PACKAGE_QT5BASE_EXAMPLES),y)
+-QT5XMLPATTERNS_LICENSE := $(QT5XMLPATTERNS_LICENSE), BSD-3-Clause (examples)
++else
++QT5XMLPATTERNS_LICENSE = Commercial license
++QT5XMLPATTERNS_REDISTRIBUTE = NO
+ endif
+ 
+ define QT5XMLPATTERNS_CONFIGURE_CMDS
+@@ -35,20 +32,9 @@ define QT5XMLPATTERNS_INSTALL_STAGING_CMDS
+ endef
+ 
+ ifeq ($(BR2_STATIC_LIBS),)
+-define QT5XMLPATTERNS_INSTALL_TARGET_LIBS
++define QT5XMLPATTERNS_INSTALL_TARGET_CMDS
+ 	cp -dpf $(STAGING_DIR)/usr/lib/libQt5XmlPatterns*.so.* $(TARGET_DIR)/usr/lib
+ endef
+ endif
+ 
+-ifeq ($(BR2_PACKAGE_QT5BASE_EXAMPLES),y)
+-define QT5XMLPATTERNS_INSTALL_TARGET_EXAMPLES
+-	cp -dpfr $(STAGING_DIR)/usr/lib/qt/examples/xmlpatterns $(TARGET_DIR)/usr/lib/qt/examples/
+-endef
+-endif
+-
+-define QT5XMLPATTERNS_INSTALL_TARGET_CMDS
+-	$(QT5XMLPATTERNS_INSTALL_TARGET_LIBS)
+-	$(QT5XMLPATTERNS_INSTALL_TARGET_EXAMPLES)
+-endef
+-
+ $(eval $(generic-package))

+ 8 - 10
Make-bb-kernel_Qt5.6.2.sh → Make-bb-kernel_Qt5.7.sh

@@ -6,25 +6,23 @@ cd ..
 rm -rf bb-kernel
 git clone https://github.com/RobertCNelson/bb-kernel
 cd bb-kernel
-#git checkout -b GfA 4.4.94-bone-rt-r19
 git checkout -b GfA 4.4.104-bone-rt-r21
 # -- patch kernelbuild
-#patch -p1 < ../GfA/build_kernel.sh.patch
 patch -p1 < ../GfA/build_kernel_44104rt.sh.patch
 #---------------------------------
 ./build_kernel.sh
 cd $GFAWRKDIR
-rm ~/buildroot_dl/GfAkernel.tar.gz
-rm GfAkernel.tar.gz
-tar -C ../bb-kernel/KERNEL --exclude=./.config --exclude=./.git  -czvf GfAkernel.tar.gz ./
+rm ~/buildroot_dl/GfAkernel57.tar.gz
+rm GfAkernel57.tar.gz
+tar -C ../bb-kernel/KERNEL --exclude=./.config --exclude=./.git  -czvf GfAkernel57.tar.gz ./
 #--
 #--
 #!/bin/bash
 GFAWRKDIR=`pwd`
 cd ..
-rm -rf buildroot562
-git clone git://git.buildroot.net/buildroot ./buildroot562
-cd buildroot562
+rm -rf buildroot57
+git clone git://git.buildroot.net/buildroot ./buildroot57
+cd buildroot57
 git checkout 63a20d5dfebe83e2b2bd683dc78ebdf787dff100 -b gfawrk
 patch -p1 < ../GfA/GfA-buildroot-changes.patch
 patch -p1 < ../GfA/GfA-buildroot_revert_S80ti-gfx_frambuffersettings.patch
@@ -47,12 +45,12 @@ patch -p1 < ../GfA/GfA-buildroot-update-add-fullhd.patch
 patch -p1 < ../GfA/GfA-buildroot-MakeDTSupdate.patch
 patch -p1 < ../GfA/GfA-buildroot_fontconfig_mtime_always_ok.patch
 patch -p1 < ../GfA/GfA-buildroot_make_image_update.patch
+patch -p1 < ../GfA/GfA-buildroot-qt57_on_Kernel_4_4_104.patch
 #
 chmod a+x *.sh
 cp ../GfA/configs/* ./configs
 git add .
 git commit -m "GfA wrk changes and setup"
-#make BR2_EXTERNAL=../GfA Display001_4.4.94_rt19_Qt5.6.2_defconfig
-make BR2_EXTERNAL=../GfA Display001_4.4.104_rt21_Qt5.6.2_defconfig
+make BR2_EXTERNAL=../GfA Display001_4.4.104_rt21_Qt5.7_defconfig
 cd $GFAWRKDIR
 #------

+ 1 - 1
board/GfA/Display001/BUILD

@@ -1 +1 @@
-470
+473

+ 1 - 1
board/GfA/Display001/rootfs/etc/init.d/rcS

@@ -80,7 +80,7 @@ done
 /usr/bin/beep -f 4500 -l 100 -r 2 -d 50 -n -f 6000 -l 200
 
 # clear screen and cursor off for customer logo
-echo -e "\033[3J\033[?25l\033[9;0]\033[14;0]" > /dev/tty0
+##echo -e "\033[3J\033[?25l\033[9;0]\033[14;0]" > /dev/tty0
 #==== set rtcdev again
 if [ "$BASEBOARD" == "DISPLAY002_DI4" ]; then
 	rm /dev/rtc

+ 1 - 1
board/GfA/Display001/rootfs/etc/inittab

@@ -31,7 +31,7 @@ tty3::respawn:/sbin/getty -L  tty3 115200 linux
 #tty4::respawn:/opt/WGET_di-soric_001/bin/WGET_di-soric_001
 #tty5::respawn:/opt/MAIN_di-soric_001/bin/MAIN_di-soric_001
 
-tty6::respawn:/root/startbrowser.sh
+#tty6::respawn:/root/startbrowser.sh
 #tty8::respawn:/var/GfA/Display_GSM 
 # Stuff to do for the 3-finger salute
 ::ctrlaltdel:/sbin/reboot

BIN
board/GfA/Display001/rootfs/opt/di-soric/HMI/VISU_di-soric


BIN
board/GfA/Display001/rootfs/usr/lib/qt/plugins/platforminputcontexts/libFreeVirtualKeyboard.so


+ 0 - 36
board/GfA/Display001/rootfs/usr/qml/ApplicationLauncher/applicationlauncher.qmltypes

@@ -1,36 +0,0 @@
-import QtQuick.tooling 1.2
-
-// This file describes the plugin-supplied types contained in the library.
-// It is used for QML tooling purposes only.
-//
-// This file was auto-generated by:
-// 'qmlplugindump -nonrelocatable ApplicationLauncher 1.0'
-
-Module {
-    dependencies: ["QtQuick 2.7"]
-    Component {
-        name: "ApplicationLaunch"
-        prototype: "QObject"
-        exports: ["ApplicationLauncher/ApplicationLaunch 1.0"]
-        exportMetaObjectRevisions: [0]
-        Property { name: "appName"; type: "string" }
-        Property { name: "arguments"; type: "string" }
-        Property { name: "stdERR"; type: "string" }
-        Property { name: "stdOUT"; type: "string" }
-        Property { name: "outFName"; type: "string" }
-        Property { name: "exitCode"; type: "int"; isReadonly: true }
-        Property { name: "exitStatus"; type: "int"; isReadonly: true }
-        Property { name: "exitError"; type: "int"; isReadonly: true }
-        Signal { name: "appFinished" }
-        Signal { name: "appStarted" }
-        Signal { name: "appError" }
-        Method { name: "launchScript" }
-    }
-    Component {
-        name: "ApplicationLauncher"
-        defaultProperty: "data"
-        prototype: "QQuickItem"
-        exports: ["ApplicationLauncher/ApplicationLauncher 1.0"]
-        exportMetaObjectRevisions: [0]
-    }
-}

BIN
board/GfA/Display001/rootfs/usr/qml/ApplicationLauncher/libApplicationLauncher.so


+ 0 - 4
board/GfA/Display001/rootfs/usr/qml/ApplicationLauncher/qmldir

@@ -1,4 +0,0 @@
-module ApplicationLauncher
-class ApplicationLauncher
-plugin ApplicationLauncher
-typeinfo applicationlauncher.qmltypes

BIN
board/GfA/Display001/rootfs/usr/qml/QtQuick/FreeVirtualKeyboard/FontAwesome.otf


+ 0 - 263
board/GfA/Display001/rootfs/usr/qml/QtQuick/FreeVirtualKeyboard/InputPanel.qml

@@ -1,263 +0,0 @@
-import QtQuick 2.0
-import "."
-import FreeVirtualKeyboard 1.0
-
-/**
- * This is the QML input panel that provides the virtual keyboard UI
- * The code has been copied from
- * http://tolszak-dev.blogspot.de/2013/04/qplatforminputcontext-and-virtual.html
- */
-Item {
-    id:root
-    objectName: "inputPanel"
-    width: parent.width
-    height: width / 4
-
-    signal hideKeyPressed
-
-    // Report actual keyboard rectangle to input engine
-    onYChanged: InputEngine.setKeyboardRectangle(Qt.rect(x, y, width, height))
-
-    KeyModel {
-        id:keyModel
-        kbdLayout: "de" //settings.value("COMMON/KbdLayout")
-    }
-
-    FontLoader {
-        source: "FontAwesome.otf"
-    }
-    QtObject {
-        id:pimpl
-        property bool shiftModifier: false
-        property bool symbolModifier: false
-        property int verticalSpacing: keyboard.height / 40
-        property int horizontalSpacing: verticalSpacing
-        property int rowHeight: keyboard.height/24*5 - verticalSpacing
-        property int buttonWidth:  (keyboard.width-column.anchors.margins)/12 - horizontalSpacing
-    }
-
-    // The delegate that paints the key buttons
-    Component {
-        id: keyButtonDelegate
-        KeyButton {
-            id: button
-            width: pimpl.buttonWidth
-            height: pimpl.rowHeight
-            text: (pimpl.shiftModifier) ? letter.toUpperCase() : (pimpl.symbolModifier)?firstSymbol : letter
-            inputPanel: root
-        }
-    }
-
-    Component {
-        id: numberButtonDelegate
-        KeyButton {
-            id: button
-            width: pimpl.buttonWidth
-            height: pimpl.rowHeight  * 4 / 5
-            text: (pimpl.shiftModifier) ? letter.toUpperCase() : (pimpl.symbolModifier)?firstSymbol : letter
-            inputPanel: root
-            color: "grey"
-        }
-    }
-
-    Connections {
-        target: InputEngine
-        // Switch the keyboard layout to Numeric if the input mode of the InputEngine changes
-        onInputModeChanged: {
-            pimpl.symbolModifier = ((InputEngine.inputMode == InputEngine.Numeric)
-                                 || (InputEngine.inputMode == InputEngine.Dialable))
-            if (pimpl.symbolModifier) {
-                pimpl.shiftModifier = false
-            }
-        }
-    }
-
-    // This function shows the character preview popup for each key button
-    function showKeyPopup(keyButton)
-    {
-        console.debug("showKeyPopup");
-        keyPopup.popup(keyButton, root);
-    }
-
-    // The key popup for character preview
-    KeyPopup {
-        id: keyPopup
-        visible: false
-        z: 100
-    }
-
-    Rectangle {
-        id: background
-        color: "black"
-        width: keyboard.width
-        height: keyboard.height + 4 * pimpl.verticalSpacing
-    }
-
-    Rectangle {
-        id:keyboard
-        color: "black"
-        anchors.fill: parent;
-        MouseArea {
-            anchors.fill: parent
-        }
-
-        Column {
-            id:column
-            anchors.margins: 5
-            anchors.fill: parent
-            spacing: pimpl.verticalSpacing
-            Row {
-                height: pimpl.rowHeight
-                spacing: pimpl.horizontalSpacing
-                anchors.horizontalCenter:parent.horizontalCenter
-                Repeater {
-                    model: keyModel.numbersRowModel
-                    delegate: numberButtonDelegate
-                }
-            }
-
-            Row {
-                height: pimpl.rowHeight
-                spacing: pimpl.horizontalSpacing
-                anchors.horizontalCenter:parent.horizontalCenter
-                Repeater {
-                    model: keyModel.firstRowModel
-                    delegate: keyButtonDelegate
-                }
-            }
-            Row {
-                height: pimpl.rowHeight
-                spacing: pimpl.horizontalSpacing
-                anchors.horizontalCenter:parent.horizontalCenter
-                Repeater {
-                    model: keyModel.secondRowModel
-                    delegate: keyButtonDelegate
-                }
-            }
-            Item {
-                height: pimpl.rowHeight
-                width:parent.width
-                KeyButton {
-                    id: shiftKey
-                    color: (pimpl.shiftModifier)? "#1e6fa7": "#1e1b18"
-                    anchors.left: parent.left
-                    width: 1.25*pimpl.buttonWidth
-                    height: pimpl.rowHeight
-                    font.family: "FontAwesome"
-                    font.bold: true
-                    text: "\u21ea" //"\uf062"
-                    functionKey: true
-                    onClicked: {
-                        if (pimpl.symbolModifier) {
-                            pimpl.symbolModifier = false
-                        }
-                        pimpl.shiftModifier = !pimpl.shiftModifier
-                    }
-                    inputPanel: root
-                }
-                Row {
-                    height: pimpl.rowHeight
-                    spacing: pimpl.horizontalSpacing
-                    anchors.horizontalCenter:parent.horizontalCenter
-                    Repeater {
-                        anchors.horizontalCenter: parent.horizontalCenter
-                        model: keyModel.thirdRowModel
-                        delegate: keyButtonDelegate
-                    }
-                }
-                KeyButton {
-                    id: backspaceKey
-                    font.family: "FontAwesome"
-                    color: "#1e1b18"
-                    anchors.right: parent.right
-                    width: 1.25*pimpl.buttonWidth
-                    height: pimpl.rowHeight
-                    text: "\x7F"
-                    displayText: "\u27f5" //"\uf177"
-                    inputPanel: root
-                    repeat: true
-                }
-            }
-            Row {
-                height: pimpl.rowHeight
-                spacing: pimpl.horizontalSpacing
-                anchors.horizontalCenter:parent.horizontalCenter
-                KeyButton {
-                    id: hideKey
-                    color: "#1e1b18"
-                    width: 1.25*pimpl.buttonWidth
-                    height: pimpl.rowHeight
-                    font.family: "FontAwesome"
-                    text: "\uf11c" //"\uf078"
-                    functionKey: true
-                    onClicked: {
-                        Qt.inputMethod.hide();
-                        hideKeyPressed();
-                    }
-                    inputPanel: root
-                    showPreview: false
-                }
-                KeyButton {
-                    color: "#1e1b18"
-                    width: 1.25*pimpl.buttonWidth
-                    height: pimpl.rowHeight
-                    font.family: "FontAwesome"
-                    font.bold: true
-                    text:  (pimpl.shiftModifier) ? "\u21a4":"\u21a6"
-                    inputPanel: root
-                    //functionKey: true
-                }
-                KeyButton {
-                    color: "#1e1b18"
-                    width: pimpl.buttonWidth
-                    height: pimpl.rowHeight
-                    font.family: "FontAwesome"
-                    text: (pimpl.shiftModifier) ? "\u2191":"\u2190" //"\uf060" // arrow left
-                    //onClicked: InputEngine.sendKeyToFocusItem(text)
-                    inputPanel: root
-                }
-                KeyButton {
-                    id: spaceKey
-                    width: 3*pimpl.buttonWidth
-                    height: pimpl.rowHeight
-                    text: " "
-                    inputPanel: root
-                    showPreview: false
-                }
-                KeyButton {
-                    color: "#1e1b18"
-                    width: pimpl.buttonWidth
-                    height: pimpl.rowHeight
-                    font.family: "FontAwesome"
-                    text: (pimpl.shiftModifier) ?"\u2193":"\u2192" //"\uf061"  //pimpl.symbolModifier ? ":" :"."
-                    inputPanel: root
-                }
-                KeyButton {
-                    id: symbolKey
-                    color: "#1e1b18"
-                    width: 1.25*pimpl.buttonWidth
-                    height: pimpl.rowHeight
-                    text: (!pimpl.symbolModifier)? "12#" : "ABC"
-                    functionKey: true
-                    onClicked: {
-                        if (pimpl.shiftModifier) {
-                            pimpl.shiftModifier = false
-                        }
-                        pimpl.symbolModifier = !pimpl.symbolModifier
-                    }
-                    inputPanel: root
-                }
-                KeyButton {
-                    id: enterKey
-                    color: "#1e1b18"
-                    width: 1.25*pimpl.buttonWidth
-                    height: pimpl.rowHeight
-                    font.bold: true
-                    displayText: "\u23ce" //"Enter"
-                    text: "\n"
-                    inputPanel: root
-                }
-            }
-        }
-    }
-}

+ 0 - 149
board/GfA/Display001/rootfs/usr/qml/QtQuick/FreeVirtualKeyboard/KeyButton.qml

@@ -1,149 +0,0 @@
-import QtQuick 2.0
-import FreeVirtualKeyboard 1.0
-
-/**
- * This is the type implements one single key button in the InputPanel
- * The code has been copied from
- * http://tolszak-dev.blogspot.de/2013/04/qplatforminputcontext-and-virtual.html
- */
-Item {
-    id:root
-
-    // The background color of this button
-    property color color: "#35322f"
-
-    // The key text to show in this button
-    property string text
-
-    // The font for rendering of text
-    property alias font: txt.font
-
-    // The color of the text in this button
-    property alias textColor: txt.color
-
-    // This property holds the pressed status of the key.
-    property alias isPressed: buttonMouseArea.pressed
-
-    // This property holds a reference to the input panel.
-    // A key can only show the charcter preview popup if this property contains
-    // a valid refernce to the input panel
-    property var inputPanel
-
-    // This property holds the highlighted status of the key
-    // The highlighted status is a little bit different from the pressed status
-    // If the user releases the key, it is not pressed anymore, but it is still
-    // highlighted for some milliseconds
-    property bool isHighlighted: false
-
-    // Sets the show preview attribute for the character preview key popup
-    property bool showPreview: true
-
-    // Sets the key repeat attribute.
-    // If the repeat is enabled, the key will repeat the input events while held down.
-    // The default is false.
-    property bool repeat: false
-
-    // Sets the key code for input method processing.
-    property int key
-
-    // Sets the display text - this string is rendered in the keyboard layout.
-    // The default value is the key text.
-    property alias displayText: txt.text
-
-    // Sets the function key attribute.
-    property bool functionKey: false
-
-    signal clicked()
-    signal pressed()
-    signal released()
-
-    Rectangle {
-        anchors.fill: parent
-        radius: height / 20
-        color: isHighlighted ? Qt.tint(root.color, "#801e6fa7") : root.color
-        Text {
-            id: txt
-            color: "white"
-            anchors.margins: parent.height / 6
-            anchors.fill: parent
-            fontSizeMode: Text.Fit
-            font.pixelSize: height
-            horizontalAlignment: Text.AlignHCenter
-            verticalAlignment: Text.AlignVCenter
-            text: root.text
-        }
-        MouseArea {
-            id: buttonMouseArea
-            anchors.fill: parent
-            onClicked: root.clicked()
-            onPressed: root.pressed()
-            onReleased: root.released()
-        }
-    }
-
-    Timer {
-        id: highlightTimer
-        interval: 100
-        running: !isPressed
-        repeat: false
-
-        onTriggered: {
-            isHighlighted = false;
-        }
-    }
-
-    Timer {
-        id: repeatTimer
-        interval: 500
-        repeat: true
-        running: root.repeat && root.isPressed
-
-        onTriggered: {
-            if (root.state == "")
-            {
-                root.state = "REPEATING"
-                console.debug("switching to repeating");
-            }
-            else if (root.state == "REPEATING")
-            {
-                console.debug()("repeating");
-            }
-
-            if (!functionKey)
-            {
-                InputEngine.sendKeyToFocusItem(text)
-            }
-        }
-    }
-
-    onInputPanelChanged: {
-        console.debug("onInputPanelChanged: " + inputPanel.objectName);
-    }
-
-    // If the InputPanel property has a valid InputPanel reference and if
-    // showPreview is true, then this function calls showKeyPopup() to
-    // show the character preview popup.
-    onPressed: {
-        if (inputPanel != null && showPreview)
-        {
-            inputPanel.showKeyPopup(root);
-        }
-        isHighlighted = true;
-    }
-
-    onReleased: {
-        state = ""
-        console.debug("onReleased - functionKey = " + functionKey)
-        if (!functionKey)
-        {
-            InputEngine.sendKeyToFocusItem(text)
-        }
-    }
-
-    states: [
-        State {
-            name: "REPEATING"
-            PropertyChanges { target: repeatTimer; interval: 50}
-        }
-    ]
-}

+ 0 - 191
board/GfA/Display001/rootfs/usr/qml/QtQuick/FreeVirtualKeyboard/KeyModel.qml

@@ -1,191 +0,0 @@
-import QtQuick 2.0
-
-/**
- * This is quick and dirty model for the keys of the InputPanel *
- * The code has been copied from
- * http://tolszak-dev.blogspot.de/2013/04/qplatforminputcontext-and-virtual.html
- */
-
-
-/********************************************************
-                English Keyboard Layout
- ********************************************************/
-
-
-Item {
-    property QtObject firstRowModel: first
-    property QtObject secondRowModel: second
-    property QtObject thirdRowModel: third
-    property QtObject numbersRowModel: numbers
-    property string kbdLayout: ""
-
-    ListModel {
-        id:numbers
-
-
-        Component.onCompleted: {
-
-            switch (kbdLayout){
-            default:
-            case "de":
-            append ({ letter: "1", firstSymbol: "1"});
-            append ({ letter: "2", firstSymbol: "2"});
-            append ({ letter: "3", firstSymbol: "3"});
-            append ({ letter: "4", firstSymbol: "4"});
-            append ({ letter: "5", firstSymbol: "5"});
-            append ({ letter: "6", firstSymbol: "6"});
-            append ({ letter: "7", firstSymbol: "7"});
-            append ({ letter: "8", firstSymbol: "8"});
-            append ({ letter: "9", firstSymbol: "9"});
-            append ({ letter: "0", firstSymbol: "0"});
-            append ({ letter: "@", firstSymbol: "€"});
-            break;
-
-            case "en":
-            append ({ letter: "1", firstSymbol: "1"});
-            append ({ letter: "2", firstSymbol: "2"});
-            append ({ letter: "3", firstSymbol: "3"});
-            append ({ letter: "4", firstSymbol: "4"});
-            append ({ letter: "5", firstSymbol: "5"});
-            append ({ letter: "6", firstSymbol: "6"});
-            append ({ letter: "7", firstSymbol: "7"});
-            append ({ letter: "8", firstSymbol: "8"});
-            append ({ letter: "9", firstSymbol: "9"});
-            append ({ letter: "0", firstSymbol: "0"});
-            append ({ letter: "$", firstSymbol: "$"});
-            break;
-
-            }
-
-        }
-
-//        ListElement { letter: "1"; firstSymbol: "1"}
-//        ListElement { letter: "2"; firstSymbol: "2"}
-//        ListElement { letter: "3"; firstSymbol: "3"}
-//        ListElement { letter: "4"; firstSymbol: "4"}
-//        ListElement { letter: "5"; firstSymbol: "5"}
-//        ListElement { letter: "6"; firstSymbol: "6"}
-//        ListElement { letter: "7"; firstSymbol: "7"}
-//        ListElement { letter: "8"; firstSymbol: "8"}
-//        ListElement { letter: "9"; firstSymbol: "9"}
-//        ListElement { letter: "0"; firstSymbol: "0"}
-//        ListElement { letter: "@"; firstSymbol: "@"}
-//        // ListElement { letter: "="; firstSymbol: "+"}
-    }
-
-    ListModel {
-        id:first
-        ListElement { letter: "q"; firstSymbol: "!"}
-        ListElement { letter: "w"; firstSymbol: "°"}
-        ListElement { letter: "e"; firstSymbol: "#"}
-        ListElement { letter: "r"; firstSymbol: "$"}
-        ListElement { letter: "t"; firstSymbol: "%"}
-        ListElement { letter: "y"; firstSymbol: "^"}
-        ListElement { letter: "u"; firstSymbol: "&"}
-        ListElement { letter: "i"; firstSymbol: "+"}
-        ListElement { letter: "o"; firstSymbol: "-"}
-        ListElement { letter: "p"; firstSymbol: "*"}
-        ListElement { letter: "("; firstSymbol: "/"}
-        ListElement { letter: ")"; firstSymbol: "="}
-    }
-    ListModel {
-        id:second
-        ListElement { letter: "a"; firstSymbol: "{"}
-        ListElement { letter: "s"; firstSymbol: "}"}
-        ListElement { letter: "d"; firstSymbol: "["}
-        ListElement { letter: "f"; firstSymbol: "]"}
-        ListElement { letter: "g"; firstSymbol: "("}
-        ListElement { letter: "h"; firstSymbol: ")"}
-        ListElement { letter: "j"; firstSymbol: ":"}
-        ListElement { letter: "k"; firstSymbol: "\""}
-        ListElement { letter: "l"; firstSymbol: "'"}
-        ListElement { letter: "'"; firstSymbol: "|"}
-        ListElement { letter: "/"; firstSymbol: "\\"}
-    }
-    ListModel {
-        id:third
-        ListElement { letter: "z"; firstSymbol: "<"}
-        ListElement { letter: "x"; firstSymbol: ">"}
-        ListElement { letter: "c"; firstSymbol: "€"}
-        ListElement { letter: "v"; firstSymbol: "µ"}
-        ListElement { letter: "b"; firstSymbol: "?"}
-        ListElement { letter: "n"; firstSymbol: ".com"}
-        ListElement { letter: "m"; firstSymbol: ";"}
-        ListElement { letter: ","; firstSymbol: ","}
-        ListElement { letter: "."; firstSymbol: "."}
-    }
-}
-
-
-
-/********************************************************
-                German Keyboard Layout
- ********************************************************/
-/*
-
-Item {
-    property QtObject firstRowModel: first
-    property QtObject secondRowModel: second
-    property QtObject thirdRowModel: third
-    property QtObject numbersRowModel: numbers
-
-    ListModel {
-        id:numbers
-        ListElement { letter: "1"; firstSymbol: "1"}
-        ListElement { letter: "2"; firstSymbol: "2"}
-        ListElement { letter: "3"; firstSymbol: "3"}
-        ListElement { letter: "4"; firstSymbol: "4"}
-        ListElement { letter: "5"; firstSymbol: "5"}
-        ListElement { letter: "6"; firstSymbol: "6"}
-        ListElement { letter: "7"; firstSymbol: "7"}
-        ListElement { letter: "8"; firstSymbol: "8"}
-        ListElement { letter: "9"; firstSymbol: "9"}
-        ListElement { letter: "0"; firstSymbol: "0"}
-        ListElement { letter: "ß"; firstSymbol: "@"}
-        // ListElement { letter: "="; firstSymbol: "+"}
-    }
-
-    ListModel {
-        id:first
-        ListElement { letter: "q"; firstSymbol: "!"}
-        ListElement { letter: "w"; firstSymbol: "°"}
-        ListElement { letter: "e"; firstSymbol: "#"}
-        ListElement { letter: "r"; firstSymbol: "$"}
-        ListElement { letter: "t"; firstSymbol: "%"}
-        ListElement { letter: "z"; firstSymbol: "^"}
-        ListElement { letter: "u"; firstSymbol: "&"}
-        ListElement { letter: "i"; firstSymbol: "+"}
-        ListElement { letter: "o"; firstSymbol: "-"}
-        ListElement { letter: "p"; firstSymbol: "*"}
-        ListElement { letter: "ü"; firstSymbol: "/"}
-        ListElement { letter: ""; firstSymbol: "="}
-    }
-    ListModel {
-        id:second
-        ListElement { letter: "a"; firstSymbol: "{"}
-        ListElement { letter: "s"; firstSymbol: "}"}
-        ListElement { letter: "d"; firstSymbol: "["}
-        ListElement { letter: "f"; firstSymbol: "]"}
-        ListElement { letter: "g"; firstSymbol: "("}
-        ListElement { letter: "h"; firstSymbol: ")"}
-        ListElement { letter: "j"; firstSymbol: ":"}
-        ListElement { letter: "k"; firstSymbol: "\""}
-        ListElement { letter: "l"; firstSymbol: "'"}
-        ListElement { letter: "ö"; firstSymbol: "|"}
-        ListElement { letter: "ä"; firstSymbol: "\\"}
-    }
-    ListModel {
-        id:third
-        ListElement { letter: "y"; firstSymbol: "<"}
-        ListElement { letter: "x"; firstSymbol: ">"}
-        ListElement { letter: "c"; firstSymbol: "€"}
-        ListElement { letter: "v"; firstSymbol: "µ"}
-        ListElement { letter: "b"; firstSymbol: "?"}
-        ListElement { letter: "n"; firstSymbol: ".de"}
-        ListElement { letter: "m"; firstSymbol: ";"}
-        ListElement { letter: ","; firstSymbol: ","}
-        ListElement { letter: "."; firstSymbol: "."}
-    }
-}
-
-*/

+ 0 - 81
board/GfA/Display001/rootfs/usr/qml/QtQuick/FreeVirtualKeyboard/KeyPopup.qml

@@ -1,81 +0,0 @@
-import QtQuick 2.0
-import QtGraphicalEffects 1.0
-
-/**
- * This is the key popup that shows a character preview above the
- * pressed key button like it is known from keyboards on phones.
- */
-
-Item {
-    id: root
-    property alias text: txt.text
-    property alias font: txt.font
-
-    width: 40
-    height: 40
-    visible: false
-
-    Rectangle {
-        id: popup
-        anchors.fill: parent
-        radius: Math.round(height / 30)
-        z: shadow.z + 1
-
-        gradient: Gradient {
-                 GradientStop { position: 0.0; color: Qt.lighter(Qt.lighter("#35322f"))}
-                 GradientStop { position: 1.0; color: Qt.lighter("#35322f")}
-
-        }
-
-        Text {
-            id: txt
-            color: "white"
-            anchors.fill: parent
-            fontSizeMode: Text.Fit
-            font.pixelSize: height
-            horizontalAlignment: Text.AlignHCenter
-            verticalAlignment: Text.AlignVCenter
-        }
-    }
-
-    Rectangle {
-        id: shadow
-        width: root.width
-        height: root.height
-        color: "#3F000000"
-        x: 4
-        y: 4
-    }
-
-    function popup(keybutton, inputPanel) {
-        console.debug("popup: " + inputPanel.objectName);
-        console.debug("keybutton.text: " + keybutton.text);
-        width = keybutton.width * 1.4;
-        height = keybutton.height * 1.4;
-        var KeyButtonGlobalLeft = keybutton.mapToItem(inputPanel, 0, 0).x;
-        var KeyButtonGlobalTop = keybutton.mapToItem(inputPanel, 0, 0).y;
-        var PopupGlobalLeft = KeyButtonGlobalLeft - (width - keybutton.width) / 2;
-        var PopupGlobalTop = KeyButtonGlobalTop - height - pimpl.verticalSpacing * 1.5;
-        console.debug("Popup position left: " + KeyButtonGlobalLeft);
-        var PopupLeft = root.parent.mapFromItem(inputPanel, PopupGlobalLeft, PopupGlobalTop).x;
-        y = root.parent.mapFromItem(inputPanel, PopupGlobalLeft, PopupGlobalTop).y;
-        if (PopupGlobalLeft < 0)
-        {
-            x = 0;
-        }
-        else if ((PopupGlobalLeft + width) > inputPanel.width)
-        {
-            x = PopupLeft - (PopupGlobalLeft + width - inputPanel.width);
-        }
-        else
-        {
-            x = PopupLeft;
-        }
-
-        text = keybutton.displayText;
-        font.family = keybutton.font.family
-        visible = Qt.binding(function() {return keybutton.isHighlighted});
-    }
-}
-
-

+ 0 - 2
board/GfA/Display001/rootfs/usr/qml/QtQuick/FreeVirtualKeyboard/qmldir

@@ -1,2 +0,0 @@
-module QtQuick.FreeVirtualKeyboard
-InputPanel 1.0 InputPanel.qml

+ 453 - 0
configs/Display001_4.4.104_rt21_Qt5.7_defconfig

@@ -0,0 +1,453 @@
+BR2_arm=y
+BR2_cortex_a8=y
+BR2_ARM_INSTRUCTIONS_THUMB2=y
+BR2_DL_DIR="~/buildroot_dl"
+BR2_HOST_DIR="/opt/GfA/TC_L44104_C493_QT57"
+# BR2_COMPILER_PARANOID_UNSAFE_PATH is not set
+BR2_TOOLCHAIN_BUILDROOT_GLIBC=y
+BR2_KERNEL_HEADERS_4_4=y
+BR2_GLIBC_VERSION_2_24=y
+BR2_BINUTILS_VERSION_2_27_X=y
+BR2_GCC_VERSION_4_9_3=y
+BR2_TOOLCHAIN_BUILDROOT_CXX=y
+BR2_PACKAGE_HOST_GDB=y
+BR2_PACKAGE_HOST_GDB_TUI=y
+BR2_PACKAGE_HOST_GDB_PYTHON=y
+BR2_TOOLCHAIN_GLIBC_GCONV_LIBS_COPY=y
+BR2_TARGET_OPTIMIZATION="-pipe"
+BR2_TARGET_GENERIC_HOSTNAME="GfA"
+BR2_TARGET_GENERIC_ISSUE="Welcome to GfA Display001"
+BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_EUDEV=y
+BR2_ROOTFS_DEVICE_TABLE="system/device_table.txt ../GfA/board/GfA/Display001/device_table.txt"
+BR2_TARGET_GENERIC_ROOT_PASSWD="root"
+BR2_TARGET_GENERIC_GETTY_PORT="ttyO0"
+BR2_TARGET_GENERIC_GETTY_BAUDRATE_115200=y
+# BR2_ENABLE_LOCALE_PURGE is not set
+BR2_GENERATE_LOCALE="en_US en_GB de_DE de_AT de_CH fr_FR it_IT es_ES sv_FI sv_SE nb_NO nn_NO se_NO da_DK zh_CN"
+BR2_TARGET_LOCALTIME="Europe/Vienna"
+BR2_ROOTFS_POST_BUILD_SCRIPT="../GfA/board/GfA/Display001/post-build_4.4.sh"
+BR2_LINUX_KERNEL=y
+BR2_LINUX_KERNEL_CUSTOM_TARBALL=y
+BR2_LINUX_KERNEL_CUSTOM_TARBALL_LOCATION="file://$(TOPDIR)/../GfA/GfAkernel57.tar.gz  "
+BR2_LINUX_KERNEL_PATCH="../GfA/board/GfA/Display001/linux_4.4.104_rt21"
+BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y
+BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="../GfA/board/GfA/Display001/Display001_4.4.104_rt_defconfig"
+BR2_LINUX_KERNEL_UIMAGE=y
+BR2_LINUX_KERNEL_UIMAGE_LOADADDR="0x80008000"
+BR2_LINUX_KERNEL_DTS_SUPPORT=y
+BR2_LINUX_KERNEL_USE_CUSTOM_DTS=y
+BR2_LINUX_KERNEL_CUSTOM_DTS_PATH="../GfA/board/GfA/Display001/DTS_4.4/Display001.dts ../GfA/board/GfA/Display001/DTS_4.4/Display001_4.dts ../GfA/board/GfA/Display001/DTS_4.4/Display001_7.dts ../GfA/board/GfA/Display001/DTS_4.4/Display001_10.dts ../GfA/board/GfA/Display001/DTS_4.4/Display001_15.dts ../GfA/board/GfA/Display001/DTS_4.4/Display001_rru.dts ../GfA/board/GfA/Display001/DTS_4.4/Display001_4_nopruss.dts ../GfA/board/GfA/Display001/DTS_4.4/Display001_7_gain1.dts ../GfA/board/GfA/Display001/DTS_4.4/Display001_5.dts ../GfA/board/GfA/Display001/DTS_4.4/Display002_7.dts ../GfA/board/GfA/Display001/DTS_4.4/Display002_10.dts ../GfA/board/GfA/Display001/DTS_4.4/Display002_4.dts"
+BR2_PACKAGE_BUSYBOX_CONFIG="../GfA/board/GfA/Display001/busybox.config"
+BR2_PACKAGE_BUSYBOX_SHOW_OTHERS=y
+BR2_PACKAGE_FFMPEG_GPL=y
+BR2_PACKAGE_FFMPEG_NONFREE=y
+BR2_PACKAGE_FFMPEG_FFPLAY=y
+BR2_PACKAGE_FFMPEG_FFSERVER=y
+BR2_PACKAGE_FFMPEG_FFPROBE=y
+BR2_PACKAGE_FFMPEG_AVRESAMPLE=y
+BR2_PACKAGE_FFMPEG_POSTPROC=y
+BR2_PACKAGE_GST1_PLUGINS_GOOD=y
+BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_RTP=y
+BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_RTPMANAGER=y
+BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_RTSP=y
+BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_SMPTE=y
+BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_UDP=y
+BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_VIDEOBOX=y
+BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_VIDEOCROP=y
+BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_Y4M=y
+BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_V4L2=y
+BR2_PACKAGE_GST1_PLUGINS_GOOD_PLUGIN_V4L2_PROBE=y
+BR2_PACKAGE_GST1_PLUGINS_BAD=y
+BR2_PACKAGE_GST1_PLUGINS_BAD_LIB_OPENGL=y
+BR2_PACKAGE_GST1_PLUGINS_BAD_PLUGIN_OPENH264=y
+BR2_PACKAGE_MPD=y
+BR2_PACKAGE_MPLAYER=y
+BR2_PACKAGE_MPV=y
+BR2_PACKAGE_VLC=y
+BR2_PACKAGE_WAVPACK=y
+BR2_PACKAGE_GZIP=y
+BR2_PACKAGE_LZ4=y
+BR2_PACKAGE_LZIP=y
+BR2_PACKAGE_LZOP=y
+BR2_PACKAGE_P7ZIP=y
+BR2_PACKAGE_UNRAR=y
+BR2_PACKAGE_UNZIP=y
+BR2_PACKAGE_ZIP=y
+BR2_PACKAGE_GDB=y
+BR2_PACKAGE_GDB_DEBUGGER=y
+BR2_PACKAGE_STRACE=y
+BR2_PACKAGE_BINUTILS=y
+BR2_PACKAGE_BINUTILS_TARGET=y
+BR2_PACKAGE_CMAKE_CTEST=y
+BR2_PACKAGE_GETTEXT=y
+BR2_PACKAGE_MAKE=y
+BR2_PACKAGE_SED=y
+BR2_PACKAGE_CIFS_UTILS=y
+BR2_PACKAGE_DOSFSTOOLS=y
+BR2_PACKAGE_DOSFSTOOLS_FATLABEL=y
+BR2_PACKAGE_DOSFSTOOLS_FSCK_FAT=y
+BR2_PACKAGE_DOSFSTOOLS_MKFS_FAT=y
+BR2_PACKAGE_E2FSPROGS=y
+BR2_PACKAGE_E2FSPROGS_DEBUGFS=y
+BR2_PACKAGE_E2FSPROGS_RESIZE2FS=y
+BR2_PACKAGE_F2FS_TOOLS=y
+BR2_PACKAGE_FLASHBENCH=y
+BR2_PACKAGE_MAKEDEVS=y
+BR2_PACKAGE_MMC_UTILS=y
+BR2_PACKAGE_DEJAVU=y
+BR2_PACKAGE_DIRECTFB=y
+BR2_PACKAGE_DIRECTFB_DIVINE=y
+BR2_PACKAGE_DIRECTFB_SAWMAN=y
+BR2_PACKAGE_DIRECTFB_DITHER_RGB16=y
+BR2_PACKAGE_EFL=y
+BR2_PACKAGE_EFL_FB=y
+BR2_PACKAGE_EFL_WEBP=y
+BR2_PACKAGE_FB_TEST_APP=y
+BR2_PACKAGE_FBTERM=y
+BR2_PACKAGE_FBV=y
+BR2_PACKAGE_LINUX_FUSION=y
+BR2_PACKAGE_PSPLASH=y
+BR2_PACKAGE_SDL_DIRECTFB=y
+BR2_PACKAGE_SDL_GFX=y
+BR2_PACKAGE_SDL_IMAGE=y
+BR2_PACKAGE_SDL_IMAGE_GIF=y
+BR2_PACKAGE_SDL_IMAGE_JPEG=y
+BR2_PACKAGE_SDL_IMAGE_LBM=y
+BR2_PACKAGE_SDL_IMAGE_PCX=y
+BR2_PACKAGE_SDL_IMAGE_PNG=y
+BR2_PACKAGE_SDL_IMAGE_PNM=y
+BR2_PACKAGE_SDL_IMAGE_TARGA=y
+BR2_PACKAGE_SDL_IMAGE_TIFF=y
+BR2_PACKAGE_SDL_IMAGE_WEBP=y
+BR2_PACKAGE_SDL_IMAGE_XCF=y
+BR2_PACKAGE_SDL_IMAGE_XPM=y
+BR2_PACKAGE_SDL_IMAGE_XV=y
+BR2_PACKAGE_SDL_MIXER=y
+BR2_PACKAGE_SDL_NET=y
+BR2_PACKAGE_SDL_SOUND=y
+BR2_PACKAGE_SDL_SOUND_PLAYSOUND=y
+BR2_PACKAGE_SDL_TTF=y
+BR2_PACKAGE_SDL2=y
+BR2_PACKAGE_SDL2_DIRECTFB=y
+BR2_PACKAGE_SDL2_GFX=y
+BR2_PACKAGE_SDL2_IMAGE=y
+BR2_PACKAGE_SDL2_TTF=y
+BR2_PACKAGE_QT5=y
+BR2_PACKAGE_QT5BASE_LICENSE_APPROVED=y
+BR2_PACKAGE_QT5BASE_MYSQL=y
+BR2_PACKAGE_QT5BASE_PSQL=y
+BR2_PACKAGE_QT5BASE_SQLITE_SYSTEM=y
+BR2_PACKAGE_QT5BASE_OPENGL_LIB=y
+BR2_PACKAGE_QT5BASE_EGLFS=y
+BR2_PACKAGE_QT5BASE_FONTCONFIG=y
+BR2_PACKAGE_QT5BASE_GIF=y
+BR2_PACKAGE_QT5BASE_JPEG=y
+BR2_PACKAGE_QT5BASE_PNG=y
+BR2_PACKAGE_QT53D=y
+BR2_PACKAGE_QT5CANVAS3D=y
+BR2_PACKAGE_QT5CONNECTIVITY=y
+BR2_PACKAGE_QT5ENGINIO=y
+BR2_PACKAGE_QT5GRAPHICALEFFECTS=y
+BR2_PACKAGE_QT5IMAGEFORMATS=y
+BR2_PACKAGE_QT5LOCATION=y
+BR2_PACKAGE_QT5MULTIMEDIA=y
+BR2_PACKAGE_QT5QUICKCONTROLS=y
+BR2_PACKAGE_QT5SENSORS=y
+BR2_PACKAGE_QT5SERIALBUS=y
+BR2_PACKAGE_QT5WAYLAND=y
+BR2_PACKAGE_QT5SVG=y
+BR2_PACKAGE_QT5TOOLS=y
+BR2_PACKAGE_QT5TOOLS_QTPATHS=y
+BR2_PACKAGE_QT5TOOLS_QTPLUGININFO=y
+BR2_PACKAGE_QT5WEBENGINE=y
+BR2_PACKAGE_QT5VIRTUALKEYBOARD=y
+BR2_PACKAGE_QT5CHARTS=y
+BR2_PACKAGE_QT5DATAVIS3D=y
+BR2_PACKAGE_QT5QUICKCONTROLS2=y
+BR2_PACKAGE_TEKUI=y
+BR2_PACKAGE_WESTON=y
+BR2_PACKAGE_AM33X_CM3=y
+BR2_PACKAGE_LINUX_FIRMWARE=y
+BR2_PACKAGE_LINUX_FIRMWARE_IBT=y
+BR2_PACKAGE_LINUX_FIRMWARE_ATHEROS_6002=y
+BR2_PACKAGE_LINUX_FIRMWARE_ATHEROS_6003=y
+BR2_PACKAGE_LINUX_FIRMWARE_ATHEROS_6004=y
+BR2_PACKAGE_LINUX_FIRMWARE_ATHEROS_7010=y
+BR2_PACKAGE_LINUX_FIRMWARE_ATHEROS_9170=y
+BR2_PACKAGE_LINUX_FIRMWARE_ATHEROS_9271=y
+BR2_PACKAGE_LINUX_FIRMWARE_BRCM_BCM43XX=y
+BR2_PACKAGE_LINUX_FIRMWARE_BRCM_BCM43XXX=y
+BR2_PACKAGE_LINUX_FIRMWARE_IWLWIFI_3160=y
+BR2_PACKAGE_LINUX_FIRMWARE_IWLWIFI_3168=y
+BR2_PACKAGE_LINUX_FIRMWARE_IWLWIFI_5000=y
+BR2_PACKAGE_LINUX_FIRMWARE_IWLWIFI_6000G2A=y
+BR2_PACKAGE_LINUX_FIRMWARE_IWLWIFI_6000G2B=y
+BR2_PACKAGE_LINUX_FIRMWARE_IWLWIFI_7260=y
+BR2_PACKAGE_LINUX_FIRMWARE_IWLWIFI_7265D=y
+BR2_PACKAGE_LINUX_FIRMWARE_IWLWIFI_8000C=y
+BR2_PACKAGE_LINUX_FIRMWARE_IWLWIFI_8265=y
+BR2_PACKAGE_LINUX_FIRMWARE_LIBERTAS_SD8686_V8=y
+BR2_PACKAGE_LINUX_FIRMWARE_LIBERTAS_SD8686_V9=y
+BR2_PACKAGE_LINUX_FIRMWARE_LIBERTAS_SD8688=y
+BR2_PACKAGE_LINUX_FIRMWARE_MWIFIEX_SD8787=y
+BR2_PACKAGE_LINUX_FIRMWARE_MWIFIEX_SD8797=y
+BR2_PACKAGE_LINUX_FIRMWARE_MWIFIEX_USB8797=y
+BR2_PACKAGE_LINUX_FIRMWARE_MWIFIEX_USB8801=y
+BR2_PACKAGE_LINUX_FIRMWARE_MWIFIEX_SD8887=y
+BR2_PACKAGE_LINUX_FIRMWARE_MWIFIEX_SD8897=y
+BR2_PACKAGE_LINUX_FIRMWARE_MWIFIEX_USB8897=y
+BR2_PACKAGE_LINUX_FIRMWARE_MWIFIEX_PCIE8897=y
+BR2_PACKAGE_LINUX_FIRMWARE_MEDIATEK_MT7601U=y
+BR2_PACKAGE_LINUX_FIRMWARE_RALINK_RT61=y
+BR2_PACKAGE_LINUX_FIRMWARE_RALINK_RT73=y
+BR2_PACKAGE_LINUX_FIRMWARE_RALINK_RT2XX=y
+BR2_PACKAGE_LINUX_FIRMWARE_RTL_81XX=y
+BR2_PACKAGE_LINUX_FIRMWARE_RTL_87XX=y
+BR2_PACKAGE_LINUX_FIRMWARE_RTL_88XX=y
+BR2_PACKAGE_LINUX_FIRMWARE_TI_WL127X=y
+BR2_PACKAGE_LINUX_FIRMWARE_TI_WL128X=y
+BR2_PACKAGE_LINUX_FIRMWARE_TI_WL18XX=y
+BR2_PACKAGE_LINUX_FIRMWARE_BNX2X=y
+BR2_PACKAGE_LINUX_FIRMWARE_CXGB4_T4=y
+BR2_PACKAGE_LINUX_FIRMWARE_CXGB4_T5=y
+BR2_PACKAGE_LINUX_FIRMWARE_RTL_8169=y
+BR2_PACKAGE_AM335X_PRU_PACKAGE=y
+BR2_PACKAGE_DEVMEM2=y
+BR2_PACKAGE_EVTEST=y
+BR2_PACKAGE_I2C_TOOLS=y
+BR2_PACKAGE_INPUT_TOOLS=y
+BR2_PACKAGE_KBD=y
+BR2_PACKAGE_LIBUIO=y
+BR2_PACKAGE_LSUIO=y
+BR2_PACKAGE_PARTED=y
+BR2_PACKAGE_RS485CONF=y
+BR2_PACKAGE_SISPMCTL=y
+BR2_PACKAGE_SPI_TOOLS=y
+BR2_PACKAGE_TI_GFX=y
+BR2_PACKAGE_TI_GFX_EGLIMAGE=y
+BR2_PACKAGE_TI_GFX_ES8=y
+BR2_PACKAGE_TI_UTILS=y
+BR2_PACKAGE_USB_MODESWITCH_DATA=y
+BR2_PACKAGE_USBMOUNT=y
+BR2_PACKAGE_USBUTILS=y
+BR2_PACKAGE_NODEJS=y
+BR2_PACKAGE_NODEJS_NPM=y
+BR2_PACKAGE_NODEJS_MODULES_EXPRESS=y
+BR2_PACKAGE_NODEJS_MODULES_COFFEESCRIPT=y
+BR2_PACKAGE_NODEJS_MODULES_ADDITIONAL="node-red"
+BR2_PACKAGE_PYTHON=y
+BR2_PACKAGE_PYTHON_BZIP2=y
+BR2_PACKAGE_PYTHON_BSDDB=y
+BR2_PACKAGE_PYTHON_CODECSCJK=y
+BR2_PACKAGE_PYTHON_CURSES=y
+BR2_PACKAGE_PYTHON_READLINE=y
+BR2_PACKAGE_PYTHON_SSL=y
+BR2_PACKAGE_PYTHON_SQLITE=y
+BR2_PACKAGE_PYTHON_PYEXPAT=y
+BR2_PACKAGE_PYTHON_HASHLIB=y
+BR2_PACKAGE_PYTHON_PYUDEV=y
+BR2_PACKAGE_TCL=y
+BR2_PACKAGE_EXPECT=y
+BR2_PACKAGE_TCLLIB=y
+BR2_PACKAGE_LIBMPD=y
+BR2_PACKAGE_OPUS=y
+BR2_PACKAGE_TAGLIB=y
+BR2_PACKAGE_LIBZIP=y
+BR2_PACKAGE_SNAPPY=y
+BR2_PACKAGE_SZIP=y
+BR2_PACKAGE_GNUTLS_TOOLS=y
+BR2_PACKAGE_LIBNSS=y
+BR2_PACKAGE_LIBSHA1=y
+BR2_PACKAGE_LIBSSH2=y
+BR2_PACKAGE_OPENSSL_BIN=y
+BR2_PACKAGE_OPENSSL_ENGINES=y
+BR2_PACKAGE_MYSQL_SERVER=y
+BR2_PACKAGE_SQLITE_NO_SYNC=y
+BR2_PACKAGE_LIBCONFIG=y
+BR2_PACKAGE_CAIRO_TEE=y
+BR2_PACKAGE_GD=y
+BR2_PACKAGE_GD_ANNOTATE=y
+BR2_PACKAGE_GD_GD2COPYPAL=y
+BR2_PACKAGE_GD_GD2TOGIF=y
+BR2_PACKAGE_GD_GD2TOPNG=y
+BR2_PACKAGE_GD_GDCMPGIF=y
+BR2_PACKAGE_GD_GDPARTTOPNG=y
+BR2_PACKAGE_GD_GDTOPNG=y
+BR2_PACKAGE_GD_GIFTOGD2=y
+BR2_PACKAGE_GD_PNGTOGD=y
+BR2_PACKAGE_GD_PNGTOGD2=y
+BR2_PACKAGE_GD_WEBPNG=y
+BR2_PACKAGE_GDK_PIXBUF=y
+BR2_PACKAGE_HARFBUZZ=y
+BR2_PACKAGE_LIBDRM=y
+BR2_PACKAGE_LIBDRM_OMAP=y
+BR2_PACKAGE_LIBDRM_INSTALL_TESTS=y
+BR2_PACKAGE_WEBP_DEMUX=y
+BR2_PACKAGE_DTC=y
+BR2_PACKAGE_DTC_PROGRAMS=y
+BR2_PACKAGE_LIBGUDEV=y
+BR2_PACKAGE_LIBHID=y
+BR2_PACKAGE_LIBIIO=y
+BR2_PACKAGE_LIBIIO_BINDINGS_PYTHON=y
+BR2_PACKAGE_LIBV4L=y
+BR2_PACKAGE_JANSSON=y
+BR2_PACKAGE_LIBXSLT=y
+BR2_PACKAGE_LIBMPEG2=y
+BR2_PACKAGE_LIBVPX=y
+BR2_PACKAGE_LIBYUV=y
+BR2_PACKAGE_CANFESTIVAL=y
+BR2_PACKAGE_CANFESTIVAL_INSTALL_EXAMPLES=y
+BR2_PACKAGE_CURL=y
+BR2_PACKAGE_LIBGSASL=y
+BR2_PACKAGE_LIBIDN=y
+BR2_PACKAGE_LIBIDN_BINARY=y
+BR2_PACKAGE_LIBMBUS=y
+BR2_PACKAGE_LIBMICROHTTPD=y
+BR2_PACKAGE_LIBMICROHTTPD_SSL=y
+BR2_PACKAGE_LIBMODBUS=y
+BR2_PACKAGE_LIBPJSIP=y
+BR2_PACKAGE_LIBRSYNC=y
+BR2_PACKAGE_LIBSOUP=y
+BR2_PACKAGE_LIBVNCSERVER=y
+BR2_PACKAGE_LIBVNCSERVER_TIGHTPNG=y
+BR2_PACKAGE_NEON=y
+BR2_PACKAGE_NEON_ZLIB=y
+BR2_PACKAGE_NEON_SSL=y
+BR2_PACKAGE_NEON_LIBXML2=y
+BR2_PACKAGE_NSS_PAM_LDAPD=y
+BR2_PACKAGE_NSS_PAM_LDAPD_UTILITIES=y
+BR2_PACKAGE_BOOST_ATOMIC=y
+BR2_PACKAGE_BOOST_CHRONO=y
+BR2_PACKAGE_BOOST_CONTAINER=y
+BR2_PACKAGE_BOOST_CONTEXT=y
+BR2_PACKAGE_BOOST_COROUTINE=y
+BR2_PACKAGE_BOOST_COROUTINE2=y
+BR2_PACKAGE_BOOST_DATE_TIME=y
+BR2_PACKAGE_BOOST_EXCEPTION=y
+BR2_PACKAGE_BOOST_FILESYSTEM=y
+BR2_PACKAGE_BOOST_GRAPH=y
+BR2_PACKAGE_BOOST_GRAPH_PARALLEL=y
+BR2_PACKAGE_BOOST_IOSTREAMS=y
+BR2_PACKAGE_BOOST_LOCALE=y
+BR2_PACKAGE_BOOST_LOG=y
+BR2_PACKAGE_BOOST_MATH=y
+BR2_PACKAGE_BOOST_METAPARSE=y
+BR2_PACKAGE_BOOST_MPI=y
+BR2_PACKAGE_BOOST_PROGRAM_OPTIONS=y
+BR2_PACKAGE_BOOST_PYTHON=y
+BR2_PACKAGE_BOOST_RANDOM=y
+BR2_PACKAGE_BOOST_REGEX=y
+BR2_PACKAGE_BOOST_SERIALIZATION=y
+BR2_PACKAGE_BOOST_SIGNALS=y
+BR2_PACKAGE_BOOST_SYSTEM=y
+BR2_PACKAGE_BOOST_THREAD=y
+BR2_PACKAGE_BOOST_TIMER=y
+BR2_PACKAGE_BOOST_TYPE_ERASURE=y
+BR2_PACKAGE_BOOST_WAVE=y
+BR2_PACKAGE_ELFUTILS=y
+BR2_PACKAGE_LIBCAP_TOOLS=y
+BR2_PACKAGE_LIBEVENT=y
+BR2_PACKAGE_LIBICAL=y
+BR2_PACKAGE_POCO=y
+BR2_PACKAGE_POCO_NETSSL_OPENSSL=y
+BR2_PACKAGE_POCO_ZIP=y
+BR2_PACKAGE_POCO_DATA_SQLITE=y
+BR2_PACKAGE_POCO_DATA_MYSQL=y
+BR2_PACKAGE_PROTOBUF=y
+BR2_PACKAGE_PROTOBUF_C=y
+BR2_PACKAGE_NCURSES_WCHAR=y
+BR2_PACKAGE_NCURSES_TARGET_PANEL=y
+BR2_PACKAGE_NCURSES_TARGET_FORM=y
+BR2_PACKAGE_NCURSES_TARGET_MENU=y
+BR2_PACKAGE_NCURSES_TARGET_PROGS=y
+BR2_PACKAGE_FETCHMAIL=y
+BR2_PACKAGE_HEIRLOOM_MAILX=y
+BR2_PACKAGE_LIBESMTP=y
+BR2_PACKAGE_MSMTP=y
+BR2_PACKAGE_MUTT=y
+BR2_PACKAGE_MUTT_IMAP=y
+BR2_PACKAGE_MUTT_POP3=y
+BR2_PACKAGE_CAN_UTILS=y
+BR2_PACKAGE_CIVETWEB=y
+BR2_PACKAGE_CIVETWEB_WITH_LUA=y
+BR2_PACKAGE_CONNTRACK_TOOLS=y
+BR2_PACKAGE_CRDA=y
+BR2_PACKAGE_DHCP=y
+BR2_PACKAGE_DHCP_SERVER=y
+BR2_PACKAGE_DHCP_SERVER_DELAYED_ACK=y
+BR2_PACKAGE_DHCP_CLIENT=y
+BR2_PACKAGE_ETHTOOL=y
+BR2_PACKAGE_GESFTPSERVER=y
+BR2_PACKAGE_HOSTAPD=y
+BR2_PACKAGE_HOSTAPD_EAP=y
+BR2_PACKAGE_HOSTAPD_WPS=y
+BR2_PACKAGE_HTTPING=y
+BR2_PACKAGE_HTTPING_TFO=y
+BR2_PACKAGE_IFTOP=y
+BR2_PACKAGE_IFUPDOWN=y
+BR2_PACKAGE_IPROUTE2=y
+BR2_PACKAGE_IPSEC_TOOLS=y
+BR2_PACKAGE_IPSEC_TOOLS_READLINE=y
+BR2_PACKAGE_IPTABLES=y
+BR2_PACKAGE_IW=y
+BR2_PACKAGE_MINIDLNA=y
+BR2_PACKAGE_NETPLUG=y
+BR2_PACKAGE_OPENSSH=y
+BR2_PACKAGE_OPENVPN=y
+BR2_PACKAGE_OPENVPN_SMALL=y
+BR2_PACKAGE_PPPD=y
+BR2_PACKAGE_PPPD_FILTER=y
+BR2_PACKAGE_PPPD_RADIUS=y
+BR2_PACKAGE_PPTP_LINUX=y
+BR2_PACKAGE_RSYNC=y
+BR2_PACKAGE_TINC=y
+BR2_PACKAGE_WGET=y
+BR2_PACKAGE_WIRELESS_TOOLS=y
+BR2_PACKAGE_WIRELESS_TOOLS_LIB=y
+BR2_PACKAGE_WPA_SUPPLICANT=y
+BR2_PACKAGE_WPA_SUPPLICANT_AP_SUPPORT=y
+BR2_PACKAGE_WPA_SUPPLICANT_WIFI_DISPLAY=y
+BR2_PACKAGE_WPA_SUPPLICANT_AUTOSCAN=y
+BR2_PACKAGE_WPA_SUPPLICANT_EAP=y
+BR2_PACKAGE_WPA_SUPPLICANT_HOTSPOT=y
+BR2_PACKAGE_WPA_SUPPLICANT_DEBUG_SYSLOG=y
+BR2_PACKAGE_WPA_SUPPLICANT_WPS=y
+BR2_PACKAGE_WPA_SUPPLICANT_CLI=y
+BR2_PACKAGE_WPA_SUPPLICANT_WPA_CLIENT_SO=y
+BR2_PACKAGE_WPA_SUPPLICANT_PASSPHRASE=y
+BR2_PACKAGE_WPA_SUPPLICANT_DBUS_OLD=y
+BR2_PACKAGE_WPA_SUPPLICANT_DBUS_NEW=y
+BR2_PACKAGE_WPA_SUPPLICANT_DBUS_INTROSPECTION=y
+BR2_PACKAGE_BASH=y
+BR2_PACKAGE_SCREEN=y
+BR2_PACKAGE_SUDO=y
+BR2_PACKAGE_ATTR=y
+BR2_PACKAGE_HTOP=y
+BR2_PACKAGE_KEYUTILS=y
+BR2_PACKAGE_POLKIT=y
+BR2_PACKAGE_UTIL_LINUX_SETTERM=y
+BR2_PACKAGE_JOE=y
+BR2_TARGET_ROOTFS_EXT2=y
+BR2_TARGET_ROOTFS_EXT2_4=y
+BR2_TARGET_ROOTFS_TAR_GZIP=y
+BR2_TARGET_UBOOT=y
+BR2_TARGET_UBOOT_BOARDNAME="am335x_boneblack"
+BR2_TARGET_UBOOT_CUSTOM_VERSION=y
+BR2_TARGET_UBOOT_CUSTOM_VERSION_VALUE="2013.10"
+BR2_TARGET_UBOOT_PATCH="../GfA/board/GfA/Display001/uboot_2013.10"
+# BR2_TARGET_UBOOT_FORMAT_BIN is not set
+BR2_TARGET_UBOOT_FORMAT_IMG=y
+BR2_TARGET_UBOOT_FORMAT_CUSTOM=y
+BR2_TARGET_UBOOT_FORMAT_CUSTOM_NAME="spl/u-boot-spl.bin"
+BR2_TARGET_UBOOT_SPL=y
+BR2_TARGET_UBOOT_SPL_NAME="MLO"
+BR2_PACKAGE_HOST_DOSFSTOOLS=y
+BR2_PACKAGE_HOST_DTC=y
+BR2_PACKAGE_HOST_GENIMAGE=y
+BR2_PACKAGE_HOST_MTOOLS=y
+BR2_PACKAGE_WT=y
+BR2_PACKAGE_NETWORK_INTERFACES_SCRIPT=y
+BR2_PACKAGE_GFA_ADDONS=y
+BR2_PACKAGE_QMLPLUGINS=y
+BR2_PACKAGE_PYTHON_UFW=y
+BR2_PACKAGE_LIBULFIUS=y

+ 6 - 0
package/libgfaipc/Config.in

@@ -0,0 +1,6 @@
+config BR2_PACKAGE_LIBGFAIPC
+	bool "libgfaipc"
+	default y
+	help
+		libgfaipc component.config BR2_PACKAGE_LIBGFAIPC
+

+ 31 - 0
package/libgfaipc/libgfaipc.mk

@@ -0,0 +1,31 @@
+LIBGFAIPC_VERSION = 1.1.0
+LIBGFAIPC_SITE = ../GfA/package/libgfaipc/src
+LIBGFAIPC_SITE_METHOD = local
+LIBGFAIPC_INSTALL_STAGING = YES
+LIBGFAIPC_INSTALL_TARGET = YES
+
+define LIBGFAIPC_BUILD_CMDS
+	$(MAKE) CC="$(TARGET_CC)" CXX="$(TARGET_CXX)" LD="$(TARGET_LD)" -C $(@D) all
+	$(MAKE) CC="$(TARGET_CC)" CXX="$(TARGET_CXX)" LD="$(TARGET_LD)" -C $(@D) DEBUG=1 all
+endef
+
+define LIBGFAIPC_INSTALL_STAGING_CMDS
+	$(INSTALL) -D -m 0755 $(@D)/Release/libgfaipc.so.1.1.0 $(STAGING_DIR)/usr/lib/libgfaipc.so.1.1.0
+	$(INSTALL) -D -m 0755 $(@D)/Debug/libgfaipcd.so.1.1.0 $(STAGING_DIR)/usr/lib/libgfaipcd.so.1.1.0
+	$(INSTALL) -D -m 0755 $(@D)/gfaipc.h $(STAGING_DIR)/usr/include/gfaipc.h
+	ln -sfn libgfaipc.so.1.1.0 $(STAGING_DIR)/usr/lib/libgfaipc.so.1
+	ln -sfn libgfaipc.so.1 $(STAGING_DIR)/usr/lib/libgfaipc.so
+	ln -sfn libgfaipcd.so.1.1.0 $(STAGING_DIR)/usr/lib/libgfaipcd.so.1
+	ln -sfn libgfaipcd.so.1 $(STAGING_DIR)/usr/lib/libgfaipcd.so
+endef
+
+define LIBGFAIPC_INSTALL_TARGET_CMDS
+	$(INSTALL) -D -m 0755 $(@D)/Release/libgfaipc.so.1.1.0 $(TARGET_DIR)/usr/lib/libgfaipc.so.1.1.0
+	$(INSTALL) -D -m 0755 $(@D)/Debug/libgfaipcd.so.1.1.0 $(TARGET_DIR)/usr/lib/libgfaipcd.so.1.1.0
+	ln -sfn libgfaipc.so.1.1.0 $(TARGET_DIR)/usr/lib/libgfaipc.so.1
+	ln -sfn libgfaipc.so.1 $(TARGET_DIR)/usr/lib/libgfaipc.so
+	ln -sfn libgfaipcd.so.1.1.0 $(TARGET_DIR)/usr/lib/libgfaipcd.so.1
+	ln -sfn libgfaipcd.so.1 $(TARGET_DIR)/usr/lib/libgfaipcd.so
+endef
+
+$(eval $(generic-package))

+ 58 - 0
package/libgfaipc/src/Makefile

@@ -0,0 +1,58 @@
+# (c) R. Russinger GfA 2017,... LGPL v3
+#
+# Makefile for GfA Libraries
+# call with make DEBUG=1 for Debug output
+# output is held in Release or Debug subfolder (folders are created automaticalle)
+# make Variable for foldernames := BINDIR
+#
+#
+DEBUG ?= 0
+        
+_LIBBASENAME=gfaipc
+LIBFILENAME=lib$(LIBBASENAME).so.1.1.0
+
+CFLAGS = -c -pthread -fPIC -Wall -Wno-unused -Wno-unused-label -Wformat -Wuninitialized -Wundef -Wcast-qual -Wwrite-strings -fabi-version=2 -fno-omit-frame-pointer
+CXXFLAGS = -c -pthread -fPIC -Wall -Wno-unused -Wno-unused-label -Wformat -Wuninitialized -Wundef -Wcast-qual -Wwrite-strings -std=c++11 -fabi-version=2 -fno-omit-frame-pointer
+LDFLAGS = -fPIC -shared -L. -lc -pthread
+
+ifeq ($(DEBUG), 1)
+	CFLAGS += -g
+	CXXFLAGS += -g
+	LDFLAGS += -g
+	LIBBASENAME = $(_LIBBASENAME)d
+	BINDIR=Debug
+else
+	CFLAGS += -O3
+	CXXFLAGS += -O3
+	LDFLAGS += -O3
+	LIBBASENAME = $(_LIBBASENAME)
+	BINDIR=Release
+endif
+
+$(shell mkdir -p $(BINDIR) > /dev/null)
+
+TARGET_LIB = $(LIBFILENAME) # target lib
+
+CSRCS = uuid.c  # source files
+CXXSRCS = sema.cpp mutex.cpp locmtx.cpp shm.cpp shmrot.cpp ipcshm.cpp # source files
+
+COBJS = $(CSRCS:%.c=$(BINDIR)/%.o)
+CXXOBJS = $(CXXSRCS:%.cpp=$(BINDIR)/%.o)
+
+.PHONY: all
+all: $(BINDIR)/${TARGET_LIB}
+
+$(BINDIR)/$(TARGET_LIB): $(COBJS) $(CXXOBJS)
+	$(CC) ${LDFLAGS} -o $@ $^
+	
+$(CSRCS:%.c=$(BINDIR)/%.d):$(BINDIR)/%.d:%.c
+	$(CC) $(CFLAGS) -MP -MT $(basename $@).o -MMD -MF $@ -o $(basename $@).o $<
+
+$(CXXSRCS:%.cpp=$(BINDIR)/%.dpp):$(BINDIR)/%.dpp:%.cpp
+	$(CXX) $(CXXFLAGS) -MP -MT $(basename $@).o -MMD -MF $@ -o $(basename $@).o $<
+
+include $(CSRCS:%.c=$(BINDIR)/%.d) $(CXXSRCS:%.cpp=$(BINDIR)/%.dpp)
+
+.PHONY: clean
+clean:
+	@rm -rf $(BINDIR)

+ 33 - 0
package/libgfaipc/src/defines.h

@@ -0,0 +1,33 @@
+// defines.h :
+//
+
+#if !defined(AGD_DEFINES_H__CBCFEAE4_7504_435D_BD29_909BA80D72CD__INCLUDED_)
+#define AGD_DEFINES_H__CBCFEAE4_7504_435D_BD29_909BA80D72CD__INCLUDED_
+
+#ifdef __cplusplus
+extern "C" {
+#endif	//	__cplusplus
+
+/////////////////////////////////////////////////////////////////////////////
+// defines.h - Declarations:
+
+#ifdef _WIN32
+#endif	//	_WIN32
+
+#ifdef __linux__
+#endif	//	__linux__
+
+#define _INVALID_ID							-1
+#define _NUMBER_OF_THE_BEAST				0666
+
+#ifdef _DEBUG
+#define TRACE								printf
+#else	//	_DEBUG
+#define TRACE(...)
+#endif	//	_DEBUG
+
+/////////////////////////////////////////////////////////////////////////////
+#ifdef __cplusplus
+}
+#endif	//	__cplusplus
+#endif	//	!defined(AGD_DEFINES_H__CBCFEAE4_7504_435D_BD29_909BA80D72CD__INCLUDED_)

+ 36 - 0
package/libgfaipc/src/gfaipc.h

@@ -0,0 +1,36 @@
+// gfaipc.h :
+//
+
+#if !defined(AGD_GFAIPC_H__6126047E_C1B1_4ACE_BD49_8780C7E5E068__INCLUDED_)
+#define AGD_GFAIPC_H__6126047E_C1B1_4ACE_BD49_8780C7E5E068__INCLUDED_
+
+#include <stdlib.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif	//	__cplusplus
+
+/////////////////////////////////////////////////////////////////////////////
+// gfaipc.h - Declarations:
+
+typedef void				*HSHM;
+
+HSHM	GfaIpcAcquireSHM	(const char *pszUuid, size_t nSizeElement, size_t nCntElements, const char *pszDescName);
+void	GfaIpcReleaseSHM	(HSHM hShm);
+void*	GfaIpcAcquirePointer(HSHM hShm);
+void	GfaIpcReleasePointer(HSHM hShm, const void *p);
+void	GfaIpcLockSHM		(HSHM hShm);
+void	GfaIpcUnlockSHM		(HSHM hShm);
+void	GfaIpcDumpSHMROT	(void);
+
+long	GfaIpcInterlockedIncrement(HSHM hShm, volatile long *pl);
+long	GfaIpcInterlockedDecrement(HSHM hShm, volatile long *pl);
+long	GfaIpcInterlockedCompare(HSHM hShm, volatile long *pl, long comparand);
+long	GfaIpcInterlockedSet(HSHM hShm, volatile long *pl, long val);
+long	GfaIpcInterlockedClear(HSHM hShm, volatile long *pl);
+
+/////////////////////////////////////////////////////////////////////////////
+#ifdef __cplusplus
+}
+#endif	//	__cplusplus
+#endif	//	!defined(AGD_GFAIPC_H__6126047E_C1B1_4ACE_BD49_8780C7E5E068__INCLUDED_)

+ 333 - 0
package/libgfaipc/src/ipcshm.cpp

@@ -0,0 +1,333 @@
+// gfaipc.cpp
+//
+
+#ifdef _WIN32
+#define _CRT_SECURE_NO_WARNINGS
+#include <windows.h>
+#endif	//	_WIN32
+
+#include <stdio.h>
+#include <string.h>
+#include "defines.h"
+#include "uuid.h"
+#include "shmrot.h"
+
+/////////////////////////////////////////////////////////////////////////////
+
+CShmHandleMap::CShmHandleMap(void)
+{
+	memset(m_handles, 0, sizeof(m_handles));
+}
+
+CShmHandleMap::~CShmHandleMap(void)
+{
+	for(size_t i = 0; i < _IPCSHM_MAX_HANDLES; i++)
+	{
+	}
+}
+
+HSHM CShmHandleMap::AcquireHandle(CShm *pShm)
+{
+	HSHM hShm = NULL;
+
+	for(int i = 0; i < _IPCSHM_MAX_HANDLES; i++)
+	{
+		if(!m_handles[i].pShm)
+		{
+			m_handles[i].pShm = pShm;
+			hShm = &m_handles[i];
+			break;
+		}
+	}
+
+	return hShm;
+}
+
+void CShmHandleMap::ReleaseHandle(HSHM hShm)
+{
+	for(int i = 0; i < _IPCSHM_MAX_HANDLES; i++)
+	{
+		if(&m_handles[i] == hShm)
+		{
+			m_handles[i].pShm = NULL;
+			break;
+		}
+	}
+}
+
+CShm* CShmHandleMap::LookupShm(const uuid_t &uuid)
+{
+	for(int i = 0; i < _IPCSHM_MAX_HANDLES; i++)
+	{
+		if(m_handles[i].pShm)
+		{
+			const uuid_t &uuid2 = m_handles[i].pShm->Uuid();
+
+			if(!_uuid_compare(&uuid, &uuid2))
+				return m_handles[i].pShm;
+		}
+	}
+
+	return NULL;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+static CShmROT g_shmRot;
+static CShmHandleMap g_shmHandleMap;
+
+/////////////////////////////////////////////////////////////////////////////
+
+HSHM GfaIpcAcquireSHM(const char *pszUuid, size_t nSizeElement, size_t nCntElements, const char *pszDescName)
+{
+	HSHM hShm = NULL;
+
+	if(!g_shmRot.Created())
+	{
+		if(!g_shmRot.Create())
+		{
+			TRACE("GfaIpcAcquireSHM: Failed to create ROT!\n");
+			return NULL;
+		}
+	}
+
+	g_shmRot.Lock();
+	CShm *pShm = g_shmRot.AcquireShm(pszUuid, nSizeElement, nCntElements, pszDescName);
+
+	if(pShm)
+	{
+		hShm = g_shmHandleMap.AcquireHandle(pShm);
+
+		if(!hShm)
+		{
+			TRACE("GfaIpcAcquireSHM: Failed to acquire handle!\n");
+			g_shmRot.ReleaseShm(pShm);
+		}
+	}
+
+	g_shmRot.Unlock();
+	return hShm;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+void GfaIpcReleaseSHM(HSHM hShm)
+{
+	if(hShm)
+	{
+		LPSHM_HANDLE ph = (LPSHM_HANDLE)hShm;
+		if(!ph->pShm)
+		{
+			TRACE("GfaIpcReleaseSHM: Invalid Handle!\n");
+			return;
+		}
+		g_shmRot.Lock();
+		g_shmRot.ReleaseShm(ph->pShm);
+		g_shmHandleMap.ReleaseHandle(hShm);
+		g_shmRot.Unlock();
+	}
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+void* GfaIpcAcquirePointer(HSHM hShm)
+{
+	if(hShm)
+	{
+		LPSHM_HANDLE ph = (LPSHM_HANDLE)hShm;
+		if(!ph->pShm)
+		{
+			TRACE("GfaIpcAcquirePointer: Invalid Handle!\n");
+			return NULL;
+		}
+
+		return ph->pShm->Attach();
+	}
+
+	TRACE("GfaIpcAcquirePointer: Invalid Handle!\n");
+	return NULL;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+void GfaIpcReleasePointer(HSHM hShm, const void *p)
+{
+	if(!hShm)
+	{
+		TRACE("GfaIpcReleasePointer: Invalid Handle!\n");
+		return;
+	}
+
+	LPSHM_HANDLE ph = (LPSHM_HANDLE)hShm;
+
+	if(!ph->pShm)
+	{
+		TRACE("GfaIpcReleasePointer: Invalid Handle!\n");
+		return;
+	}
+
+	ph->pShm->Detach(p);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+void GfaIpcLockSHM(HSHM hShm)
+{
+	if(!hShm)
+	{
+		TRACE("GfaIpcReleasePointer: Invalid Handle!\n");
+		return;
+	}
+
+	LPSHM_HANDLE ph = (LPSHM_HANDLE)hShm;
+
+	if(!ph->pShm)
+	{
+		TRACE("GfaIpcReleasePointer: Invalid Handle!\n");
+		return;
+	}
+
+	ph->pShm->Lock();
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+void GfaIpcUnlockSHM(HSHM hShm)
+{
+	if(!hShm)
+	{
+		TRACE("GfaIpcReleasePointer: Invalid Handle!\n");
+		return;
+	}
+
+	LPSHM_HANDLE ph = (LPSHM_HANDLE)hShm;
+
+	if(!ph->pShm)
+	{
+		TRACE("GfaIpcReleasePointer: Invalid Handle!\n");
+		return;
+	}
+
+	ph->pShm->Unlock();
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+void GfaIpcDumpSHMROT(void)
+{
+	if(!g_shmRot.Created())
+	{
+		if(!g_shmRot.Create())
+		{
+			TRACE("GfaIpcDumpSHMROT: Failed to create ROT!\n");
+			return;
+		}
+	}
+
+	g_shmRot.DumpEntries(g_shmHandleMap);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+long GfaIpcInterlockedIncrement(HSHM hShm, volatile long *pl)
+{
+	if(!hShm)
+	{
+		TRACE("GfaIpcInterlockedIncrement: Invalid Handle!\n");
+		return 0;
+	}
+
+	LPSHM_HANDLE ph = (LPSHM_HANDLE)hShm;
+
+	if(!ph->pShm)
+	{
+		TRACE("GfaIpcInterlockedIncrement: Invalid Handle!\n");
+		return 0;
+	}
+
+	return ph->pShm->InterlockedIncrement(pl);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+long GfaIpcInterlockedDecrement(HSHM hShm, volatile long *pl)
+{
+	if(!hShm)
+	{
+		TRACE("GfaIpcInterlockedDecrement: Invalid Handle!\n");
+		return 0;
+	}
+
+	LPSHM_HANDLE ph = (LPSHM_HANDLE)hShm;
+
+	if(!ph->pShm)
+	{
+		TRACE("GfaIpcInterlockedDecrement: Invalid Handle!\n");
+		return 0;
+	}
+
+	return ph->pShm->InterlockedDecrement(pl);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+long GfaIpcInterlockedCompare(HSHM hShm, volatile long *pl, long comparand)
+{
+	if(!hShm)
+	{
+		TRACE("GfaIpcInterlockedCompare: Invalid Handle!\n");
+		return 0;
+	}
+
+	LPSHM_HANDLE ph = (LPSHM_HANDLE)hShm;
+
+	if(!ph->pShm)
+	{
+		TRACE("GfaIpcInterlockedCompare: Invalid Handle!\n");
+		return 0;
+	}
+
+	return ph->pShm->InterlockedCompare(pl, comparand);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+long GfaIpcInterlockedSet(HSHM hShm, volatile long *pl, long val)
+{
+	if(!hShm)
+	{
+		TRACE("GfaIpcInterlockedSet: Invalid Handle!\n");
+		return 0;
+	}
+
+	LPSHM_HANDLE ph = (LPSHM_HANDLE)hShm;
+
+	if(!ph->pShm)
+	{
+		TRACE("GfaIpcInterlockedSet: Invalid Handle!\n");
+		return 0;
+	}
+
+	return ph->pShm->InterlockedSet(pl, val);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+long GfaIpcInterlockedClear(HSHM hShm, volatile long *pl)
+{
+	if(!hShm)
+	{
+		TRACE("GfaIpcInterlockedSet: Invalid Handle!\n");
+		return 0;
+	}
+
+	LPSHM_HANDLE ph = (LPSHM_HANDLE)hShm;
+
+	if(!ph->pShm)
+	{
+		TRACE("GfaIpcInterlockedClear: Invalid Handle!\n");
+		return 0;
+	}
+
+	return ph->pShm->InterlockedClear(pl);
+}

+ 87 - 0
package/libgfaipc/src/locmtx.cpp

@@ -0,0 +1,87 @@
+#ifdef _WIN32
+#define _CRT_SECURE_NO_WARNINGS
+#define _CRT_NONSTDC_NO_WARNINGS
+#include <windows.h>
+#include <io.h>
+#include "../Win32/w32def.h"
+#endif	//	_WIN32
+
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <unistd.h>
+#ifdef __linux__
+#include <sys/file.h>
+#include <sys/ipc.h>
+#include <sys/sem.h>
+#include <linux/limits.h>
+#include <sys/shm.h>
+#endif	//	__linux__
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include "defines.h"
+#include "mutex.h"
+
+/////////////////////////////////////////////////////////////////////////////
+
+#define _IS_VALID_SHMID(id)				((id) >= 0)
+
+/////////////////////////////////////////////////////////////////////////////
+
+CLocalMutex::CLocalMutex(void) : m_bInit(false)
+{
+	memset(&m_mutex, 0, sizeof(m_mutex));
+	memset(&m_mutexAttr, 0, sizeof(m_mutexAttr));
+	::pthread_mutexattr_init(&m_mutexAttr);
+	::pthread_mutexattr_settype(&m_mutexAttr, PTHREAD_MUTEX_RECURSIVE);
+}
+
+CLocalMutex::~CLocalMutex(void)
+{
+	Release();
+	::pthread_mutexattr_destroy(&m_mutexAttr);
+}
+
+bool CLocalMutex::Create(bool bRecursive)
+{
+	if(!m_bInit)
+	{
+		if(!::pthread_mutex_init(&m_mutex, bRecursive ? &m_mutexAttr : NULL))
+		{
+			TRACE("CLocalMutex::Create: Created Mutex (recursive=%s)\n", bRecursive ? "true" : "false");
+			m_bInit = true;
+		}
+		else
+		{
+			TRACE("CLocalMutex::Create failed!\n");
+		}
+	}
+	
+	return m_bInit;
+}
+
+void CLocalMutex::Release(void)
+{
+	if(m_bInit)
+	{
+		::pthread_mutex_destroy(&m_mutex);
+		m_bInit = false;
+		TRACE("CLocalMutex::Release: Mutex released.\n");
+	}
+}
+
+bool CLocalMutex::Lock(void)
+{
+	return !::pthread_mutex_lock(&m_mutex);
+}
+
+bool CLocalMutex::TryLock(void)
+{
+	return !::pthread_mutex_trylock(&m_mutex);
+}
+
+bool CLocalMutex::Unlock(void)
+{
+	return !::pthread_mutex_unlock(&m_mutex);
+}

+ 222 - 0
package/libgfaipc/src/mutex.cpp

@@ -0,0 +1,222 @@
+#ifdef _WIN32
+#define _CRT_SECURE_NO_WARNINGS
+#define _CRT_NONSTDC_NO_WARNINGS
+#include <windows.h>
+#include <io.h>
+#include "../Win32/w32def.h"
+#endif	//	_WIN32
+
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <unistd.h>
+#ifdef __linux__
+#include <sys/file.h>
+#include <sys/ipc.h>
+#include <sys/sem.h>
+#include <linux/limits.h>
+#include <sys/shm.h>
+#endif	//	__linux__
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include "defines.h"
+#include "mutex.h"
+
+/////////////////////////////////////////////////////////////////////////////
+
+#define _IS_VALID_SHMID(id)				((id) >= 0)
+
+/////////////////////////////////////////////////////////////////////////////
+
+CGlobalMutex::CGlobalMutex(void) :	m_nShmID(_INVALID_ID), m_pMutex(NULL)
+{
+	memset(&m_mutexAttr, 0, sizeof(m_mutexAttr));
+	::pthread_mutexattr_init(&m_mutexAttr);
+	::pthread_mutexattr_setpshared(&m_mutexAttr, PTHREAD_PROCESS_SHARED);
+	::pthread_mutexattr_settype(&m_mutexAttr, PTHREAD_MUTEX_RECURSIVE);
+	::pthread_mutexattr_setrobust(&m_mutexAttr, PTHREAD_MUTEX_ROBUST);
+}
+
+CGlobalMutex::~CGlobalMutex(void)
+{
+	Release();
+}
+
+int CGlobalMutex::Create(const uuid_t &ruuid, const char *pszDir)
+{
+	if(!pszDir)
+		pszDir = "";
+
+	size_t nLenReq = strlen(pszDir) + _UUID_STRING_LEN + 2;
+
+	if(nLenReq > PATH_MAX)
+	{
+		TRACE("CGlobalMutex::Create: directory name too long\n");
+		errno = EINVAL;
+		return -1;
+	}
+
+	int nRet = -1;
+	char szUuid[_UUID_STRING_LEN + 1];
+	char szShm[PATH_MAX];
+	_uuid_unparse(&ruuid, szUuid, sizeof(szUuid));
+	sprintf(szShm, "%s/%s.mtx", pszDir, szUuid);
+
+	int nFdShm;
+
+	if((nFdShm = ::open(szShm, O_RDWR | O_CREAT | O_TRUNC, _NUMBER_OF_THE_BEAST)) >= 0)
+	{
+		key_t shmKey;
+
+		if((shmKey = ::ftok(szShm, 'R')) >= 0)
+		{
+			if((m_nShmID = ::shmget(shmKey, sizeof(pthread_mutex_t), IPC_CREAT | _NUMBER_OF_THE_BEAST)) >= 0)
+			{
+				struct shmid_ds sds;
+				memset(&sds, 0, sizeof(sds));
+
+				if(!::shmctl(m_nShmID, IPC_STAT, (struct shmid_ds*)&sds))
+				{
+					m_pMutex = (pthread_mutex_t*)::shmat(m_nShmID, NULL, 0);
+
+					if(!sds.shm_atime)
+					{
+						if(!(nRet = ::pthread_mutex_init(m_pMutex, &m_mutexAttr)))
+						{
+							TRACE("CGlobalMutex::Create: Created new Mutex\n");
+							nRet = 1;
+						}
+						else
+						{
+							TRACE("CGlobalMutex::Create failed! Code: %d\n", nRet);
+							nRet = -1;
+						}
+					}
+					else
+					{
+						TRACE("CGlobalMutex::Create: Opened existing Mutex\n");
+						nRet = 0;
+					}
+				}
+				else
+				{
+					TRACE("CGlobalMutex::Create: IPC_STAT failed - errno: %d!\n", errno);
+				}
+			}
+			else
+			{
+				TRACE("CGlobalMutex::Create: Failed to create SHM on Key: 0x%08X - errno: %d!\n", shmKey, errno);
+			}
+		}
+		else
+		{
+			TRACE("CGlobalMutex::Create: Failed to create shmKey - errno: %d!\n", errno);
+		}
+
+		close(nFdShm);
+	}
+	else
+	{
+		TRACE("CGlobalMutex::Create: Failed to open '%s' - errno: %d!\n", szShm, errno);
+	}
+
+	return nRet;
+}
+	
+long CGlobalMutex::Release(void)
+{
+	struct shmid_ds sds;
+	sds.shm_nattch = (shmatt_t)-1;
+
+	if(_IS_VALID_SHMID(m_nShmID) && m_pMutex)
+	{
+		if(!::shmctl(m_nShmID, IPC_STAT, (struct shmid_ds*)&sds))
+		{
+			if((long)sds.shm_nattch > 1)
+			{
+				::pthread_mutexattr_destroy(&m_mutexAttr);
+				::shmdt(m_pMutex);
+				::shmctl(m_nShmID, IPC_STAT, (struct shmid_ds*)&sds);
+				TRACE("CGlobalMutex::Release: Still attached: %ld!\n", (long)(sds.shm_nattch));
+			}
+			else if((long)sds.shm_nattch == 1)
+			{
+				::pthread_mutex_destroy(m_pMutex);
+				::pthread_mutexattr_destroy(&m_mutexAttr);
+				::shmdt(m_pMutex);
+				::shmctl(m_nShmID, IPC_RMID, NULL);
+				sds.shm_nattch = 0;
+				TRACE("CGlobalMutex::Release: Mutex removed!\n");
+			}
+		}
+		else
+		{
+			sds.shm_nattch = (shmatt_t)-1;
+			TRACE("CGlobalMutex::Release: IPC_STAT failed!\n");
+		}
+
+		m_pMutex = NULL;
+		m_nShmID = _INVALID_ID;
+	}
+
+	return (long)sds.shm_nattch;
+}
+
+bool CGlobalMutex::Lock(void)
+{
+	if(m_pMutex)
+	{
+		int nRet = ::pthread_mutex_lock(m_pMutex);
+		if(nRet == EOWNERDEAD)
+		{
+			TRACE("CGlobalMutex::Lock: Former owner process has died - gained ownership!\n");
+			::pthread_mutex_consistent(m_pMutex);
+			nRet = 0;
+		}
+//		TRACE("CGlobalMutex::Lock: Locked: %d.\n", m_nShmID);
+		return !nRet;
+	}
+	else
+	{
+		TRACE("CGlobalMutex::Lock: Invalid Mutex: %p!\n", m_pMutex);
+		errno = EINVAL;
+		return false;
+	}
+}
+
+bool CGlobalMutex::TryLock(void)
+{
+	if(m_pMutex)
+	{
+		int nRet = ::pthread_mutex_trylock(m_pMutex);
+		if(nRet == EOWNERDEAD)
+		{
+			TRACE("CGlobalMutex::TryLock: Former owner process has died - gained ownership!\n");
+			::pthread_mutex_consistent(m_pMutex);
+			nRet = 0;
+		}
+		return !nRet;
+	}
+	else
+	{
+		TRACE("CGlobalMutex::TryLock: Invalid Mutex: %p!\n", m_pMutex);
+		errno = EINVAL;
+		return false;
+	}
+}
+
+bool CGlobalMutex::Unlock(void)
+{
+	if(m_pMutex)
+	{
+//		TRACE("CGlobalMutex::Unlock: Unlocked: %d.\n", m_nShmID);
+		return !::pthread_mutex_unlock(m_pMutex);
+	}
+	else
+	{
+		TRACE("CGlobalMutex::Unlock: Invalid Mutex: %p!\n", m_pMutex);
+		errno = EINVAL;
+		return false;
+	}
+}

+ 66 - 0
package/libgfaipc/src/mutex.h

@@ -0,0 +1,66 @@
+// mutex.h :
+//
+
+#if !defined(AGD_MUTEX_H__307A751D_EF2D_45D6_BBA8_2EB4B79B548D__INCLUDED_)
+#define AGD_MUTEX_H__307A751D_EF2D_45D6_BBA8_2EB4B79B548D__INCLUDED_
+
+#include <inttypes.h>
+#include <stdlib.h>
+#include <pthread.h>
+#include "uuid.h"
+
+/////////////////////////////////////////////////////////////////////////////
+// mutex.h - Declarations:
+
+#ifdef _WIN32
+#define _DEF_MUTEX_DIR						"."
+#endif	//	_WIN32
+
+#ifdef __linux__
+#define _DEF_MUTEX_DIR						"/tmp"
+#endif	//	__linux__
+
+/////////////////////////////////////////////////////////////////////////////
+
+class CGlobalMutex
+{
+public:
+	CGlobalMutex(void);
+	virtual ~CGlobalMutex(void);
+
+	int Create(const uuid_t &ruuid, const char *pszDir = _DEF_MUTEX_DIR);
+	long Release(void);
+
+	bool Lock(void);
+	bool TryLock(void);
+	bool Unlock(void);
+
+private:
+	int m_nShmID;
+	pthread_mutexattr_t m_mutexAttr;
+	pthread_mutex_t *m_pMutex;
+};
+
+/////////////////////////////////////////////////////////////////////////////
+
+class CLocalMutex
+{
+public:
+	CLocalMutex(void);
+	virtual ~CLocalMutex(void);
+
+	bool Create(bool bRecursive = false);
+	void Release(void);
+
+	bool Lock(void);
+	bool TryLock(void);
+	bool Unlock(void);
+
+private:
+	bool m_bInit;
+	pthread_mutexattr_t m_mutexAttr;
+	pthread_mutex_t m_mutex;
+};
+
+/////////////////////////////////////////////////////////////////////////////
+#endif	//	!defined(AGD_MUTEX_H__307A751D_EF2D_45D6_BBA8_2EB4B79B548D__INCLUDED_)

+ 459 - 0
package/libgfaipc/src/sema.cpp

@@ -0,0 +1,459 @@
+#ifdef _WIN32
+#define _CRT_SECURE_NO_WARNINGS
+#define _CRT_NONSTDC_NO_WARNINGS
+#include <windows.h>
+#include <io.h>
+#include "../Win32/w32def.h"
+#endif	//	_WIN32
+
+/////////////////////////////////////////////////////////////////////////////
+
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <unistd.h>
+#ifdef __linux__
+#include <sys/file.h>
+#include <sys/ipc.h>
+#include <sys/sem.h>
+#include <sys/shm.h>
+#include <linux/limits.h>
+#endif	//	__linux__
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include "defines.h"
+#include "sema.h"
+
+/////////////////////////////////////////////////////////////////////////////
+
+#define _IS_VALID_SEMID(id)				((id) >= 0)
+
+/////////////////////////////////////////////////////////////////////////////
+
+CSemaphore::CSemaphore(void) :	m_nSemID(_INVALID_ID)
+{
+}
+
+CSemaphore::~CSemaphore(void)
+{
+	Release();
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+int CSemaphore::Create(const char *pszFilename, int nsems, unsigned short *pInitArr)
+{
+	int nFdSema, nRet = -1;
+
+	if((nFdSema = ::open(pszFilename, O_RDWR | O_CREAT | O_TRUNC, _NUMBER_OF_THE_BEAST)) >= 0)
+	{
+		if(!::flock(nFdSema, LOCK_EX))
+		{
+			key_t semKey;
+
+			if((semKey = ::ftok(pszFilename, 'R')) >= 0)
+			{
+				if((m_nSemID = ::semget(semKey, nsems, IPC_CREAT | _NUMBER_OF_THE_BEAST)) >= 0)
+				{
+					struct semid_ds sds;
+					::memset(&sds, 0, sizeof(sds));
+
+					if(!IpcStat(&sds))
+					{
+						if(!sds.sem_otime)
+						{
+							bool fCreateArr = !pInitArr;
+
+							if(fCreateArr)
+							{
+								pInitArr = new unsigned short[sds.sem_nsems];
+
+								for(unsigned long i = 0; i < sds.sem_nsems; i++)
+								{
+									pInitArr[i] = 0;
+								}
+							}
+
+							SetAll(pInitArr);
+
+							if(fCreateArr)
+								delete [] pInitArr;
+
+							struct sembuf sb[2] = {{0, 1, IPC_NOWAIT}, {0, -1, IPC_NOWAIT}};
+							Op(sb, 2);
+
+							TRACE("CSemaphore::Create: Created new Semaphore!\n");
+							nRet = 1;
+						}
+						else
+						{
+							TRACE("CSemaphore::Create: Opened existing Semaphore!\n");
+							nRet = 0;
+						}
+					}
+					else
+					{
+						TRACE("CSemaphore::Create: IpcStat failed - errno: %d!\n", errno);
+					}
+				}
+				else
+				{
+					TRACE("CSemaphore::Create: Failed to create Semaphore - errno: %d!\n", errno);
+				}
+			}
+			else
+			{
+				TRACE("CSemaphore::Create: Failed to create semKey - errno: %d!\n", errno);
+			}
+
+			::flock(nFdSema, LOCK_UN);
+		}
+		else
+		{
+			TRACE("CSemaphore::Create: Failed to create Lock on '%s' - errno: %d!\n", pszFilename, errno);
+		}
+
+		::close(nFdSema);
+	}
+	else
+	{
+		TRACE("CSemaphore::Create: Failed to create '%s' - errno: %d!\n", pszFilename, errno);
+	}
+
+	return nRet;
+}
+
+void CSemaphore::Release(void)
+{
+	if(_IS_VALID_SEMID(m_nSemID))
+	{
+		m_nSemID = _INVALID_ID;
+		TRACE("CSemaphore::Release\n");
+	}
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+int CSemaphore::Ctl(int cmd)
+{
+	union semun su;
+	su.val = 0;
+	return Ctl(0, cmd, su);
+}
+
+int CSemaphore::Ctl(int semnum, int cmd)
+{
+	union semun su;
+	su.val = 0;
+	return Ctl(semnum, cmd, su);
+}
+
+int CSemaphore::Ctl(int semnum, int cmd, int val)
+{
+	union semun su;
+	su.val = val;
+	return Ctl(semnum, cmd, su);
+}
+
+int CSemaphore::Ctl(int cmd, struct semid_ds *buf)
+{
+	union semun su;
+	su.buf = buf;
+	return Ctl(0, cmd, su);
+}
+
+int CSemaphore::Ctl(int cmd, unsigned short  *arr)
+{
+	union semun su;
+	su.array = arr;
+	return Ctl(0, cmd, su);
+}
+
+int CSemaphore::Ctl(int cmd, struct seminfo *si)
+{
+	union semun su;
+	su.__buf = si;
+	return Ctl(0, cmd, su);
+}
+
+int CSemaphore::Ctl(int semnum, int cmd, union semun su)
+{
+	if(!_IS_VALID_SEMID(m_nSemID))
+	{
+//		TRACE("CSemaphore::Ctl: Invalid SemID: %d!\n", m_nSemID);
+		errno = EINVAL;
+		return -1;
+	}
+
+	return ::semctl(m_nSemID, semnum, cmd, su);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+int CSemaphore::IpcStat(struct semid_ds *buf)
+{
+	return Ctl(IPC_STAT, buf);
+}
+
+int CSemaphore::IpcSet(struct semid_ds *buf)
+{
+	return Ctl(IPC_SET, buf);
+}
+
+int CSemaphore::IpcRmID(void)
+{
+	int nRet = Ctl(IPC_RMID);
+	Release();
+	return nRet;
+}
+
+int CSemaphore::IpcInfo(struct seminfo *si)
+{
+	return Ctl(IPC_INFO, si);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+int CSemaphore::SemStat(int index, struct semid_ds *buf)
+{
+	union semun su;
+	su.buf = buf;
+	return ::semctl(index, 0, SEM_STAT, su);
+}
+
+int CSemaphore::SemInfo(struct seminfo *si)
+{
+	return Ctl(SEM_INFO, si);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+int CSemaphore::GetVal(int semnum)
+{
+	return Ctl(semnum, GETVAL);
+}
+
+int CSemaphore::SetVal(int semnum, int val)
+{
+	return Ctl(semnum, SETVAL, val);
+}
+
+int CSemaphore::GetAll(unsigned short *arr)
+{
+	return Ctl(GETALL, arr);
+}
+
+int CSemaphore::SetAll(unsigned short *arr)
+{
+	return Ctl(SETALL, arr);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+int CSemaphore::GetPid(int semnum)
+{
+	return Ctl(semnum, GETPID);
+}
+
+int CSemaphore::GetNCnt(int semnum)
+{
+	return Ctl(semnum, GETNCNT);
+}
+
+int CSemaphore::GetZCnt(int semnum)
+{
+	return Ctl(semnum, GETZCNT);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+bool CSemaphore::Op(struct sembuf *sops, size_t nsops)
+{
+	if(!_IS_VALID_SEMID(m_nSemID))
+	{
+//		TRACE("CSemaphore::Op: Invalid SemID: %d!\n", m_nSemID);
+		errno = EINVAL;
+		return false;
+	}
+
+	return !::semop(m_nSemID, sops, nsops);
+}
+
+bool CSemaphore::TimedOp(struct sembuf *sops, size_t nsops, const struct timespec *timeout)
+{
+	if(!_IS_VALID_SEMID(m_nSemID))
+	{
+		TRACE("CSemaphore::TimedOp: Invalid SemID: %d!\n", m_nSemID);
+		errno = EINVAL;
+		return false;
+	}
+
+	return !::semtimedop(m_nSemID, sops, nsops, timeout);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+bool CSemaphore::Lock(int semnum)
+{
+	struct sembuf sb;
+	sb.sem_num	= (unsigned short)semnum;
+	sb.sem_op	= -1;
+	sb.sem_flg	= SEM_UNDO;
+	return Op(&sb, 1);
+}
+
+bool CSemaphore::LockTimeout(const struct timespec *timeout, int semnum)
+{
+	struct sembuf sb;
+	sb.sem_num	= (unsigned short)semnum;
+	sb.sem_op	= -1;
+	sb.sem_flg	= SEM_UNDO;
+	return TimedOp(&sb, 1, timeout);
+}
+
+bool CSemaphore::LockTimeout(unsigned long msec, int semnum)
+{
+	struct timespec to;
+	to.tv_sec	= msec / 1000;
+	to.tv_nsec	= (msec % 1000) * 1000000;
+	return LockTimeout(&to, semnum);
+}
+
+bool CSemaphore::Unlock(int semnum)
+{
+	struct sembuf sb;
+	sb.sem_num	= (unsigned short)semnum;
+	sb.sem_op	= 1;
+	sb.sem_flg	= SEM_UNDO;
+	return Op(&sb, 1);
+}
+
+bool CSemaphore::WaitZero(int semnum)
+{
+	struct sembuf sb;
+	sb.sem_num	= (unsigned short)semnum;
+	sb.sem_op	= 0;
+	sb.sem_flg	= SEM_UNDO;
+	return Op(&sb, 1);
+}
+
+bool CSemaphore::WaitZeroTimeout(const struct timespec *timeout, int semnum)
+{
+	struct sembuf sb;
+	sb.sem_num	= (unsigned short)semnum;
+	sb.sem_op	= 0;
+	sb.sem_flg	= SEM_UNDO;
+	return TimedOp(&sb, 1, timeout);
+}
+
+bool CSemaphore::WaitZeroTimeout(unsigned long msec, int semnum)
+{
+	struct timespec to;
+	to.tv_sec	= msec / 1000;
+	to.tv_nsec	= (msec % 1000) * 1000000;
+	return WaitZeroTimeout(&to, semnum);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+void CSemaphore::DumpIpcPerm(struct ipc_perm *ip)
+{
+	printf("__key: 0x%X\n", ip->__key);
+	printf("uid:   %d\n", ip->uid);
+	printf("gid:   %d\n", ip->gid);
+	printf("cuid:  %d\n", ip->cuid);
+	printf("cgid:  %d\n", ip->cgid);
+	printf("mode:  %hu\n", ip->mode);
+	printf("__seq: %hu\n", ip->__seq);
+}
+
+void CSemaphore::DumpSemidDs(struct semid_ds *sid)
+{
+	CSemaphore::DumpIpcPerm(&sid->sem_perm);
+	printf("sem_otime: %lu\n", sid->sem_otime);
+	printf("sem_ctime: %lu\n", sid->sem_ctime);
+	printf("sem_nsems: %lu\n", sid->sem_nsems);
+}
+
+void CSemaphore::DumpSeminfo(struct seminfo *psi)
+{
+	printf("semmap: %d\n", psi->semmap);
+	printf("semmni: %d\n", psi->semmni);
+	printf("semmns: %d\n", psi->semmns);
+	printf("semmnu: %d\n", psi->semmnu);
+	printf("semmsl: %d\n", psi->semmsl);
+	printf("semopm: %d\n", psi->semopm);
+	printf("semume: %d\n", psi->semume);
+	printf("semusz: %d\n", psi->semusz);
+	printf("semvmx: %d\n", psi->semvmx);
+	printf("semaem: %d\n\n", psi->semaem);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+CShmSemaphore::CShmSemaphore(void)
+{
+}
+
+CShmSemaphore::~CShmSemaphore(void)
+{
+	Release();
+}
+
+int CShmSemaphore::Create(const char *pszFilename)
+{
+	int nRet;
+	unsigned short nVals[2] = {1, 0};
+	if((nRet = CSemaphore::Create(pszFilename, 2, nVals)) < 0)
+		return nRet;
+	Unlock(1);
+	TRACE("CShmSemaphore::Create\n");
+	return nRet;
+}
+
+int CShmSemaphore::Create(const uuid_t &ruuid, const char *pszDir)
+{
+	if(!pszDir)
+		pszDir = "";
+
+	size_t nLenReq = strlen(pszDir) + _UUID_STRING_LEN + 2;
+
+	if(nLenReq > PATH_MAX)
+	{
+		TRACE("CShmSemaphore::Create: directory name too long\n");
+		errno = EINVAL;
+		return -1;
+	}
+
+	char szUuid[_UUID_STRING_LEN + 1];
+	char szSema[PATH_MAX];
+	_uuid_unparse(&ruuid, szUuid, sizeof(szUuid));
+	sprintf(szSema, "%s/%s.sem", pszDir, szUuid);
+	return Create(szSema);
+}
+
+void CShmSemaphore::Release(void)
+{
+	if(_IS_VALID_SEMID(m_nSemID))
+	{
+		int nRefs = GetVal(1);
+
+		if(nRefs > 1)
+		{
+			TRACE("CShmSemaphore::Release: remaining References: %d\n", nRefs - 1);
+			Lock(1);
+		}
+		else if(nRefs == 1)
+		{
+			TRACE("CShmSemaphore::Release: remaining References: %d - Semaphore removed!\n", nRefs - 1);
+			IpcRmID();
+		}
+
+		CSemaphore::Release();
+	}
+}

+ 113 - 0
package/libgfaipc/src/sema.h

@@ -0,0 +1,113 @@
+// sema.h :
+//
+
+#if !defined(AGD_SEMA_H__EA777512_58F6_495A_A36F_1272222A4749__INCLUDED_)
+#define AGD_SEMA_H__EA777512_58F6_495A_A36F_1272222A4749__INCLUDED_
+
+#include <inttypes.h>
+#include <stdlib.h>
+#include "uuid.h"
+
+#define _SHM_SEMA_RECURSIVE				1
+
+/////////////////////////////////////////////////////////////////////////////
+// sema.h - Declarations:
+
+#ifdef __cplusplus
+extern "C" {
+#endif	//	__cplusplus
+
+union semun
+{
+	int              val;    // Value for SETVAL
+	struct semid_ds *buf;    // Buffer for IPC_STAT, IPC_SET
+	unsigned short  *array;  // Array for GETALL, SETALL
+	struct seminfo  *__buf;  // Buffer for IPC_INFO	(Linux-specific)
+};
+
+#ifdef __cplusplus
+}
+#endif	//	__cplusplus
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+class CSemaphore
+{
+public:
+	CSemaphore(void);
+	virtual ~CSemaphore(void);
+
+	virtual int Create(const char *pszFilename, int nsems, unsigned short *pInitArr = NULL);
+	virtual void Release(void);
+
+	int Ctl(int cmd);
+	int Ctl(int semnum, int cmd);
+	int Ctl(int semnum, int cmd, int val);
+	int Ctl(int cmd, struct semid_ds *buf);
+	int Ctl(int cmd, unsigned short *arr);
+	int Ctl(int cmd, struct seminfo *si);
+
+	int IpcStat(struct semid_ds *buf);
+	int IpcInfo(struct seminfo *si);
+	int IpcSet(struct semid_ds *buf);
+	int IpcRmID(void);
+	int SemStat(int index, struct semid_ds *buf);
+	int SemInfo(struct seminfo *si);
+	int GetVal(int semnum = 0);
+	int SetVal(int semnum, int val);
+	int GetAll(unsigned short *arr);
+	int SetAll(unsigned short *arr);
+	int GetPid(int semnum = 0);
+	int GetNCnt(int semnum = 0);
+	int GetZCnt(int semnum = 0);
+
+	bool Op(struct sembuf *sops, size_t nsops);
+	bool TimedOp(struct sembuf *sops, size_t nsops, const struct timespec *timeout);
+
+	bool Lock(int semnum = 0);
+	bool LockTimeout(const struct timespec *timeout, int semnum = 0);
+	bool LockTimeout(unsigned long msec, int semnum = 0);
+	bool Unlock(int semnum = 0);
+	bool WaitZero(int semnum = 0);
+	bool WaitZeroTimeout(const struct timespec *timeout, int semnum = 0);
+	bool WaitZeroTimeout(unsigned long msec, int semnum = 0);
+
+	static void DumpIpcPerm(struct ipc_perm *ip);
+	static void DumpSemidDs(struct semid_ds *sid);
+	static void DumpSeminfo(struct seminfo *psi);
+
+protected:
+	int Ctl(int semnum, int cmd, union semun su);
+
+protected:
+	int m_nSemID;
+};
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+#ifdef _WIN32
+#define _DEF_SEMA_DIR						"."
+#endif	//	_WIN32
+
+#ifdef __linux__
+#define _DEF_SEMA_DIR						"/tmp"
+#endif	//	__linux__
+
+/////////////////////////////////////////////////////////////////////////////
+
+class CShmSemaphore : public CSemaphore
+{
+public:
+	CShmSemaphore(void);
+	virtual ~CShmSemaphore(void);
+
+	virtual int Create(const char *pszFilename);
+	virtual int Create(const uuid_t &ruuid, const char *pszDir = _DEF_SEMA_DIR);
+	virtual void Release(void);
+};
+
+/////////////////////////////////////////////////////////////////////////////
+#endif	//	!defined(AGD_SEMA_H__EA777512_58F6_495A_A36F_1272222A4749__INCLUDED_)

+ 378 - 0
package/libgfaipc/src/shm.cpp

@@ -0,0 +1,378 @@
+#ifdef _WIN32
+#define _CRT_SECURE_NO_WARNINGS
+#define _CRT_NONSTDC_NO_WARNINGS
+#include <windows.h>
+#include <io.h>
+#include "../Win32/w32def.h"
+#endif	//	_WIN32
+
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <unistd.h>
+#ifdef __linux__
+#include <sys/file.h>
+#include <sys/ipc.h>
+#include <sys/sem.h>
+#include <linux/limits.h>
+#include <sys/shm.h>
+#endif	//	__linux__
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include "defines.h"
+#include "shm.h"
+
+/////////////////////////////////////////////////////////////////////////////
+
+#define _IS_VALID_SHMID(id)				((id) >= 0)
+
+/////////////////////////////////////////////////////////////////////////////
+
+class CShmLocker
+{
+public:
+	CShmLocker(CGlobalMutex &rMutex) :	m_bLocked(false),
+										m_rMutex(rMutex)
+	{
+		m_bLocked = m_rMutex.Lock();
+	}
+
+	~CShmLocker(void)
+	{
+		if(m_bLocked)
+			m_bLocked = !m_rMutex.Unlock();
+	}
+
+private:
+	bool m_bLocked;
+	CGlobalMutex &m_rMutex;
+};
+
+/////////////////////////////////////////////////////////////////////////////
+
+CShm::CShm(void) :	m_nShmID(_INVALID_ID)
+{
+	memset(&m_uuid, 0, sizeof(m_uuid));
+}
+
+CShm::~CShm(void)
+{
+	Release();
+}
+
+int CShm::Create(const uuid_t &ruuid, size_t nCbShm, const char *pszDir)
+{
+	if(!pszDir)
+		pszDir = "";
+
+	size_t nLenReq = strlen(pszDir) + _UUID_STRING_LEN + 2;
+
+	if(nLenReq > PATH_MAX)
+	{
+		TRACE("CShm::Create: directory name too long\n");
+		errno = EINVAL;
+		return -1;
+	}
+
+	int nRet = -1;
+	char szUuid[_UUID_STRING_LEN + 1];
+	char szShm[PATH_MAX];
+	_uuid_unparse(&ruuid, szUuid, sizeof(szUuid));
+	sprintf(szShm, "%s/%s.shm", pszDir, szUuid);
+
+	if(m_mutex.Create(ruuid, pszDir) < 0)
+		return -1;
+
+	int nFdShm;
+//	CShmLocker locker(m_mutex);
+
+	if((nFdShm = ::open(szShm, O_RDWR | O_CREAT | O_TRUNC, _NUMBER_OF_THE_BEAST)) >= 0)
+	{
+		key_t shmKey;
+
+		if((shmKey = ::ftok(szShm, 'R')) >= 0)
+		{
+			if((m_nShmID = ::shmget(shmKey, nCbShm, IPC_CREAT | _NUMBER_OF_THE_BEAST)) >= 0)
+			{
+				struct shmid_ds sds;
+				memset(&sds, 0, sizeof(sds));
+
+				if(!IpcStat(&sds))
+				{
+					if(!sds.shm_atime)
+					{
+						void *p = ::shmat(m_nShmID, NULL, 0);
+						::shmdt(p);
+						TRACE("CShm::Create: Created new SHM: ID: %d, Size: %zu\n", m_nShmID, nCbShm);
+						nRet = 1;
+					}
+					else
+					{
+						TRACE("CShm::Create: Opened existing SHM: ID: %d, Size: %zu\n", m_nShmID, nCbShm);
+						nRet = 0;
+					}
+
+					_uuid_copy(&m_uuid, &ruuid);
+				}
+				else
+				{
+					TRACE("CShm::Create: IpcStat failed - errno: %d!\n", errno);
+				}
+			}
+			else
+			{
+				TRACE("CShm::Create: Failed to create SHM on Key: 0x%08X - errno: %d!\n", shmKey, errno);
+			}
+		}
+		else
+		{
+			TRACE("CShm::Create: Failed to create shmKey - errno: %d!\n", errno);
+		}
+
+		close(nFdShm);
+	}
+	else
+	{
+		TRACE("CShm::Create: Failed to open '%s' - errno: %d!\n", szShm, errno);
+	}
+
+	return nRet;
+}
+
+long CShm::Release(void)
+{
+	long att = -1;
+	CShmLocker locker(m_mutex);
+
+	if(_IS_VALID_SHMID(m_nShmID))
+	{
+		att = GetNumAttached();
+
+		if(att == 0)
+		{
+			TRACE("CShm::Release: attached: %ld - SHM removed!\n", att);
+			IpcRmID();
+		}
+		else if(att > 0)
+		{
+			TRACE("CShm::Release: Still attached: %ld!\n", att);
+		}
+
+		m_nShmID = _INVALID_ID;
+	}
+
+	return att;
+}
+
+void* CShm::Attach(const void *pAddr, int shmflg)
+{
+	CShmLocker locker(m_mutex);
+
+	if(!_IS_VALID_SHMID(m_nShmID))
+	{
+		TRACE("CShm::Attach: Invalid ShmID: %d!\n", m_nShmID);
+		errno = EINVAL;
+		return NULL;
+	}
+
+	void *p = ::shmat(m_nShmID, pAddr, shmflg);
+
+	if(p == (void*)-1)
+	{
+		TRACE("CShm::Attach: Failed to attach memory - errno: %d!\n", errno);
+		p = NULL;
+	}
+	else
+	{
+		TRACE("CShm::Attach: %p!\n", p);
+	}
+
+	return p;
+}
+
+void CShm::Detach(const void *pAddr)
+{
+	if(pAddr)
+	{
+		TRACE("CShm::Detach: %p!\n", pAddr);
+		CShmLocker locker(m_mutex);
+		::shmdt(pAddr);
+	}
+}
+
+long CShm::GetNumAttached(void)
+{
+	long att = -1;
+	struct shmid_ds sds;
+	if(!IpcStat(&sds))
+		att = (long)sds.shm_nattch;
+	return att;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+int CShm::Ctl(int cmd, struct shmid_ds *pshd)
+{
+	if(!_IS_VALID_SHMID(m_nShmID))
+	{
+		TRACE("CShm::Ctl: Invalid ShmID: %d!\n", m_nShmID);
+		errno = EINVAL;
+		return -1;
+	}
+
+	return ::shmctl(m_nShmID, cmd, pshd);
+}
+
+int CShm::Ctl(int cmd)
+{
+	return Ctl(cmd, (struct shmid_ds*)NULL);
+}
+
+int CShm::Ctl(int cmd, struct shminfo *pinfo)
+{
+	return Ctl(cmd, (struct shmid_ds*)pinfo);
+}
+
+int CShm::Ctl(int cmd, struct shm_info *pinfo)
+{
+	return Ctl(cmd, (struct shmid_ds*)pinfo);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+int CShm::IpcStat(struct shmid_ds *buf)
+{
+	return Ctl(IPC_STAT, buf);
+}
+
+int CShm::IpcInfo(struct shminfo *si)
+{
+	return Ctl(IPC_INFO, si);
+}
+
+int CShm::IpcSet(struct shmid_ds *buf)
+{
+	return Ctl(IPC_SET, buf);
+}
+
+int CShm::IpcRmID(void)
+{
+	return Ctl(IPC_RMID);
+}
+
+int CShm::ShmStat(int index, struct shmid_ds *buf)
+{
+	return ::shmctl(index, SHM_STAT, buf);
+}
+
+int CShm::ShmInfo(struct shm_info *pinfo)
+{
+	return Ctl(SHM_INFO, pinfo);
+}
+
+int CShm::Lock(void)
+{
+	return m_mutex.Lock();
+}
+
+int CShm::Unlock(void)
+{
+	return m_mutex.Unlock();
+}
+
+long CShm::InterlockedIncrement(volatile long *pl)
+{
+	if(!pl)
+	{
+		TRACE("CShm::InterlockedIncrement: Invalid Argument!\n");
+		return 0;
+	}
+
+	long l;
+	m_mutex.Lock();
+	l = ++(*pl);
+	m_mutex.Unlock();
+	return l;
+}
+
+long CShm::InterlockedDecrement(volatile long *pl)
+{
+	if(!pl)
+	{
+		TRACE("CShm::InterlockedDecrement: Invalid Argument!\n");
+		return 0;
+	}
+
+	long l;
+	m_mutex.Lock();
+	l = --(*pl);
+	m_mutex.Unlock();
+	return l;
+}
+
+long CShm::InterlockedCompare(volatile long *pl, long comparand)
+{
+	if(!pl)
+	{
+		TRACE("CShm::InterlockedCompare: Invalid Argument!\n");
+		return 0;
+	}
+
+	long l;
+	m_mutex.Lock();
+	l = *pl - comparand;
+	m_mutex.Unlock();
+	return l;
+}
+
+long CShm::InterlockedSet(volatile long *pl, long val)
+{
+	if(!pl)
+	{
+		TRACE("CShm::InterlockedSet: Invalid Argument!\n");
+		return 0;
+	}
+
+	long l;
+	m_mutex.Lock();
+	l = *pl;
+	*pl = val;
+	m_mutex.Unlock();
+	return l;
+}
+
+long CShm::InterlockedClear(volatile long *pl)
+{
+	if(!pl)
+	{
+		TRACE("CShm::InterlockedClear: Invalid Argument!\n");
+		return 0;
+	}
+
+	long l;
+	m_mutex.Lock();
+	l = *pl;
+	*pl = 0;
+	m_mutex.Unlock();
+	return l;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+void CShm::DumpIpcPerm(struct ipc_perm *ip)
+{
+	CSemaphore::DumpIpcPerm(ip);
+}
+
+void CShm::DumpShmidDs(struct shmid_ds *sid)
+{
+	CShm::DumpIpcPerm(&sid->shm_perm);
+	printf("shm_segsz:  %zu\n", sid->shm_segsz);
+	printf("shm_atime:  %lu\n", sid->shm_atime);
+	printf("shm_dtime:  %lu\n", sid->shm_dtime);
+	printf("shm_ctime:  %lu\n", sid->shm_ctime);
+	printf("shm_cpid:  %hd\n", sid->shm_cpid);
+	printf("shm_lpid:   %hd\n", sid->shm_lpid);
+	printf("shm_nattch: %lu\n", sid->shm_nattch);
+}

+ 73 - 0
package/libgfaipc/src/shm.h

@@ -0,0 +1,73 @@
+// shm.h :
+//
+
+#if !defined(AGD_SHM_H__AD9FF941_0114_4585_8EF1_0A4ACA7DC0AD__INCLUDED_)
+#define AGD_SHM_H__AD9FF941_0114_4585_8EF1_0A4ACA7DC0AD__INCLUDED_
+
+#include "mutex.h"
+#include "sema.h"
+
+/////////////////////////////////////////////////////////////////////////////
+// shm.h - Declarations:
+
+#ifdef _WIN32
+#define _DEF_SHM_DIR						"."
+#endif	//	_WIN32
+
+#ifdef __linux__
+#define _DEF_SHM_DIR						"/tmp"
+#endif	//	__linux__
+
+/////////////////////////////////////////////////////////////////////////////
+
+class CShm
+{
+public:
+	CShm(void);
+	virtual ~CShm(void);
+
+	int Create(const uuid_t &ruuid, size_t nCbShm, const char *pszDir = _DEF_SHM_DIR);
+	long Release(void);
+
+	void* Attach(const void *pAddr = NULL, int shmflg = 0);
+	void Detach(const void *pAddr);
+	long GetNumAttached(void);
+
+	int Ctl(int cmd);
+	int Ctl(int cmd, struct shmid_ds *pshd);
+	int Ctl(int cmd, struct shminfo *pinfo);
+	int Ctl(int cmd, struct shm_info *pinfo);
+
+	int IpcStat(struct shmid_ds *buf);
+	int IpcInfo(struct shminfo *si);
+	int IpcSet(struct shmid_ds *buf);
+	int IpcRmID(void);
+
+	int ShmStat(int index, struct shmid_ds *buf);
+	int ShmInfo(struct shm_info *pinfo);
+
+	int Lock(void);
+	int Unlock(void);
+
+	const uuid_t& Uuid() const {
+		return m_uuid;}
+
+	long InterlockedIncrement(volatile long *pl);
+	long InterlockedDecrement(volatile long *pl);
+	long InterlockedCompare(volatile long *pl, long comparand);
+	long InterlockedSet(volatile long *pl, long val);
+	long InterlockedClear(volatile long *pl);
+
+	static void DumpIpcPerm(struct ipc_perm *ip);
+	static void DumpShmidDs(struct shmid_ds *sid);
+
+private:
+
+private:
+	int m_nShmID;
+	CGlobalMutex m_mutex;
+	uuid_t m_uuid;
+};
+
+/////////////////////////////////////////////////////////////////////////////
+#endif	//	!defined(AGD_SHM_H__AD9FF941_0114_4585_8EF1_0A4ACA7DC0AD__INCLUDED_)

+ 299 - 0
package/libgfaipc/src/shmrot.cpp

@@ -0,0 +1,299 @@
+#ifdef _WIN32
+#define _CRT_SECURE_NO_WARNINGS
+#define _CRT_NONSTDC_NO_WARNINGS
+#include <windows.h>
+#include <io.h>
+#include "../Win32/w32def.h"
+#endif	//	_WIN32
+
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <unistd.h>
+#ifdef __linux__
+#include <sys/file.h>
+#include <sys/ipc.h>
+#include <sys/sem.h>
+#include <linux/limits.h>
+#include <sys/shm.h>
+#endif	//	__linux__
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include "defines.h"
+#include "shmrot.h"
+
+/////////////////////////////////////////////////////////////////////////////
+
+#define _FILES_DIRECTORY				"/tmp"
+
+/////////////////////////////////////////////////////////////////////////////
+
+#define _SHMROT_ENTRY_FLAG_VALID		0x00000001
+
+/////////////////////////////////////////////////////////////////////////////
+
+// {99df2b86-f904-425d-9fcc-c83c329d0937}
+DEFINE_UUID(GUID_SHMROT, 0x99df2b86, 0xf904, 0x425d, 0x9f, 0xcc, 0xc8, 0x3c, 0x32, 0x9d, 0x09, 0x37);
+
+/////////////////////////////////////////////////////////////////////////////
+
+CShmROT::CShmROT(void)	: m_pTable(NULL)
+{
+}
+
+CShmROT::~CShmROT(void)
+{
+	Release();
+}
+
+bool CShmROT::Create(void)
+{
+	TRACE("CShmROT::Create!\n");
+
+	int nRet = m_shmRot.Create(GUID_SHMROT, sizeof(SHMROT));
+
+	if(	nRet >= 0 &&
+		(m_pTable = (LPSHMROT)m_shmRot.Attach()))
+	{
+		if(nRet == 1)
+		{
+			m_pTable->version		= _ROT_CURRENT_VERSION;
+			m_pTable->maxEntries	= _ROT_MAX_TABLE_ENTRIES;
+			m_pTable->entrySize		= (uint32_t)sizeof(SHMROT_ENTRY);
+
+		}
+		else if(nRet == 0)
+		{
+			if(m_pTable->version != _ROT_CURRENT_VERSION)
+			{
+				// ...
+			}
+		}
+
+		return true;
+	}
+
+	return false;
+}
+
+void CShmROT::Release(void)
+{
+	if(m_pTable)
+	{
+		TRACE("CShmROT::Release!\n");
+		m_shmRot.Detach(m_pTable);
+		m_shmRot.Release();
+		m_pTable = NULL;
+	}
+}
+
+CShm* CShmROT::AcquireShm(const char *pszUuid, size_t nSizeElement, size_t nCntElements, const char *pszDescName)
+{
+	if(!m_pTable)
+	{
+		TRACE("CShmROT::AcquireShm: ROT not initialized!\n");
+		return NULL;
+	}
+
+	uuid_t uuid;
+	CShm *pShm = NULL;
+
+	if(!_uuid_parse(pszUuid, &uuid))
+	{
+		TRACE("CShmROT::AcquireShm: invalid uuid!\n");
+		return NULL;
+	}
+
+	int nIndexFound			= -1;
+	int nFirstUnusedIndex	= -1;
+
+	for(int i = 0; i < (int)m_pTable->maxEntries; i++)
+	{
+		SHMROT_ENTRY &re = m_pTable->rot[i];
+
+		if(re.flags & _SHMROT_ENTRY_FLAG_VALID)
+		{
+			if(!_uuid_compare(&re.uuid, &uuid))
+			{
+				nIndexFound = i;
+				break;
+			}
+		}
+		else if(nFirstUnusedIndex == -1)
+		{
+			nFirstUnusedIndex = i;
+		}
+	}
+
+	if(nIndexFound >= 0) // found existing entry
+	{
+		SHMROT_ENTRY &re = m_pTable->rot[nIndexFound];
+		bool bMatch = (re.nSizeElement == nSizeElement) && (re.nCntElements == nCntElements);
+
+		if(bMatch)
+		{
+			TRACE("CShmROT::AcquireShm: Found matching SHM entry!\n");
+
+			if((pShm = new CShm))
+			{
+				if(pShm->Create(uuid, nSizeElement * nCntElements) < 0)
+				{
+					pShm->Release();
+					delete pShm;
+					pShm = NULL;
+					TRACE("CShmROT::AcquireShm: Failed to create new CShm!\n");
+				}
+				else
+				{
+					re.nCntHandles++;
+				}
+			}
+			else
+			{
+				TRACE("CShmROT::AcquireShm: Failed to allocate new CShm!\n");
+			}
+		}
+		else
+		{
+			TRACE("CShmROT::AcquireShm: SHM uuid exists, but size does not match!\n");
+		}
+	}
+	else if(nFirstUnusedIndex >= 0) // next free slot
+	{
+		TRACE("CShmROT::AcquireShm: Create new SHM entry!\n");
+
+		SHMROT_ENTRY &re = m_pTable->rot[nFirstUnusedIndex];
+
+		if((pShm = new CShm))
+		{
+			if(pShm->Create(uuid, nSizeElement * nCntElements) < 0)
+			{
+				pShm->Release();
+				delete pShm;
+				pShm = NULL;
+				TRACE("CShmROT::AcquireShm: Failed to create new CShm!\n");
+			}
+			else
+			{
+				re.flags		= _SHMROT_ENTRY_FLAG_VALID;
+				re.nSizeElement	= (uint32_t)nSizeElement;
+				re.nCntElements	= (uint32_t)nCntElements;
+				re.nCntHandles	= 1;
+				_uuid_copy(&re.uuid, &uuid);
+				memset(re.szDescName, 0, sizeof(re.szDescName));
+
+				if(pszDescName)
+				{
+					size_t nLen = strlen(pszDescName);
+
+					if(nLen > 0)
+					{
+						if(nLen >= _ROT_MAX_ENTRY_NAME)
+							nLen = _ROT_MAX_ENTRY_NAME - 1;
+						memcpy(re.szDescName, pszDescName, nLen);
+						re.szDescName[nLen] = '\0';
+					}
+				}
+			}
+		}
+		else
+		{
+			TRACE("CShmROT::AcquireShm: Failed to allocate new CShm!\n");
+		}
+	}
+	else
+	{
+		TRACE("CShmROT::AcquireShm: SHM uuid not found and no slot available!\n");
+	}
+
+	return pShm;
+}
+
+void CShmROT::ReleaseShm(CShm *pShm)
+{
+	if(pShm)
+	{
+		const uuid_t &ruuid = pShm->Uuid();
+
+		for(int i = 0; i < (int)m_pTable->maxEntries; i++)
+		{
+			SHMROT_ENTRY &re = m_pTable->rot[i];
+
+			if(!_uuid_compare(&re.uuid, &ruuid))
+			{
+				if(re.flags & _SHMROT_ENTRY_FLAG_VALID)
+				{
+					if(re.nCntHandles > 0)
+						--re.nCntHandles;
+						
+					if(re.nCntHandles == 0)
+						re.flags &= ~_SHMROT_ENTRY_FLAG_VALID;
+				}
+
+				break;
+			}
+		}
+
+		pShm->Release();
+		delete pShm;
+	}
+}
+
+int CShmROT::Lock(void)
+{
+	return m_shmRot.Lock();
+}
+
+int CShmROT::Unlock(void)
+{
+	return m_shmRot.Unlock();
+}
+
+void CShmROT::DumpEntries(CShmHandleMap &map)
+{
+	if(!m_pTable)
+	{
+		printf("CShmROT::DumpEntries: ROT not initialized!\n");
+		return;
+	}
+
+	char szUuid[_UUID_STRING_LEN + 1];
+
+	Lock();
+
+	for(int i = 0; i < (int)m_pTable->maxEntries; i++)
+	{
+		SHMROT_ENTRY &re = m_pTable->rot[i];
+
+		if(re.flags & _SHMROT_ENTRY_FLAG_VALID)
+		{
+			unsigned long nAttached = 0;
+			_uuid_unparse(&re.uuid, szUuid, sizeof(szUuid));
+
+			if(re.nCntHandles > 0)
+			{
+				CShm *pShm = map.LookupShm(re.uuid);
+				if(pShm)
+					nAttached = pShm->GetNumAttached();
+			}
+
+			printf(	"uuid: '%s',\n"						\
+					"    flags:              0x%08x,\n"	\
+					"    size of element:    %u,\n"		\
+					"    number of elements: %u,\n"		\
+					"    name:               '%s',\n"	\
+					"    number of handles:  %u,\n"		\
+					"    number of pointers: %lu\n",
+					szUuid,
+					re.flags,
+					re.nSizeElement,
+					re.nCntElements,
+					re.szDescName,
+					re.nCntHandles,
+					nAttached);
+		}
+	}
+
+	Unlock();
+}

+ 99 - 0
package/libgfaipc/src/shmrot.h

@@ -0,0 +1,99 @@
+// shmrot.h :
+//
+
+#if !defined(AGD_SHMROT_H__58C9857B_4E4E_4AE1_B093_DFECBB85F652__INCLUDED_)
+#define AGD_SHMROT_H__58C9857B_4E4E_4AE1_B093_DFECBB85F652__INCLUDED_
+
+#include "gfaipc.h"
+#include "shm.h"
+
+/////////////////////////////////////////////////////////////////////////////
+// shmrot.h - Declarations:
+
+typedef struct _SHM_HANDLE
+{
+	CShm *pShm;
+}SHM_HANDLE, *LPSHM_HANDLE;
+typedef const SHM_HANDLE *LPCSHM_HANDLE;
+
+/////////////////////////////////////////////////////////////////////////////
+
+#define _IPCSHM_MAX_HANDLES			32
+
+class CShmHandleMap
+{
+public:
+	CShmHandleMap(void);
+	~CShmHandleMap(void);
+
+	HSHM AcquireHandle(CShm *pShm);
+	void ReleaseHandle(HSHM hShm);
+	CShm* LookupShm(const uuid_t &uuid);
+
+private:
+	SHM_HANDLE m_handles[_IPCSHM_MAX_HANDLES];
+};
+
+/////////////////////////////////////////////////////////////////////////////
+
+#define _ROT_MAX_TABLE_ENTRIES			32
+#define _ROT_MAX_ENTRY_NAME				128
+
+#define _ROT_MAKE_VERSION(ma, mi)		(((ma) << 16) | (mi))
+#define _ROT_VERSION_MAJOR(ver)			(((ver) >> 16) & 0x0000FFFF)
+#define _ROT_VERSION_MINOR(ver)			((ver) & 0x0000FFFF)
+#define _ROT_CURRENT_VERSION			_ROT_MAKE_VERSION(1, 0)
+
+/////////////////////////////////////////////////////////////////////////////
+
+typedef struct _SHMROT_ENTRY
+{
+	uuid_t uuid;
+	uint32_t flags;
+	uint32_t nSizeElement;
+	uint32_t nCntElements;
+	uint32_t nCntHandles;
+	uint32_t reserved[4];
+	char szDescName[_ROT_MAX_ENTRY_NAME];
+}SHMROT_ENTRY, *LPSHMROT_ENTRY;
+typedef const SHMROT_ENTRY *LPCSHMROT_ENTRY;
+
+typedef struct _SHMROT
+{
+	uint32_t version;		// major << 16, minor version
+	uint32_t maxEntries;	// sollte _ROT_MAX_TABLE_ENTRIES sein
+	uint32_t entrySize;
+	uint32_t reserved[5];
+	SHMROT_ENTRY rot[_ROT_MAX_TABLE_ENTRIES];
+}SHMROT, *LPSHMROT;
+typedef const SHMROT *LPCSHMROT;
+
+/////////////////////////////////////////////////////////////////////////////
+
+class CShmROT
+{
+public:
+	CShmROT(void);
+	virtual ~CShmROT(void);
+
+	bool Create(void);
+	void Release(void);
+
+	CShm* AcquireShm(const char *pszUuid, size_t nSizeElement, size_t nCntElements, const char *pszDescName);
+	void ReleaseShm(CShm *pShm);
+
+	int Lock(void);
+	int Unlock(void);
+
+	bool Created(void) const {
+		return !!m_pTable;}
+
+	void DumpEntries(CShmHandleMap &map);
+
+private:
+	CShm m_shmRot;
+	LPSHMROT m_pTable;
+};
+
+/////////////////////////////////////////////////////////////////////////////
+#endif	//	!defined(AGD_SHMROT_H__58C9857B_4E4E_4AE1_B093_DFECBB85F652__INCLUDED_)

+ 79 - 0
package/libgfaipc/src/shmstrvar.cpp

@@ -0,0 +1,79 @@
+#include "shmvar.h"
+#include <QDebug>
+
+#define _IS_VALID_VT(vt)		((vt > CShmStringVariable::VT_Invalid) && (vt < CShmStringVariable::VT_Last))
+
+CShmStringVariable::CShmStringVariable(void *pData, size_t nCChData, VT vt, const std::type_info &rti, HSHM hShm, const char *pszName, int nIndex, QObject *pParent)
+{
+	if(!pData || !hShm || !nCChData || !_IS_VALID_VT(vt))
+	{
+		Q_ASSERT_X(false, "CShmStringVariable::CShmStringVariable", "Invalid parameter!");
+		return;
+	}
+
+    m_data.pVoid = pData;
+    m_hShm = hShm;
+    setObjectName(QStringLiteral("CShmVariable"));
+    if((m_nIndex = nIndex) >= 0)
+	{
+		m_varName += QString("%1%2%3").arg('[').arg(nIndex).arg(']');
+	}
+
+    if((rti == typeid(signed char)) || (rti == typeid(unsigned char)))
+    {
+    }
+    else if(rti == typeid(wchar_t))
+	{
+	}
+    else
+	{
+		Q_ASSERT_X(false, "CShmStringVariable::CShmStringVariable", "Unknown data type!");
+	}
+}
+
+CShmStringVariable::~CShmStringVariable(void)
+{
+}
+
+void CShmStringVariable::valRaw(QString &v)
+{
+}
+
+QString CShmStringVariable::val(void)
+{
+}
+
+void CShmStringVariable::setVal(const QString &val)
+{
+}
+
+unsigned long long CShmStringVariable::CheckUpdateShm(bool fLock)
+{
+	return 0;
+}
+
+
+void CShmStringVariable::Lock(void)
+{
+	::GfaIpcLockSHM(m_hShm);
+//	qDebug() << "CShmStringVariable::Lock";
+}
+
+void CShmStringVariable::Unlock(void)
+{
+//	qDebug() << "CShmStringVariable::Unlock";
+	::GfaIpcUnlockSHM(m_hShm);
+}
+
+void CShmStringVariable::emitChanged(bool fLock)
+{
+//    qDebug() << "CShmStringVariable: val changed!";
+	if(fLock)
+	    emit valChanged(val());
+	else
+	{
+	    QString v;
+	    valRaw(v);
+	    emit valChanged(v);
+	}
+}

+ 69 - 0
package/libgfaipc/src/uuid.c

@@ -0,0 +1,69 @@
+#ifdef _WIN32
+#define _CRT_SECURE_NO_WARNINGS
+#include <windows.h>
+#endif	//	_WIN32
+
+#include "uuid.h"
+#include <stdio.h>
+#include <string.h>
+
+DEFINE_UUID(UUID_NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+
+int _uuid_parse(const char *pszIn, uuid_t *uuid)
+{
+	int i, nRet = 0;
+
+	if(pszIn && uuid && strlen(pszIn) == _UUID_STRING_LEN)
+	{
+		int n[8];
+
+		nRet = sscanf(pszIn,
+				"%08x-%04hx-%04hx-%02x%02x-%02x%02x%02x%02x%02x%02x",
+				&uuid->Data1,
+				&uuid->Data2,
+				&uuid->Data3,
+				&n[0], &n[1],
+				&n[2], &n[3], &n[4], &n[5], &n[6], &n[7]);
+
+		if(nRet == 11)
+		{
+			for(i = 0; i < 8; i++)
+			{
+				uuid->Data4[i] = (unsigned char)n[i];
+			}
+		}
+	}
+
+	return nRet == 11;
+}
+
+int _uuid_unparse(const uuid_t *uuid, char *pszOut, size_t nCChOut)
+{
+	if(!uuid || !pszOut || nCChOut <= _UUID_STRING_LEN)
+		return 0;
+
+	return sprintf(pszOut, "%08x-%04hx-%04hx-%02hx%02hx-%02hx%02hx%02hx%02hx%02hx%02hx",
+				uuid->Data1,
+				uuid->Data2,
+				uuid->Data3,
+				uuid->Data4[0], uuid->Data4[1],
+				uuid->Data4[2], uuid->Data4[3], uuid->Data4[4], uuid->Data4[5], uuid->Data4[6], uuid->Data4[7]);
+}
+
+int _uuid_compare(const uuid_t *uuid1, const uuid_t *uuid2)
+{
+	if(uuid1 && uuid2)
+		return memcmp(uuid1, uuid2, sizeof(uuid_t));
+	return 0;
+}
+
+void _uuid_copy(uuid_t *uuDest, const uuid_t *uuSrc)
+{
+	if(uuDest && uuSrc)
+		memcpy(uuDest, uuSrc, sizeof(uuid_t));
+}
+
+int _uuid_is_null(const uuid_t *uuid)
+{
+	return !_uuid_compare(uuid, &UUID_NULL);
+}

+ 49 - 0
package/libgfaipc/src/uuid.h

@@ -0,0 +1,49 @@
+// uuid.h :
+//
+
+#if !defined(AGD_UUID_H__E2CBFDC3_1EA5_4220_8D44_D0C26219B529__INCLUDED_)
+#define AGD_UUID_H__E2CBFDC3_1EA5_4220_8D44_D0C26219B529__INCLUDED_
+
+#include <inttypes.h>
+#include <stdlib.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif	//	__cplusplus
+
+/////////////////////////////////////////////////////////////////////////////
+// uuid.h - Declarations:
+
+#ifdef __linux__
+typedef struct _UUID
+{
+    uint32_t Data1;
+    uint16_t Data2;
+    uint16_t Data3;
+    uint8_t  Data4[8];
+}UUID;
+#define uuid_t UUID
+#endif	//	__linux__
+
+#define DEFINE_UUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
+											const uuid_t name = {l, w1, w2, {b1, b2, b3, b4, b5, b6, b7, b8}}
+
+#define _UUID_STRING_LEN					36
+
+/////////////////////////////////////////////////////////////////////////////
+
+extern const uuid_t UUID_NULL;
+
+/////////////////////////////////////////////////////////////////////////////
+
+int		_uuid_parse		(const char *pszIn, uuid_t *uuid);
+int		_uuid_unparse	(const uuid_t *uuid, char *pszOut, size_t nCChOut);
+int		_uuid_compare	(const uuid_t *uuid1, const uuid_t *uuid2);
+void	_uuid_copy		(uuid_t *uuDest, const uuid_t *uuSrc);
+int		_uuid_is_null	(const uuid_t *uuid);
+
+/////////////////////////////////////////////////////////////////////////////
+#ifdef __cplusplus
+}
+#endif	//	__cplusplus
+#endif	//	!defined(AGD_UUID_H__E2CBFDC3_1EA5_4220_8D44_D0C26219B529__INCLUDED_)

+ 6 - 0
package/libgfatimer/Config.in

@@ -0,0 +1,6 @@
+config BR2_PACKAGE_LIBGFATIMER
+	bool "libgfatimer"
+	default y
+	help
+		libgfatimer component.config BR2_PACKAGE_LIBGFATIMER
+

+ 31 - 0
package/libgfatimer/libgfatimer.mk

@@ -0,0 +1,31 @@
+LIBGFATIMER_VERSION = 1.0.0
+LIBGFATIMER_SITE = ../GfA/package/libgfatimer/src
+LIBGFATIMER_SITE_METHOD = local
+LIBGFATIMER_INSTALL_STAGING = YES
+LIBGFATIMER_INSTALL_TARGET = YES
+
+define LIBGFATIMER_BUILD_CMDS
+	$(MAKE) CC="$(TARGET_CC)" CXX="$(TARGET_CXX)" LD="$(TARGET_LD)" -C $(@D) all
+	$(MAKE) CC="$(TARGET_CC)" CXX="$(TARGET_CXX)" LD="$(TARGET_LD)" -C $(@D) DEBUG=1 all
+endef
+
+define LIBGFATIMER_INSTALL_STAGING_CMDS
+	$(INSTALL) -D -m 0755 $(@D)/Release/libgfatimer.so.1.0.0 $(STAGING_DIR)/usr/lib/libgfatimer.so.1.0.0
+	$(INSTALL) -D -m 0755 $(@D)/Debug/libgfatimerd.so.1.0.0 $(STAGING_DIR)/usr/lib/libgfatimerd.so.1.0.0
+	$(INSTALL) -D -m 0755 $(@D)/gfatimer.h $(STAGING_DIR)/usr/include/gfatimer.h
+	ln -sfn libgfatimer.so.1.0.0 $(STAGING_DIR)/usr/lib/libgfatimer.so.1
+	ln -sfn libgfatimer.so.1 $(STAGING_DIR)/usr/lib/libgfatimer.so
+	ln -sfn libgfatimerd.so.1.0.0 $(STAGING_DIR)/usr/lib/libgfatimerd.so.1
+	ln -sfn libgfatimerd.so.1 $(STAGING_DIR)/usr/lib/libgfatimerd.so
+endef
+
+define LIBGFATIMER_INSTALL_TARGET_CMDS
+	$(INSTALL) -D -m 0755 $(@D)/Release/libgfatimer.so.1.0.0 $(TARGET_DIR)/usr/lib/libgfatimer.so.1.0.0
+	$(INSTALL) -D -m 0755 $(@D)/Debug/libgfatimerd.so.1.0.0 $(TARGET_DIR)/usr/lib/libgfatimerd.so.1.0.0
+	ln -sfn libgfatimer.so.1.0.0 $(TARGET_DIR)/usr/lib/libgfatimer.so.1
+	ln -sfn libgfatimer.so.1 $(TARGET_DIR)/usr/lib/libgfatimer.so
+	ln -sfn libgfatimerd.so.1.0.0 $(TARGET_DIR)/usr/lib/libgfatimerd.so.1
+	ln -sfn libgfatimerd.so.1 $(TARGET_DIR)/usr/lib/libgfatimerd.so
+endef
+
+$(eval $(generic-package))

+ 58 - 0
package/libgfatimer/src/Makefile

@@ -0,0 +1,58 @@
+# (c) R. Russinger GfA 2017,... LGPL v3
+#
+# Makefile for GfA Libraries
+# call with make DEBUG=1 for Debug output
+# output is held in Release or Debug subfolder (folders are created automaticalle)
+# make Variable for foldernames := BINDIR
+#
+#
+DEBUG ?= 0
+        
+_LIBBASENAME=gfatimer
+LIBFILENAME=lib$(LIBBASENAME).so.1.0.0
+
+CFLAGS = -c -pthread -fPIC -Wall -Wno-unused -Wno-unused-label -Wformat -Wuninitialized -Wundef -Wcast-qual -Wwrite-strings -fabi-version=2 -fno-omit-frame-pointer
+CXXFLAGS = -c -pthread -fPIC -Wall -Wno-unused -Wno-unused-label -Wformat -Wuninitialized -Wundef -Wcast-qual -Wwrite-strings -std=c++11 -fabi-version=2 -fno-omit-frame-pointer
+LDFLAGS = -fPIC -shared -L. -lc -pthread
+
+ifeq ($(DEBUG), 1)
+	CFLAGS += -g
+	CXXFLAGS += -g
+	LDFLAGS += -g
+	LIBBASENAME = $(_LIBBASENAME)d
+	BINDIR=Debug
+else
+	CFLAGS += -O3
+	CXXFLAGS += -O3
+	LDFLAGS += -O3
+	LIBBASENAME = $(_LIBBASENAME)
+	BINDIR=Release
+endif
+
+$(shell mkdir -p $(BINDIR) > /dev/null)
+
+TARGET_LIB = $(LIBFILENAME) # target lib
+
+CSRCS =   # source files
+CXXSRCS = timer.cpp gfatimer.cpp # source files
+
+COBJS = $(CSRCS:%.c=$(BINDIR)/%.o)
+CXXOBJS = $(CXXSRCS:%.cpp=$(BINDIR)/%.o)
+
+.PHONY: all
+all: $(BINDIR)/${TARGET_LIB}
+
+$(BINDIR)/$(TARGET_LIB): $(COBJS) $(CXXOBJS)
+	$(CC) ${LDFLAGS} -o $@ $^
+	
+$(CSRCS:%.c=$(BINDIR)/%.d):$(BINDIR)/%.d:%.c
+	$(CC) $(CFLAGS) -MP -MT $(basename $@).o -MMD -MF $@ -o $(basename $@).o $<
+
+$(CXXSRCS:%.cpp=$(BINDIR)/%.dpp):$(BINDIR)/%.dpp:%.cpp
+	$(CXX) $(CXXFLAGS) -MP -MT $(basename $@).o -MMD -MF $@ -o $(basename $@).o $<
+
+include $(CSRCS:%.c=$(BINDIR)/%.d) $(CXXSRCS:%.cpp=$(BINDIR)/%.dpp)
+
+.PHONY: clean
+clean:
+	@rm -rf $(BINDIR)

+ 69 - 0
package/libgfatimer/src/gfatimer.cpp

@@ -0,0 +1,69 @@
+#include "gfatimer.h"
+#include "timer.h"
+
+static CGfaTimer g_gfaTimer;
+
+int GfaTimerInit(int nTimerCount, GfaTimerResolution res)
+{
+	return g_gfaTimer.Initialize(nTimerCount, res);
+}
+
+void GfaTimerRelease(void)
+{
+	g_gfaTimer.Release();
+}
+
+void GfaRegisterTimerCallback(int tnum, pfnTIMERCALLBACK pfnCallback, void *pContext)
+{
+	g_gfaTimer.RegisterTimerCallback(tnum, pfnCallback, pContext);
+}
+
+void GfaRegisterClockPulseCallback(GfaTimerClockPulse cp, pfnPULSECALLBACK pfnCallback, void *pContext)
+{
+	g_gfaTimer.RegisterClockPulseCallback(cp, pfnCallback, pContext);
+}
+
+void GfaUnregisterTimerCallback(int tnum)
+{
+	g_gfaTimer.RegisterTimerCallback(tnum, NULL, NULL);
+}
+
+void GfaUnregisterClockPulseCallback(GfaTimerClockPulse cp)
+{
+	g_gfaTimer.RegisterClockPulseCallback(cp, NULL, NULL);
+}
+
+int tf_test(int tnum)
+{
+	return g_gfaTimer.tf_test(tnum);
+}
+
+void tf_set(int tnum)
+{
+	g_gfaTimer.tf_set(tnum);
+}
+
+void tf_clear(int tnum)
+{
+	g_gfaTimer.tf_clear(tnum);
+}
+
+void tf_store(int tnum, int fset)
+{
+	g_gfaTimer.tf_store(tnum, fset);
+}
+
+unsigned long tw_read(int tnum)
+{
+	return g_gfaTimer.tw_read(tnum);
+}
+
+void tw_set(int tnum, unsigned long val)
+{
+	g_gfaTimer.tw_set(tnum, val);
+}
+
+int cp_test(GfaTimerClockPulse cp)
+{
+	return g_gfaTimer.cp_test(cp);
+}

+ 77 - 0
package/libgfatimer/src/gfatimer.h

@@ -0,0 +1,77 @@
+// gfatimer.h :
+//
+
+#if !defined(AGD_GFATIMER_H__60DC793C_D443_45EB_AD2F_D947862C2060__INCLUDED_)
+#define AGD_GFATIMER_H__60DC793C_D443_45EB_AD2F_D947862C2060__INCLUDED_
+
+#ifdef __cplusplus
+extern "C" {
+#endif	//	__cplusplus
+
+/////////////////////////////////////////////////////////////////////////////
+// gfatimer.h - Declarations:
+
+typedef enum GfaTimerResolution
+{
+	GTR_Invalid,
+	GTR_10ms,
+	GTR_25ms,
+	GTR_50ms,
+	GTR_Last
+	
+}GfaTimerResolution;
+
+/////////////////////////////////////////////////////////////////////////////
+
+typedef enum GfaTimerClockPulse
+{
+	GTCP_Invalid = -1,
+	GTCP_250ms,
+	GTCP_500ms,
+	GTCP_750ms,
+	GTCP_1000ms,
+	GTCP_1500ms,
+	GTCP_2000ms,
+	GTCP_5000ms,
+	GTCP_10000ms,
+	GTCP_Last
+}GfaTimerClockPulse;
+
+/////////////////////////////////////////////////////////////////////////////
+
+typedef void (*pfnTIMERCALLBACK)(int, void*);
+typedef void (*pfnPULSECALLBACK)(GfaTimerClockPulse, int, void*);
+
+/////////////////////////////////////////////////////////////////////////////
+// initialization (if GfaTimerRelease is not called explicitly, clean up will
+// be done internally, if the process exits gracefully)
+
+int				GfaTimerInit(int nTimerCount, GfaTimerResolution res);
+void			GfaTimerRelease(void);
+
+void			GfaRegisterTimerCallback(int tnum, pfnTIMERCALLBACK pfnCallback, void *pContext);
+void			GfaUnregisterTimerCallback(int tnum);
+
+void			GfaRegisterClockPulseCallback(GfaTimerClockPulse cp, pfnPULSECALLBACK pfnCallback, void *pContext);
+void			GfaUnregisterClockPulseCallback(GfaTimerClockPulse cp);
+
+/////////////////////////////////////////////////////////////////////////////
+// mondial legacy timer API
+
+int				tf_test(int tnum);
+void			tf_set(int tnum);
+void			tf_clear(int tnum);
+void			tf_store(int tnum, int fset);
+unsigned long	tw_read(int tnum);
+void			tw_set(int tnum, unsigned long val); // val in milliseconds
+
+/////////////////////////////////////////////////////////////////////////////
+// test clock pulse (see GfaTimerClockPulse enumeration for possible values)
+
+int				cp_test(GfaTimerClockPulse cp);
+
+/////////////////////////////////////////////////////////////////////////////
+#ifdef __cplusplus
+}
+#endif	//	__cplusplus
+#endif	//	!defined(AGD_GFATIMER_H__60DC793C_D443_45EB_AD2F_D947862C2060__INCLUDED_)

+ 66 - 0
package/libgfatimer/src/mutex.h

@@ -0,0 +1,66 @@
+// mutex.h :
+//
+
+#if !defined(AGD_MUTEX_H__307A751D_EF2D_45D6_BBA8_2EB4B79B548D__INCLUDED_)
+#define AGD_MUTEX_H__307A751D_EF2D_45D6_BBA8_2EB4B79B548D__INCLUDED_
+
+#include <inttypes.h>
+#include <stdlib.h>
+#include <pthread.h>
+#include "uuid.h"
+
+/////////////////////////////////////////////////////////////////////////////
+// mutex.h - Declarations:
+
+#ifdef _WIN32
+#define _DEF_MUTEX_DIR						"."
+#endif	//	_WIN32
+
+#ifdef __linux__
+#define _DEF_MUTEX_DIR						"/tmp"
+#endif	//	__linux__
+
+/////////////////////////////////////////////////////////////////////////////
+
+class CGlobalMutex
+{
+public:
+	CGlobalMutex(void);
+	virtual ~CGlobalMutex(void);
+
+	int Create(const uuid_t &ruuid, const char *pszDir = _DEF_MUTEX_DIR);
+	long Release(void);
+
+	bool Lock(void);
+	bool TryLock(void);
+	bool Unlock(void);
+
+private:
+	int m_nShmID;
+	pthread_mutexattr_t m_mutexAttr;
+	pthread_mutex_t *m_pMutex;
+};
+
+/////////////////////////////////////////////////////////////////////////////
+
+class CLocalMutex
+{
+public:
+	CLocalMutex(void);
+	virtual ~CLocalMutex(void);
+
+	bool Create(bool bRecursive = false);
+	void Release(void);
+
+	bool Lock(void);
+	bool TryLock(void);
+	bool Unlock(void);
+
+private:
+	bool m_bInit;
+	pthread_mutexattr_t m_mutexAttr;
+	pthread_mutex_t m_mutex;
+};
+
+/////////////////////////////////////////////////////////////////////////////
+#endif	//	!defined(AGD_MUTEX_H__307A751D_EF2D_45D6_BBA8_2EB4B79B548D__INCLUDED_)

+ 421 - 0
package/libgfatimer/src/timer.cpp

@@ -0,0 +1,421 @@
+/////////////////////////////////////////////////////////////////////////////
+//
+
+#include <time.h>
+#include <errno.h>
+#include "timer.h"
+
+/////////////////////////////////////////////////////////////////////////////
+
+#ifdef _DEBUG
+#define _VALIDATE_TIMER_RET(tnum, ret)		if(!ValidateTimer(tnum, __FUNCTION__)) return (ret)
+#define _VALIDATE_TIMER_VOID(tnum)			if(!ValidateTimer(tnum, __FUNCTION__)) return
+#define TRACE								printf
+#else	//	_DEBUG
+#define _VALIDATE_TIMER_RET(tnum, ret)
+#define _VALIDATE_TIMER_VOID(tnum)
+#define TRACE(...)
+#endif	//	_DEBUG
+
+#define _GFA_DEFAULT_TIMER_COUNT			32
+#define _GFA_MAX_TIMER_COUNT				256
+#define _COUNTOF(a)							(sizeof(a) / sizeof(*a))
+#define _INVALID_THREAD_ID					0
+#define _NANOSECS_PER_SEC					1000000000
+
+/////////////////////////////////////////////////////////////////////////////
+
+const int CGfaTimer::m_nPulseFreq[GTCP_Last] = {250, 500, 750, 1000, 1500, 2000, 5000, 10000};
+
+/////////////////////////////////////////////////////////////////////////////
+
+CGfaTimer::CGfaTimer(void) : m_pTimer(NULL), m_nTimerCount(0), m_nTimerIncrement(0), m_nClockCount(0), m_nClockPulse(0), m_threadID(_INVALID_THREAD_ID), m_bProcessTimers(false)
+{
+	memset(&m_timInterval, 0, sizeof(m_timInterval));
+	memset(m_ClkPulseCallbackTable, 0, sizeof(m_ClkPulseCallbackTable));
+
+	if(!m_mutex.Create(true))
+	{
+		TRACE("CGfaTimer::CGfaTimer: failed to create mutex!\n");
+		throw -1;
+	}
+}
+
+CGfaTimer::~CGfaTimer(void)
+{
+	Release();
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+int CGfaTimer::Initialize(int nTimerCount, GfaTimerResolution res)
+{
+	if(!m_pTimer)
+	{
+		if(nTimerCount == 0)
+			nTimerCount = _GFA_DEFAULT_TIMER_COUNT;
+		else if(nTimerCount < 0)
+		{
+			TRACE("CGfaTimer::Initialize: invalid timer count: %d!\n", nTimerCount);
+			return 0;
+		}
+		else if(nTimerCount > _GFA_MAX_TIMER_COUNT)
+			nTimerCount = _GFA_MAX_TIMER_COUNT;
+
+		switch(res)
+		{
+		case GTR_10ms:
+			m_timInterval.tv_sec	= 0;
+			m_timInterval.tv_nsec	= 10000000;
+			m_nTimerIncrement		= 10;
+			break;
+		case GTR_25ms:
+			m_timInterval.tv_sec	= 0;
+			m_timInterval.tv_nsec	= 25000000;
+			m_nTimerIncrement		= 25;
+			break;
+		case GTR_50ms:
+			m_timInterval.tv_sec	= 0;
+			m_timInterval.tv_nsec	= 50000000;
+			m_nTimerIncrement		= 50;
+			break;
+		default:
+			TRACE("CGfaTimer::Initialize: invalid timer resolution: %d!\n", (int)res);
+			return 0;
+		}
+
+		m_pTimer = new GFA_TIMER[nTimerCount];
+		memset(m_pTimer, 0, sizeof(GFA_TIMER) * nTimerCount);
+		m_nTimerCount = nTimerCount;
+		m_bProcessTimers = true;
+
+		if(::pthread_create(&m_threadID, NULL, &CGfaTimer::LordOfTheTimers, reinterpret_cast<void*>(this)))
+		{
+			TRACE("CGfaTimer::Initialize: Failed to create timer thread!\n");
+			Release();
+		}
+
+		TRACE("CGfaTimer::Initialize: Success!\n");
+	}
+	else
+	{
+		TRACE("CGfaTimer::Initialize: Already initialized!\n");
+	}
+
+	return m_nTimerCount;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+void CGfaTimer::Release(void)
+{
+	if(m_pTimer)
+	{
+		m_mutex.Lock();
+		if(m_threadID != _INVALID_THREAD_ID)
+		{
+			m_bProcessTimers = false;
+			m_mutex.Unlock();
+			::pthread_join(m_threadID, NULL);
+			m_mutex.Lock();
+			m_threadID = _INVALID_THREAD_ID;
+		}
+
+		m_nTimerCount = m_nTimerIncrement = m_nClockCount = m_nClockPulse = 0;
+		delete [] m_pTimer;
+		m_pTimer = NULL;
+		m_mutex.Unlock();
+		TRACE("CGfaTimer::Release: Timer released.\n");
+	}
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+void CGfaTimer::RegisterTimerCallback(int tnum, pfnTIMERCALLBACK pfnCallback, void *pContext)
+{
+	_VALIDATE_TIMER_VOID(tnum);
+	if(pfnCallback)
+	{
+		m_mutex.Lock();
+	    m_pTimer[tnum].pfnCallback		= pfnCallback;
+    	m_pTimer[tnum].pContext			= pContext;
+    	m_pTimer[tnum].bCallScheduled	= false;
+		m_mutex.Unlock();
+		TRACE("CGfaTimer::RegisterTimerCallback: Timer %d - callback: %p, context: %p.\n", tnum, pfnCallback, pContext);
+    }
+    else
+	{
+		m_mutex.Lock();
+	    m_pTimer[tnum].pfnCallback		= NULL;
+    	m_pTimer[tnum].pContext			= NULL;
+    	m_pTimer[tnum].bCallScheduled	= false;
+		m_mutex.Unlock();
+		TRACE("CGfaTimer::RegisterTimerCallback: Timer %d - Unregister callback.\n", tnum);
+	}
+}
+
+void CGfaTimer::RegisterClockPulseCallback(GfaTimerClockPulse cp, pfnPULSECALLBACK pfnCallback, void *pContext)
+{
+	if(cp <= GTCP_Invalid || cp >= GTCP_Last)
+	{
+		TRACE("CGfaTimer::RegisterClockPulseCallback: invalid clock pulse %d!\n", cp);
+		return;
+	}
+	
+	if(pfnCallback)
+	{
+		m_mutex.Lock();
+		m_ClkPulseCallbackTable[cp].pfnCallback	= pfnCallback;
+		m_ClkPulseCallbackTable[cp].pContext	= pContext;
+		m_mutex.Unlock();
+		TRACE("CGfaTimer::RegisterClockPulseCallback:  Clock pulse %dms: Register callback: %p, context: %p.\n", CGfaTimer::m_nPulseFreq[cp], pfnCallback, pContext);
+	}
+	else
+	{
+		m_mutex.Lock();
+		m_ClkPulseCallbackTable[cp].pfnCallback	= NULL;
+		m_ClkPulseCallbackTable[cp].pContext	= NULL;
+		m_mutex.Unlock();
+		TRACE("CGfaTimer::RegisterClockPulseCallback: Clock pulse %dms: Unregister callback.\n", CGfaTimer::m_nPulseFreq[cp]);
+	}
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+bool CGfaTimer::ValidateTimer(int tnum, const char *pszCaller)
+{
+	if(!m_pTimer)
+	{
+		TRACE("%s: Timer not initialized!\n", pszCaller);
+		return false;
+	}
+
+	if((tnum < 0) || (tnum >= m_nTimerCount))
+	{
+		TRACE("%s: Invalid Timer number: %d\n", pszCaller, tnum);
+		return false;
+	}
+
+	return true;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+int CGfaTimer::tf_test(int tnum)
+{
+	_VALIDATE_TIMER_RET(tnum, 0);
+	m_mutex.Lock();
+    int nRet = m_pTimer[tnum].tf;
+	m_mutex.Unlock();
+	return nRet;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+void CGfaTimer::tf_set(int tnum)
+{
+	_VALIDATE_TIMER_VOID(tnum);
+	m_mutex.Lock();
+	m_pTimer[tnum].tf = 1;
+	m_mutex.Unlock();
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+void CGfaTimer::tf_clear(int tnum)
+{
+	_VALIDATE_TIMER_VOID(tnum);
+	m_mutex.Lock();
+	m_pTimer[tnum].tf = 0;
+	m_mutex.Unlock();
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+void CGfaTimer::tf_store(int tnum, int fset)
+{
+	_VALIDATE_TIMER_VOID(tnum);
+	if(fset)
+	{
+		m_mutex.Lock();
+		m_pTimer[tnum].tf = 1;
+		m_mutex.Unlock();
+	}
+	else
+	{
+		m_mutex.Lock();
+		m_pTimer[tnum].tf = 0;
+		m_mutex.Unlock();
+	}
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+unsigned long CGfaTimer::tw_read(int tnum)
+{
+	_VALIDATE_TIMER_RET(tnum, 0);
+	m_mutex.Lock();
+    unsigned long nRet = m_pTimer[tnum].tw;
+	m_mutex.Unlock();
+	return nRet;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+void CGfaTimer::tw_set(int tnum, unsigned long val)
+{
+	_VALIDATE_TIMER_VOID(tnum);
+	m_mutex.Lock();
+    m_pTimer[tnum].tw = val;
+	m_mutex.Unlock();
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+int CGfaTimer::cp_test(GfaTimerClockPulse cp)
+{
+	if(cp > GTCP_Invalid && cp < GTCP_Last)
+	{
+		return !!(m_nClockPulse & (0x00000001 << cp));
+	}
+
+	TRACE("CGfaTimer::cp_test: Invalid clock pulse: %d.\n", (int)cp);
+	return 0;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+void CGfaTimer::AddTimeSpecs(const struct timespec &ts1, const struct timespec &ts2, struct timespec &tsResult)
+{
+	long ns = ts1.tv_nsec + ts2.tv_nsec;
+	tsResult.tv_sec = ts1.tv_sec + ts2.tv_sec + (time_t)ns / _NANOSECS_PER_SEC;
+	tsResult.tv_nsec = ns % _NANOSECS_PER_SEC;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////
+
+void* CGfaTimer::LordOfTheTimers(void *pParam)
+{
+	int nRet;
+	struct timespec tsDueTime;
+	CGfaTimer* pSelf = reinterpret_cast<CGfaTimer*>(pParam);
+	TRACE("CGfaTimer::LordOfTheTimers: thread enter.\n");
+
+	::clock_gettime(CLOCK_MONOTONIC, &tsDueTime);
+
+	/////////////////////////////////////////////////////////////////////////
+	// enter loop
+
+	do
+	{
+		/////////////////////////////////////////////////////////////////////
+
+		CGfaTimer::AddTimeSpecs(tsDueTime, pSelf->m_timInterval, tsDueTime);
+
+		if((nRet = ::clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &tsDueTime, NULL)))
+		{
+			while(nRet && (errno == EINTR))
+			{
+				errno = 0;
+				nRet = ::clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &tsDueTime, NULL);
+			}
+		}
+		/////////////////////////////////////////////////////////////////////
+
+		for(int i = 0; i < pSelf->m_nTimerCount; i++)
+		{
+			GFA_TIMER &rt = pSelf->m_pTimer[i];
+
+			pSelf->m_mutex.Lock();
+            if(rt.tf)
+            {
+                if(rt.tw > pSelf->m_nTimerIncrement)
+                	rt.tw -= pSelf->m_nTimerIncrement;
+                else if(rt.tw)
+                {
+                	rt.tw = 0;
+                	if(rt.pfnCallback)
+                		rt.bCallScheduled = true;
+                }
+            }
+            else if(rt.tw)
+            {
+                rt.tw = 0;
+            }
+			pSelf->m_mutex.Unlock();
+		}
+
+		/////////////////////////////////////////////////////////////////////
+		// process clock pulses
+
+		pSelf->m_mutex.Lock();
+		bool bDoCallbacks = false;
+		unsigned long nPrevClockPulse = pSelf->m_nClockPulse;
+		unsigned long nScheduled;
+		pSelf->m_nClockCount += pSelf->m_nTimerIncrement;
+
+		if(!(pSelf->m_nClockCount % CGfaTimer::m_nPulseFreq[0]))
+		{
+			unsigned long nPulseMask = 1;
+			pSelf->m_nClockPulse ^= nPulseMask;
+
+			for(int i = 1; i < GTCP_Last; i++)
+			{
+				nPulseMask <<= 1;
+
+				if(!(pSelf->m_nClockCount % CGfaTimer::m_nPulseFreq[i]))
+				{
+					pSelf->m_nClockPulse ^= nPulseMask;
+				}
+			}
+
+			bDoCallbacks	= true;
+			nScheduled		= pSelf->m_nClockPulse ^ nPrevClockPulse;
+		}
+
+		pSelf->m_mutex.Unlock();
+
+		/////////////////////////////////////////////////////////////////////
+		// call clock pulse callbacks
+		
+		if(bDoCallbacks)
+		{
+			unsigned long nPulseMask	= 1;
+
+			for(int i = GTCP_250ms; i < GTCP_Last; i++, nPulseMask <<= 1)
+			{
+				pSelf->m_mutex.Lock();
+				pfnPULSECALLBACK pfnCallback = pSelf->m_ClkPulseCallbackTable[i].pfnCallback;
+				void *pContext = pSelf->m_ClkPulseCallbackTable[i].pContext;
+				int nState = !!(pSelf->m_nClockPulse & nPulseMask);
+				pSelf->m_mutex.Unlock();
+				
+				if(pfnCallback && (nScheduled & nPulseMask))
+				{
+					(*pfnCallback)((GfaTimerClockPulse)i, nState, pContext);
+				}
+			}
+		}
+
+		/////////////////////////////////////////////////////////////////////
+		// process timer callbacks
+
+		for(int i = 0; i < pSelf->m_nTimerCount; i++)
+		{
+			GFA_TIMER &rt = pSelf->m_pTimer[i];
+
+			pSelf->m_mutex.Lock();
+            if(rt.pfnCallback && rt.tf && rt.bCallScheduled && !rt.tw)
+            {
+            	rt.bCallScheduled = false;
+				(*rt.pfnCallback)(i, rt.pContext);
+            }
+			pSelf->m_mutex.Unlock();
+		}
+	}
+	while(pSelf->m_bProcessTimers);
+
+	TRACE("CGfaTimer::LordOfTheTimers: thread exit.\n");
+	return NULL;
+}

+ 74 - 0
package/libgfatimer/src/timer.h

@@ -0,0 +1,74 @@
+// timer.h :
+//
+
+#if !defined(AGD_TIMER_H__039EAF1D_4D42_44F5_9CAD_437128DA1BA9__INCLUDED_)
+#define AGD_TIMER_H__039EAF1D_4D42_44F5_9CAD_437128DA1BA9__INCLUDED_
+
+#include <stdio.h>
+#include <string.h>
+#include "mutex.h"
+#include "gfatimer.h"
+
+/////////////////////////////////////////////////////////////////////////////
+// timer.h - Declarations:
+
+typedef struct _GFA_TIMER
+{
+    int tf;
+    unsigned long tw;
+    pfnTIMERCALLBACK pfnCallback;
+    void *pContext;
+    bool bCallScheduled;
+}GFA_TIMER, *LPGFA_TIMER;
+typedef const GFA_TIMER *LPCGFA_TIMER;
+
+typedef struct _GFA_TIMER_PULSE_CALLBACK
+{
+    pfnPULSECALLBACK pfnCallback;
+    void *pContext;
+}GFA_TIMER_PULSE_CALLBACK, *LPGFA_TIMER_PULSE_CALLBACK;
+typedef const GFA_TIMER_PULSE_CALLBACK *LPCGFA_TIMER_PULSE_CALLBACK;
+
+/////////////////////////////////////////////////////////////////////////////
+
+class CGfaTimer
+{
+public:
+	CGfaTimer(void);
+	~CGfaTimer(void);
+
+	int Initialize(int nTimerCount, GfaTimerResolution res);
+	void Release(void);
+	void RegisterTimerCallback(int tnum, pfnTIMERCALLBACK pfnCallback, void *pContext);
+	void RegisterClockPulseCallback(GfaTimerClockPulse cp, pfnPULSECALLBACK pfnCallback, void *pContext);
+
+	int tf_test(int tnum);
+	void tf_set(int tnum);
+	void tf_clear(int tnum);
+	void tf_store(int tnum, int fset);
+	unsigned long tw_read(int tnum);
+	void tw_set(int tnum, unsigned long val);
+
+	int cp_test(GfaTimerClockPulse cp);
+
+private:
+	bool ValidateTimer(int tnum, const char *pszCaller);
+	static void* LordOfTheTimers(void *pParam);
+	static void AddTimeSpecs(const struct timespec &ts1, const struct timespec &ts2, struct timespec &tsResult);
+
+private:
+	LPGFA_TIMER m_pTimer;
+	int m_nTimerCount;
+	unsigned long m_nTimerIncrement;
+	unsigned long long m_nClockCount;
+	unsigned long m_nClockPulse;
+	CLocalMutex m_mutex;
+    pthread_t m_threadID;
+    struct timespec m_timInterval;
+    bool m_bProcessTimers;
+    static const int m_nPulseFreq[];
+    GFA_TIMER_PULSE_CALLBACK m_ClkPulseCallbackTable[GTCP_Last];
+};
+
+/////////////////////////////////////////////////////////////////////////////
+#endif	//	!defined(AGD_TIMER_H__039EAF1D_4D42_44F5_9CAD_437128DA1BA9__INCLUDED_)

+ 49 - 0
package/libgfatimer/src/uuid.h

@@ -0,0 +1,49 @@
+// uuid.h :
+//
+
+#if !defined(AGD_UUID_H__E2CBFDC3_1EA5_4220_8D44_D0C26219B529__INCLUDED_)
+#define AGD_UUID_H__E2CBFDC3_1EA5_4220_8D44_D0C26219B529__INCLUDED_
+
+#include <inttypes.h>
+#include <stdlib.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif	//	__cplusplus
+
+/////////////////////////////////////////////////////////////////////////////
+// uuid.h - Declarations:
+
+#ifdef __linux__
+typedef struct _UUID
+{
+    uint32_t Data1;
+    uint16_t Data2;
+    uint16_t Data3;
+    uint8_t  Data4[8];
+}UUID;
+#define uuid_t UUID
+#endif	//	__linux__
+
+#define DEFINE_UUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
+											const uuid_t name = {l, w1, w2, {b1, b2, b3, b4, b5, b6, b7, b8}}
+
+#define _UUID_STRING_LEN					36
+
+/////////////////////////////////////////////////////////////////////////////
+
+extern const uuid_t UUID_NULL;
+
+/////////////////////////////////////////////////////////////////////////////
+
+int		_uuid_parse		(const char *pszIn, uuid_t *uuid);
+int		_uuid_unparse	(const uuid_t *uuid, char *pszOut, size_t nCChOut);
+int		_uuid_compare	(const uuid_t *uuid1, const uuid_t *uuid2);
+void	_uuid_copy		(uuid_t *uuDest, const uuid_t *uuSrc);
+int		_uuid_is_null	(const uuid_t *uuid);
+
+/////////////////////////////////////////////////////////////////////////////
+#ifdef __cplusplus
+}
+#endif	//	__cplusplus
+#endif	//	!defined(AGD_UUID_H__E2CBFDC3_1EA5_4220_8D44_D0C26219B529__INCLUDED_)

+ 21 - 0
package/liborcania/0001-makefile.patch

@@ -0,0 +1,21 @@
+diff -pruN a/src/Makefile b/src/Makefile
+--- a/src/Makefile	2018-01-03 16:03:08.000000000 +0100
++++ b/src/Makefile	2018-01-17 11:19:54.387542091 +0100
+@@ -18,8 +18,7 @@
+ # You should have received a copy of the GNU General Public
+ # License along with this library.	If not, see <http://www.gnu.org/licenses/>.
+ #
+-PREFIX=/usr/local
+-CC=gcc
++PREFIX=/usr
+ CFLAGS=-c -fPIC -Wall -D_REENTRANT $(ADDITIONALFLAGS) $(JANSSONFLAG)
+ OUTPUT=liborcania.so
+ VERSION=1.1.1
+@@ -54,7 +53,6 @@ clean:
+ install: all
+ 	cp $(OUTPUT).$(VERSION) $(PREFIX)/lib
+ 	cp orcania.h $(PREFIX)/include
+-	-ldconfig
+ 
+ static-install: static
+ 	cp liborcania.a $(PREFIX)/lib

+ 5 - 0
package/liborcania/Config.in

@@ -0,0 +1,5 @@
+config BR2_PACKAGE_LIBORCANIA
+	bool "liborcania"
+	help
+		liborcania V 1.1.1
+

+ 23 - 0
package/liborcania/liborcania.mk

@@ -0,0 +1,23 @@
+LIBORCANIA_VERSION = 4b908eea87f59130ee672881e88ec4b9d5b49ccc
+INST_VERSION = 1.1.1
+LIBORCANIA_SITE = https://github.com/babelouest/orcania.git
+LIBORCANIA_SITE_METHOD = git
+LIBORCANIA_INSTALL_STAGING = YES
+LIBORCANIA_INSTALL_TARGET = YES
+
+define LIBORCANIA_BUILD_CMDS
+	$(MAKE) CC="$(TARGET_CC)" CXX="$(TARGET_CXX)" LD="$(TARGET_LD)" -C $(@D) all
+endef
+
+define LIBORCANIA_INSTALL_STAGING_CMDS
+	$(INSTALL) -D -m 0755 $(@D)/src/liborcania.so.$(INST_VERSION) $(STAGING_DIR)/usr/lib/liborcania.so.$(INST_VERSION)
+	cp -d $(@D)/src/liborcania.so $(STAGING_DIR)/usr/lib/liborcania.so
+	cp -d $(@D)/src/orcania.h $(STAGING_DIR)/usr/include
+endef
+
+define LIBORCANIA_INSTALL_TARGET_CMDS
+	$(INSTALL) -D -m 0755 $(@D)/src/liborcania.so.$(INST_VERSION) $(TARGET_DIR)/usr/lib/liborcania.so.$(INST_VERSION)
+	cp -d $(@D)/src/liborcania.so $(TARGET_DIR)/usr/lib/liborcania.so
+endef
+
+$(eval $(generic-package))

+ 35 - 0
package/libulfius/0001-makefile.patch

@@ -0,0 +1,35 @@
+Binärdateien a/src/libulfius.so und b/src/libulfius.so sind verschieden.
+Binärdateien a/src/libulfius.so.2.2.4 und b/src/libulfius.so.2.2.4 sind verschieden.
+diff -pruN a/src/Makefile b/src/Makefile
+--- a/src/Makefile	2018-01-16 23:17:38.000000000 +0100
++++ b/src/Makefile	2018-01-17 13:30:28.881587726 +0100
+@@ -19,12 +19,9 @@
+ # License along with this library.	If not, see <http://www.gnu.org/licenses/>.
+ #
+ 
+-LIBORCANIA_LOCATION=../lib/orcania/src
+-LIBYDER_LOCATION=../lib/yder/src
+-PREFIX=/usr/local
+-CC=gcc
+-CFLAGS=-c -pedantic -std=gnu99 -fPIC -Wall -D_REENTRANT -I$(PREFIX)/include -I$(LIBORCANIA_LOCATION) -I$(LIBYDER_LOCATION) $(ADDITIONALFLAGS) $(JANSSONFLAG) $(CURLFLAG) $(WEBSOCKETFLAG)
+-LIBS=-L$(PREFIX)/lib -L$(LIBORCANIA_LOCATION) -L$(LIBYDER_LOCATION) -lc -lmicrohttpd -lyder -lorcania -lpthread
++PREFIX=/usr
++CFLAGS=-c -pedantic -std=gnu99 -fPIC -Wall -D_REENTRANT $(ADDITIONALFLAGS) $(JANSSONFLAG) $(CURLFLAG) $(WEBSOCKETFLAG)
++LIBS= -lc -lmicrohttpd -lyder -lorcania -lpthread
+ OUTPUT=libulfius.so
+ VERSION=2.2.4
+ 
+@@ -73,7 +70,6 @@ clean:
+ install: all
+ 	cp $(OUTPUT).$(VERSION) $(PREFIX)/lib
+ 	cp ulfius.h $(PREFIX)/include
+-	-ldconfig
+ 
+ static-install: static
+ 	cp libulfius.a $(PREFIX)/lib
+Binärdateien a/src/ulfius.o und b/src/ulfius.o sind verschieden.
+Binärdateien a/src/u_map.o und b/src/u_map.o sind verschieden.
+Binärdateien a/src/u_request.o und b/src/u_request.o sind verschieden.
+Binärdateien a/src/u_response.o und b/src/u_response.o sind verschieden.
+Binärdateien a/src/u_send_request.o und b/src/u_send_request.o sind verschieden.
+Binärdateien a/src/u_websocket.o und b/src/u_websocket.o sind verschieden.

+ 7 - 0
package/libulfius/Config.in

@@ -0,0 +1,7 @@
+config BR2_PACKAGE_LIBULFIUS
+	bool "libulfius"
+	select BR2_PACKAGE_LIBORCANIA
+	select BR2_PACKAGE_LIBYDER
+	help
+		libulfius V 2.2.4
+

+ 25 - 0
package/libulfius/libulfius.mk

@@ -0,0 +1,25 @@
+LIBULFIUS_VERSION = fca4261026a9bfc1963a16eee2607883aa08bd27
+ULFIUS_INST_VERSION = 2.2.4
+LIBULFIUS_SITE = https://github.com/babelouest/ulfius.git
+LIBULFIUS_SITE_METHOD = git
+LIBULFIUS_INSTALL_STAGING = YES
+LIBULFIUS_INSTALL_TARGET = YES
+
+LIBULFIUS_DEPENDENCIES = libyder
+
+define LIBULFIUS_BUILD_CMDS
+	$(MAKE) CC="$(TARGET_CC)" CXX="$(TARGET_CXX)" LD="$(TARGET_LD)" -C $(@D) all
+endef
+
+define LIBULFIUS_INSTALL_STAGING_CMDS
+	$(INSTALL) -D -m 0755 $(@D)/src/libulfius.so.$(ULFIUS_INST_VERSION) $(STAGING_DIR)/usr/lib/libulfius.so.$(ULFIUS_INST_VERSION)
+	cp -d $(@D)/src/libulfius.so $(STAGING_DIR)/usr/lib/libulfius.so
+	cp -d $(@D)/src/ulfius.h $(STAGING_DIR)/usr/include
+endef
+
+define LIBULFIUS_INSTALL_TARGET_CMDS
+	$(INSTALL) -D -m 0755 $(@D)/src/libulfius.so.$(ULFIUS_INST_VERSION) $(TARGET_DIR)/usr/lib/libulfius.so.$(ULFIUS_INST_VERSION)
+	cp -d $(@D)/src/libulfius.so $(TARGET_DIR)/usr/lib/libulfius.so
+endef
+
+$(eval $(generic-package))

+ 24 - 0
package/libyder/0001-makefile.patch

@@ -0,0 +1,24 @@
+Binärdateien a/src/libyder.so und b/src/libyder.so sind verschieden.
+Binärdateien a/src/libyder.so.1.1.1 und b/src/libyder.so.1.1.1 sind verschieden.
+diff -pruN a/src/Makefile b/src/Makefile
+--- a/src/Makefile	2018-01-16 22:41:22.000000000 +0100
++++ b/src/Makefile	2018-01-17 12:50:56.030845423 +0100
+@@ -18,8 +18,7 @@
+ # You should have received a copy of the GNU General Public
+ # License along with this library.	If not, see <http://www.gnu.org/licenses/>.
+ #
+-PREFIX=/usr/local
+-CC=gcc
++PREFIX=/usr
+ CFLAGS=-c -fPIC -Wall -D_REENTRANT $(ADDITIONALFLAGS)
+ LIBS=-lc -lorcania
+ OUTPUT=libyder.so
+@@ -43,7 +42,6 @@ clean:
+ install: all
+ 	cp $(OUTPUT).$(VERSION) $(PREFIX)/lib
+ 	cp yder.h $(PREFIX)/include
+-	-ldconfig
+ 
+ static-install: static
+ 	cp libyder.a $(PREFIX)/lib
+Binärdateien a/src/yder.o und b/src/yder.o sind verschieden.

+ 6 - 0
package/libyder/Config.in

@@ -0,0 +1,6 @@
+config BR2_PACKAGE_LIBYDER
+	bool "libyder"
+	select BR2_PACKAGE_LIBORCANIA
+	help
+		liborcania component.config V 1.1.1
+

+ 24 - 0
package/libyder/libyder.mk

@@ -0,0 +1,24 @@
+LIBYDER_VERSION = fdcf30db62f1debdecf7fa6106de4883cdb0631c
+INST_VERSION = 1.1.1
+LIBYDER_SITE = https://github.com/babelouest/yder.git
+LIBYDER_SITE_METHOD = git
+LIBYDER_INSTALL_STAGING = YES
+LIBYDER_INSTALL_TARGET = YES
+
+LIBYDER_DEPENDENCIES = liborcania
+define LIBYDER_BUILD_CMDS
+	$(MAKE) CC="$(TARGET_CC)" CXX="$(TARGET_CXX)" LD="$(TARGET_LD)" -C $(@D) all
+endef
+
+define LIBYDER_INSTALL_STAGING_CMDS
+	$(INSTALL) -D -m 0755 $(@D)/src/libyder.so.$(INST_VERSION) $(STAGING_DIR)/usr/lib/libyder.so.$(INST_VERSION)
+	cp -d $(@D)/src/libyder.so $(STAGING_DIR)/usr/lib/libyder.so
+	cp -d $(@D)/src/yder.h $(STAGING_DIR)/usr/include
+endef
+
+define LIBYDER_INSTALL_TARGET_CMDS
+	$(INSTALL) -D -m 0755 $(@D)/src/libyder.so.$(INST_VERSION) $(TARGET_DIR)/usr/lib/libyder.so.$(INST_VERSION)
+	cp -d $(@D)/src/libyder.so $(TARGET_DIR)/usr/lib/libyder.so
+endef
+
+$(eval $(generic-package))

+ 4 - 0
package/python-ufw/Config.in

@@ -0,0 +1,4 @@
+config BR2_PACKAGE_PYTHON_UFW
+	bool "python-ufw"
+	help
+	  UFW uncomplicated fore wall

+ 32 - 0
package/python-ufw/python-ufw.mk

@@ -0,0 +1,32 @@
+################################################################################
+#
+# python-ufw
+#
+################################################################################
+
+PYTHON_UFW_VERSION = 0.35
+PYTHON_UFW_SOURCE = ufw-$(PYTHON_UFW_VERSION).tar.gz
+PYTHON_UFW_SITE = https://launchpad.net/ufw/0.35/0.35/+download
+#PYTHON_UFW_LICENSE = MIT
+#PYTHON_UFW_LICENSE_FILES = LICENSE
+PYTHON_UFW_SETUP_TYPE = distutils
+
+define PYTHON_UFW_BUILD_CMDS
+	cd $(PYTHON_UFW_BUILDDIR); \
+	$(PYTHON_UFW_PYTHON_INTERPRETER) setup.py build -f
+
+	cd $(PYTHON_UFW_BUILDDIR); \
+	rm -rf ./SETUP;\
+	mkdir ./SETUP; \
+	$(PYTHON_UFW_PYTHON_INTERPRETER) setup.py install -f --home=$(PYTHON_UFW_BUILDDIR)/SETUP
+
+	sed -i -e 1c"#! /usr/bin/env /usr/bin/python " $(PYTHON_UFW_BUILDDIR)/SETUP/usr/sbin/ufw
+endef
+
+define PYTHON_UFW_INSTALL_TARGET_CMDS
+	echo "================>"; \
+	cd $(PYTHON_UFW_BUILDDIR)/SETUP; \
+	cp -av * $(TARGET_DIR)
+endef
+
+$(eval $(python-package))

+ 4 - 0
package/qmlplugins/Config.in

@@ -0,0 +1,4 @@
+config BR2_PACKAGE_QMLPLUGINS
+	bool "qmlplugins"
+	help
+		qmlplugins GfA QML Plugins 

BIN
package/qmlplugins/GFAQMLPlugins.tar.gz


+ 19 - 0
package/qmlplugins/qmlplugins.mk

@@ -0,0 +1,19 @@
+QMLPLUGINS_VERSION = 1.0.0
+QMLPLUGINS_SITE = ../GfA/package/qmlplugins
+QMLPLUGINS_SITE_METHOD = local
+QMLPLUGINS_INSTALL_STAGING = YES
+QMLPLUGINS_INSTALL_TARGET = YES
+
+define QMLPLUGINS_BUILD_CMDS
+	echo "GfA plugins installer"
+endef
+
+define QMLPLUGINS_INSTALL_STAGING_CMDS
+	tar -C $(STAGING_DIR) -xzvf $(@D)/GFAQMLPlugins.tar.gz
+endef
+
+define QMLPLUGINS_INSTALL_TARGET_CMDS
+	tar -C $(TARGET_DIR) -xzvf $(@D)/GFAQMLPlugins.tar.gz
+endef
+
+$(eval $(generic-package))