1、开发环境
- 硬件环境:快捷N32926开发板
- 软件环境:
SDK:W55FA92BSP2.6.35_160719_kuaijie_v3.02.tar.gz
交叉编译工具:arm-linux-4.2.1
&arm-linux-4.3.4
QT:qt-everywhere-opensource-src-4.8.7
2、驱动移植
使用menuconfig配置内核,选择触摸屏相关选项,编译后将内核下载到开发板。
Device Drivers --->
Input device support --->
<*> Event interface
[*] Miscellaneous devices --->
[*] W55FA92 Input ADC Function
ADC Function Select --->
[*] Touch panel detection
[*] Battery detection
[*] Keypad detection
BATTERY detection channel selection (Battery detection from channel 1) --->
Keypad detection channel selection (Keypad detection from channel 2) --->
默认相关选项已经选择,使用快捷提供的arm-linux-4.2.1进行编译。
3、QT移植
3.1 移植前准备
3.1.1 配置环境变量
移植QT时使用快捷提供的arm-linux-4.3.4交叉编译工具,并配置QT安装目录。
MY_CC_TOOLCHAIN
export MY_CC_TOOLCHAIN=/usr/local/arm_linux_4.3/usr
export PATH=${MY_CC_TOOLCHAIN}/bin:$PATH
MY_CC_STAGING
QT在桌面Linux系统上安装的路径。
export MY_CC_STAGING=/home/horo/QT4
MY_CC_QT4_PREFIX
QT在嵌入式Linux系统上的安装路径,开发板中的路径必须和下面路径相同。
export MY_CC_QT4_PREFIX=/usr/local/Trolltech/QtEmbedded-4.8.7
3.1.2 文件拷贝
将文件qt4.8.5-n329-port-2015.03.27.tar.gz和qt-everywhere-opensource-src-4.8.7_N3292x.tar.gz文件解压到同一目录下,例如/home/horo/arm-qt,并进入arm-qt目录。
修正工具链依赖编译错误
cp qt4.8.5-n329-port/src/qthread_unix.cpp qt-everywhere-opensource-src-4.8.7/src/corelib/thread
支持JPEG硬件解码
cp qt4.8.5-n329-port/src/qjpeghandler.cpp qt-everywhere-opensource-src-4.8.7/src/corelib/thread
支持OSD渲染
cp qt4.8.5-n329-port/src/qscreenlinuxfb_qws.* qt-everywhere-opensource-src-4.8.7/src/gui/embedded
定义qmake配置
cp -R qt4.8.5-n329-port/mkspecs/qws/linux-n3292x-g++ qt-everywhere-opensource-src-4.8.7/mkspecs/qws
更新工具链的tslib
cp -RPp qt4.8.5-n329-port/tslib/include $MY_CC_TOOLCHAIN/arm-linux-uclibcgnueabi
cp -RPp qt4.8.5-n329-port/tslib/include $MY_CC_TOOLCHAIN
cp -RPp qt4.8.5-n329-port/tslib/lib $MY_CC_TOOLCHAIN/arm-linux-uclibcgnueabi
cp -RPp qt4.8.5-n329-port/tslib/lib $MY_CC_TOOLCHAIN
定义qconfig
cp qt4.8.5-n329-port/qconfig/qconfig-n3292x.h qt-everywhere-opensource-src-4.8.7/src/corelib/global
3.2 QT移植
3.2.1 QT配置
进入qt-everywhere-opensource-src-4.8.7目录,对QT进行配置。
./configure -verbose -prefix ${MY_CC_QT4_PREFIX} -release -opensource -confirm-license -shared -qconfig dist -qt3support \
-no-xmlpatterns -no-phonon -no-mmx -no-3dnow -no-sse -no-sse2 -no-svg -no-multimedia -webkit -javascript-jit -qt-zlib \
-qt-libtiff -qt-libpng -qt-libjpeg -make tools -make demos -nomake examples -nomake docs -nomake translations -embedded \
arm -platform qws/linux-x86-g++ -xplatform qws/linux-n3292x-g++ -qt-gfx-linuxfb -qt-mouse-tslib -qt-kbd-linuxinput
其中和开发板电阻触摸屏相关的选项为-qt-mouse-tslib
,是对触摸屏的校准。由于实际项目中使用webkit浏览网页,添加选项-webkit
。
3.2.2 QT编译
进入qt-everywhere-opensource-src-4.8.7目录,执行make
命令。
编译过程中报错,解决方法如下:
1.undefined reference to ‘__sync_sub_and_fetch_4’
- 使用其他版本的gcc编译器,例如4.4.3。进入到gcc/config/arm/目录下,找到一个linux-atomic.c;
- 使用libtool制作链接库,这一步会在当前目录生成.libs目录。输入命令:
libtool --tag=CC --mode=compile arm-linux-gcc -g -O2 -MT linux-atomic.lo -MD -MP -MF linux-atomic.Tpo -c -o linux-atomic.lo linux-atomic.c
libtool --tag=CC --mode=link arm-linux-g++ -g -O2 -o liblinux-atomic.la linux-atomic.lo
- 将生成的库拷贝到一个比较短的目录,比如/opt:
cp .libs/liblinux-atomic.a /opt
- 在script和webkit的Makefile中在LIBS = 的结尾添加 -L/opt/arm -llinux-atomic。
2.undefined reference to ‘QThreadData::clearCurrentThreadData()’
在qthread_unix.cpp文件中定义:
void QThreadData::clearCurrentThreadData()
{
clear_thread_data();
}
3.2.3 QT安装
进入qt-everywhere-opensource-src-4.8.7目录,执行命令:
make INSTALL_ROOT=${MY_CC_STAGING} install
mkdir -p $MY_CC_QT4_PREFIX
rmdir $MY_CC_QT4_PREFIX
ln -s $MY_CC_STAGING/$MY_CC_QT4_PREFIX $MY_CC_QT4_PREFIX
至此,QT已经编译安装完成,需要将安装后生成的lib目录下的文件拷贝到开发板,由于开发板nand1-1空间较小,将lib目录拷贝到nand1-2下,再在nand1-1的相应目录下创建软连接。
进入/usr/local/Trolltech/QtEmbedded-4.8.7目录,将lib目录下的动态库拷贝到开发板的/nand1-2/Qtlib下。由于软连接无法拷贝到开发板,我采用了将所有动态库的名字都改成*.so.4
格式。
在开发板上创建目录/usr/local/Trolltech/QtEmbedded-4.8.7,并创建软连接文件:
ln -s /mnt/nand1-2/Qtlib/lib /usr/local/Trolltech/QtEmbedded-4.8.7/lib
QT移植完成。
4、测试
实际项目中使用webkit浏览网页,相关程序可以在qt-everywhere-opensource-src-4.8.7程序样例中的fancybrower中找到,编译程序的qmake文件在安装路径的bin目录下,在程序目录下编译程序:
qmake -r;
make
编写测试网页,代码如下:
<!DOCTYPE html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title></title>
<script type="text/javascript">
function myFunction()
{
document.getElementById("demo").innerHTML="My First JavaScript Function";
}
</script>
<script type="text/javascript">
function myFun()
{
document.getElementById("demo").innerHTML="A Paragraph.";
}
</script>
</head>
<body>
<h1>My Web Page</h1>
<p id="demo">A Paragraph.</p>
<input type=button value="hello" onclick="myFunction()" style="height:50px;width:100px;">
<input type=button value="back" onclick="myFun()" style="height:50px;width:100px;">
</body>
</html>
实际显示效果如下,通过点击不同的按钮,显示不同的文本内容。
在运行前需要配置环境变量:
export QWS_MOUSE_PROTO=Tslib:/dev/input/event0
如果是第一次运行触摸屏的相关程序,首先需要进行屏幕的校准,执行命令ts_calibrate,按照屏幕上的显示对屏幕进行校准。
接下来运行fancybrower程序,检查是否运行正常。
/mnt/nand1-2/APP/fancybrower /mnt/nand1-2/html/test.html -qws