diff --git a/doc/src/platforms/supported-platforms.qdocinc b/doc/src/platforms/supported-platforms.qdocinc index 28253eed014bf8bc79e87a043c102a9cc65f14e8..26d9c64b0126ffd4d4b7de888c31e9ad33821cfe 100644 --- a/doc/src/platforms/supported-platforms.qdocinc +++ b/doc/src/platforms/supported-platforms.qdocinc @@ -89,7 +89,8 @@ Mobile Platforms: \l {Qt for Android}{Android}, \li \row \li {3,1} \header \li {3,1} - Embedded Platforms: \l {Qt for Embedded Linux}{Embedded Linux}, \l {QNX}, \l {INTEGRITY} + Embedded Platforms: \l {Qt for Embedded Linux}{Embedded Linux}, \l {QNX}, \l {INTEGRITY}, + \l{Qt for VxWorks}{VxWorks} \row \li \l {Qt for Embedded Linux}{Embedded Linux} \li GCC \li ARM Cortex-A, Intel boards with GCC-based toolchains \row \li QNX 6.6.0, 7.0 (armv7le and x86) @@ -99,6 +100,9 @@ Mobile Platforms: \l {Qt for Android}{Android}, \row \li \l {INTEGRITY} {INTEGRITY 11.4.x} \li As provided by Green Hills INTEGRITY \li Hosts: 64-bit Linux + \row \li \l{Qt for VxWorks}{VxWorks 7} + \li As provided by Wind River + \li Hosts: 64-bit Linux, Windows \row \li {3,1} \header \li {3,1} Mobile Platforms: \l {Qt for Android}{Android}, \l {Qt for iOS}{iOS}, diff --git a/doc/src/platforms/vxworks.qdoc b/doc/src/platforms/vxworks.qdoc new file mode 100644 index 0000000000000000000000000000000000000000..7bc891f27d98241e14df110a73324c51d7467f6a --- /dev/null +++ b/doc/src/platforms/vxworks.qdoc @@ -0,0 +1,529 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:FDL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Free Documentation License Usage +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. Please review the following information to ensure +** the GNU Free Documentation License version 1.3 requirements +** will be met: http://www.gnu.org/copyleft/fdl.html. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! + \page vxworks.html + \title Qt for VxWorks + + Qt for VxWorks is available only under a commercial license. + + Contact The Qt Company for more information: + \l {https://www.qt.io/contact-us/} + + \section1 Supported Architectures and VxWorks Releases + + Qt 5.5 is currently tested and supported on VxWorks 7 release SR0480 2016-09-16. + Supported architecture is ARM-v7. + + \section1 Qt for VxWorks Source Package + + Qt for VxWorks is delivered via the \l {Qt Account}, under the name + \b {Qt 5.5.1} > \b {Qt VxWorks Platform Source Package}. + + \section1 Requirements for VxWorks + + \section2 QtWidget Applications + + \list + \li Framebuffer device (FBDEV) + \li Evdev support (compatibility mode) + \li POSIX support + \li C++11 support + \endlist + + \section2 Qt Quick 2 Applications + + All features which are required for QtWidget applications, and in addition the following: + + \list + \li GPU device (GPUDEV) for OpenGL ES 2.0 + \endlist + + \section1 Supported Modules + + Almost all essential \l{All Modules}{Qt modules} and some add-on modules supported. + + \section2 Limitations for Essential modules + + \table 80% + \header + \li Qt Module + \li Supported Features + \li Notes + + \row + \li \l {Qt Multimedia} + \li Audio + \li \l [QML] {QtMultimedia::SoundEffect}{SoundEffect}, + \l [QtMultimedia] {QSound}, + \l [QtMultimedia] {QSoundEffect} and + \l [QtMultimedia] {QAudioOutput} + + \row + \li \l {Qt Multimedia Widgets} + \li Not supported + \li + + \row + \li Qt WebKit + \li Not supported + \li + + \row + \li Qt WebKit Widgets + \li Not supported + \li + + \endtable + + \section2 Supported Add-ons + + \table 80% + \header + \li Qt Add-on + \li Notes + \row + \li \l {Qt Charts} + \li Version 2.0.1 + \row + \li \l {Qt Data Visualization} + \li Version 1.2.1 + \row + \li \l {Qt Virtual Keyboard} + \li Version 2.0 + \row + \li \l {Qt Quick Compiler} + \li Version 3.0 + \row + \li \l {Qt Concurrent} + \li + \row + \li \l {Qt Graphical Effects} + \li + \row + \li \l {Qt Image Formats} + \li + \row + \li \l {Qt OpenGL} + \li Only OpenGL ES 2 \note Provided to ease porting from Qt 4.x. + Use the QOpenGL classes in \l{Qt GUI} for new code + \row + \li \l {Qt Platform Headers} + \li + \row + \li \l {Qt SVG} + \li + \row + \li \l {Qt XML Patterns} + \li + \endtable + + \note You can explicitly exclude unsupported or unused modules from the + build via the -skip <module> option when running the configure tool. + + \section1 Platform Notes + + With the release of Qt 5.0, Qt no longer contains its own window system + implementation: QWS is no longer a supported platform. For single-process use + cases, the \l{Qt Platform Abstraction} is a superior solution. + + There are two platform plugins that are usable on VxWorks: EGLFS and VxWorksFB. + The availability of these plugins depends on the configuration of Qt. The default + platform plugin is also device-specific. For instance, on many boards \c eglfs will be + chosen as the default one. If the default is not suitable, the \c QT_QPA_PLATFORM + environment variable parameter can be used to request another plugin. + Alternatively, for quick tests, the \c -platform command-line option can be used + with the same syntax. + + \section1 Configuring for a Specific Device + + Building Qt for a given device requires a toolchain and a + sysroot. Additionally, some devices require vendor specific adaptation code + for EGL and OpenGL ES 2.0 support. This is not relevant for non-accelerated + platforms, for example the ones using the VxWorksFB plugin, however neither + OpenGL nor Qt Quick 2 will be functional in such a setup. + + The directory \e qtbase/mkspecs/devices contains configuration and graphics + adaptation code for a number of devices. For example, \c vxworks-imx6 + contains build settings, such as the optimal compiler and linker flags, for + the \l {http://en.wikipedia.org/wiki/I.MX#i.MX6x_series}{Freescale iMX6 series}, + and either an implementation of the eglfs hooks (vendor-specific adaptation code), + or a reference to a suitable eglfs device integration plugin. The device is + selected through the \l{Qt Configure Options}{configure} tool's \c -device + parameter. The name that follows after this argument must, at least partially, + match one of the subdirectories under \e devices. + + Before running configure and building Qt 5 it is required to open \e {VxWorks 7 + Development Shell} in command prompt. + + \list + \li Linux: + \badcode + cd <VxWorks 7 installation directory> + ./wrenv.sh -p vxworks-7 + \endcode + + \li Windows: + \badcode + cd <VxWorks 7 installation directory> + wrenv -p vxworks-7 + \endcode + \endlist + + Below is an example configuration for the BD-SL-i.MX6. For most VxWorks boards + the configure command will look very similar. By default, Qt 5 is configured to + use shared libraries. To build Qt 5 statically, add \c -static option for configure. + + \badcode + ./configure -commercial -confirm-license -device vxworks-imx6 -device-option CROSS_COMPILE=arm -prefix /sd0:1/qt5rtp -sysroot <path_to_vxworks_vsb_dir>/fsl_imx6_1_1_6_0_VSB -no-gcc-sysroot -extprefix <path_to_host_dir>/qt5rtp -hostprefix <path_to_host_dir>/qt5rtp -no-openssl -nomake tools -nomake examples + \endcode + + The most important parameters are \c -device, \c -device-option CROSS_COMPILE=<arch>, + \c -sysroot and \c -no-gcc-sysroot. By specifying \c -sysroot, the include + files and libraries used by \c {configure}'s feature detection tests, as well + as Qt itself, will be taken from the specified location, instead of the host + PC's standard locations. This means that installing development packages on the + host machine has no relevance. Instead, the headers and the libraries for the + target architecture (e.g. ARM) have to be present in the sysroot. + + It is recommended to build Qt 5 using a \e{shadow build}. See \l {Qt Configure Options} + for more information. + + \section1 Building and Installing Qt 5 + + \badcode + make -j<N> + make install + \endcode + + \section1 Platform Plugins for VxWorks Devices + + \section2 EGLFS + + \l {http://www.khronos.org/egl}{EGL} is an interface between OpenGL and the + native windowing system. Qt can use EGL for context and surface management, + however the API contains no platform specifics: The creation of a \e {native + window} (which will not necessarily be an actual window on the screen) must + still be done by platform-specific means. Hence the need for the board or GPU + specific adaptation code. Such adaptations are provided either as \e {eglfs + hooks}, a single source file compiled in to the platform plugin, or as + dynamically loaded \e {EGL device integration} plugins. + + EGLFS is a platform plugin for running Qt 5 applications on top of EGL and + OpenGL ES 2.0 without an actual windowing system (like X11 or Wayland). In + addition to Qt Quick 2 and native OpenGL applications it supports + software-rendered windows (for example QWidget) too. In the latter case the + widgets' contents are rendered using the CPU into images which are then + uploaded into textures and composited by the plugin. + + This is the recommended plugin for modern VxWorks devices that include + a GPU. + + EGLFS forces the first top-level window (be it either a QWidget or a + QQuickView) to become fullscreen. This window is also chosen to be the \e root + widget window into which all other top-level widgets (for example dialogs, + popup menus or combobox dropdowns) are composited. This is necessary because + with EGLFS there is always exactly one native window and EGL window surface, + and these belong to the widget or window that is created first. This approach + works well when there is a main window that exists for the entire lifetime of + the application and all other widgets are either non top-levels or are created + afterwards, once the main window is shown. + + There are further restrictions for OpenGL-based windows. As of Qt 5.3, eglfs + supports a single, fullscreen GL window (for example, an OpenGL-based QWindow, + a QQuickView or a QGLWidget). Opening additional OpenGL windows or mixing such + windows with QWidget-based content is not supported and will terminate the + application with an error message. + + If necessary, eglfs can be configured via environment variables: + + \list + + \li \c {QT_QPA_EGLFS_FB} - Overrides the framebuffer device. The default is + \c /dev/fb0. On most embedded platforms this is not very relevant because the + framebuffer is used only for querying settings like the display dimensions. + On certain devices however this parameter provides the ability to specify + which display to use in multiple display setups, similarly to the \c fb + parameter in VxWorksFB. + + \li \c {QT_QPA_EGLFS_WIDTH} and \c {QT_QPA_EGLFS_HEIGHT} - Contain the screen + width and height in pixels. While eglfs will try to determine the dimensions + from the framebuffer device \e{/dev/fb0}, this will not always work and + manually specifying the sizes may become necessary. + + \li \c {QT_QPA_EGLFS_PHYSICAL_WIDTH} and \c {QT_QPA_EGLFS_PHYSICAL_HEIGHT} - + Physical screen width and height in millimeters. On platforms where the + framebuffer device \e{/dev/fb0} is not available or the query is not + successful, the values are calculated based on a default DPI of 100. This + variable can be used to override any such defaults. + + \li \c {QT_QPA_EGLFS_DEPTH} - Overrides the color depth for the screen. On + platforms where the framebuffer device \e{/dev/fb0} is not available or the + query is not successful, the default of 32 is used. This variable can be used + to override any such defaults. Note that this affects only the color depth + value reported by QScreen. It has no connection to EGL configurations and the + color depth used for OpenGL rendering. + + \li \c {QT_QPA_EGLFS_SWAPINTERVAL} - By default a swap interval of \c 1 will + be requested. This enables synchronizing to the displays vertical refresh. The + value can be overridden with this environment variable. For instance, passing + 0 will disable blocking on swap, resulting in running as fast as possible + without any synchronization. + + \li \c {QT_QPA_EGLFS_FORCE888} - When set, the red, green and blue color + channel sizes are ignored whenever creating a new context, window or offscreen + surface. Instead, the plugin will request a configuration with 8 bits per + channel. This can be helpful on devices where configurations with less than 32 + or 24 bits per pixel are chosen by default but are known not to be suitable, + for example, due to banding effects. Instead of changing all the applications, + this variable provides an easier shortcut to force 24/32 bpp configurations + for a given device. + + \li \c {QT_QPA_EGLFS_DEBUG} - When set, some debugging information is printed + on the debug output. For example, the input QSurfaceFormat and the properties + of the chosen EGL configuration are printed whenever creating a new + context. Together with Qt Quick's \c {QSG_INFO} variable, this can provide + useful information for troubleshooting issues related to the EGL + configuration. + + \li \c {QT_QPA_EGLFS_INTEGRATION} - In addition to the compiled-in \e hooks, + it is also possible to provide device or vendor-specific adaptation in the + form of dynamically loaded plugins. This environment variable enforces a + specific plugin. For example, setting it to \e{eglfs_kms} will use the KMS/DRM + backend. This is only an option when no static, compiled-in hooks were + specified in the device makespecs. In practice the traditional compiled-in + hooks are rarely used, almost all backends are now migrated to plugins. The + device makespecs still contain a relevant \c EGLFS_DEVICE_INTEGRATION entry: + the name of the preferred backend for that particular device. This is + optional, but very useful to avoid the need to set this environment variable + in case there are more than one plugins present in the target system. In a + desktop environment the KMS or the X11 backends are prioritized, depending on + the presence of the \c DISPLAY environment variable. + + \endlist + + In addition to \c {QT_QPA_EGLFS_DEBUG}, eglfs also supports the more modern + categorized logging system of Qt. The following logging categories are + available: + + \list + + \li \c qt.qpa.egldeviceintegration – Enables logging for dynamically loaded + backends. Very useful to check what backend is in use. + + \li \c qt.qpa.input – Enables debug output from the evdev input handler. + Very useful to check if a given input device was correctly recognized and + opened. + + \endlist + + \section2 Qt Quick Scene Graph Rendering Thread + + The scene graph is a graphical representation of the Item scene. It + can be thought of as a graphical deep copy, an independent structure + that contains enough information to render all the items. + + On many platforms, the \l{Qt Quick Scene Graph}{scene graph} will even be + rendered on a dedicated render thread while the GUI thread is preparing the + next frame's state. + + In some cases when application is complex e.g. it's scene graph contains + lot's of Items, scene graph can consume more stack memory than what is + available by default for the render thread. Default stack memory size is + 64KB. Using the environment variable QSG_RENDERTHREAD_STACK_SIZE, it is possible + to increase the stack size available for the scene graph render thread. + + \section2 VxWorksFB + + This plugin writes directly to the framebuffer. Only software-rendered content + is supported. Note that on some setups the display performance is expected to + be limited. + + The \c vxworksfb plugin allows specifying additional settings by passing them + in the \c QT_QPA_PLATFORM environment variable or \c -platform command-line + option. For example, \c {QT_QPA_PLATFORM=vxworksfb:fb=/dev/fb1} specifies that + the framebuffer device \c /dev/fb1 should be used instead of the default + \c fb0. Multiple settings can be specfified by separating them with a colon. + + \list + + \li \c {fb=/dev/fbN} - Specifies the framebuffer devices. On multiple display + setups this will typically allow running the application on different + displays. For the time being there is no way to use multiple framebuffers from + one Qt application. + + \li \c{size=}\e{<width>}\c{x}\e{<height>} - Specifies the screen size in + pixels. The plugin will try to query the display dimensions, both physical and + logical, from the framebuffer device. This may not always lead to proper + results however, and therefore it may become necessary to explicitly specify + the values. + + \li \c{mmSize=}\e{<width>}\c{x}\e{<height>} - Physical width and height in + millimeters. + + \li \c{offset=}\e{<width>}\c{x}\e{<height>} - Offset in pixels specifying the + top-left corner of the screen. The default position is at \c{(0, 0)}. + + \endlist + + \section1 Input + + When no windowing system is present, the mouse, keyboard and touch input are + read directly via \c evdev. Note that this requires that devices nodes + \c {/input/event*} are readable by the user. eglfs and vxworksfb has all + the evdev input handling code built-in. + + \section2 Input on eglfs and vxworksfb + + Parameters like the device node name can be set in the environment variables + \c QT_QPA_EVDEV_MOUSE_PARAMETERS, \c QT_QPA_EVDEV_KEYBOARD_PARAMETERS and + \c QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS. Additionally, the built-in input handlers + can be disabled by setting \c QT_QPA_EGLFS_DISABLE_INPUT or + \c QT_QPA_FB_DISABLE_INPUT to \c 1. On some touch screens the coordinates will + need to be rotated. This can be enabled by setting + \c QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS to \c {rotate=180}. + + \section2 Mouse + + The mouse cursor will show up whenever \c QT_QPA_EGLFS_HIDECURSOR (for eglfs) + or \c QT_QPA_FB_HIDECURSOR (for vxworksfb) is not set, the mouse cursor will + always show up unless explicitly disabled via the environment variable. + + Hot plugging is not supported. + + \section2 Keyboard + + The evdev keyboard handler supports the following extra parameters: + + \list + + \li \c {/input/...} - Specifies the name of the input device. When not + given, Qt will look for a suitable device by walking through the available + nodes. + \endlist + + If the default, built-in keymap is not sufficient, a different one can be + specified either via the \c keymap parameter or by using the eglfs-specific + \l{QEglFSFunctions::loadKeymap()}{loadKeymap()} function. The latter allows + switching the keymap at runtime. Note however that this requires using eglfs' + built-in keyboard handler; it is not supported when the keyboard handler is + loaded via the \c -plugin command-line parameter. + + \section2 Touch + + Both single and multitouch devices are supported and require that VxWorks + has been properly configured to support touch devices. + + \section2 Debugging Input Devices + + It is possible to print some information to the debug output by enabling + the \c qt.qpa.input logging rule, for example by setting the \c QT_LOGGING_RULES + environment variable to \c{qt.qpa.input=true}. This is useful for detecting + which device is being used, or to troubleshoot device discovery issues. + + \section2 Using Custom Mouse Cursor Images + + eglfs comes with its own set of 32x32 sized mouse cursor images. If these are + not sufficient, a custom cursor atlas can be provided by setting the \c + QT_QPA_EGLFS_CURSOR environment variable to the name of a JSON file. The file + can also be embedded into the application via Qt's resource system. + + For example, an embedded cursor atlas with 8 cursor images per row can be + specified like the following: + + \badcode + { + "image": ":/cursor-atlas.png", + "cursorsPerRow": 8, + "hotSpots": [ + [7, 2], + [12, 3], + [12, 12], + ... + ] + } + \endcode + + Note that the images are expected to be tightly packed in the atlas: the + width and height of the cursors are decided based on the total image size and + the \c cursorsPerRow setting. Atlases have to provide an image for all the + supported cursors. + + \section1 QML Component Loader Thread + + In some cases, a complex application (for example, using a lot of custom + QML components) may cause the QML loader thread to consume stack memory + more than the 32 KB available by default. Using the environment variable + \c QML_LOADERTHREAD_STACK_SIZE, it is possible to increase the stack + size available for the QML loader thread. + + \section1 Preventing Timeouts in QEventDispatcher + + Default system clock rate (SYS_CLK_RATE) for VxWorks 7 is 1/60s or ~16,67ms. + In some cases this may cause a drop in the application frame rate; + in QEventDispatcher, the select function is blocking for the entire system + clock interval because a timeout is used. By defining an environment variable + \c QT_FORCE_SELECT_NOTIMEOUT=1, the select function returns immediately + if no new events are available and the resolution of the system clock is higher + than 10ms, which is true with default value. + + \section1 Running Qt Applications + + Following example shows how to start an application when Qt 5 is built using + shared libraries. With a statically build Qt 5, there is no need to use the + LD_LIBRARY_PATH environment variable. This variable is only needed to point + the location of VxWorks shared libraries (for example libc and OpenGL ES 2.0). + It is not needed for Qt 5 shared libraries. + + \badcode + putenv "LD_LIBRARY_PATH=/sd0:1/lib" + cd "/sd0:1" + rtpSp("<Qt5_app>", 200, 0x100000, 0, 0x01000000) + \endcode + + \section1 Limitations + + \section2 OpenSSL Support + Qt 5 does not support OpenSSL for VxWorks as it does not support using OpenSSL + in RTP mode. + + \section2 Video Memory + + Systems with a fixed amount of dedicated video memory may need extra care + before running Qt application based on Qt Quick or classes like + QOpenGLWidget. The default setting may be insufficient for such applications, + especially when they are displayed on a high resolution (for example, full HD) + screen. In this case they may start failing in unexpected ways. It is + therefore recommended to ensure that there is at least 128 MB of GPU memory + available. For systems that do not have a fixed amount of memory reserved for + the GPU this is not an issue. + + \section2 vxworksfb + + Use the \c fb plugin parameter to specify the framebuffer device to use. + +*/