构建qt4.8.6嵌入式qt环境
需要源代码:
1、qt-everywhere-opensource-src-4.8.6.tar.gz
2. tslib-1.4.tar.gz
tslib是电阻式触摸屏用于校准的一个软件库,是一个开源的程序,能够为触摸屏驱动获得的采样提供诸如滤波、去抖、校准等功能,通常作为触摸屏驱动的适配层,为上层的应用提供了一个统一的接口。因此这里先编译安装tslib,这样在后面编译Qt的时候才能打包编译进去。不论是电子屏还是电容屏,只要满足linux输入子系统都可以使用tslib库。
编译过程很简单,首先加查以下软件是否安装
sudo apt-get install automakesudo apt-get install autogensudo apt-get install autoconf
# tar -zxvf tslib-1.4.tar.gz# cd tslib# ./autogen.sh#./configure --host=arm-linuxac_cv_func_malloc_0_nonnull=yes --cache-file=arm-linux.cache -prefix=/usr/local/tslib
# make# make install
在根文件系统/etc下建立profile文件
export TSLIB_ROOT=/usr/local/tslib1.4
export TSLIB_TSDEVICE=/dev/event0
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/usr/local/tslib1.4/lib/ts
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TSLIB_ROOT/lib
说明:
1. TSLIB_TSDEVICE :触摸屏设备文件名
2. TSLIB_CALIBFILE:校准的数据文件,由ts_calibrate校准程序生成。
3. TSLIB_CONFFILE :配置文件名。
4. TSLIB_PLUGINDIR:插件目录
5. TSLIB_CONSOLEDEVICE :控制台设备文件名
6. TSLIB_FBDEVICE :LCD设备名
Tslib 的应用程序需要通过读取环境变量来获取相关硬件的信息链接库的信息。
在分析ts.conf 这个文件建立在/etc目录下,内容:
# 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
其中有”#”开头的都是被注释掉的,真正有用的信息为:
module_raw input
module pthres pmin=1
module variance delta=30
module dejitter delta=100
module linear
module_raw有许多种,这里只使用input(即Linux的input子系统,设备文件名称为/dev/input/event0)。后面的几个module还没有深入了解,它们使用的库就在tslib/lib/ts中,最后三个模块的字面意思是“方差(滤波)”、“去抖动(去噪)”、“线性(坐标变换)”
我在/us/local目录下建立tslib.1.4目录
把编译好的库文件copy到自己的根文件系统种
下面是我的根文件系统/usr/local/tslib1.4/lib/ts$ ls下的内容:
arctic2.la corgi.la h3600.la linear_h2200.la mk712.la ucb1x00.la
arctic2.so corgi.so h3600.so linear_h2200.so mk712.so ucb1x00.so
collie.la dejitter.la input.la linear.la pthres.la variance.la
collie.so dejitter.so input.so linear.so pthres.so variance.so
这些红 {MOD}的就是对应TSLIB_PLUGINDIR插件,tslib程序会在读取环境变量后根据ts.conf中指明要加载的模块来调用这些库文件。
这个时候就可以启动开发板运行tslib库自带的应用程序了比如ts_calibrate
注意:
#cd/opt/tslib/bin
#./ts_calibrate
报错 :
Couldnt load module input No raw modules loaded
发生这种问题的原因可能有很多种:
首先检查module_raw input这项在/etc/ts.conf是否已经打开
其次关注
export TSLIB_ROOT=/usr/local/tslib1.4
export TSLIB_TSDEVICE=/dev/event0
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/usr/local/tslib1.4/lib/ts
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TSLIB_ROOT/lib
这些环境变量
export TSLIB_TSDEVICE=/dev/event0
这项是否存在,/dev/event0输入子系统事件是否存在,这个子系统是由底层驱动决定的,必须保证触摸屏的底层驱动正常工作。
判断这些指定的环境目录在其目录下是否真的存在,如果有误请对应自己的根文件系统修改,然后reboot重启更新环境变量。(注意都是在自己的开发板目录下执行)
下一步编译qt4.8.6
在qt4.8.6的目录下创建一个脚本文件auto_config.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
这项配置项就不解释了,自行百度,”-no”开头的一看就是编译时不需要此部件
-qt-mouse-tslib
-I/usr/local/tslib/include
-L/usr/local/tslib/lib
这三项十分重要,嵌入式环境大多需要触摸屏的支持,第一行表明支持触摸屏,第二行指明tslib库的头文件路径,编译时需要用到,第三行指明tslib库的路径,编译时需要用到。
编译时也许会报错,我用arm-linux-gcc 4.3.3的编译器是遇到:
undefined reference to `__sync_add_and_fetch_4'报错
编译器的问题,打开友善之臂逛网http://www.arm9.net/download.asp,下载arm-linux-gcc 4.4.3 可以完美解决这个问题。之后不要忘记复制这个编译器下的glib库到自己的根文件系统。编译成功后,同样和需要支持tslib工作一样,qt也需要为它设置环境变量。
打开/etc/profile(注意是开发板文件系统路径)
增加:
export QWS_MOUSE_PROTO=tslib:/dev/event0
export QWS_SIZE=800*480
export QTDIR=/usr/local/qt4.8.6
export QT_QWS_FONTDIR=$QTDIR/lib/fonts
export LD_LIBRARY_PATH=$TSLIB_ROOT/lib:$QTDIR/lib:/usr/local/lib:$LD_LIBRARY_PATH
export QT_PLUGIN_PATH=$QTDIR/plugins/
QWS_MOUSE_PROTO环境变量主要是帮助QMouseDriverFactory也就是Qt鼠标设备的枚举者来创建你想要的鼠标设备而不是系统默认的。
默认该环境变量时空的,其实大部分情况下空就可以了,Qt能够根据系统配置猜测出你想要的设备,并且这个大多数情况下好像都是正确的。不过如果错了我们可以通过设置该变量来纠正。
该环境变量的格式如下:
export QWS_MOUSE_PROTO="[:] [:] [:]"
中间可以通过空格来指定多个鼠标设备,目前我也没用到过,因为一般有一个输入设备就够了,最常用的格式例如:
export QWS_MOUSE_PROTO="tslib:/dev/ts"
第一个,指明要使用tslib这个驱动,对应的设备名字是/dev/ts
其他的环境变量一看就明白,一笔带过。
编译一个QT自带的小example后放入自己的文件系统
Mkyaff2制作根文件系统后,重新烧写,启动后执行这个example就可以看到已经成功了。