Raspberry Pi

Raspberry Pi 3 (model B) + Qt5 + EGLFS - Part1

이빈(ebeen) 2018. 7. 16. 21:16

[원문] https://wiki.qt.io/RaspberryPi2EGLFS

 

RaspberryPi2EGLFS

A modern guide for cross-compiling Qt for HW accelerated OpenGL with eglfs on Raspbian and setting up Qt Creator

 

Initial notes

- 이 문서는 X11에서 데스크탑 스타일의 창으로 표시되는 Qt 응용프로그램을 실행하기 위한 것이 아니라 Broadcom driver를 사용하여 Qt 응용프로그램이 dispmanx / EGL 위에 전체 화면으로 실행되는 실제 embedded device 작성 상황에 사용됩니다.

- Embedded Linux의 eglfs 및 Qt에 대한 자세한 내용은 Qt documentation을 확인 하십시오.

 

테스트된 구성

- Qt 5.6과 Raspbian Wheezy / Jessie (본인이 테스트 완료한 구성 Qt.5.6.3과 Jessie)

- Qt 5.9.1과 Raspbian Stretch with Raspberry 3 model B

- Qt 5.10과 Raspbian Stretch with Raspberry 1 model B

- Qt 5.10.1과 Raspbian Stretch with Raspberry 3 model B

- Qt 5.10.1과 Raspbian Stretch with Raspberry Zero W

 

본인 구성

- Raspberry Pi 3 model B

- Host PC : Ubuntu 14.04.5 with VMWare

 

단계별 순서

 

1. [on host PC] Raspbian Stretch 이전 image 파일들은 여기에서, 최신 Raspbian 이미지는 여기에서 다운로드

(본인은 Qt 5.6을 사용하기 위해 Jessie의 마지막 버전을 다운로드, 2017-07-05 일자) 

 

2. [on host PC] 공식 설치 가이드에 따라 SD카드에 다운로드 받은 이미지를 SD카드 Write하여 부팅을 하거나, Host PC에서 압축을 풀고 SD카드에 command 명령어로 Write

에)

sudo dd if=2017-07.05-raspbian-jessie.img of=/dev/sdb bs=4M

 

 

3. [on RPi] [선택사항] Raspberry Pi를 부팅한 후 Terminal에서 raspi-config를 실행하여 X대신 console로 부팅하도록 변경하고 GPU 메모리를 256MB로 변경하십시오.

예)

sudo raspi-config
sudo reboot
sudo apt-get update
sudo apt-get upgrade
sudo reboot

 

- console로 부팅은 

   3번 Boot Options 진입 -> B1 Desktop / CLI 진입 -> B1 Console 또는 B2 Console Autologin 선택

- GPU Memory 256MB는 

   7번 Advanced Options 진입 -> A3 Memory Split 진입 -> 256 입력

- 본인은 추가로 부팅시 Splash Screen을 안보이게 하기위해 

   3번 Boot Options 진입 -> B3 Splash Screen 진입 -> <No> 선택

- 또한 Password 또한 빨리 입력하기 위해 짧은것으로 변경 ^^

 

4. [on RPi] Raspbian Stretch 버전을 사용하는 경우 Raspberry 장비를 업데이트 해야 한다 (여기 참조)

예)

sudo rpi-update

reboot

 

5 [on RPi] 개발에 필요한 파일 설치

5.1 먼저 /etc/apt/sources.list에 파일을 편집기로 열어 #deb-src 행의 주석을 제거하십시오. 

#deb-src ... -> deb-src ...

> 기존 deb-src 주소는 닫혔기 때문에 Jessie를 사용할 경우 아래 값으로 대체하거나, deb와 dev-src 앞에 주석처리하고 아래값 추가 [2022.02.17]

deb http://raspbian.mirrors.lucidnetworks.net/raspbian/ jessie main contrib non-free rpi

deb-src http://raspbian.mirrors.lucidnetworks.net/raspbian/ jessie main contrib non-free rpi

 

5.2 시스템을 업데이트 하고 필수 라이브러리를 설치 하십시오.

sudo apt-get update

sudo apt-get build-dep qt4-x11

sudo apt-get build-dep libqt5gui5

sudo apt-get install libudev-dev libinput-dev libts-dev libxcb-xinerama0-dev libxcb-xinerama0


for stretch
sudo apt-get install "^libxcb.*" libx11-xcb-dev libglu1-mesa-dev libxrender-dev

* 본인은 gstreamer가 필요해 추가 설치

sudo apt-get install gstreamer1.0-omx libgstreamer1.0-dev libgsteamer-plugins-base1.0-dev
or
sudo apt install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-pulseaudio

sudo apt-get install alsa-tools alsa-utils

 

6. [on RPi] 타겟 폴더 준비

sudo mkdir /usr/local/qt5pi

sudo chown pi:pi /usr/local/qt5pi

 

7. [on host PC] 작업 폴더를 만들고 toolchain을 받아 옵니다.

mkdir ~/raspi

cd ~/raspi

git clone https://github.com/raspberrypi/tools

 

8. [on host PC] sysroot 폴더를 만들고, rsync를 사용하여 raspberry 기기와 동기화 합니다.

raspberrypi.local은 실제 기기의 IP 주소로 적용해야 합니다. 예) 192.168.0.50

cd ~/raspi

mkdir sysroot sysroot/usr sysroot/opt

rsync -avz pi@raspberrypi.local:/lib sysroot

rsync -avz pi@raspberrypi.local:/usr/include sysroot/usr

rsync -avz pi@raspberrypi.local:/usr/lib sysroot/usr

rsync -avz pi@raspberrypi.local:/opt/vc sysroot/opt

 

9. [on host PC] 심볼릭 링크를 상대적으로 변경하십시오. 이전 fixQualifiedLibraryPaths가 제대로 작동하지 않기 때문에 제공된 스크립트를 사용하십시오.

cd ~/raspi
wget https://raw.githubusercontent.com/Kukkimonsuta/rpi-buildqt/master/scripts/utils/sysroot-relativelinks.py
chmod +x sysroot-relativelinks.py
./sysroot-relativelinks.py sysroot

 

10. [on host PC] qtbase를 가져와서 Qt를 구성하십시오. 대상 디렉토리는 Pi의 /usr/local/qt5pi 이며, qmake와 같은 호스트 도구는 ~/raspi/qt5host로 이동합니다. 반면 make install은 ~/raspi/qt5pi를 대상으로 합니다. (이것이 실제 기기와 동기화 됩니다.) 변경한 경우 경로를 조정하는 것을 잊지 마십시오. 어떤 이유로 전체 경로를 사용하는 경우 경로의 ~/가 작동하지 않을 수 있습니다. <qt-version>을 적절한 Qt버전으로 변경해야 합니다. 

예) 5.6 또는 5.9.1, 5.9.1버전은 branch가 아닌 태그이므로 로컬 branch를 만들 수 있습니다.

 

Qt소스를 원하는 버전을 다운로드 받아야 합니다. 소스를 다운받는 방법은 세가지 나눌수 있습니다.

 

- git을 통해 전체 소스를 다운로드 ( ~/raspi/qt5src 폴더에 다운로드)

git clone git://code.qt.io/qt/qt5.git -b 5.6 qt5src

cd qt5src

./init-repository

 

- 원하는 패키지만 다운로드

git clone git://code.qt.io/qt/qtbase.git -b 5.6 qt5src

git clone git://code.qt.io/qt/qtdeclarative.git -b 5.6 qt5src

 

- 압축된 전체소스 파일을 다운로드하여 ~/raspi/qt5src 폴더에 압축을 풉니다.

cd ~/raspi
wget 
http://download.qt.io/new_archive/qt/5.6/5.6.3/single/qt-everywhere-opensource-src-5.6.3.tar.xz
tar Jxvf qt-everywhere-opensource-src-5.6.3.tar.xz
mv qt-everywhere-opensource-src-5.6.3 ./qt5src

적절한 Raspberry Pi 버전으로 <rpi-version>을 변경해야 합니다. 

RPi는 linux-rasp-pi-g++, 

RPi2는 linux-rasp-pi2-g++

RPi3는 linux-rpi3-g++

을 사용하십시오.

시스템이 64비트인 경우 다음과 같이 편질 할 수도 있습니다.

-device-option CROSS_COMPILE=~/raspi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-

더 높은 Qt 버전(예: 5.9.1)을 사용하려면

- no - use - gold - linker

옵션으로 -jn 옵션을 사용할 수 있습니다. 여기서 n은 멀티코어를 사용하려는 코어 수 입니다.

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

cd qtbase

./configure -release -opengl es2 -device <rpi-version> -device-option CROSS_COMPILE=~/raspi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf- -sysroot ~/raspi/sysroot -opensource -confirm-license -make libs -prefix /usr/local/qt5pi -extprefix ~/raspi/qt5pi -hostprefix ~/raspi/qt5 -v

make

make install

본인이 사용한 configure는 아래와 같다

cd ~/raspi
cd qt5src

./configure \

  -opensource -confirm-license -release \

  -opengl es2 -device linux-rpi3-g++ \

  -device-option CROSS_COMPILE=~/raspi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf- \

  -sysroot ~/raspi/sysroot \

  -prefix /usr/local/qt5pi \

  -extprefix ~/raspi/qt5pi \

  -hostprefix ~/raspi/qt5host \

  -nomake examples -nomake tests -no-use-gold-linker -qt-pcre -qt-xcb  \

  -skip qtscript -skip qttools -skip qtserialbus -skip qtwebengine -skip qtlocation -skip qtwayland

 

이후 

make -j4

make install -j4

 

 

실패를 한 경우 다음을 사용하여 모든 항목을 지울 수 있습니다.

git clean -dfx

 

11. [on host PC] Qt를 기기에 배포하십시오. 우리는 ~/raspi/qt5pi의 모든 것을 위에서 설정한 접두사와 단순히 동기화 합니다.

rsync -avz qt5pi pi@raspberrypi.local:/usr/local

 

12. [on host PC] 모든 것이 잘 되었는지 테스트 할 예제를 작성 하십시오. 적절한 빌드가 끝나면 실행 파일을 장치에 복사 합니다.

cd ~/raspi/qt5src/qtbase/examples/opengl/qopenglwidget

~/raspi/qt5host/bin/qmake

make

 

scp qopenglwidget pi@raspberrypi.local:/home/pi

 

13. [on RPi] 링커가 Qt라이브러리를 찾을 수 있도록 기기를 업데이트 하십시오.

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

sudo ldconfig

 

14. [on RPi] EGL/GLES 라이브러리를 수정하십시오. 기기에는 /usr/lib/arm-linux-gnueabihf에 libEGL과 libGLESv2의 mesa 버전이 있을 수 있으므로 Qt응용프로그램은 실제 대신 /opt/vc/lib에 있는 파일을 선택하도록 합니다. 이것은 OpenGL 성능을 신경 쓰지 않는 X11 데스크탑 응용프로그램에서는 좋지만, 시스템이 없는 전체화면의 임베디드 응용 프로그램에서는 전혀 쓸모가 없습니다. 경우에 따라 원본을 어딘가에 저장하는 것이 좋습니다. 다음 명령을 실행 할 때 "/home/pi"라고 적혀 있는지 확인 하십시오.

sudo mv /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0 /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0_backup

sudo mv /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0 /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0_backup

sudo ln -s /opt/vc/lib/libEGL.so /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0

sudo ln -s /opt/vc/lib/libGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0

누락된 심볼 링크도 추가해야 합니다.

sudo ln -s /opt/vc/lib/libEGL.so /opt/vc/lib/libEGL.so.1

sudo ln -s /opt/vc/lib/libGLESv2.so /opt/vc/lib/libGLESv2.so.2

 

15. [on RPi] 이전에 빌드 한 예제를 실행합니다. 이 예제는 60FPS와 마우스, 키보드 및 터치 지원 기능이 있는 전체 화면에서 작동해야 합니다.

- 본인이 확인 했을 때 HDMI 연결상태에서 1920x1080 화면에서는 약 30fps, 1280x720 화면에서는 60fps로 동작

 

$ .qopenglwidget -platform eglfs

 

 

Additional notes

 

자주 묻는 질문 : 640x480 또는 576x416과 같은 저해상도 디스플레이의 경우 설정 방법은?

 

[on RPi]

/boot/config.txt 파일에 disable_overscan=1을 추가하고 재부팅 후 /opt/vc/bin/tvservice에서 사용 가능한 모드를 확인 하십시오.

예를 들어 1024x768로 전환하려면 다음을 입력 하십시오.

$ /opt/vc/bin/tvservice -m DMT

Group DMT has 4 modes:

           mode 4: 640x480 @ 60Hz 4:3, clock:25MHz progressive 

           mode 9: 800x600 @ 60Hz 4:3, clock:40MHz progressive 

           mode 16: 1024x768 @ 60Hz 4:3, clock:65MHz progressive 

           mode 35: 1280x1024 @ 60Hz 5:4, clock:108MHz progressive 

 

$ /opt/vc/bin/tvservice -e "DMT 16 HDMI"

$ fbset -xres 1024 -yres 768

 

Troubleshooting

 

일반적으로 로깅 범주(QT_LOGGING_RULES)를 qt.qpa에서 사용 가능하게 하는 것이  좋습니다.

[on RPi]

export QT_LOGGING_RULES=qt.qpa.*=true

./qopenglwidget

 

일반적인 출력은 다음과 같습니다.

qt.qpa.egldeviceintegration: EGL device integration plugin keys: ("eglfs_brcm", "eglfs_kms")

qt.qpa.egldeviceintegration: EGL device integration plugin keys (sorted): ("eglfs_brcm", "eglfs_kms")

qt.qpa.egldeviceintegration: Trying to load device EGL integration "eglfs_brcm"

qt.qpa.egldeviceintegration: Using EGL device integration "eglfs_brcm"

Unable to query physical screen size, defaulting to 100 dpi.

To override, set QT_QPA_EGLFS_PHYSICAL_WIDTH and QT_QPA_EGLFS_PHYSICAL_HEIGHT (in millimeters).

qt.qpa.input: libinput: input device 'Logitech Optical USB Mouse', /dev/input/event0 is a pointer caps = relative-motion button

qt.qpa.input: libinput: input device 'Apple Inc. Apple Keyboard', /dev/input/event1 is a keyboard

qt.qpa.input: libinput: input device 'Apple Inc. Apple Keyboard', /dev/input/event2 is a keyboard

qt.qpa.input: libinput: input device 'Raspberry Pi Sense HAT Joystick', /dev/input/event3 is a keyboard

qt.qpa.input: Using xkbcommon for key mapping

 

eglfs_brcm이 사용되고 입력 장치가 올바르게 적용 되었는지 확인 하십시오.

터치 스크린을 사용할 때 Qt Quick Controls를 사용하여 친숙한 사용자 인터페이스 요소를 적절히 조정하려면 정확한 물리적 화면 크기를 설정하는 것이 중요 할 수 있습니다. HDMI를 통해 일반 모니터를 사용할 때 기본 100dpi가 적합 할 수 있습니다.

또한 qtbase 빌드를 진행하기 전에 config.surmmay로 저장 한 configure 출력을 주의 깊게 확인하는 것이 좋습니다. 아래와 같이 표시되어 있는지 확인하십시오.

Support enabled for:

  ...

  Evdev .................. yes

  FontConfig ............. yes

  FreeType ............... yes (system library)

  ...

  libinput................ yes

  ...

  OpenGL / OpenVG: 

    EGL .................. yes

    OpenGL ............... yes (OpenGL ES 2.0+)

  QPA backends: 

    EGLFS ................ yes

      ...

      EGLFS Raspberry Pi . yes

    ...

    LinuxFB .............. yes

    ...

  udev ................... yes

  xkbcommon-evdev......... yes

 

 

키보드 입력 관련

기본적으로 Qt는 키보드를 비활성화하고 응용 프로그램 시작시 커서를 숨기려고 시도합니다. 이 방법은 키입력이 콘솔 쪽으로 가지 않기 때문에 매우 편리합니다. 그러나 현재 ssh를 통해 원격으로 응용 프로그램을 시작할 때 이 모든 작업이 자동으로 실패합니다. 이것은 키보드 입력이 예기치 않게 콘솔로 전송되는 것에 대한 설명입니다.

이 문제를 해결 하려면 콘솔에서 직접 응용 프로그램을 시작하십시오.

또는 sudo systemctl disable getty@tty1.service를 실행하여 첫 번째 TTY를 제거하고 다시 부팅하는 방법을 시도해 볼 수 있습니다.(tty2 및 기타 tty는 계속 사용할 수 있습니다.)

 

end