How to compile Linux with Qt5 option using Yocto for STM32MP1

Short manual how to prepare Linux Qt5 image in ST Yocto

Assumption:

The tutorial is dedicated to Linux users

NOTE: The Following description based on the description from the manufacturer webpage

https://wiki.st.com/stm32mpu/index.php/STM32MP1_Distribution_Package

1. Create main directory for Yocto purposes

mkdir openstlinux-4.19-thud-mp1-19-02-20

2. Go to the created folder

cd openstlinux-4.19-thud-mp1-19-02-20 

4. Initialize repo

repo init -u https://github.com/STMicroelectronics/oe-manifest.git -b refs/tags/openstlinux-5.4-dunfell-mp1-20-06-24

and synchronize repo

repo sync

In this place some modification in Yocto is necessary.

First open file

…/layers/meta-st/meta-st-stm32mp/conf/machine/include/st-machine-common-stm32mp.inc

and remove from line 141

openocd-stm32mp-native \

next remove from line 149

nativesdk-openocd-stm32mp \

Note: Removed “openocd” due to some problem with the package itself. For this purposes application “openocd” is not necessary.

and finally, remove from line 150

nativesdk-sdcard-raw-tools \

Store file after deletion.

Next open file

../layers/meta-st/meta-st-openstlinux/recipes-qt/qt5/files/qt-eglfs.sh

Add two lines after “export QT_QPA_PLATFORM=eglfs”

export QT_QPA_EGLFS_ALWAYS_SET_MODE="1"
export QT_QPA_EGLFS_INTEGRATION="eglfs_kms"

After modification store the file. The modified file should look like below

!/bin/sh -
 export QT_QPA_PLATFORM=eglfs
 export QT_QPA_EGLFS_ALWAYS_SET_MODE="1"
 export QT_QPA_EGLFS_INTEGRATION="eglfs_kms"
 if [ -e /usr/share/qt5/cursor.json ];
 then
         export QT_QPA_EGLFS_KMS_CONFIG=/usr/share/qt5/cursor.json
 fiN

Note: In the Latest systems discover a some problem with compilation so if find somewhere the following

...
error: ‘SIOCGSTAMP’ undeclared here (not in a function);
...

It is necessary to add some include in the file …/syscall.c

/home/mw/openstlinux-4.19-thud-mp1-19-02-20/build-openstlinuxeglfs-stm32mp1/tmp-glibc/work/x86_64-linux/qemu-native/3.0.0-r0/qemu-3.0.0/linux-user/syscall.c

To do this issue using ‘gedit’ or ‘nano’ or other editor

gedit /home/mw/openstlinux-4.19-thud-mp1-19-02-20/build-openstlinuxeglfs-stm32mp1/tmp-glibc/work/x86_64-linux/qemu-native/3.0.0-r0/qemu-3.0.0/linux-user/syscall.c

and add #include <linux/sockios.h>

5. Choose DISTRO. Valid DISTRO for QT5 purpose is

DISTRO=openstlinux-eglfs MACHINE=stm32mp1 source layers/meta-st/scripts/envsetup.sh

NOTE: Accept all necessary agreements

6. When DISTRO is chosen it is a good time to start compile QT5 image for STM32MP1

bitbake st-example-image-qt

7. After a couple of hours, 😉 the image should be ready

8. Create image for SD-Card using a dedicated script. So go to

cd tmp-glibc/deploy/images/stm32mp1/scripts

the folder and execute the following command to generate *.raw file for SD-Card

./create_sdcard_from_flashlayout.sh ../flashlayout_st-example-image-qt/FlashLayout_sdcard_stm32mp157c-dk2-optee.tsv

9. Afterimage generation script suggests how to write an image to SD-Card.

sudo dd if=../flashlayout_st-example-image-qt/../flashlayout_st-example-image-qt_FlashLayout_sdcard_stm32mp157c-dk2-optee.raw of=/dev/mmcblk0 bs=8M conv=fdatasync status=progress

NOTE: Only thing to do is replace if necessary of=/dev/mmcblk0 to of=/dev/sdx for instance. Be aware wrong specification of “of=/dev/..” can damage Your local system, check twice !. To check where the SD-Card is connected “df -h” command can be useful

10. Insert SD-Card into SD-Card slot in development board and check if boot pins are configured as follow

STM32MP157x-DKx boot switches microSD card.png

11. Connect USB C wire located near distance of SD-CARD slot. System should start

12. Connect ethernet wire to ethernet connector and check its IP address.

13. Using ssh login on to the board

ssh 192.168.x.y -l root

NOTE: Accept key

14. Remove “psplash-drm service permanently to be able to run QT5 application. To do this issue following commands

systemctl stop psplash-drm-start
systemctl disable psplash-drm-start
systemctl daemon-reload
systemctl reset-failed

15. Next, compile QT5 toolchain in Yocto. Go back again to main Yocto build folder

cd ~/openstlinux-4.19-thud-mp1-19-02-20/build-openstlinuxeglfs-stm32mp1

and execute toolchain generation. This process can take a lot of hours.

bitbake meta-toolchain-qt5

NOTE: During compilation some WARNINGS can appears

16. Next step is install SDK into the system. Go to directory

cd tmp-glibc/deploy/sdk/
./meta-toolchain-qt5-openstlinux-eglfs-stm32mp1-x86_64-toolchain-2.6-snapshot.sh

Note: Accept all agreements and choose default proposed installation place

17. When installation finished created on Your desktop two files

activator stm32_qtcreator and stm32_qtcreator.sh

stm32_qtcreator content

!/usr/bin/env xdg-open
[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
Icon[pl_PL]=gnome-panel-launcher
Name[pl_PL]=stm32_qtcreator
Exec=/home/mw/Pulpit/stm32_qtcreator.sh
Name=stm32_qtcreator

stm32_qtcreator.sh content

!/bin/bash
. /opt/st/stm32mp1/2.6-snapshot/environment-setup-cortexa7t2hf-neon-vfpv4-openstlinux_eglfs-linux-gnueabi
/opt/Qt5.12.0/Tools/QtCreator/bin/qtcreator

Use activator stm32_qtcreator to open QTCreator application. This process is necessary because “. /opt/st/stm32mp1/2.6-snapshot/environment-setup-cortexa7t2hf-neon-vfpv4-openstlinux_eglfs-linux-gnueabi” set all necessary export, path etc. demanded by QTCreator to proper make a cross-compilation.

18. The Last thing to do is create Kit for STM32 into QTCreator application

Michał Wołowik

Software, hardware embedded engineer. Current duties: Linux(YOCTO) and Android(AOSP) images preparation. Main duties are to develop c/c++ application.

This Post Has 5 Comments

  1. philip

    I hava question about Step 17. There is no two file “stm32_qtcreator.sh” “stm32_qtcreator”…
    When I bitbake “meta-toolchain-qt5”, fail bitbake because of qt_webengine error..
    So, I edit local.conf file in the build folder.
    add comment that “Distro remove : webengine…”
    So, bitbake “meta-toolchain-qt5” successe…
    but, There is no two file “stm32_qtcreator.sh” “stm32_qtcreator”…

  2. philip

    And, Finaly I create Qt App… Reference your blog comment… example name Qt quick contorl2 wearable…
    deploy target board STM32MP1…
    but… occure error message…
    “./wearable: error while loading shared libraries: libQt5QuickControls2.so.5: cannot open shared object file: No such file or directory”

  3. Vladimir Gordienko

    Thank you very much for the manual. It worked. But when compiling any example in QTCreator, an error occurs: /opt/st/stm32mp1/2.6-snapshot/sysroots/x86_64-openstlinux_eglfs_sdk-linux/usr/libexec/arm-openstlinux_eglfs-linux-gnueabi/gcc/arm-openstlinux_eglfs-linux-gnueabi/8.2.0/real-ld: cannot find -lGLESv2

  4. Balance Bike Toddler

    Thanks for share this article it is quite helpful to me.

    King regards,
    Boswell Raahauge

  5. Sock Boots Knee High

    This goes far beyond the commenting! It composed his
    thoughts while reading the post amazingly 🙂
    Best regards,
    Demir Griffin

Leave a Reply