Powered by Drupal, an open source content management system

การสร้าง Qt4.5.3 และ Qt4.6 สำหรับ mini2440

 

Qt เป็น Cross-Platform Application และ UI Frame Work ที่วิ่งได้ในหลายระบบตั้งแต่ Windows, Mac OSX, Linux ตลอดจนไปถึง Linux Embeded system เราสามารถที่จะพัฒนาบน Platform หนึ่งแล้วเอาซอสโคดไปคอมไพล์ใช้บนอีก Platform ได้อย่างสบาย ตลอดจนเนื่องจากเป็น C++ ดังนั้นประสิทธิภาพของโปรแกรมที่ได้จึงสูงมาก

บทความนี้จะแสดงวิธีการคอมไพล์ระบบ Qt เพื่อนำไปใช้บน Mini2440 โดยจะอิง Qt 4.5.3 และ Qt 4.6 เป็นหลัก โดยสมมติให้ home directory ของ user คือ /home/mini2440

1. หากระบบยังไม่ได้ติดตั้ง cross tool chain ให้ทำงานติดตั้งได้ตามนี้ครับ การติดตั้ง Cross Tool Chain

2. เนื่องจาก Embedded Linux มักจะใช้งานร่วมกับ Touch screen ดังนั้นเราจึงจำเป็นต้องเตรียม Driver สำหรับ Touch screen ดังนี้

  •  กำหนด directory และ ตำแหน่งที่เราจะไปดึง source code ด้วย cvs
  • password ที่ใช้ในการดึง source code คือ anoncvs
$ mkdir tslib
$ cd tslib
$ export CVSROOT=:pserver:anoncvs@cvs.handhelds.org:/cvs
$ cvs login
$ cvs co apps/tslib

 ผลที่ได้จะเป็นดังนี้

 

  • source code จะถูกดึงมาไว้ที่ ~/tslib/apps/tslib
  • เริ่มต้นการสร้าง tslib ดังนี้

$ export ac_cv_func_malloc_0_nonnull=yes

export ac_cv_func_malloc_0_nonnull=yes ต้องทำก่อน configure หากไม่ทำเวลา compile จะเจอปัญหา "undefined reference to rpl_malloc"

$ cd ~/tslib/apps/tslib
$ ./autogen.sh
$ CC=arm-angstrom-linux-gnueabi-gcc CXX=arm-angstrom-linux-gnueabi-g++ ./configure --build=i386-linux --host=arm-linux --target=arm --disable-inputapi --prefix=$PWD/build
$ make
$ make install

 

  • เมื่อเสร็จสิ้นการคอมไพล์ เราจะได้ tslib อยู่ภายใต้ build directory โดยมีโครงสร้างดังนี้

/home/mini2440/tslib/apps/tslib/build
|-- bin
|   |-- ts_calibrate
|   |-- ts_harvest
|   |-- ts_print
|   |-- ts_print_raw
|   `-- ts_test
|-- etc
|   `-- ts.conf
|-- include
|   `-- tslib.h
`-- lib
    |-- libts-0.0.so.0 -> libts-0.0.so.0.1.0
    |-- libts-0.0.so.0.1.0
    |-- libts.la
    |-- libts.so -> libts-0.0.so.0.1.0
    `-- ts
        |-- arctic2.la
        |-- arctic2.so
        |-- collie.la
        |-- collie.so
        |-- corgi.la
        |-- corgi.so
        |-- dejitter.la
        |-- dejitter.so
        |-- h3600.la
        |-- h3600.so
        |-- input.la
        |-- input.so
        |-- linear.la
        |-- linear.so
        |-- mk712.la
        |-- mk712.so
        |-- pthres.la
        |-- pthres.so
        |-- ucb1x00.la
        |-- ucb1x00.so
        |-- variance.la
        `-- variance.so

 

3. คราวนี้ก็ได้เวลาเตรียม source code สำหรับ Qt แล้วครับ โดยสร้าง Directory แล้วทำการดึงไฟล์มาแล้วแตกไฟล์ดังนี้

ในกรณีที่เป็น Qt4.5.3

$ mkdir ~/qt4.5.3
$ cd ~/qt4.5.3
$ wget http://get.qt.nokia.com/qt/source/qt-embedded-linux-opensource-src-4.5.3.tar.gz
$ tar xvzf qt-embedded-linux-opensource-src-4.5.3.tar.gz
$ cd qt-embedded-linux-opensource-src-4.5.3

ในกรณีที่เป็น Qt4.6

$ mkdir ~/qt4.6
$ cd ~/qt4.6
$ wget http://get.qt.nokia.com/qt/source/qt-everywhere-opensource-src-4.6.0.tar.gz
$ tar xvzf qt-everywhere-opensource-src-4.6.0.tar.gz
$ cd qt-everywhere-opensource-src-4.6.0

4. แก้ไขไฟล์ mkspecs/qws/linux-arm-g++/qmake.conf ที่ใช้กำกับการสร้าง Qt ดังนี้

  • แก้ไขFilename ของ cross tool chain ในส่วนสีแดงให้ถูกต้อง หากท่านใช้ Cross Tool Chain ตัวอื่นที่แตกต่างไปจากที่กำหนดไว้ในข้อ 1
  • เพิ่มบรรทัดสีชมพูเพื่อกำหนดตำแหน่งของ Include/Lib สำหรับ Touch Screen Lib ที่เราได้สร้างไว้ในข้อ 2

#
# qmake configuration for building with arm-linux-g++
#

include(../../common/g++.conf)
include(../../common/linux.conf)
include(../../common/qws.conf)

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

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

QMAKE_INCDIR            = /home/mini2440/tslib/apps/tslib/build/include
QMAKE_LIBDIR            = /home/mini2440/tslib/apps/tslib/build/lib

load(qt_config)

  •  ในกรณีของ Qt4.6 เนื่องจากมีบั๊กในการสร้าง Makefile เราจึงจำเป็นต้องเพิ่ม LIBS += -lts ไปอีกบรรทัดเพื่อรองรับ Touch screen lib ดังนี้

#
# qmake configuration for building with arm-linux-g++
#

include(../../common/g++.conf)
include(../../common/linux.conf)
include(../../common/qws.conf)

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

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

QMAKE_INCDIR            = /home/mini2440/tslib/apps/tslib/build/include
QMAKE_LIBDIR            = /home/mini2440/tslib/apps/tslib/build/lib
LIBS                    += -lts

load(qt_config)

 

5. ทำการ configure ด้วยคำสั่ง

 

$ ./configure -embedded arm -xplatform qws/linux-arm-g++ -prefix /usr/local/Qt -qt-mouse-tslib -little-endian -qt-gfx-transformed -qt-gfx-linuxfb -qt-gfx-vnc

  • -qt-gfx-transformed สำหรับติดตั้ง Driver เพื่อการหมุนหน้าจอ
  • -qt-gfx-linuxfb สำหรับติดตั้ง Driver เพื่อติดต่อกับ Linux Frame Buffer
  • -qt-gfx-vnc สำหรับติดตั้ง Driver เพื่อให้ Qt เป็น vncserver ทำให้เราสามารถใช้ vnc client ติดต่อกับหน้าจอของ Qt
  • -prefix /usr/local/Qt จะกำหนด Directory ที่จะทำการติดตั้งระบบ Qt

และเลือก o สำหรับ Open Source Edition และ เลือก yes เพื่อยอมรับ license

 

หลังจาก configure แล้วระบบก็พร้อมที่จะทำการสร้าง Qt

6. ทำการสร้างระบบ Qt ด้วยคำสั่ง make ซึ่งจะใช้เวลาในการ compile ยาวนานมากและหากทุกอย่างเรียบร้อย เราก็สามารถต่อด้วยคำสั่ง sudo make install เพื่อติดตั้ง Qt ไปยังตำแหน่งที่ระบุไว้ด้วย -prefix ในข้อ 5 ซึ่งในกรณีนี้คือ /usr/local/Qt เราจำเป็นต้องใช้คำสั่ง sudo ในขั้นตอนการ make install เพราะ /usr/local จะเขียนได้โดย root เท่านั้น

7. มาถึงจุดนี้ ไฟล์ของระบบ Qt ที่จะใช้รันบน mini2440 ทั้งหมดจะถูกเก็บอยู่ไว้ที่ /usr/local/Qt ซึ่งเราจะต้องทำการย้ายไปลงยัง File system ของ mini2440 ที่จะใช้รัน โดยเราจะต้องมีระบบที่วิ่ง Linux อยู่แล้ว หากท่านยังไม่มีระบบ Linux วิ่งอยู่บน mini2440 ให้ดูตัวอย่างการสร้างได้จากบทความสองอันนี้ การสร้าง Debian File System สำหรับ mini2440 หรือ การสร้าง Ångström Distribution ด้วย Openembedded 

  • ระบบที่ใช้ทดสอบมีคุณสมบัติดังนี้
    • วิ่ง Linux Angstrom Distribution
    • mini2440 ใช้ file system ที่ต่อผ่าน Network File system โดย root directory ของ mini2440 จะถูก map ไปยัง Host system ที่ /nfs/home/Angstrom-console (ดูเรื่อง การบูทระบบด้วย Network File System )

8. เริ่มต้นด้วยการย้ายไฟล์ที่เกี่ยวของกับ touch screen ไปยัง File System ของ mini2440

$ export MINI2440FS="/nfs/home/Angstrom-console"
$ sudo cp -Rp ~/tslib/apps/tslib/build/lib/* $MINI2440FS/usr/lib
$ sudo cp -Rp ~/tslib/apps/tslib/build/bin/* $MINI2440FS/usr/bin
$ sudo cp -Rp ~/tslib/apps/tslib/build/etc/* $MINI2440FS/etc

9. คัดลอกไฟล์ที่จำเป็นในการรันจาก Cross Tool Chain ไปยัง File system ของ mini2440 ดังนี้

$ export MINI2440FS="/nfs/home/Angstrom-console"
$ sudo cp -p /opt/toolchains/arm920t-eabi/arm-angstrom-linux-gnueabi/lib/libstdc++.so* $MINI2440FS/usr/local/Qt/lib

10. คัดลอกไฟล์ Qt ไปยัง Root File System ของ mini2440

$ export MINI2440FS="/nfs/home/Angstrom-console"
$ sudo cp -Rpf /usr/local/Qt $MINI2440FS/usr/local/Qt

11. มาถึงขั้นนี้เราก็พร้อมที่จะบูท mini2440 ของเราแล้วครับ ให้เปิดสวิชท์เพื่อเริ่มต้นรัน mini2440 รอจนบูทเสร็จสิ้นแล้วให้ login ระบบด้วย root user

เราจำเป็นต้องทำการ Calibrate touch screen ของเราก่อนใช้งาน แต่ก่อนอื่นเราต้องแก้ไขไฟล์อีกสองตัวดังนี้

  • แก้ไขไฟล์ /etc/ts.conf โดยตัดคอมเม็นท์ # ออกจากบรรทัดที่สองดังนี้

# Uncomment if you wish to use the linux input layer event interface
module_raw input

  • แก้ไขไฟล์ /etc/profile โดยเพิ่ม export ที่เกี่ยวข้องกับ tslib ดังนี้

# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).

export TSLIB_TSEVENTTYPE=input
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_TSDEVICE=/dev/input/event1
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/usr/lib/ts
export QWS_MOUSE_PROTO=tslib:/dev/input/event1

export QTDIR=/usr/local/Qt

หลังจากแก้ไขไฟล์แล้วให้ รีบูท mini2440 หนึ่งครั้ง !!!!!

  • login root แล้ววิ่งคำสั่ง ts_calibrate จะเห็นภาพดังนี้ปรากฏบนหน้าจอ mini2440 ให้ทำการแตะจุดไปจนครบห้าจุด ซึ่งโปรแกรมจะทำการเก็บข้อมูลของการ Calibrate ไว้ในไฟล์ /etc/pointercal

 

12. และแล้วก็ได้เวลาที่เราจะได้ทดสอบโปรแกรมแรกของ Qt ภายใต้ mini2440 แล้ว ให้รัน demo ดังนี้

# cd /usr/local/Qt/demos/embedded/fluidlauncher
# ./fluidlauncher -qws

ถ้าทุกอย่างถูกต้อง ท่านจะเห็น fluidlauncher ปรากฏบนจอ lcd ของ mini2440 ดังนี้ครับ