Chinaunix首页 | 论坛 | 博客
  • 博客访问: 500684
  • 博文数量: 119
  • 博客积分: 5054
  • 博客等级: 大校
  • 技术积分: 1305
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-03 13:13
文章分类

全部博文(119)

文章存档

2011年(4)

2010年(115)

我的朋友

分类: 嵌入式

2010-01-03 15:17:20

在进行Qt/E的移植和触摸屏校正的实践过程中,不得不感慨一下国内的学术文章真是天下一大抄,想找点有价值的资料还真得累个精疲力竭。可恶的是,转载的文章也不标明,搞得就像是自己原创的一样,其中有多少人真正实践过了,不得而知。废话就到此为止,牢骚也少发了,下面说说我的移植过程吧(前前后后一共耗时3天),既为了方便自己,也希望对“不幸”搜到这篇文章的读者有所帮助。
参考了下面几篇文章:

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/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的软件安装包可以到下载,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 <

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 <

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 <

到这里,tslib、qte-arm的移植工作算是完成了,至于上面环境变量的意思,不懂的自己再搜索了。有疑惑的估计也就是LD_LIBRARY_PATH、QWS_DISPLAY、QWS_SIZE这几个环境变量(俺有时间再补充一下)关于QWS环境变量可参考
这一步有个小小的问题不得不说一下,即这些设置环境变量的语句貌似只有添加在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的容量,所以理论上是可以成功烧写到开发板的。

至此,终于完成了整个移植过程。

阅读(5874) | 评论(3) | 转发(0) |
给主人留下些什么吧!~~

king318hua2011-09-20 15:37:10

if [ -d /usr/local/qte-x86 ];then   怎么执行不了???

syntax error near unexpected token then  这个错误怎么改

chinaunix网友2010-12-08 17:55:47

不知道你触摸屏移植以后,有没有 鼠标指针 在点击位置跳动的现象,是如何解决的了???

yyy2008192010-01-15 18:13:05

非常感谢你的文章,可惜没有早点找到。向你学习!