Raspberry Pi 3 (model B) + Qt5 + EGLFS - Part1
[원문] 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