Qt Embedded 4.5.3 的移植和觸摸屏校正

在進行Qt/E的移植和觸摸屏校正的實踐過程中,不得不感慨一下國內的學術文章真是天下一大抄,想找點有價值的資料還真得累個精疲力竭。可惡的是,轉載的文章也不標明,搞得就像是自己原創的一樣,其中有多少人真正實踐過了,不得而知。廢話就到此爲止,牢騷也少發了,下面說說我的移植過程吧(前前後後一共耗時3天),既爲了方便自己,也希望對“不幸”搜到這篇文章的讀者有所幫助。
參考了下面幾篇文章:
http://www.qtcn.org/bbs/read.php?tid=10373
http://blog.ifeng.com/article/1848021.html
http://blog.chinaunix.net/u2/86708/showart_1924834.html
http://www.cnblogs.com/wangtianxj/archive/2009/05/12/1454729.html
首先,有必要區分幾個名詞:Qt,Qt/E,Qtopia Core, Qtopia。(引用自Qt中文論壇

Qt泛指Qt的所有桌面版本,比如Qt/X11,Qt Windows,Qt Mac等。由於Qt最早是在Linux中隨着KDE流行開來的,因此通常很多人說的Qt都指用於Linux/Unix的Qt/X11。

Qt/E(Qt/Embedded)是用於嵌入式Linux系統的Qt版本。Qt/E去掉了X Lib的依賴而直接工作於Frame Buffer上,因而效率更高,但它並不是Qt的子集,而應該是超集,部分機制(如QCOP等)不能用於Qt/X11中。

Qtopia是一個構建於Qt/E之上的類似桌面系統的應用環境。相比之下,Qt/E是基礎類庫。

Qtopia Core:就是原來的Qt/E,大概從Qt 4開始改名,把Qtopia Core併到Qtopia的產品線中去了。但實際上Qtopia Core就相當於原來的Qt/E,仍然作爲基礎類庫。

另外,似乎奇趣最近又把Qtopia Core改名叫做Qt for Embedded Linux了,不知道是不是因爲Qtopia Core搞得大家都很糊塗,沒人來買的緣故。

1、系統環境以及軟件準備
主機操作系統:Ubuntu 8.04
主機編譯器:gcc 版本 4.2.4 (Ubuntu 4.2.4-1ubuntu4)
交叉編譯器:arm-linux-gcc 3.4.1
軟件安裝包:(軟件包事先下載到了主目錄下的Qt目錄)
qt-embedded-linux-opensource-src-4.5.3.tar.gz
qt-x11-opensource-src-4.5.3.tar.gz
tslib-1.4.tar.gz
Qt的軟件安裝包可以到http://ftp3.ie.freebsd.org/pub/trolltech/pub/qt/source/下載,tslib下載

2、編譯安裝qt-x11
qt-x11版本可以產生Qt開發工具,如qmake、designer、qvfb(Qt/Embedded Virtual Framebuffer)等等。藉助qvfb工具就可以在PC上仿真開發Qt Embedded 的應程序。其實編譯qt-x11的主要目的是爲了得到qvfb這個工具,爲此花費好幾個鍾,真夠鬱悶。

A、編譯安裝qt-x11到/usr/local/qt-x86目錄(進入到Qt目錄)

tar xvzf qt-x11-opensource-src-4.5.3.tar.gz

cd qt-x11-opensource-src-4.5.3

./configure -prefix /usr/local/qt-x86 -qvfb

make

sudo make install

ps:配置參數中記得一定要有-qvfb,否則後面的qvfb工具無法編譯。這一編譯過程十分耗時,約三個小時。

B、編譯安裝qvfb
執行完上面的步驟後,然後就可以編譯安裝qvfb了。

cd qt-x11-opensource-src-4.5.3/tools/qvfb/

make

sudo make install (注:是在qt-x11-opensource-src-4.5.3/tools/qvfb/目錄下執行此命令的)

這樣qvfb就被安裝到/usr/local/qt-x86/bin目錄下了。

C、設置環境變量,我只是簡單的設置一下

cat >> ~/.bashrc <<EOF

if [ -d /usr/local/qte-x86 ];then

PATH=/usr/local/qte-x86/bin:/$PATH

fi

EOF

source ~/.bashrc 或 . ~/.bashrc

3、編譯安裝qt-embedded(進入到Qt目錄)

爲了程序開發的便捷性,安裝了x86版和arm版,先在PC上使用x86版和qvfb開發,完成以後再使用arm版交叉編譯放到開發版上運行。

A、解壓qt-embedded-linux-opensource-src-4.5.3.tar.gz
把源文件qt-embedded-linux-opensource-src-4.5.3.tar.gz解壓到當前目錄下。執行:

tar xvzf qt-embedded-linux-opensource-src-4.5.3.tar.gz

將其解壓得到qt-embedded-linux-opensource-src-4.5.3目錄,重命名爲qte-x86。
再次解壓qt-embedded-linux-opensource-src-4.5.3.tar.gz,並重命名爲qte-arm。
在qte-x86目錄下編譯x86架構的編譯工具鏈,用於PC機上的仿真調試。在qte-arm目錄下編譯arm架構的編譯工具鏈,用於交叉編譯在arm開發板上運行的程序。

B、編譯安裝觸摸屏庫軟件tslib-1.4.tar.gz
解壓tslib-1.4.tar.gz文件到當前目錄,進入到解壓後的tslib-1.4目錄。運行:

./autogen.sh

./configure --prefix=/usr/local/qte-arm/tslib-1.4 --host=arm-linux ac_cv_func_malloc_0_nonnull=yes

make

sudo make install

這樣就可以在/usr/local/qte-arm/tslib-1.4目錄下看到相關的應用程序、共享庫、配置文件等。

C、編譯安裝qte-x86(進入到qte-x86目錄)

./configure -prefix /usr/local/qte-x86 /
> -no-qt3support /
> -system-zlib /
> -system-libtiff /
> -system-libpng /
> -system-libjpeg /
> -qt-libmng /
> -make libs /
> -make examples / (注:因爲這個是x86版本,是在PC上仿真的,所以編譯這個爲了演示,下同)
> -make demos /
> -no-nis /
> -no-cups /
> -no-iconv /
> -xplatform qws/linux-x86-g++ /
> -embedded x86 /
> -depths 16,24,32 /
> -qt-gfx-qvfb /
> -no-gfx-linuxfb /
> -no-gfx-transformed /
> -no-gfx-vnc /
> -no-gfx-multiscreen /
> -qt-kbd-tty /
> -qt-kbd-usb /
> -qt-kbd-qvfb /
> -qt-mouse-pc /
> -qt-mouse-qvfb /
> -no-glib

make

sudo make install

一些默認的選項就沒有必要再列出來了,除非需要的功能剛好和默認的相反。

D、編譯安裝qte-arm (進入到qte-arm目錄)

./configure -prefix /usr/local/qte-arm /

> -no-qt3support /

> -qt-zlib /

> -qt-libtiff /

> -qt-libpng /

> -qt-libmng /

> -qt-libjpeg /

> -make libs /

> -nomake examples / (因爲這個是arm版本,所以編譯出來的程序只能在arm開發板上運行,編譯時把這些給去掉,加快編譯過程)

> -nomake demos /

> -nomake docs /

> -no-nis /

> -no-cups /

> -no-iconv /

> -xplatform qws/linux-arm-g++ /

> -embedded arm /

> -little-endian /

> -qt-freetype /

> -depths 8,16,24,32 /

> -qt-gfx-linuxfb /

> -no-gfx-transformed /

> -no-gfx-qvfb /

> -no-gfx-vnc /

> -no-gfx-multiscreen /

> -qt-kbd-usb /

> -qt-kbd-tty /

> -qt-mouse-pc /

> -no-glib /

> -qt-mouse-tslib -I/usr/local/qte-arm/tslib-1.4/include -L/usr/local/qte-arm/tslib-1.4/lib

make

sudo make install

編譯選項-qt-mouse-tslib需要用到觸摸屏功能的動態庫,所以得把之前編譯安裝的tslib庫包含進來。
至此,Qt/E的編譯安裝工作算是完成了,把這兩個都編譯好所花時間4個多小時,還真是一個漫長的過程啊。

爲了方便以後使用,俺把它們打包備份了。爲了方便備份,所以我才把tslib的安裝目錄放到了qte-arm下,因爲在編譯應用於arm開發板的程序時總是需要鏈接tslib庫的。所以使用下面的命令打包後,以後需要使用時直接解壓就可以而不必擔心缺失tslib庫。

tar cvzf qte-arm.tar.gz -P /usr/local/qte-arm 解壓命令 tar xvzf qte-arm.tar.gz -C /

把/usr/local/qt-x86/bin目錄下的qvfb工具複製到/usr/local/qte-x86/bin目錄下,然後打包備份。

sudo cp /usr/local/qt-x86/bin/qvfb* /usr/local/qte-x86/bin/

tar cvzf qte-x86.tar.gz -P /usr/local/qte-x86 解壓命令 tar xvzf qte-x86.tar.gz -C /

爲了方便使用qte-x86和qte-arm工具鏈來編譯程序,必要的環境變量還是得設置一下的。其實,在編譯Qt程序時,我們一般只是使用到了qmake工具,所以只要在~/.bashrc中添加幾個alias就可以了。

cat >> ~/.bashrc <<EOF

alias qvfb='/usr/local/qte-x86/bin/qvfb -width 640 -height 480'

alias qte-x86-make='/usr/local/qte-x86/bin/qmake'

alias qte-arm-make='/usr/local/qte-arm/bin/qmake'

EOF

source ~/.bashrc 或 . ~/.bashrc

4、tslib、qte-arm 的移植和配置

A、tslib 的環境變量和配置

(以下內容主要摘自TSlib校準原理
在採用觸摸屏的移動終端中,觸摸屏性能的調試是個重要問題之一,因爲電磁噪聲的緣故,觸摸屏容易存在點擊不準確、有抖動等問題。
Tslib是一個開源的程序,能夠爲觸摸屏驅動獲得的採樣提供諸如濾波、去抖、校準等功能,通常作爲觸摸屏驅動的適配層,爲上層的應用提供了一個統一的接口。在Qtopia 4.*版本中,默認的Tslib版本爲Tslib 1.4。在Qtopia 2.*版本中,默認的Tslib版本爲Tslib 1.3。

在嵌入式中,由於觸摸屏的種類多樣、質量不一,採用Tslib 的參考配置往往無法獲得較好的觸摸屏觸摸效果,同樣需要經過大量的測試才能得到滿意的配置參數,惡劣情況下,甚至需要對Tslib 的算法進行進一步的優化。下面就Tslib 的環境變量、配置文件等進行簡要的介紹。

1)環境變量
爲了實現Tslib 的正確運行,需要對如下的Tslib 的環境變量進行配置:

TSLIB_TSDEVICE //觸摸屏設備文件名

Default (no inputapi): /dev/touchscreen/ucb1x00

Default (inputapi): /dev/input/event0

TSLIB_CALIBFILE //校準的數據文件,由ts_calibrate 校準程序生成

Default: ${sysconfdir}/pointercal

TSLIB_CONFFILE //配置文件名

Default: ${sysconfdir}/ts.conf

TSLIB_PLUGINDIR //插件目錄

Default: ${datadir}/plugins

TSLIB_CONSOLEDEVICE //控制檯設備文件名

Default: /dev/tty

TSLIB_FBDEVICE //FrameBuffer設備名

Default: /dev/fb0

以上環境變量在實際開發中的實際配置可以根據實際情況決定。

2)配置文件
除了環境變量以外,Tslib 的配置文件ts.conf 同樣是個十分重要的部分,在ts.conf 中配置了需要加載的插件、插件加載順序以及插件的一些約束參數,這些配置參數對觸摸屏的觸摸效果具有十分重要的影響。
下面是Tslib 1.4 中的ts.conf 的參考配置:

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

# module_raw input

# Uncomment if you're using a Sharp Zaurus SL-5500/SL-5000d

# module_raw collie

# Uncomment if you're using a Sharp Zaurus SL-C700/C750/C760/C860

# module_raw corgi

# Uncomment if you're using a device with a UCB1200/1300/1400 TS interface

# module_raw ucb1x00

# Uncomment if you're using an HP iPaq h3600 or similar

# module_raw h3600

# Uncomment if you're using a Hitachi Webpad

# module_raw mk712

# Uncomment if you're using an IBM Arctic II

# module_raw arctic2

module pthres pmin=1

module variance delta=30

module dejitter delta=100

module linear

其中 pthres 爲Tslib提供的觸摸屏靈敏度門檻插件;variance 爲Tslib提供的觸摸屏濾波算法插件;dejitter 爲Tslib提供的觸摸屏去噪算法插件;linear 爲Tslib 提供的觸摸屏座標變換插件。

tslib 的實際配置:

去掉module_raw input前面的#號,同時把其他#號註釋項全部刪除,這些東西很BT!我的最終ts.conf 內容爲:

module_raw input

module pthres pmin=1

module variance delta=30

module dejitter delta=100

module linear

我也以親身痛苦的經歷強烈建議把配置文件改成和上面的一樣。感謝Freedomxura

B、tslib、qte-arm 的移植

目前我是使用nfs方式啓動開發板的,所以這個“移植”不大像真正意義上的移植。新建一個/opt/FriendlyARM/mini2440/root_nfs目錄作爲開發板nfs方式啓動所要掛載的根文件系統目錄,然後把開發板附帶光盤中的root_default.tgz裏面的文件釋放到 root_nfs(指代/opt/FriendlyARM/mini2440/root_nfs,下同)目錄。

1)在root_nfs目錄的opt子目錄下新建一個qt/lib目錄。

cd /opt/FriendlyARM/mini2440/root_nfs/opt && mkdir -p qt/lib

拷貝/usr/local/qte-arm/lib目錄下的 libQtCore、libQtGui、libQtNetwork 動態鏈接庫及其對應的所有符號鏈接到qt/lib目錄下。

2)在root_nfs目錄的usr目錄下新建一個local/qte-arm/lib/fonts目錄,然後到/usr/share/fonts目錄找到wqy(文泉驛)的字體文件並拷貝過來(這一步我並沒有直接拷貝/usr/local/qte-arm/lib/fonts/目錄下的字體文件)。

cd /opt/FriendlyARM/mini2440/root_nfs/usr/local/qte-arm/lib/fonts/

sudo cp /usr/share/fonts/truetype/wqy/wqy-zenhei.ttf ./

3)拷貝/usr/local/qte-arm/tslib-1.4目錄到/opt/FriendlyARM/mini2440/root_nfs目錄下

sudo cp -r /usr/local/qte-arm/tslib-1.4 /opt/FriendlyARM/mini2440/root_nfs/

4)設置環境變量。編輯/opt/FriendlyARM/mini2440/root_nfs/etc/profile文件(即開發板系統上的/etc/profile文件),輸入如下內容(假定當前工作目錄爲/opt/FriendlyARM/mini2440/root_nfs):

cat >> etc/profile <<EOF

export QTDIR=/opt/qt

export QPEDIR=/opt/qtopia

export T_ROOT=/tslib-1.4

export PATH=/$T_ROOT/bin:/$PATH

export LD_LIBRARY_PATH=/$T_ROOT/lib:/$QTDIR/lib

export TSLIB_CONSOLEDEVICE=none

export TSLIB_FBDEVICE=/dev/fb0

export TSLIB_TSDEVICE=/dev/input/event0

export TSLIB_PLUGINDIR=/$T_ROOT/lib/ts

export TSLIB_CONFFILE=/$T_ROOT/etc/ts.conf

export TSLIB_CALIBFILE=/etc/pointercal

export QWS_KEYBOARD=USB:/dev/input/event1

export QWS_MOUSE_PROTO=Tslib:/dev/input/event0

export QWS_DISPLAY=LinuxFb:mmWidth45:mmHeight60:0

export QWS_SIZE=640x480

EOF

到這裏,tslib、qte-arm的移植工作算是完成了,至於上面環境變量的意思,不懂的自己再搜索了。有疑惑的估計也就是LD_LIBRARY_PATH、QWS_DISPLAY、QWS_SIZE這幾個環境變量。(俺有時間再補充一下)
這一步有個小小的問題不得不說一下,即這些設置環境變量的語句貌似只有添加在etc/profile文件的後面,系統啓動後才能生效,而單獨把它們保存到一個shell腳本(可執行),然後丟到bin目錄下,並且在etc/init.d/rcS文件中也添加了執行該腳本的語句,奇怪的是這樣做系統啓動後環境變量並沒有成功設置,這是我遇到的一個說小不小說大不大的問題(因爲這個問題折騰了不少時間)。

ps:我現在大概明白爲什麼了,估計是子shell中設置的環境變量影響不到父shell

5)測試。以nfs的方式啓動開發板上的系統,然後執行ts_calibrate命令對觸摸屏進行校正,如果該命令能成功執行,那麼恭喜你,任務完成了。當然,你還可以執行ts_test命令做進一步的測試(玩玩^_^)

6)可能出現的問題彙總

1/

error while loading shared libraries: libQtGui.so.4: cannot open shared object file: No such file or directory

2/

[root@FriendlyARM fa]# ./hello

./hello: error while loading shared libraries: librt.so.1: cannot open shared object file: No such file or directory

3/

[root@FriendlyARM fa]# ./hello

QWSSocket::connectToLocalFile could not connect:: No such file or directory

QWSSocket::connectToLocalFile could not connect:: No such file or directory

QWSSocket::connectToLocalFile could not connect:: No such file or directory

QWSSocket::connectToLocalFile could not connect:: No such file or directory

QWSSocket::connectToLocalFile could not connect:: No such file or directory

QWSSocket::connectToLocalFile could not connect:: No such file or directory

No Qt for Embedded Linux server appears to be running.

If you want to run this program as a server,

add the "-qws" command-line option.

4/

[root@FriendlyARM fa]# ./hello -qws

QFontDatabase: Cannot find font directory /usr/local/qte-arm/lib/fonts - is Qt ?

Aborted

(注:/usr/local/qte-arm/lib/fonts這個具體路徑視你安裝qte-arm的路徑而定)

5/

[root@FriendlyARM fa]# ./hello -qws

./hello: relocation error: /opt/qt/lib/libQtGui.so.4: symbol __floatsisf, version Gcc_3.0 not defined in file libgcc_s.so.1 with link time reference.

如果你嚴格按照前面的幾個步驟執行了,那麼前四個問題是不會出現的了。第5個問題的解決:拷貝/usr/local/arm/3.4.1/arm-linux/lib/目錄下的libgcc_s.so、libgcc_s.so.1這兩個文件覆蓋/opt/FriendlyARM/mini2440/root_nfs/lib目錄下的libgcc_s.so、libgcc_s.so.1就可以了(其實這兩個文件中,一個是另外一個的符號鏈接)。參考移植QT4.5.0到博創UP-NETARM2410-S平臺的網友評論部分。

7)重新制作根文件系統,並燒寫到開發板上。完成上面的步驟後,最終的root_nfs目錄文件大小爲47M左右,使用mkyaffsimage(開發板附帶光盤中)工具重新制作根文件系統rootfs.img文件,通過usb線把rootfs.img燒寫到開發板(可能要經過多次才能燒寫成功)。ps:我使用的是mini2440的開發板,Nand Flash的容量爲64M,所以,重新生成的根文件系統鏡像(47M)加上壓縮內核鏡像(1.5M)的總大小沒有超過flash的容量,所以理論上是可以成功燒寫到開發板的。

至此,終於完成了整個移植過程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章