2007年12月13日 星期四

Porting QT/Embedded-3.3.6 on PXA270

QT/Embedded 3.3.6
Cross-Compiler: gcc-4.0.2
以下流程為編譯QTE並驅動Touch Screen(尚未成功)

事前工作
編kernel時要加入touch screen及LCD module
->UCB1400 Touchscreen support
->LCDtype(MTLCD-0353224A 3.5 inches)

下載:
qt-x11-free-3.3.5.tar.bz2
qt-embedded-free-3.3.6.tar.bz2
tslib-1.0.tar.bz2

編譯Qt-X11 (後面會用到)
./configure -thread -no-xft -no-cups -no-stl -no-ipv6 -no-freetype -disable-opengl -disable-xml -disable-canvas -shared
make

編譯tslib (後面會用到)
將toolchain路徑加入$PATH
echo "ac_cv_func_malloc_0_nonnull=yes" > arm-linux.autogen
//解決rpl_malloc的error
CONFIG_SITE=arm-linux.autogen ./configure CC=arm-unknown-linux-gnu-gcc CXX=arm-unknown-linux-gnu-g++ --host=arm-linux --target=arm-linux --prefix=$PWD/_install
make; make install

編譯QT/Embedded
QTE對路徑要求嚴格,在target的library路徑需和編譯時的一樣,這邊預設為/opt/qte
為了讓QT支援Touch Screen
修改qte/src/embedded/qmouselinuxtp_qws.h, 加入
#define QT_QWS_IPAQ
#define QT_QWS_IPAQ_RAW

修改qte/src/embedded/qmouselinuxtp_qws.cpp, 指定TS的device node為/dev/ts
...
#if defined(QT_QWS_IPAQ)
# ifdef QT_QWS_IPAQ_RAW
if ((mouseFD = open( "/dev/ts", O_RDONLY | O_NDELAY)) < 0) {
# else
if ((mouseFD = open( "/dev/ts", O_RDONLY | O_NDELAY)) < 0) {
# endif
qWarning( "Cannot open /dev/ts (%s)", strerror(errno));
return;
}
...

將QT-X11編出來的bin/uic, bin/moc copy到 qte/bin底下
將tslib編出來的include/tslib.h copy到qte/include底下
修改qte/mkspecs/qws/linux-arm-g++/qmake.conf, 修改gcc為自己所用的
arm-linux-gcc -> arm-unknown-linux-gnu-gcc
arm-linux-g++ -> arm-unknown-linux-gnu-g++

開始編譯
./configure -thread -embedded ipaq -shared -depths 16 -no-cups -no-ipv6 -thread -no-gfx-qvfb -no-freetype -disable-opengl -disable-xml -disable-canvas -qt-libjpeg -qt-mouse-linuxtp -xplatform qws/linux-arm-g++ -L/tslib/lib -L/tslib/lib/ts -I/tslib/include -lts
make sub-src
-L接tslib的library, -I接tslib的include 編譯時一同加入
make完成在qte/lib下產生libqte-mt.so, libqte-mt.so.3, libqte-mt.so.3.3, libqte-mt.so.3.3.6, 前三個為link, 最後一個即為object檔

安裝到target
受限於空間的不足, 可以將object檔放在flash,再用link的方式完成
假設libqte-mt.so.3.3.6放在sda1的根目錄mount /dev/sda1 /mnt/sda1
ln -s /mnt/sda1/libqte-mt.so.3.3.6 /opt/qte/lib/libqte-mt.so
ln -s /mnt/sda1/libqte-mt.so.3.3.6 /opt/qte/lib/libqte-mt.so.3
ln -s /mnt/sda1/libqte-mt.so.3.3.6 /opt/qte/lib/libqte-mt.so.3.3

寫一個hello world放上去跑, 經測試可以正常顯示, 不過touch screen的部份不能使用, 目前僅能以外接滑鼠的方式來操控. (註: 執行程式前要記得export QTDIR=/opt/qte)

參考資料:
QT/Embedded-3.3.8初步交叉编译的完全整理
Qt-embedded-3.2.3到PXA270上的移植
Qt/Embedded 2.3.10 到PXA270上的移植

TSLIB相關資料:
QTE與觸摸屏
tslib 1.4 - WeiBing
Qt-embedded-interest Archive - Touchscreen with qt examples?
Embedded Systems-GUI
tslib download and cross compile for arm

6 意見:

匿名 提到...

我在編譯QTE時有錯誤:make[1]: *** [.obj/release-shared-mt-emb-ipaq/allmoc.o] Error 1
make[1]: Leaving directory `/opt/qte/src'
make: *** [sub-src] Error 2
你知道原因嗎??
我也是用Creator_PXA270的環境,
你用的linux是哪一個版本??
我用fedora 5
可以把你編譯完成的lib給我嗎??
我的e-mail: jackylee@j92a21.ee.ncku.edu.tw
謝謝.........

飄浮水瓶 提到...

格主你好,我自己嘗試依照你的方式實作QTE的編譯時,也有跟上面的jacky lee發生一樣的錯誤

目前仍找不出是在哪個操作步驟出現問題

想問是否能跟格主你討論呢?

不知格主是否有e-mail那類的聯絡方式可供聯繫?

我先留下我的mail: mewl_volans@yahoo.com.tw

米都 提到...

樓主你好,我自己嘗試依照你的方式實作QTE的編譯時,也有跟上面的mewl_volans發生一樣的錯誤

目前仍找不出是在哪個操作步驟出現問題

想問是否能跟樓主你討論呢?

不知樓主是否有e-mail那類的聯絡方式可供聯繫?

我先留下我的mail: s0922350@mail.ncyu.edu.tw

lance7 提到...

樓主你好,我自己嘗試依照你的方式實作QTE的編譯時,也有跟上面的米都發生一樣的錯誤

目前仍找不出是在哪個操作步驟出現問題

想問是否能跟樓主你討論呢?

不知樓主是否有e-mail那類的聯絡方式可供聯繫?

我先留下我的mail: 965202094@cc.ncu.edu.tw

雲科資工專題生 提到...

這個錯誤 往上面看是錯在
../include/qstring.h: In member function 'ushort& QChar::unicode()':
../include/qstring.h:199: error: cannot bind packed field
'((QChar*)this)->QChar::ucs' to 'ushort&'
由于对于qt的交*编译工具的版本问题而导致提示错误
解决办法:
打开src/tools/qglobal.h查看318-326行:
# if (defined(__arm__) || defined(__ARMEL__)) && !defined(QT_MOC_CPP)
# define Q_PACKED __attribute__ ((packed))
# if __GNUC__ == 3 && __GNUC_MINOR__ >= 4
# define Q_NO_PACKED_REFERENCE
# endif
# endif
# if !defined(__EXCEPTIONS)
# define Q_NO_EXCEPTIONS
# endif

修改如下:
# if (defined(__arm__) || defined(__ARMEL__)) && !defined(QT_MOC_CPP)
# define Q_PACKED __attribute__ ((packed))
# if __GNUC__ == 3 && __GNUC_MINOR__ >= 4
# define Q_NO_PACKED_REFERENCE
# endif
+# if __GNUC__ == 4 && __GNUC_MINOR__ >= 0
+# define Q_NO_PACKED_POINTERS
+# endif
# endif
# if !defined(__EXCEPTIONS)
# define Q_NO_EXCEPTIONS
# endif

打开src/include/qstring.h查看195-199行
ushort unicode() const { return ucs; }
#ifdef Q_NO_PACKED_REFERENCE
ushort &unicode() { return *(&ucs); }
#else
ushort &unicode() { return ucs; }
#endif

修改如下:
ushort unicode() const { return ucs; }
#ifdef Q_NO_PACKED_REFERENCE
ushort &unicode() { return *(&ucs); }
+#elif defined Q_NO_PACKED_POINTERS
+ ushort &unicode() { ushort& tmp = ucs; return tmp; }
#else
ushort &unicode() { return ucs; }
#endif

ps:+号表示修改的地方

雲科資工專提生 提到...

上述步驟有些許錯誤 include 不再src裡
更改為繁體
打開qte/src/tools/qglobal.h查看318-326行:
# if (defined(__arm__) || defined(__ARMEL__)) && !defined(QT_MOC_CPP)
# define Q_PACKED __attribute__ ((packed))
# if __GNUC__ == 3 && __GNUC_MINOR__ >= 4
# define Q_NO_PACKED_REFERENCE
# endif
# endif
# if !defined(__EXCEPTIONS)
# define Q_NO_EXCEPTIONS
# endif

修改如下:
# if (defined(__arm__) || defined(__ARMEL__)) && !defined(QT_MOC_CPP)
# define Q_PACKED __attribute__ ((packed))
# if __GNUC__ == 3 && __GNUC_MINOR__ >= 4
# define Q_NO_PACKED_REFERENCE
# endif
+# if __GNUC__ == 4 && __GNUC_MINOR__ >= 0
+# define Q_NO_PACKED_POINTERS
+# endif
# endif
# if !defined(__EXCEPTIONS)
# define Q_NO_EXCEPTIONS
# endif

打開qte/include/qstring.h查看195-199行
ushort unicode() const { return ucs; }
#ifdef Q_NO_PACKED_REFERENCE
ushort &unicode() { return *(&ucs); }
#else
ushort &unicode() { return ucs; }
#endif

修改如下:
ushort unicode() const { return ucs; }
#ifdef Q_NO_PACKED_REFERENCE
ushort &unicode() { return *(&ucs); }
+#elif defined Q_NO_PACKED_POINTERS
+ ushort &unicode() { ushort& tmp = ucs; return tmp; }
#else
ushort &unicode() { return ucs; }
#endif

ps:+號表示修改的地方

附上參考資料網址:
http://www.cevx.com/Article/ArticleShow.asp?ArticleID=9102