Qt เป็น Cross-Platform Application และ UI Frame Work ที่วิ่งได้ในหลายระบบตั้งแต่ Windows, Mac OSX, Linux ตลอดจนไปถึง Linux Embeded system เราสามารถที่จะพัฒนาบน Platform หนึ่งแล้วเอาซอสโคดไปคอมไพล์ใช้บนอีก Platform ได้อย่างสบาย ตลอดจนเนื่องจากเป็น C++ ดังนั้นประสิทธิภาพของโปรแกรมที่ได้จึงสูงมาก ในส่วนของบทความนี้จะแสดงวิธีการคอมไพล์ระบบ Qt เพื่อนำไปใช้บน Mini2440 โดยจะอิง Qt 4.7 ซึ่งเพิ่งออกล่าสุดเป็นหลัก
- หากระบบยังไม่ได้ติดตั้ง cross tool chain ให้ทำงานติดตั้งได้ตามนี้ครับ การติดตั้ง Cross Tool Chain สำหรับ mini2440
- ติดตั้ง TE-Linux ลงใน SD Card ให้ทำงานติดตั้งได้ตามนี้ครับ Thai Embedded Linux Distribution(TE-Linux
- เนื่องจาก Mini2440 + Qt มักจะใช้งานร่วมกับ Touch screen ดังนั้นเราจึงจำเป็นต้องเตรียม Driver สำหรับ Touch screen ดังนี้
- สร้าง directory ขึ้นมาใน home directory ของเรา ในที่นี้ใช้ชื่อว่า tslb
- กำหนดค่า parameter ต่างๆที่จำเป็นต้องใช้ใน cvs เพื่อใช้ในการ login ดึง source code ของ tslib มา
และใช้คาสั่งดังต่อไปนี้
- $ mkdir tslib
$cd tslib/
$ export CVSROOT=:pserver:anoncvc@cvs.handhelds.org:/cvs
จากนั้นพิมพ์คาสั่ง
$ cvs login
ในที่นี้ได้มีการให้ทาการ install cvs ก่อน เราก็ทาโดยใช้คาสั่ง$ sudo apt-get install cvs
เมื่อการ install เสร็จสิ้น ให้พิมพ์
$ cvs login
จะมีการถาม Password ให้ใส่ anoncvs
หลังจากนั้น เริ่มต้นการสร้าง tslib ดังนี้
$ export ac_cv_func_malloc_0_nonnull=yes
จากนั้นพิมพ์
$ 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
- คราวนี้ก็ได้เวลาเตรียม source code สำหรับ Qt4.7 แล้วครับ โดยสร้าง Directory แล้วทำการดึงไฟล์มาแล้วแตกไฟล์ดังนี้
$ mkdir ~/qt4.7 $ cd ~/qt4.7 $ wget http://get.qt.nokia.com/qt/source/qt-everywhere-opensource-src-4.7.0-tp.tar.gz $ tar xvzf qt-everywhere-opensource-src-4.7.0-tp.tar.gz $ cd qt-everywhere-opensource-src-4.7.0-tp
- แก้ไขไฟล์ mkspecs/qws/linux-arm-g++/qmake.conf ที่ใช้กำกับการสร้าง Qt ดังนี้
- แก้ไขFilename ของ cross tool chain ให้ถูกต้อง หากท่านใช้ Cross Tool Chain ตัวอื่นที่แตกต่างไปจากที่กำหนดไว้ในข้อ 1
- เพิ่มบรรทัด QMAKE_INCDIR,QMAKE_LIBDIR และ LIBS เพื่อกำหนดตำแหน่งของ Include/Lib สำหรับ 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/piyachai/tslib/apps/tslib/build/include QMAKE_LIBDIR = /home/piyachai/tslib/apps/tslib/build/lib LIBS += -lts load(qt_config)
- กรณีที่ home directory ไม่ใช่ piyachai ให้แก้ path ให้ตรงกับ home directory ขอเรา
- ทำการ 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
- ทำการสร้างระบบ Qt ด้วยคำสั่ง make ซึ่งจะใช้เวลาในการ compile ยาวนานมากและหากทุกอย่างเรียบร้อย เราก็สามารถต่อด้วยคำสั่ง sudo make install เพื่อติดตั้ง Qt ไปยังตำแหน่งที่ระบุไว้ด้วย -prefix ในข้อ 5 ซึ่งในกรณีนี้คือ /usr/local/Qt เราจำเป็นต้องใช้คำสั่ง sudo ในขั้นตอนการ make install เพราะ /usr/local จะเขียนได้โดย root เท่านั้น
- มาถึงจุดนี้ ไฟล์ของระบบ Qt ที่จะใช้รันบน mini2440 ทั้งหมดจะถูกเก็บอยู่ไว้ที่ /usr/local/Qt ซึ่งเราจะต้องทำการย้ายไปลงยัง File system ของ mini2440 ที่จะใช้รัน โดยเราจะต้องมีระบบที่วิ่ง Linux อยู่แล้ว คือ TE-Linux ที่อยู่ใน SD Card ตามหัวข้อที่ 2
- เริ่มต้นด้วยการย้ายไฟล์ที่เกี่ยวของกับ touch screen ไปยัง File System ของ mini2440 ที่อยู่บน SD Card ของผม mount อยู่ใน Directory /mnt/ext3 หรือแกตามให้ตรงกับเครื่องของเรา
$ export MINI2440FS="/mnt/ext3" $ 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
- คัดลอกไฟล์ที่จำเป็นในการรันจาก Cross Tool Chain ไปยัง File system ของ mini2440 บน SD Card ดังนี้
$ sudo mkdir $MINI2440FS/usr/local/Qt $ sudo mkdir $MINI2440FS/usr/local/Qt/lib $ sudo cp -p /opt/toolchains/arm920t-eabi/arm-angstrom-linux-gnueabi/lib/libstdc++.so* $MINI2440FS/usr/local/Qt/lib
- คัดลอกไฟล์ Qt ไปยัง Root File System ของ mini2440 บน SD Card
$ sudo cp -Rpf /usr/local/Qt/* $MINI2440FS/usr/local/Qt/
$ sync
- มาถึงขั้นนี้เราก็พร้อมที่จะบูท 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
- และแล้วก็ได้เวลาที่เราจะได้ทดสอบโปรแกรมแรกของ Qt ภายใต้ mini2440 แล้ว ให้รัน demo ดังนี้ # cd /usr/local/Qt/demos/embedded/fluidlauncher # ./fluidlauncher -qws
ขั้นต่อไปเป็นส่วนในการปรับแต่งการใช้งาน Qt ให้สามารถแสดงผลอย่างมีประสิทธิภาพ
- การเปลี่ยน font ที่ใช้ใน Applicationเมื่อทาการติดตั้ง Qt4 เป็นที่เรียบร้อยแล้ว ทดลองรัน program
# ./calculatorform -qws
- การหมุนจอภาพจำเป็นต้องใช้ driver ตัวนึงที่ชื่อว่า Transformed ซึ่งจะถูกสร้างขึ้นมาพร้อมกับระบบโดยเราต้องระบุ feature ดังนี้ -qt-gfx-transformed ในขั้นตอนการ configureการใช้งานสามารถระบุได้ทั้งจาก Environment Variables ดังนี้
# export QWS_DISPLAY=tansformed:rot90
หรือจะเป็น option ต่อท้าย application ก็ได้ดังนี้
# ./calculatorform -qws -fn unifont -display "transformed:rot90"
หลังจากนั้นเมื่อรัน application จอภาพก็จะหมุนไป 90 องศาตามต้องการ
- การทา Remote Desktop ด้วย VNC
VNC (Virtual Network Computing) เป็นเทคนิคในการแชร์จอภาพ คีย์บอร์ด และ เมาส์ ด้วยกันจากคอมพิวเตอร์ตัวหนึ่งไปยังอีกตัวหนึ่ง ทาให้คอมพิวเตอร์อีกตัวสามารถเห็นภาพของคอมพิวเตอร์อีกตัวหนึ่งและควบคุมได้ ด้วย ข้อดีของ VNC คือเป็น Open Source และไม่ยึดติดกับ Operating System
สิ่งที่ต้องมีคือ
- ระบบ Qt ที่มี VNC Driver ซึ่งสามารถกาหนดได้ในขั้นตอน configure ด้วยการเพิ่ม option ดังนี้ -qt-gfx-vnc
- โปรแกรม vncviewer โดยใช้คาสั่ง sudo apt-get install vncviewer บน linux PC
- ใช้คาสั่ง ifconfig ที่ mini2440 เพื่อตรวจสอบดูว่า ip address ของ mini2440 คืออะไร ในที่นี้กาหนดให้เป็น 192.168.1.102
- VNC Driver ในมุมมองของ Qt แล้วคือจอตัวหนึ่งซึ่ง defualt จะกาหนดให้มีขนาด 800x600 พิกเซล เราสามารถที่จะทาการเปลี่ยนแปลงค่า default นี้ได้
- ลองมารัน application
mini2440#./calculatorform -qws -fn unifont –display "VNC:size=800x600:depth=32" QVNCServer created on port 5900
เริ่มต้นด้วยการรัน calculatorform โดยกาหนดให้ใช้ font unifont และให้แสดงผลไปยัง vnc driver ที่กาหนดให้มีขนาด 800x600 จานวนสีต่อพิกเซล 32 ซึ่งเราจะไม่เห็นอะไรปรากฏบนหน้าจอ lcd เพราะขณะนี้เอาพุทของโปรแกรมจะวิ่งไปหา vnc โปรดสังเกตุข้อความ QVNCServer created on port 5900 ซึ่งหมายความว่าขณะนี้ VNCServer ได้ทาการรันแล้วโดยใช้พอร์ทหมายเลข 5900
- 4. ที่ linux PC ใช้คาสั่ง
$vncviewer 192.168.1.102 จะได้
- ถ้าต้องการที่จะรันและให้แสดงผล บน lcd ของ mini2440 และ vnc บน PC ไปพร้อมๆกันสามารถทาได้โดย กาหนด display ให้เป็น vnc over framebuffer ดังนี้
./calculatorform -qws -fn unifont -small –screen -display "vnc:linuxfb"
ภาพจาก linux-PC
ภาพจาก Board mini2440
ขอบคุณข้อมูลจาก www.thaiembedded.net
ไม่มีความคิดเห็น:
แสดงความคิดเห็น