Tslib和Qt 4.8.4與在開發板上的移植


這篇博客算是接着Linux 下編譯、安裝、配置 QT這篇的,搞完PC平台的就來弄一下嵌入式平台的,Linux的東西搞起來麻煩的地方就在於太雜、太散,像QT,各版本之間都有很多差異,因此在網絡上查找資料不能光看某一個,必須很多資料綜合來判斷、取舍。

好了,下面進入正題,本篇主要記錄QT的交叉編譯過程,這過程中很多東西我都試着去理解,去找出為什么這樣做,然而畢竟時間有限,很多地方還不太清楚,只能先做了再說,后續的地方回頭慢慢理解。

軟件平台


Linux:Ubuntu 12.04 X86

QT:4.8.4

交叉編譯工具鏈:gcc version 4.3.2 (Sourcery G++ Lite 2008q3-72)

tslib編譯與安裝


tslib是電阻式觸摸屏用於校准的一個軟件庫,是一個開源的程序,能夠為觸摸屏驅動獲得的采樣提供諸如濾波、去抖、校准等功能,通常作為觸摸屏驅動的適配層,為上層的應用提供了一個統一的接口。因此這里先編譯安裝tslib,這樣在后面編譯Qt的時候才能打包編譯進去。

首先現在源文件http://download.csdn.net/source/3177449

編譯安裝過程很簡單

首先需要檢查一下軟件是否安裝

sudo apt-get install automake
sudo apt-get install autogen
sudo apt-get install autoconf

確定以上工具都已經安裝后,解壓安裝即可。

# tar -zxvf tslib-1.4.tar.gz
# cd tslib
# ./autogen.sh
#./configure --host=arm-linux ac_cv_func_malloc_0_nonnull=yes --cache-file=arm-linux.cache -prefix=/usr/local/tslib
# make
# make install

-prefix=/usr/local/tslib是指定安裝路徑,其實包括下文的安裝配置,路徑都可以不指定,默認就是安裝到/usr/local/目錄下

tslib的開發板移植與測試


將交叉編譯的tslib安裝到開發板上其實就是拷貝相關的文件並添加系統環境變量而已,所以相對操作較為簡單,主要的就是需要找對目錄就行。

按照上面的操作方法,交叉編譯安裝后的文件在/usr/local/tslib目錄下,因此需要拷貝的文件如下:

  1. /usr/local/tslib/lib文件下除去pkgconfig目錄外其他所有文件拷貝到開發板/lib目錄下
  2. /usr/local/tslib/etc下的ts.conf拷貝到開發板的/etc下,在復制對應目錄之前修改文件如下,也可以復制完成后修改。

下面是ts.conf文件的第一行與第二行

# Uncomment if you wish to use the linux input layer event interface
# module_raw input
去掉# module_raw input前面的注釋,一定要注意中間的空格也去掉,module頂格。

最后添加環境變量,通過超級終端在開發板系統中添加環境變量,可以在開發板文件系統的/etc/profile文件里添加,也可以直接添加。

export TSLIB_TSDEVICE=/dev/input/touchscreen0
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/lib/ts

export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0

說明:
                TSLIB_TSDEVICE        //觸摸屏設備文件名。
                TSLIB_CALIBFILE        //校准的數據文件,由ts_calibrate校准程序生成。
                SLIB_CONFFILE        //配置文件名。
                TSLIB_PLUGINDIR         //插件目錄
                TSLIB_CONSOLEDEVICE        //控制台設備文件名
                TSLIB_FBDEVICE        //設備名

以上環境變量在實際開發中的實際配置可以根據實際情況決定。而這些指定的設備節點一定要和你的開發板上的/dev目錄下的設備節點相對應。

最后運行測驗程序

ts_calibrate 進行校驗
ts_test      進行測試

測試結果如下圖所示:

SNAGHTML2232630

image

說明:這個開發板的官方給的交叉編譯工具鏈是arm-2007q3,而我這里用的是OK6410開發板提供的工具鏈,這里使用暫時沒發現啥問題,不排除其他程序開發中可能存在啥問題。

emouse原創文章轉載請注明http://emouse.cnblogs.com/

QT 的交叉編譯與安裝


和PC平台下的編譯類似,通過運行./configure進行配置生成makefile文件,然后編譯安裝,只是因為是針對嵌入式平台需要進行一些針對性配置,這里生成一個自動配置文件,可以通過修改文件來方便的更改配置。

# cd qt-everywhere-opensource-src-4.8.4
#sudo gedit autoconfig.sh

加入以下內容保存.

#!/bin/sh
./configure \ -opensource \ -confirm-license \ -release -shared \ -embedded arm \ -xplatform qws/linux-arm-g++ \ -depths 16,18,24 \ -fast \ -optimized-qmake \ -pch \ -qt-sql-sqlite \ -qt-libjpeg \ -qt-zlib \ -qt-libpng \ -qt-freetype \ -little-endian -host-little-endian \ -no-qt3support \ -no-libtiff -no-libmng \ -no-opengl \ -no-mmx -no-sse -no-sse2 \ -no-3dnow \ -no-openssl \ -no-webkit \ -no-qvfb \ -no-phonon \ -no-nis \ -no-opengl \ -no-cups \ -no-glib \ -no-xcursor -no-xfixes -no-xrandr -no-xrender \ -no-separate-debug-info \ -nomake examples -nomake tools -nomake docs \ -qt-mouse-tslib \ -I/usr/local/tslib/include \ -L/usr/local/tslib/lib exit

文件中的內容就是需要配置的內容,同樣如果需要指定安裝路徑可以在開始加入-prefix=/usr/local/(自己的路徑)

上面的主要參數含義說明如下:
-embedded arm: 表示將編譯針對 arm 平台的 embedded 版本;
-xplatform qws/linux-arm-g++: 表示使用 arm-linux 交叉編譯器進行編譯;
-qt-mouse-tslib: 表示將使用 tslib 來驅動觸摸屏;

其他還有很多參數我也不太了解,后面使用的過程中再慢慢體會.

運行./autoconfig.sh 生成makefile文件,生成成功最后會輸出如下信息

Qt is now configured for building. Just run 'make'.
Once everything is built, you must run 'make install'.
Qt will be installed into /usr/local/Trolltech/QtEmbedded-4.8.4-arm

To reconfigure, run 'make confclean' and 'configure'.

如果編譯出現缺少鏈接信息錯誤:

warning: libts-0.0.so.0, needed by , not found (try using -rpath or -rpath-link)
undefined reference to `ts_read_raw'
undefined reference to `ts_open'
undefined reference to `ts_fd'
undefined reference to `ts_config'
undefined reference to `ts_close'
undefined reference to `ts_read'
collect2: ld returned 1 exit status

解決方法如下:

修改qt-everywhere-opensource-src-4.8.4/mkspecs/qws/linux-arm-g++/qmake.conf 文件(添加lts參數):

QMAKE_CC                = arm-linux-gcc -lts

QMAKE_CXX               = arm-linux-g++ -lts

QMAKE_LINK              = arm-linux-g++ -lts

QMAKE_LINK_SHLIB        = arm-linux-g++ -lts

修改完成后保存退出,繼續編譯。

這段信息指明了安裝方式和默認路徑,所以可以看出不指定路徑情況下的默認安裝路徑,因此這個路徑沒必要手工指定,雖然查出來的資料都指定的。

接下來執行make 進行編譯,時間同樣需要很長的時間,視個人電腦配置而定,時間大概在半個小時左右吧。

最后make install安裝,安裝完成后可以在安裝目錄/usr/local/Trolltech/QtEmbedded-4.8.4-arm 下查看對應文件。

開發板配置


在開發板上的使用其實很簡單,只需要拷貝相應的庫文件並設置環境變量即可,拷貝的方法按照個人喜好,我是掛載nfs來實現拷貝。

root@emouse:/armnfs# cp -R /usr/local/Trolltech/QtEmbedded-4.8.4-arm/lib /armnfs/qt 

設置環境變量:

export QTDIR=/opt/qt484 
export LD_LIBRARY_PATH=$QTDIRlib:$LD_LIBRARY_PATH 
export PATH=$QTDIR/bin:$PATH 
export QWS_MOUSE_PROTO=tslib:/dev/input/touchscreen0 
export QWS_DISPLAY="LinuxFb:mmWidth100:mmHeight130:0" 
export QT_QWS_FONTDIR=/opt/qt484/lib/fonts

在飛凌的OK6410板子中,是在/bin目錄下放一個腳本文件,在腳本文件中設置變量來實現運行,這樣可以為不同的程序進行單獨的配置,也可以設置開機運行等,用起來比較方便,下面是我的腳本文件,腳本中完成對所有環節變量的配置,當然這里是基於之前的改的,所以有些是多余的。最后運行的程序就是我放在opt目錄下的QC程序。關於在開發板上的Qt程序中顯示中文字體等設置可以參見 Qt 中顯示中文 這篇博客。

#!/bin/sh
base1=qpe
pid=`/bin/pidof $base1`
if [ -n "$pid" ]; then
    killall $base1
fi

base2=qss
pid=`/bin/pidof $base2`
if [ -n "$pid" ]; then
    killall $base2
fi

base3=quicklauncher
pid=`/bin/pidof $base3`
if [ -n "$pid" ]; then
    killall  $base3
fi


base4=fluidlauncher
pid=`/bin/pidof $base4`
if [ -n "$pid" ]; then
    killall  $base4
fi

export TSLIB_ROOT=/usr/local/tslib
export TSLIB_TSDEVICE=/dev/input/event2
export TSLIB_TSEVENTTYPE=H3600
export TSLIB_CONFFILE=/usr/local/tslib/etc/ts.conf
export TSLIB_PLUGINDIR=/usr/local/tslib/lib/ts
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export QTDIR=/opt/qt-4.8.4/
export QT_QWS_FONTDIR=/opt/qt-4.8.4/lib/fonts

export LD_LIBRARY_PATH=$QTDIR/plugins/qtopialmigrate/:$QTDIR/qt_plugins/imageformats/:$QTDIR/lib:/root/tslib/build/lib:$LD_LIBRARY_PATH
export PATH=/bin:/sbin:/usr/bin/:/usr/sbin:/root/tslib/build/bin


if [ -c /dev/input/event2 ]; then
        export QWS_MOUSE_PROTO="Tslib:${TSLIB_TSDEVICE}"
        if [ -e /etc/pointercal -a ! -s /etc/pointercal ] ; then
                rm /etc/pointercal
                /root/tslib/build/bin/ts_calibrate
        fi
else
        export QWS_MOUSE_PROTO="MouseMan:/dev/input/mice"
        >/etc/pointercal
fi
export QWS_KEYBOARD=TTY:/dev/tty1



FB_SIZE=$(cat /sys/class/graphics/fb0/virtual_size)

#export QWS_DISPLAY="LinuxFb:mmWidth76:mmHeight44:1"
case "$FB_SIZE" in
800,480)
export QWS_DISPLAY="LinuxFb:mmWidth91:mmHeight53:1"
;;
480,272)
export QWS_DISPLAY="LinuxFb:mmWidth76:mmHeight44:1"
;;
*)
export QWS_DISPLAY="LinuxFb:mmWidth91:mmHeight53:1"
;;
esac
#export QWS_DISPLAY=:1



export HOME=/root/QtE4Home

cd /opt
./QC -qws


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM