QT程序到arm板(s5pv210)的移植之旅

                                             
前記:
        由於畢設的原因,將來需要移植QT程序到arm板子運行,故有此文。
        看博客尋資料,看到一位作者寫道:知識來源於互聯網,必將回報互聯網。贊。
        介於從陌生到熟悉的折騰,故將移植過程記錄,發文,以己省人。

————————————————————備註———————————————————————
備註:1、移植過程存在各種情況,如遇編譯報錯,可百度查詢,都能解決問題;
          2、本文僅記錄作者所遇到的移植問題,僅供參考。
          3、參考另一博客:http://whylinux.blog.51cto.com/10900429/1856076
————————————————————正文———————————————————————
一、開發環境
主機環境:ubuntu14.04
目標機:九鼎創展科技的x210開發板(S5PV210)
主機工具鏈:gcc-4.8.2
交叉編譯工具鏈:arm-none-linux-gnueabi-gcc-4.4.1 (來自三星的arm-2009q3)
QT移植版本:QT-4.7.4
掛載x210開發板根文件系統方式:NFS
自行製作開發板根文件系統
 
二、移植tslib
說明:一般QT程序放到arm板上都需要觸摸控制,所以需要移植這個觸摸屏庫tslib。
(1)下載
百度下載 tslib-1.4.tar.gz
或者開發板九鼎官方提供的tslib_x210_qtopia.tgz
備註:本人tslib使用的是九鼎官方QT4.8源碼(qt_x210v3s_160307.tar.bz2)裏面的tslib_x210_qtopia.tgz
 
(2)解壓
將tslib源碼複製到ubuntu 的/usr/local/src/目錄下,解壓,並創建一個目錄tslib_x210用於稍後的tslib安裝
 
(3)修改及緣由(往下看)
查看使用的工具鏈中的arm-none-linux-gnueabi/libc/usr/include/linux/input.h中的EV_VERSION宏的值,它一定要和內核中的include/linux/input.h中的EV_VERSION宏的值一樣(一般都需要修改,選其中任何一個修改同樣值即可;本人選擇將內核該宏值修改爲0x010000,因爲本人工具鏈該宏值是這個,再重新編譯內核燒錄)
以上緣由:
在tslib源碼中的/plugins/input-raw.c文件中check_fd函數裏,有一段代碼對開發板的觸摸屏進行檢測,若下面條件只要有一個不滿足,則報告"selected device is not a touchscreen I understand",意思是檢測不到觸摸屏:

if (! ((ioctl(ts->fd, EVIOCGVERSION, &version) >= 0) && (version == EV_VERSION) &&
(ioctl(ts->fd, EVIOCGBIT(0, sizeof(bit) * 8), &bit) >= 0) &&
(bit & (1 << EV_ABS)) &&
(ioctl(ts->fd, EVIOCGBIT(EV_ABS, sizeof(absbit) * 8), &absbit) >= 0) &&
(absbit & (1 << ABS_X)) &&
(absbit & (1 << ABS_Y)) &&
(absbit & (1 << ABS_PRESSURE))))
{ fprintf(stderr, "selected device is not a touchscreen I understand\n"); return -1; }

a、如果修改參數後不清楚是否修改成功,可見前面“備註”第3條參考博主對該段的debug;
b、注意一些板子觸摸屏驅動文件中對上面的ABS_X、ABS_Y、ABS_PRESSURE的定義和使用情況,在本人移植的九鼎x210開發板ft5x06觸摸屏驅動文件中,它就沒使用ABS_X、ABS_Y,而是多點觸摸的定義ABS_MT_POSITION_X、ABS_MT_POSITION_Y,導致打印 "selected device is not a touchscreen I understand”
解決方法:去除ft5x06觸摸屏驅動文件裏的多點觸摸相關定義ABS_MT_WIDTH_MAJOR和ABS_MT_TRACKING_ID所在函數,再將ABS_MT_POSITION_X、ABS_MT_POSITION_Y改成ABS_X、ABS_Y。(MT = multiple
c、上面這條,僅起提醒作用,其他x210板子用戶可驗證是否確實有這個問題。
 
(4)配置、安裝tslib
a、解壓後進入tslib目錄,執行./autogen.sh
b、執行./configure CC=arm-none-linux-gnueabi-gcc CXX=arm-none-linux-gnueabi-g++ --host=arm-none-linux-gnueabi --prefix=/usr/local/src/tslib_x210 ac_cv_func_malloc_0_nonnull=yes
(--prefix 指定tslib的安裝目錄 : 此文件夾在前面已經創建)
c、先後執行make、 make install,之後tslib就會安裝在指定的目錄tslib_x210 下,它裏面有bin、lib、include、etc四個文件夾
 
(5)修改ts.conf
進入安裝目錄tslib_x210 ,vi命令打開etc/ts.conf :
a、如果是網上下載、安裝的tslib-1.4版本,則將第二行“# module_raw input” 的“# ”去掉,並頂格,不能留下空格
b、如果是九鼎官方提供的tslib_x210_qtopia
修改內容爲紅色字體:
module_raw input
module pthres pmin=1
module variance delta=30
module dejitter delta=100 (原來是10000)
module linear
保存

(6)設置開發板環境變量
將整個安裝目錄tslib_x210 複製到開發板的文件系統,啓動開發板通過NFS方式啓動它的文件系統,再通過開發板的終端 打開環境變量文件/etc/profile,添加如下內容:(先看下方備註)
export TSLIB_ROOT=/tslib_x210
export TSLIB_TSDEVICE=/dev/input/event2
export QWS_MOUSE_PROTO=tslib:/dev/input/event2
export TSLIB_CALIBFILE=/etc/pointercal  
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf   
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts 
export TSLIB_FBDEVICE=/dev/fb0  
export TSLIB_CONSOLEDEVICE=none  
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TSLIB_ROOT/lib:/lib
備註:
a、前三項需要自行檢查;TSLIB_ROOT更換爲自己實際存放的路徑;
b、TSLIB_TSDEVICE (第2項)和QWS_MOUSE_PROTO(第3項)這兩項需要查看自己的板子的觸摸屏設備對應/dev/input/下那個文件,方法:進入查看/dev/input/,裏面有幾個event ,每個cat一次,並點觸摸屏看看secureCRT是否有內容輸出,亂碼也允許;
c、對於第3項的QWS_MOUSE_PROTO,這裏使用的QT控制方式是觸摸屏,故它的關鍵字的“tslib”,如果將來的QT程序想同時允許使用觸摸屏和鼠標來控制,那這裏參數可改爲
export QWS_MOUSE_PROTO="tslib:/dev/input/event2 Mouseman:/dev/input/mouse2" (本人的是mouse2,可插入usb鼠標後自行測試)
d、若QT程序移植到arm後只採用觸摸屏控制,不想看到鼠標箭頭,則打開QT程序主函數,添加以下代碼即可:
1.引入頭文件 
 #include   <QWSServer>
2.設置鼠標樣子屬性爲false  
QWSServer::setCursorVisible(false);

(7)測試並校準觸摸屏(一定要校準,否則觸摸位置不準確)
a、執行source /etc/profile更新環境變量(每次修改profile文件都要記得執行此命令,就不需重啓開發板)
b、進入tslib_x210/bin/目錄,執行其中的觸摸屏校準程序
./ts_calibrate
如果出現tslib的觸摸屏五點校準畫面,說明tslib的安裝移植成功完成。
校準:點擊五點十字架(按出現的順序點擊!)後就會得到pointercal觸摸屏檢驗的信息文件,會在tslib_x210的etc目錄中出現;也可執行此目錄下其他的程序來體驗觸摸屏,secureCRT會輸出位置信息。

三、移植QT
(0)準備
記得本文先行下載了幾個庫,請參考http://248341.blog.51cto.com/238341/1438867
如果在後面的make編譯過程中出現錯誤,網上查錯再下載也可。
(1)下載qtcreatorqt源碼包,轉移到ubuntu下


(2)ubuntu下安裝qtcreator,並解壓qt源碼包
a、給上面的.bin文件添加“可執行”權限:chmod +x 文件名,再執行./qt-creator-linux-x86-opensource-2.4.1.bin,接下來的qtcreator安裝過程so easy省略,qtcreator會默認安裝在/usr/local/Trolltech目錄;
b、將qt源碼包解壓至/usr/local/src目錄下,解壓,
進入qt-everywhere-opensource-src-4.7.4/mkspecs/qws/linux-arm-g++/目錄下,打開qmake.conf文件。修改內容如下:




(3)配置
本文是要將qt安裝在/usr/local/qt4arm 目錄下,安裝的是嵌入式版本QT
執行如下:(先看下面備註)
./configure --prefix=/usr/local/qt4arm -opensource -release -shared -Declarative -importdir /opt/imports -fast -no-largefile -qt-sql-sqlite -qt3support -exceptions -xmlpatterns -no-glib -no-phonon -no-mmx -no-3dnow -no-sse -no-sse2 -svg -no-webkit -qt-zlib -qt-libtiff -qt-libpng -qt-libjpeg -make libs -make tools -nomake examples -nomake docs -nomake demos -no-nis -no-cups -iconv -no-dbus -xplatform qws/linux-arm-g++ -embedded arm -little-endian -qt-freetype -depths 16,24,32 -qt-gfx-linuxfb -qt-gfx-transformed -qt-gfx-multiscreen -no-gfx-vnc -no-gfx-qvfb -qt-kbd-linuxinput -no-kbd-qvfb -armfpa -no-mouse-qvfb -qt-mouse-linuxtp -qt-mouse-tslib -DQT_QLOCALE_USES_FCVT -DQT_NO_QWS_CURSOR -no-pch -I/usr/local/src/tslib_x210/include -L/usr/local/src/tslib_x210/lib -confirm-license
備註:
--prefix=是後面編譯源碼後,安裝QT時所在的目錄;
-I後面的是你的tslib所在的頭文件路徑;
-L後面的是你的tslib所在的lib路徑;
本文按照此配置可正確安裝,來源網絡,可參考其他移植QT文章
若需重新配置,請參考執行下面命令:


(4)執行make編譯
這是一個漫長的等待過程,本文需要3小時,如果編譯過程中報錯,則可能缺少什麼庫,網上查詢再apt-get install即可 ,只要沒有重新配置./configure生成新的Makefile,make 都是可以繼續編譯下去的。
(提醒一點:本文在編譯過程出現幾個錯誤,全都網上搜索,都有解決方法,就是不要乾等着後臺編譯)

(5) 執行make install安裝  
本文已配置安裝在/usr/local/qt4arm目錄

(6)庫文件的轉移
進入QT安裝目錄/usr/local/qt4arm/lib目錄,複製所有so文件到開發板文件系統的lib/下
cp ./* /root/rootfs/rootfs/lib/ -rf
細心地發現qt使用的字體庫在lib/fonts目錄下,也被上述命令一起復制到開發板的/lib/下了,
故需將開發板的lib目錄下的fonts字體庫文件夾轉移到頂層根目錄,開發板終端執行:mv /lib/fonts /

(7)再次配置環境變量
打開開發板的/etc/profile,添加字體庫export QT_QWS_FONTDIR=/fonts即可;
至此,基本的QT移植到arm板就完成了,簡單地總結就是將嵌入式版本的QT的lib庫移植到arm板子上,配合觸摸屏等輸入類設備來控制使用

(8)測試QT程序
 準備好編寫好的qt測試程序源代碼,先後執行以下命令:
qmake -project
qmake
make
再用命令file 目標文件名,查看目標可執行文件是否爲ARM架構,若是ARM架構的,則需將目標可執行文件複製到開發板文件系統中,加上“-qws”執行測試程序,例如下面例子中,將在開發板終端執行命令:./yizhi_test -qws。那麼板子屏幕就能看到QT測試程序了。



————————————————————完畢——————————————————————
至此,基本的QT移植到arm板工作就完成了,簡單地總結就是將嵌入式版本的QT的lib目錄和觸摸屏庫tslib的lib目錄移植到arm板子上,配合觸摸屏等輸入類設備來控制使用。
若遇其他問題,則請藉助強大的互聯網。
————————————————“知識來源於互聯網,必將回報互聯網”————————————

本文部分參考博客:

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