9/21/2014

Porting QT on ODROID (추후 정리가 필요, TEST완료)

1. Backgraound 

QT는 Trolltech사에서 개발한 UI Interface이며 현재 임베디드에서 많이 이용이 되며, Linux 뿐만 아니라 Window 및 Mac OS, Vxworks 등에서 구동이 된다.
예전에 회사에서 QT를 몇번 Porting을 했지만 매번 까먹는것 같어 정리 좀 한다.

이제 나의 장난감 ODROID에 QT를 올려보고자 한다.

A. QT 관련회사
  • Trolltech: Qt를 개발한 노르웨이 회사
  • Digia     : 현재 QT를 인수한 회사  2012년에 인수
  • Nokia: 핸드폰 제조회사로 QT 회사인 Trolltech와 QT를  2008년에 인수 했지만 이후로 Digia가 인수. 

   http://ko.wikipedia.org/wiki/Qt_(%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC)
   http://en.wikipedia.org/wiki/Qt_(software)
   http://en.wikipedia.org/wiki/Qt_Development_Frameworks


B. ODROID 관련회사

  •  hardkernel : odroid platform을 개발 
  •  linaro : ARM 기반 Linux open source를 지향하는 비영리 단체이며 ARM, Freescale, IBM, Samsung, ST-Ericsson 및 TI가 주축으로 구성이 되어 Soc가 나올 경우 이 관련 솔루션개발. 

현재 UBUNTU Image는 Linaro에서 공급을 받고 있으며, 이를 수정

   http://ko.wikipedia.org/wiki/%EB%A6%AC%EB%82%98%EB%A1%9C


2. Cross Compile 설치

기존 사용하던 Code Sourcery로는 에러가 발생하여, 다른 Cross Compiler 사용.
무료 Version이라 hard floating point 미지원 문제인 것 같다.

apt-get install 로도 가능하나, odroid 추천사이트를 아래와 같이 찾음


- 기본 환경설정
$ sudo mkdir -p /usr/local/arm >/dev/null 
$ sudo chmod 777 /usr/local/arm
$ cd /usr/local/arm

- Down Toolchain
$ cd /usr/local/arm
$ wget https://launchpadlibrarian.net/129963014/gcc-linaro-arm-linux-gnueabihf-4.7-2013.01-20130125_linux.tar.xz
$ xz -d gcc-linaro-arm-linux-gnueabihf-4.7-2013.01-20130125_linux.tar.xz 
$ tar -xvf gcc-linaro-arm-linux-gnueabihf-4.7-2013.01-20130125_linux.tar

- 의존성 문제로 Link 사용
$ ln -s gcc-linaro-arm-linux-gnueabihf-4.7-2013.01-20130125_linux /usr/local/arm/toolchain

- C-Compiler Cache 설정 (옵션)
$ cd /usr/local/arm/toolchain
$ mkdir bin-ccache
# you may already have ccache installed, but for the sake of illustration...
$ sudo apt-get install ccache
$ ln -s $(which ccache) arm-linux-gnueabihf-gcc
$ ln -s $(which ccache) arm-linux-gnueabihf-g++
$ ln -s $(which ccache) arm-linux-gnueabihf-cpp
$ ln -s $(which ccache) arm-linux-gnueabihf-c++

출처:
   http://odroid.us/mediawiki/index.php?title=Step-by-step_Cross-compiling_a_Kernel


3. Ubuntu Image

  • Download
   http://dn.odroid.com/Ubuntu_X2/

   * odroidx2_20130125-linaro-ubuntu-desktop_SDeMMC_with_HDMI.img


3.1 Modify the Image

  • IMAGE의 Partition 정보 확인

$ fdisk -l  odroidx2_20130125-linaro-ubuntu-desktop_SDeMMC_with_HDMI.img

Disk odroidx2_20130125-linaro-ubuntu-desktop_SDeMMC_with_HDMI.img: 5904 MB, 5904530944 bytes
255 heads, 63 sectors/track, 717 cylinders, total 11532287 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000c4046

                                                       Device Boot      Start         End      Blocks   Id  System
odroidx2_20130125-linaro-ubuntu-desktop_SDeMMC_with_HDMI.img1            4096      266239      131072    b  W95 FAT32
odroidx2_20130125-linaro-ubuntu-desktop_SDeMMC_with_HDMI.img2          266240    11532287     5633024   83  Linux

     A. FAT32 수정
         (kernel 및 boot.scr 변경)

// offset  2097152  = 4096 x 512 bytes
$  sudo mount -o loop,offset=2097152 /media/sf_SHARED/odroidx2_20130125-linaro-ubuntu-desktop_SDeMMC_with_HDMI.img ./tmp1
$ ls ./tmp1
board.dtb  boot  boot-hdmi1080.scr  boot-hdmi1080.txt  boot-hdmi720.scr  boot-hdmi720.txt  boot.ini  boot.scr  boot.txt  uImage  uInitrd  zImage
$ cd tmp1 
$ sudo cp boot.scr boot.scr.org   // backup 
$ vi boot.txt                    // mem=1023M 변경
$ sudo mkimage -A arm -T script -C none -n "Boot.scr for odroid" -d ./boot.txt ./boot.scr 


     B.Linux FS 수정
          (QT 복사 및 설정)

// offset  136314880 = 266240 x 512 bytes 
$ sudo mount -o loop,offset=136314880   /media/sf_SHARED/odroidx2_20130125-linaro-ubuntu-desktop_SDeMMC_with_HDMI.img ./tmp2
$ ls ./tmp2
bin  boot  dev etc  home  initrd.img  lib  lost+found media  mnt  opt  proc  root  run  sbin selinux  srv  sys  tmp usr  var  vmlinuz



3.3 Resize Image  (option)


기본에 존재하는 큰사이즈 Image를 줄이고, 필요없는 File System Partition 삭제
(NFS사용 ,SD도 4G가라 줄여야 함)

$ dd if=odroidx2_20130125-linaro-ubuntu-desktop_SDeMMC_with_HDMI.img of=newimage.img bs=1k count=200000

//FDISK로 두번째 partion 제거하고 사이즈를 아래와 같이 사이즈를 줄임
$ fdisk newimage.img
Command (m for help): d
Partition number (1-4): 2
Command (m for help): w
Command (m for help): p

Disk newimage.img: 204 MB, 204800000 bytes
255 heads, 63 sectors/track, 24 cylinders, total 400000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000c4046

       Device Boot      Start         End      Blocks   Id  System
newimage.img1            4096      266239      131072    b  W95 FAT32

$ sudo mount -o loop,offset=2097152 ./newimage.img ./tmp1




  • DD 관련설명

   http://forum.falinux.com/zbxe/index.php?document_srl=561988&mid=lecture_tip


4. KERNEL 

4.1 Download

  • 아래의 사이트에 가서 소스를 확인하고, 각 branch를 확인 후 down

   https://github.com/hardkernel/linux

$ git clone https://github.com/hardkernel/linux.git -b odroid-3.0.y 


4.2  Build Kernel 

$ cd linux
$ ls arch/arm/configs/odroidx2*                         // 확인후 설정
arch/arm/configs/odroidx2_android_emmc_defconfig   arch/arm/configs/odroidx2_ubuntu_defconfig
arch/arm/configs/odroidx2_android_sdmmc_defconfig  arch/arm/configs/odroidx2_ubuntu_mali_defconfig

$ make  odroidx2_ubuntu_defconfig   

$ make zImage   or make                                // make는 moudles도 함께,           
$ ls arch/arm/boot/
$ make modules -j4      
$ make modules_install  INSTALL_MOD_PATH=~/tmp          // 임시설정, 위의 Android에 복사


5. QT 


5.1 Download 

구글에서 qt-everywhere-opensource-src

   http://download.qt-project.org/archive/qt/5.2/5.2.0/single/qt-everywhere-opensource-src-5.2.0.tar.gz.mirrorlist
   http://download.qt-project.org/archive/qt/5.0/5.0.2/single/qt-everywhere-opensource-src-5.0.2.tar.gz.mirrorlist
   http://download.qt-project.org/archive/qt/4.8/4.8.6/qt-everywhere-opensource-src-4.8.6.tar.gz.mirrorlist



5.2  TSLIB 


$ ./configure prefix=/usr/local/Qt-4.8.6 --host=arm-linux CC=arm-linux-gnueabihf-gcc
$ make
$ make install 




ts_test.o: In function `main':
ts_test.c:(.text.startup+0x228): undefined reference to `rpl_malloc'
fbutils.o: In function `open_framebuffer':
fbutils.c:(.text+0x152): undefined reference to `rpl_malloc'
collect2: error: ld returned 1 exit status
make[2]: *** [ts_test] Error 1
make[2]: Leaving directory `/home/jhlee/qtwork/qtsource/tslib/tslib-1.0/tests'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/jhlee/qtwork/qtsource/tslib/tslib-1.0'
make: *** [all] Error 2


http://egloos.zum.com/sunnmoon/v/2348814
http://jiphung.com/399


5.3 QTWebkit

git clone git://gitorious.org/+qtwebkit-developers/webkit/qtwebkit.git


sudo apt-get install bison flex libqt4-dev libqt4-opengl-dev libphonon-dev libicu-dev libsqlite3-dev libxext-dev libxrender-dev gperf libfontconfig1-dev libphonon-dev g++




Ref. QTWebkit 빌드
http://webkit.sed.hu/blog/20100427/qtwebkit-cross-compilation-gcc-arm-linux
http://linuxspot.tistory.com/249
http://www.sarangnamu.net/basic/basic_view.php?no=4603&page=47&sCategory=0

5.4 Build QT 


개발전 우분투에서 설치해줘야할 Package들

 sudo apt-get install build-essential libfontconfig1-dev libfreetype6-dev libx11-dev libxcursor-dev libxext-dev libxfixes-dev libxft-dev libxi-dev libxrandr-dev libxrender-dev


  • vi mkspecs/qws/linux-arm-g++/qmake.conf
           :1,$s/arm-linux-/arm-linux-gnueabihf-/g 와 입력하여,
           아래와 같이 수정.

# modifications to g++.conf
QMAKE_CC                = arm-linux-gnueabihf-gcc
QMAKE_CXX               = arm-linux-gnueabihf-g++
QMAKE_LINK              = arm-linux-gnueabihf-g++
QMAKE_LINK_SHLIB        = arm-linux-gnueabihf-g++

# modifications to linux.conf
QMAKE_AR                = arm-linux-gnueabihf-ar cqs
QMAKE_OBJCOPY           = arm-linux-gnueabihf-objcopy
QMAKE_STRIP             = arm-linux-gnueabihf-strip

// TS Lib 설치 했을 경우 , Option
QMAKE_INCDIR += /usr/local/Qt-4.8.6/include
QMAKE_LIBDIR += /usr/local/Qt-4.8.6/lib -lts


  • 아래와 같이 QT source에 들어가 초기화하고, 설정 및 Make 

$ sudo -i  
$ cd qt-everywhere-opensource-src-4.8.4
$ make confclean
$  echo yes | ./configure -prefix /usr/local/Qt-4.8.6 -xplatform qws/linux-arm-g++ -embedded arm -little-endian  -release -no-largefile -no-accessibility -no-qt3support -qt-zlfile -no-accessibility -no-qt3support -qt-zlib -qt-libpng -no-libmng -qt-libjpeg -no-libtiff -no-nis -no-cups -qt-freetype -depths 16,24,32 -opensource




$ make confclean
$ echo yes | ./configure -prefix /usr/local/Qt-4.8.6 -xplatform qws/linux-arm-g++ -embedded arm -little-endian  -release -no-largefile -no-accessibility -no-qt3support -qt-zlib -qt-libpng -no-libmng -qt-libjpeg -no-libtiff -no-nis -no-cups -qt-freetype -depths 16,24,32 -opensource 

$ make -j 5
$ make install

//TSLibrary 추가

$echo yes | ./configure -prefix /usr/local/Qt-4.8.6 -xplatform qws/linux-arm-g++ -embedded arm -little-endian  -release   -no-largefile -no-accessibility  -no-qt3support -qt-zlib -qt-libpng  -qt-libjpeg  -qt-libtiff -qt-libmng  -qt-freetype -depths 16,24,32 -opensource  -qt-gfx-transformed -qt-mouse-tslib -qt-mouse-pc -webkit -qt-sql-qsqlite
$ make -j 5
$ make install




http://www.sereno-labs.com/Qt_4.8.3_installation_procedure_FriendlyARM_mini6410_Linux


6. QT Build ERRS 

1. ERROR-1


qtconcurrentiteratekernel.cpp:(.text+0x1a): undefined reference to `clock_gettime'
collect2: error: ld returned 1 exit status
make[1]: *** [../../lib/libQtCore.so.4.8.6] Error 1

vi  src/corelib/Makefile

 LIBS  = $(SUBLIBS)  -L/opt/qt-everywhere-opensource-src-4.8.4/lib -lpthread -lm -ldl -lrt


2. ERROR-2

make: *** [sub-examples-make_default-ordered] Error 2
           
                위의 Setting에서 기본환경 설치 확인

3. ERROR-3 (TSLIB)

참고사항
The tslib functionality test failed!
 You might need to modify the include and library search paths by editing
 QMAKE_INCDIR and QMAKE_LIBDIR in


TSLib 설치 및 QMAKE_LIBDIR 설정


4. 기타에러 

uentialanimationgroup.h -o .moc/release-shared-emb-arm/moc_qsequentialanimationgroup.cpp

compilation terminated.
make[1]: *** [.pch/release-shared-emb-arm/QtCore.gch/c++] Error 1
make[1]: *** Waiting for unfinished jobs...

이전에 permission 문제를 발견을 해서,

chown -R jhlee .
chgrp -R jhlee . 로 해결



5.6 Configure option 설명

-prefix /usr/local/Qt-4.8.6 : QT library가 설치될 장소 선정

-opensource : opensource 이 옵션일 경우 question 이 없어짐  (상용 –commercial)

-embedded arm : 임베디드 ARM 기반으로 빌드한다.

-platform /qws/linux-x86_64-g++ : Host에서 사용할 컴파일러(32비트 사용시는/qws/linux-x86-g++ 옵션을 사용)

-xplatform /qws/linux-dm368-g++ : Target에서 사용할 컴파일러(dm368일 경우)

-depths 16,24,32 : 지원되는 Bit-per-pixel. (콤마로 지원되는 값들을 구분)

-no-cups : CUPS를 지원하지 않도록 함.

-no-largefile : 대용량 파일을 지원하지 않도록 함.

-no-accessibility : Windows Active Accessibility을 지원하지 않도록 함.

-no-openssl : OPENSSL을 지원하지 않는다.

-no-gif : GIF 읽기를 지원하지 않는다.

-no-libtiff : TIFF를 지원하지 않는다.

-no-libmng :MNG를 지원하지 않는다.

-qt-gfx-transformed : 가속되지 않은 Linux Framebuffer(/dev/fb0)을 Enable한다.

-plugin-gfx-transformed : Linux Framebuffer를 런타임시에 링크시킨다.

-continue : 가능한 범위 내에서 오류를 무시하고 계속한다.

-no-mouse-pc : PC 마우스 드라이버를 사용하지 않는다.

-no-mouse-linuxtp : linuxtp 마우스 드라이버를 사용하지 않는다.

-qt-mouse-tslib : ‘tslib’ 터치 드라이버를 사용한다.

-plugin-mouse-tslib : ‘tslib’ 터치 드라이버를 런타임시에 링크한다.

-little-endian : Target 플랫폼은 little-endian으로 동작한다.

-host-little-endian : Host 플랫폼은 little-endian으로 동작한다.

-no-multimedia : Qt Multimedia 모듈을 빌드하지 않는다.

--no-svg : SVG(Scalable Vector Graphics) 모듈을 빌드하지 않는다.

-no-webkit : Webkit 모듈을 빌드하지 않는다.

-no-mmx : MMX 명령을 사용하지 않는다.

-no-3dnow : 3DNOW 명령을 사용하지 않는다.

-no-sse : SSE 명령을 사용하지 않는다.

-no-sse2 : SSE2 명령을 사용하지 않는다.

-no-qt3support : Qt3 지원을 사용하지 않는다.

-no-script : Qt Script를 사용하지 않는다.

-no-scripttools : Qt ScriptTools를 사용하지 않는다.

-qt-libpng : png 라이브러리를 사용한다.

-qt-zlib : zlib 옵션을 사용하도록 한다.(32비트에서만 필요할 것이다.)

-qconfig petra : qconfig-petra.h 를 참조하여 필요한 부분만 컴파일한다.

-release : 디버깅 모드를 사용하지 않고 릴리즈 모드로 컴파일한다.

-qt-sql-[driver-name]  : qmysql, qsqlite,
                                   
http://qt-project.org/doc/qt-4.8/sql-driver.html
http://qt-project.org/wiki/Building_Qt_for_Embedded_Linux







5.3  QT TEST 

http://processors.wiki.ti.com/index.php/Qt_Tips
http://com.odroid.com/sigong/blog/blog_list.php?bid=133

기본환경 설정


  • cat /etc/X11/xorg.conf
기존사용하던 Interface 파악, FB6 HDMI, FB0 LCD

  //FB6 HDMI  , FB0 LCD
Section "Device"
        identifier "FBDEV"
        Driver "fbdev"
        Option "fbdev" "/dev/fb6"
EndSection

Section "Screen"
        identifier "Default Screen"
        Device "FBDEV"
        DefaultDepth 16
EndSection


  • vi /etc/enviornments   or   /etc/rc.local  (/etc/rc.local 동작안함)


export QWS_DISPLAY="LinuxFb:/dev/fb6"
export LD_LIBRARY_PATH=/usr/lib:/lib:/usr/local/Qt-4.8.6/lib:/usr/local/lib
export PATH=$PATH:/usr/local/bin:/usr/local/Qt-4.8.6/demos/deform

export QWS_DISPLAY="LinuxFb:/dev/fb6"
export QWS_MOUSE_PROTO="USB:/dev/input/event1"
export LD_LIBRARY_PATH=/usr/lib:/lib:/usr/local/Qt-4.8.6/lib
export PATH=/bin:/sbin:/usr/bin/:/usr/sbin:/usr/local/bin:/usr/local/Qt-4.8.6/demos/deform
cd /usr/local/Qt-4.8.6/demos/deform
./deform -qws


  • ./deform -qws -display LinuxFb:/dev/fb6 // -display 옵션, Multi로 사용가능



  • 관련 link

QTWebKit
  http://linuxspot.tistory.com/249


ODROID QT Porting
  http://com.odroid.com/sigong/nf_board/nboard_view.php?brd_id=odroidx&kind=52&bid=1644

  http://napan.ca/ghpsdr3/index.php/Odroid

QT 4.7 Porting GUIDE
  http://www.jkelec.co.kr/img/arm/arm11/s3c6410_startkit/man/s3c6410_startkit_qt4.7.0_porting.html


QT 구조
  http://qt-project.org/doc/qt-4.8/qt-embedded-linux.html

QT 4.8 Porting GUIDE
  http://qt-project.org/doc/qt-4.8/qt-embedded-install.html
  http://qt-project.org/doc/qt-5/embedded-linux.html

QT 5.2
  https://www.ics.com/blog/building-qt-and-qtwayland-raspberry-pi#.VCKXLvl_uGE

QT 4.8.4
  http://galhui.tistory.com/38

  http://blog.csdn.net/wangpengqi/article/details/8728234

  http://stackoverflow.com/questions/19059596/cross-compiling-qt-for-pandaboard
  http://qt-project.org/forums/viewthread/16595
  http://forum.falinux.com/zbxe/index.php?document_srl=506571&mid=question

  http://chiccoder.tistory.com/36 
  (USB 모니터 및 Touchscreen example)

  • FILE SYSTEM 
추후에 직접 File system 을 만들거나 다른 BSP에서 가져와서 편집하자. 

  https://wiki.kldp.org/wiki.php/LinuxBasedOnUSB-StorageDevice
http://processors.wiki.ti.com/index.php/Creating_a_Root_File_System_for_Linux_on_OMAP35x
  https://emreboy.wordpress.com/2012/12/20/building-a-root-file-system-using-busybox/
  https://gist.github.com/chrisdone/02e165a0004be33734ac2334f215380e


  • Window에서 Image굽는 프로그램
  http://dn.odroid.com/DiskImager_ODROID/