2020년 6월 16일 화요일

Linux Device Driver for Embedded Processors 에피소드 3 - STM32MP157C Discovery Kit 소개(3)

지난 시간에 이어 STM32MP157C Discovery Kit 분석, 세번째 시간이다. 😊

(온/습도 센서가 도착하는데 시간이 좀 필요하니) 이번 시간에는 Qt5 application을 DK2 board에서 돌려 보는 방법을 먼저 소개해 보도록 하겠다.


Qt는 다양한 산업현장(특히 embedded Linux)에서 많이 사용되고 있다. 최근에는 C++ 말고도 QML, Python(PyQt, PySide) 등을 지원하면서 영역을 확장해 나가고 있고, Android, iOS 등에서도 Qt app이 돌아가는 상황이 되었다. 하지만, 이러한 급속한 발전 추세에도 불구하고, 국내의 Qt 관련 서적이나 강좌는 지지부진한 상태이다(있기는 있는데 많이 없다). 왜 일까 ?


4. Qt5 application 개발환경 설정 및 테스트해 보기
a) Buildroot에서 Qt5 enable하기 
Qt5 app을 DK2 board에서 돌려 보기 위해서는 stm32mp157c_dk2_defconfig 파일을 수정한 후, buildroot menuconfig를 통해 Qt5를 enable시켜 주어야 한다.

$ cd buildroot
$ vi configs/stm32mp157c_dk2_defconfig
...
BR2_LINUX_KERNEL_INSTALL_TARGET=y
BR2_PACKAGE_DEJAVU=y
BR2_PACKAGE_QT5=y
BR2_PACKAGE_QT5BASE_EXAMPLES=y
BR2_PACKAGE_QT5BASE_GUI=y
BR2_PACKAGE_QT5BASE_WIDGETS=y
BR2_PACKAGE_QT5BASE_FONTCONFIG=y
BR2_PACKAGE_EVTEST=y
BR2_PACKAGE_LIBDRM=y
BR2_PACKAGE_LIBDRM_INSTALL_TESTS=y
BR2_TARGET_ROOTFS_EXT2=y
...
~

$ make menuconfig
      => (변경 1) Toolchain -> Toolchain type : 
                                              (  ) Buildroot toolchain
                                              (X) External toolchain
     => 이유: Qt5 needs a toolchain w/ gcc >= 5.0, wchar, NPTL, C++, dynamic library ***

[그림 4.1] Toolchain type 변경

      => (변경 2) Target packages -> Graphic libraries and applications (graphic/text) -> [*] Qt5  

[그림 4.2] Qt5 enable

[그림 4.3] Qt5 세부 설정

$ make
$ cd output/images

[그림 4.4] Qt5 enable 상태에서 build한 결과물

$ mkdir tmp
sudo mount -o loop ./rootfs.ext2 ./tmp
$ cd usr/lib
ls -l libQt5*

[그림 4.5] libQt5* library files

OK, Qt library가 추가된 것으로 보아, 정상적으로 build가 되었음을 알 수 있다.

Qt5에는 다양한 예제 코드가 많이 포함되어 있다. 따라서 새로 build한 buidroot image를 이용하여 이를 돌려 보도록 하자.

$ cd output/images
$ sudo dd if=./sdcard.img of=/dev/sdb

<Target board 재부팅>
  => Qt5에는 다양한 예제가 포함되어 있는데, 이 중 몇가지를 실행해 보면 다음과 같다.

# /usr/lib/qt/examples/gui/rasterwindow/
# ./rasterwindow -platform linuxfb

[그림 4.6] rasterwindow Qt app 실행 화면

# /usr/lib/qt/examples/gui/analogclock/
./analogclock -platform linuxfb

[그림 4.7] analogclock Qt app 실행 화면

b) DK2 보드에서 ssh 및 sftp 서버 띄우기
Program이 추가될 때마다 전체 build 및 microSD card에 image writing을 하는 것은 너무 비효율적이라고 볼 수 있다. 따라서 이절에서는 ssh daemon(dropbear)과 sftp daemon(Green End SFTP server)을 띄우고 이를 활용하는 방법을 소개하고자 한다.

$ make menuconfig
    => Target packages --> Networking applications -->
                                                                                                       [*] dropbear
                                                                                                       [*] gesftpserver

[그림 4.8] buildroot에서 dropbear, gesftpserver enable시키기

[Tip] dropbear, gesftpserver 외에도 rsync가 필요할 듯하여 선택해 주었다.

그 다음, target board가 부팅할 때마다 eth0 interface에 static ip가 할당될 수 있도록 /etc/network/interfaces 파일을 overlay 디렉토리에 포함시켜 주도록 하자.
[Tip] board/stmicroelectronics/stm32mp157c-dk2/overlay 디렉토리 아래의 파일은 전체 build 후, rootfs디렉토리로 자동 복사된다.

$ cd board/stmicroelectronics/stm32mp157c-dk2/overlay/
$ mkdir -p ./etc/network
$ vi interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
address 192.168.1.100
netmask 255.255.255.0
~

$ make

$ cd output/images
$ sudo dd if=./sdcard.img of=/dev/sdb
   => 새로 build한 image를 microSD에 write하도록 하자.


<Desktop PC>
Target board 재 부팅 후, ssh와 sftp login을 각각 시도해 보면 다음과 같다.

[그림 4.9] ssh login


[그림 4.10] sftp login

<Target board>
이 상태에서 Target board의 network 설정 상태와 ps 출력 결과를 확인해 보면 다음과 같다.

[그림 4.11] DK2 board ifconfig 실행 모습

[그림 4.12] DK2 board 상에서 ps 실행 결과

c) DK2 보드에서 Qt5 app 실행하기
일전(3년 전)에도 이와 비슷한 내용을 blog에 실은 적이 있다. 그 때는 buildroot가 아니라 yocto project를 기준으로 설명을 전개했었다. 비슷한 내용이니 다음 내용을 진행하기에 앞서 먼저 확인해 보는 것도 좋을 듯 싶다. 


우선, Qt5 설치(지면 관계상, 여기서는 이 부분에 대한 설명은 생략) 후, 아래와 같이 설정하도록 하자. 앞서 언급한 blog post 내용과 중복되는 내용이므로 간단히 요점만 정리해 보기로 하자.

1) Tools -> Options 메뉴 선택 -> Kits tab 선택
     - Name: Buildroot ARM  입력(다른 적당한 이름으로 해도 됨)
     - Device type: Generic Linux Device 선택
     - Sysroot: buildroot sysroot path 입력(예: /home/chyi/workspace/Boards/STM32MP1/workspace/buildroot/buildroot/output/host/arm-buildroot-linux-gnueabihf/sysroot)
      
2) Compiler tab 선택 
     - Add 버튼 선택하여 GCC compiler 추가
     - Name: Buildroot GCC(다른 적당한 이름으로 해도 됨)
     - Compiler path: /home/chyi/workspace/Boards/STM32MP1/workspace/buildroot/buildroot/output/host/bin/arm-none-linux-gnueabihf-gcc
        
      - Add 버튼 선택하여 C++ compiler 추가
      - Name: Buildroot G++(다른 적당한 이름으로 해도 됨)
      - Compiler path: /home/chyi/workspace/Boards/STM32MP1/workspace/buildroot/buildroot/output/host/bin/arm-none-linux-gnueabihf-g++

3) Debugger tab 선택 
     - Add 버튼 선택하여 gdb 추가
     - Name: Buildroot GDB(다른 적당한 이름으로 해도 됨)
     - Path: /home/chyi/workspace/Boards/STM32MP1/workspace/buildroot/buildroot/output/host/bin/arm-none-linux-gnueabihf-gdb

4) Qt Versions tab 선택
     - qmake path 입력: /home/chyi/workspace/Boards/STM32MP1/workspace/buildroot/buildroot/output/host/bin
     - Version name: Qt %{Qt:Version} (host)를 Qt %{Qt:Version} (Buildroot)로 수정

5) Kits tab으로 다시 복귀
     - C, C++ compiler는 Buildroot GCC, Buildroot G++ compiler로 선택(변경)
     - Qt mkspec: devices/linux-buildroot-g++  입력
     - Apply -> OK 버튼 선택

[그림 4.13] Tool => Options => Kits => Compilers  설정

[그림 4.14] Tool => Options => Kits => Qt Versions  설정

[그림 4.15] Tool => Options => Kits 설정

6) Devices tab 선택 => Add 버튼 선택 후, Generic Linux Device 선택
   => 여기서는 ssh & sftp로 target board에 접속하여 Qt app(binary)를 복사(upload)하기 위해 필요한 설정을 해 준다.

[그림 4.16] Tool => Options =>  Devices 설정

이미 "b) DK2 보드에 ssh 및 sftp 서버 띄우기" 절에서 관련 설정을 진행한 바 있다. 따라서 제대로 설정을 해 주었다면 아래와 같이 정상 동작 메시지가 출력되어야 한다.

[그림 4.17] Qt creator <=> target board 연결 성공(sftp, rsync 사용)

앞서 살펴본 바와 같이 target board에서 Qt app을 실행하려면, -platform linuxfb option을 붙여 주어야 한다. 따라서 마지막으로 아래와 같이 Qt creator 설정을 변경해 주도록 하자.

Projects => Buildroot ARM => Run => Command line arguments: -platform linuxfb 입력

[그림 4.18] Projects => Buildroot ARM => Run => Command line arguments 설정

Qt Creator에 대한 모든 설정이 진행되었다. 따라서 이 상태에서 예제 program을 하나 만들어 실행해 보도록 하자.

[그림 4.19] Hello3 app

[Tip] Build 결과물을 target board 올리기 위해 아래와 같이 Hello3.pro 파일의 target.path를 적당히 잡아 주어야 한다.



[그림 4.20] Hello3 app ps 명령 모습(/root/workspace/Hello3 -platform linuxfb)

[그림 4.21] Hello3 app 실행 모습

지금까지 설명한 내용은 Qt Creator로 application을 cross-compile 한 후, scp or sftp 등을 활용하여 target board에 올려 실행하는 것과 동일하다고 볼 수 있다.

<Desktop>
chyi@mars:~build-Hello2-Buildroot_ARM-Debug$ scp ./Hello3 root@192.168.1.100:~/workspace
root@192.168.1.100's password: 
Hello3                                                                       100%   26KB   1.0MB/s   00:00

<Target board>
# cd workspace
# ./Hello3 -platform linuxfb



5. Device Tree 분석 및 Device Driver 시험하기
이번 장에서는 DK2 보드의 device tree를 분석하고, i2c 용 온/습도 센서를 DK2 보드에 연결하는 과정을 소개해 보도록 하겠다.

stm32mp157.dtsi
stm32mp15xc.dtsi
stm32mp15-pinctrl.dtsi
stm32mp15xxac-pinctrl.dtsi
stm32mp15xx-dkx.dtsi
^
|
stm32mp157c-dk2.dts

[그림 5.1] output/build/linux-5.7.1/arch/arm/boot/stm32mp157c-dk2.dts

To be continued ...



8. References




Slowboot

댓글 없음:

댓글 쓰기