学习嵌入式Linux也有一段时间了,最近在弄qt的移植,一个下午搞定(电脑编译太慢了 》==《 ),我来大概介绍下移植步骤:
一. 环境
linux主机:ubutun 16
开发板:mini2440
内核 : linux 3.4.2
busybox :1.20
qt版本:4.8.5
二. 移植步骤
移植QT的前提,首先你的开发板带有lcd驱动,触摸屏驱动并把这两个驱动编译进内核,这两个驱动可以参考韦老师去自己写,然后移植tslib,最后移植qt系统。总结下:
a.写lcd驱动(当然如果板子已经有就不用写了)
b. .写触摸屏驱动(当然如果板子已经有就不用写了)
c.移植tslib
d.移植QT
1.写lcd驱动,这个可以参考韦老师的驱动,但是有一点注意要注意
比如:lcd_regs->lcdcon3=(37<<19) | (239<<8) | (10<<0); 我刚开始设置不对,然后发现屏幕显示左移了。所以驱动要根据自己的显示屏去设置,看看手册,要调。
2.触摸屏驱动,这一部分完全可以参考韦老师的驱动,了解输入子系统,以及ADC误差消除。
3.tslib移植
如果你的linux服务器是比较高的版本(我的是ubutun16)就得安装几个库,这样才能配置编译tslib
# apt-get install autoconf(或autoconf2.13)
# apt-get install automake
# apt-get install libtool
网上下载 tslib-1.4.tar.gz,拷贝到linux服务器,
然后解压缩 tar xzf tslib-1.4.tar.gz , 进入解压后的目录 cd tslib ,执行其内部脚本./autogen.sh ,创建一个目录mkdir tmp,待会我们安装到这个目录tmp, 执行echo "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache 再执行./configure --host=arm-linux --cache-file=arm-linux.cache --prefix=$(pwd)/tmp 。
如果你用的编译版本和我一样,编译器要修改一点东西:把 /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include/linux/input.h 里的 #define EV_VERSION 0x010000改为 #define EV_VERSION 0x010001。不然编译后的tslib不能用。
现在make编译 然后make install .安装结束后进入tmp目录 执行 cp * -rf /开发板文件系统根目录(我的是/work/nfsroot/min_fs)。
在开发板串口控制台,修改/etc/ts.conf (去掉#和空格):
# module_raw input
改为:
module_raw input
修改/etc/profile文件添加下面几句话:
export TSLIB_ROOT=/ #刚刚我是把tmp的目录拷贝到开发板文件根目录 /
export TSLIB_TSDEVICE=/dev/event0 # 这个是我触摸屏上报事件对于的设备文件节点,根据实际情况填您自己的。
export QWS_MOUSE_PROTO=tslib:/dev/event0
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 #这个是我lcd驱动对应的设备文件节点,根据实际情况填您自己的
export TSLIB_CONSOLEDEVICE=none
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TSLIB_ROOT/lib
输入ts_calibrate ,就会进入校准界面,此时tslib就移植完成。
4.QT移植
下载QT4.8.5源码 qt-everywhere-opensource-src-5.6.0.tar
把它放到linux服务器解压tar zxvf qt-everywhere-opensource-src-5.6.0.tar
进入刚解压的qt-everywhere-opensource-src-5.6.0目录 ,vi mkspecs/qws/linux-arm-gnueabi-g++/qmake.conf 修改编译参数,不然可能编译报错
我的qmake.conf被修改为:
include(../../common/linux.conf)
include(../../common/gcc-base-unix.conf)
include(../../common/g++-unix.conf)
include(../../common/qws.conf)
QMAKE_INCDIR=/work/tools/tslib/tmp/include
QMAKE_LIBDIR=/work/tools/tslib/tmp/lib
# modifications to g++.conf
QMAKE_CC = /work/tools/usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-gcc -lts
QMAKE_CXX = /work/tools/usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-g++ -lts
QMAKE_LINK = /work/tools/usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-g++ -lts
QMAKE_LINK_SHLIB = /work/tools/usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-g++ -lts
# modifications to linux.conf
QMAKE_AR = /work/tools/usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-ar cqs
QMAKE_OBJCOPY = /work/tools/usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-objcopy
QMAKE_STRIP = /work/tools/usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-strip
QMAKE_CFLAGS += -msoft-float -D__GCC_FLOAT_NOT_NEEDED -march=armv4 -mtune=arm920t
QMAKE_CXXFLAGS += -msoft-float -D__GCC_FLOAT_NOT_NEEDED -march=armv4 -mtune=arm920t
然后配置./configure -prefix /usr/local/QT4.8.5-ARM-mini2440/ -force-pkg-config -opensource -confirm-license -release -shared -embedded arm -xplatform qws/linux-arm-gnueabi-g++ -depths 16,18,24 -fast -optimized-qmake -pch -qt-sql-sqlite -qt-libjpeg -qt-zlib -qt-libpng -qt-freetype -qt-mouse-tslib -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 -I/opt/tslib/tmp/include -L/opt/tslib/tmp/lib
其中/usr/local/QT4.8.5-ARM-mini2440/来表达编译linux服务器哪个目录下,
其中-I/opt/tslib/tmp/include,您刚刚不是在linux服务器编译了tslib ,并且生成tmp目录吗,这里就是用这个tmp目录的子目录include来头文件。
其中-I/opt/tslib/tmp/lib,您刚刚不是在linux服务器编译了tslib ,并且生成tmp目录吗,这里就是用这个tmp目录的子目录lib来编译。
然后编译sudo make -j3 开3个线程 ,我话了2个小时,是个人电脑配置而定
安装 make install ,默认是按安装到 /usr/local/Trolltech/ ,进入目录 ,你会发现有以下文件:
bin/ demos/ examples/ imports/ include/ lib/ mkspecs/ plugins/ translations/
把plugins,imports,lib,mkspecs复制到开发板某个目录下,我是把它们拷贝到 /opt/qte目录,还要拷贝 demos目录到开发板根目录,这个目录有些QT例子,我们待会就用来测试
在开发板串口控制台,修改/etc/ profile 文件,我最后的内容如下:
#tslib
export TSLIB_ROOT=/
export TSLIB_TSDEVICE=/dev/event0
export QWS_MOUSE_PROTO=tslib:/dev/event0
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
#QT
export QTDIR=/opt/qte #刚才我把plugins,imports,lib,mkspecs拷贝到这的
export QPEDIR=/opt/qte
export PATH=$QTDIR/bin:$PATH
export QWS_DISPLAY=LinuxFb:/dev/fb0 #我显示屏对应的设备文件节点
export LD_LIBRARY_PATH=$TSLIB_ROOT/lib:$QTDIR/lib:$LD_LIBRARY_PATH
最后我们就看看我们的成果了:
进入demo目录,里面有很多测试程序 我就拿mainwindow程序来测试吧
进入mainwindows ,执行 ./mainwindow -qws
就会看到结果了。