基于QT移植的ARM触摸屏校准
- 格式:docx
- 大小:14.90 KB
- 文档页数:2
QtEmbedded-4.5.3-arm 移植Qt/E 版本:QtEmbedded-4.5.3-arm交叉编译器版本:arm-linux-gcc 4.1.2操作系统平台:Linux -- Red Hat 9.0开发板平台:Arm -- S3C24401、解压QtEmbedded-4.5.3-arm源码包,进入源码目录2、./configure -embedded arm -xplatform qws/linux-arm-g++ -no-mouse-linuxtp -qt-mouse-tslib -I/usr/local/tslib/include -L/usr/local/tslib/lib (-no-qt3support -no-openssl -nomake examples -nomake demos -nomake doc -nomake tools )注释:-embedded arm指定目标平台是arm,-xplatform qws/linux-arm-g++指目标平台编译配置文件使用的是qws/linux-arm-g++文件夹下的配置文件,-no-mouse-linuxtp -qt-mouse-tslib因为我们使用tslib作为触摸屏校正程序,所以让鼠标不支持linuxtp协议,而支持tslib-I/usr/local/tslib/include -L/usr/local/tslib/lib指定tslib头文件和库文件-no-qt3support -no-openssl -nomake examples -nomake demos -nomake doc -nomake tools为了减少编译时间,可以不提供对qt3函数支持以及对openssl的支持,不编译examples,demos,doc,tools,在需要的时候在编译,这里可用另一种方法见“Qt configure 参数不完全说明(转)”3、#make#make install默认是被安装到/usr/local/Trolltech/这个目录4、设置环境变量vi /etc/profile添加exportPATH=/usr/local/Trolltech/QtEmbedded-4.5.3-arm/bin:$PATH source /etc/profile5、例子我们主要是用到/usr/local/Trolltech/QtEmbedded-4.5.3-arm/lib 这个库,我们可以找个qt应用程序把它放到开发板上运行,这个qt应用程序必须是用QtEmbedded-4.5.3-arm编译才能运行到开发板上,而且运行时必须依赖上面的库文件进入源码包中examples随便找个例子cd examples/widgets/wiggly在这个文件夹中没有Makefile文件我们可以使用bin目录下的qmake工具生成Makefile文件#../../../bin qmake #make#make install将编译好的wiggly文件放到根文件系统的usr/bin 目录下cp wiggly /home/zy/root_qtfs/usr/bin查看他依赖那些库文件arm-linux-readelf -d wiggly我们可以把所依赖的库文件拷贝的根文件系统的usr/lib目录下cp -a libQtCore.* libQtNetwork.* libQtGui.* /home/zy/root_qtfs/usr/librm -f *.la *.prl设置开发板上的环境变量qtconfig脚本#!bin/shexport QTLIB=/usr/libexport TSLIB_ROOT=/usr/local/tslibexport TSLIB_TSDEVICE=/dev/event0export TSLIB_CALIBFILE=/etc/pointercalexport TSLIB_CONFILE=$TSLIB_ROOT/etc/ts.confexport TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/tsexport TSLIB_CONSOLEDEVICE=noneexport TSLIB_FBDEVICE=/dev/fb0exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TSLIB_ROOT/lib:$QTL IB #设置加载库路径,qt的库和tslib都加上export QWS_SIZE=320*240 #显示大小export QWS_MOUSE_PROTO=Tslib:/dev/event0export QWS_DISPLAY="LinuxFb:mmWidth35:mmHeight45:0"#字体大小if [ -f "$TSLIB_CALIBFILE" ]; thenwiggly -qws&elsets_calibratewiggly -qws&fi在根文件系统中的etc/init.d/rcS初始化脚本中加入qtconfig&让它运行这个脚本将qtconfig复制到根文件usr/bin目录下并加上可执行权限(chmod 777 qtconfig)制作文件系统mkyaffs2image root_qtfs root_qtfs.bin出现错误:1、Please press Enter to activate this console. Segmentation fault . Could not read calibration:"/etc/pointercal"解决方法:tslib/etc/ts.conf文件,第二行module_raw input的注释去掉,同时要其前面不能有空格(若有空格则出现上述错误)2、QFontDatabase:Cannot find font directory/usr/local/Trolltech/QtEmbedded-4.5.3-arm/lib/fonts installed correctly?解决方法:因为qt程序默认会到/usr/local/Trolltech/QtEmbedded-4.5.3-arm/lib/fonts 这个路径下查找字体文件现在我们的根文件系统并没有这个路径,应先建立这个目录cd usr/localmkdir -p Trolltech/QtEmbedded-4.5.3-arm/lib/fonts将机子上的/usr/local/Trolltech/QtEmbedded-4.5.3-arm/lib/fonts全部文件拷到上述目录cp /usr/local/Trolltech/QtEmbedded-4.5.3-arm/lib/fonts/* ./。
嵌入式Linux和MiniGUI结合的解决方案已经成为很多嵌入式系统的图形化方案之一,而触摸屏也是很多嵌入式系统首选的输入设备,因此触摸屏的校准也成为很多嵌入式系统开发过程中常常碰到的问题之一。
嵌入式Linux是一种可以进行裁减、修改使之能在嵌入式计算机系统上运行的操作系统,既继承了Internet上的无限的开放源代码资源,又具有嵌入式操作系统的特性。
该系统具有较高的稳定性和安全性、良好的硬件支持、标准兼容性和资源丰富等功能。
而触摸屏是一种方便、快捷的输入设备,附着在显示器的表面,与显示器配合使用,在工业控制场合得到了广泛的应用。
然而在实际的嵌入式程序移植的过程中,由于触摸屏尺寸的不同,以及GUI(Graphic User Interface)方案选择和IAL(Input Abstract Layer)的差异,一般开发板制造商并不提供触摸屏的校正程序。
本文介绍的正是笔者在制作实际的嵌入式Linux数控机床人机接口过程中,提出的一套基于嵌入式Linux和MiniGUI的通用触摸屏校准程序设计方案。
MiniGUI简介MiniGUI()是国内最有影响的自由软件项目之一, MiniGUI 项目的目标是为基于 Linux 的实时嵌入式系统提供一个轻量级的图形用户界面支持系统。
该项目自1998年底开始到现在,已历经7年多的开发过程,到目前为止,已经比较成熟和稳定,并且在许多实际产品或项目中得到了广泛应用。
MiniGUI 为应用程序定义了一组轻量级的窗口和图形设备接口。
利用这些接口,每个应用程序可以建立多个窗口,而且可以在这些窗口中绘制图形且互不影响。
用户也可以利用MiniGUI 建立菜单、按钮、列表框等常见的 GUI 元素。
MiniGUI 可以具有两种截然不同的运行时模式:MiniGUI-Threads或者MiniGUILite。
运行在 MiniGUI-Threads 上的程序可以在不同的线程中建立多个窗口,但所有的窗口在一个进程中运行。
qtcreator单步调试嵌入式arm程序的方法前言该方法配置步骤为:(1)安装gdb-multiarch。
(2)在qtcreator中配置gdb-multiarch。
(3)启动板子上的gdbserver。
(4)将qtcreator连接到板子上的gdbserver,启动单步调试。
1.安装gdb-multiarch使用“sudo apt-get install gdb-multiarch”命令安装gdb-multiarch。
安装完如图1所示。
图12.在qtcreator中配置gdb-multiarch在qtcreator中添加gdb-multiarch步骤如下。
在[工具]-[选项]中,在[Debuggers]页面中,添加gdb-multiarch,如图2和图3所示。
图2图3在[构建套件(kit)]页面中,添加gdb-multiarch对应的调试器,如图4所示。
图43.在板子上启动gdbserver将要调试的程序拷贝到板子上,如图5所示。
图5用如下指令,启动gdbserver。
gdbserver 172.24.119.123:8888 /tmp/only_only_test172.24.119.123是虚拟机的IP地址。
8888是选取的一个通信端口。
/tmp/only_only_test是板子上要调试的程序。
如图6所示。
图64.qtcreator连接gdbserver单步调试首先,确保虚拟机与板子能互相ping通,如图7所示。
图7然后,在虚拟机的qtcreator中,用Debug模式编译程序,如图8所示。
图8在虚拟机中的qtcreator中,点击[调试]-[开始调试]-[Attach to Running Debug Server...]。
参考图9进行设置。
图9设置中:✧本地执行档:虚拟机中待调试程序的存在位置。
✧Override server channel: IP地址为板子IP地址,端口号为gdbserver启动时指定的端口号。
移植所遇到的问题分析与总结(elephant半原创)一:移植环境1:主机环境:Ret Hat Enterprise 52: 交叉工具链:开发平台:友善之臂mini2440+统宝寸屏4:所需的软件资源:(QT的移植是参考网上找到一篇较好的移植手册,但是此手册的作者不知道是无心之失还是咋的,给的资料有所保留。
不过思路比较清晰以及解析的比较详细,还是非常值得参考的)参照的文章链接地址为:二:交叉编译在移植好触摸屏的驱动后(在移植内核的时候完成),一般都要移植一个tslib来配合,在用户层对触摸屏的数据进行滤波和矫正,同时也可以给应用程序一个统一的接口,很多GUI都支持tslib的接口。
我移植到开发板的QT版本是QT4,所以用进行触摸屏校正,因为QT4只是支持(目前最新版),QT2支持的是版本,所以在移植过程中先要看清楚自己移植的是什么版本。
简单描述tslib校正触摸屏原理:Tslib是触摸屏驱动和应用层之间的适配层,它从触摸屏驱动处获得原始的设备坐标数据,通过一系列的去噪、去抖、坐标变换等操作,来去除噪声并将原始的设备坐标转换为相应的屏幕坐标。
通过tslib/src/文件可以看出,在tslib中为应用层提供了2个主要的接口ts_open(),ts_close();ts_read()和ts_read_raw(),其中ts_read()为正常情况下的接口,ts_read_raw()为校准情况下使用的接口。
从tslib默认的文件中可以看出包括如下基本插件:(强烈建议通读这个配置文件并理解这个文件所写的内容)pthres 为Tslib 提供的触摸屏灵敏度门槛插件;variance 为Tslib提供的触摸屏滤波算法插件;dejitter 为Tslib 提供的触摸屏去噪算法插件;linear为Tslib 提供的触摸屏坐标变换插件。
tslib 从触摸屏驱动采样到的设备坐标进行处理再提供给应用端的过程大体如下: raw device --> variance --> dejitter --> linear --> applicationmodule module module module再来看看ts_calibrate主要做了哪些事情,校准情况下,tslib对驱动采样到的数据进行处理的一般过程如下:1。
移植tslib-1.4所遇到的问题分析与总结(elephant半原创)一:移植环境1:主机环境:Ret Hat Enterprise 52: 交叉工具链:arm-linux-gcc-4.3.23: 开发平台:友善之臂mini2440+统宝3.5寸屏4:所需的软件资源:tslib-1.4.tar.gz qt-x11-opensource-src-4.5.3.tar.gz qt-embedded-opensource-src-4.5.3.tar.gz (QT的移植是参考网上找到一篇较好的移植手册,但是此手册的作者不知道是无心之失还是咋的,给的资料有所保留。
不过思路比较清晰以及解析的比较详细,还是非常值得参考的)参照的文章链接地址为:/view/242c91f24693daef5ef73d82.html二:交叉编译tslib-1.4在移植好触摸屏的驱动后(在移植内核的时候完成),一般都要移植一个tslib来配合,在用户层对触摸屏的数据进行滤波和矫正,同时也可以给应用程序一个统一的接口,很多GUI都支持tslib的接口。
我移植到开发板的QT版本是QT4,所以用tslib-1.4进行触摸屏校正,因为QT4只是支持tslib-1.4(目前最新版),QT2支持的是tslib-1.3版本,所以在移植过程中先要看清楚自己移植的是什么版本。
简单描述tslib校正触摸屏原理:Tslib是触摸屏驱动和应用层之间的适配层,它从触摸屏驱动处获得原始的设备坐标数据,通过一系列的去噪、去抖、坐标变换等操作,来去除噪声并将原始的设备坐标转换为相应的屏幕坐标。
通过tslib/src/tslib.h文件可以看出,在tslib中为应用层提供了2个主要的接口ts_open(),ts_close();ts_read()和ts_read_raw(),其中ts_read()为正常情况下的接口,ts_read_raw()为校准情况下使用的接口。
移植触摸屏校正Tslib1.4开发板:友善之臂mini2440-128M主机: VMware 7.1 + Fedora 9开发版内核:Linux 2.6.32.2交叉编译器:arm-linux-gcc-4.3.2Qt:qt-everywhere-opensource-src-4.6.3.tar.gz*************************************************************** *****移植触摸屏校正Tslib1.41,解压下载的tslib1.4,我的是在/tmp下tar xzvf tslib-1.4.tar.gz2.进入生成的目录/tmp/tslib,执行脚本文件./autogen.sh3,/tmp/tslib下执行configure./configure --prefix=/opt/tslib/ --host=arm-linux ac_cv_func_malloc_0_nonnull=yes经过一段时间编译,如果无错误,执行make install,安装后,tslib已经安装到/opt/tslib目录下4,修改/opt/tslib/etc/ts.conf去掉第二行的#,并同时删除空格,如果不去掉,测试时会出现段错误(Segmentation fault)module_raw有许多种,这里只使用input(即Linux的input子系统,设备文件名称为/dev/input/event0),其它的注释掉。
后面的几个module还没有深入了解,它们使用的库就在tslib/lib/ts中,最后三个模块的字面意思是“方差(滤波)”、“去抖动(去噪)”、“线性(坐标变换)”,对这些东西不了解,不发表意见。
5,在/nfs/rootfs/下创建软件目录/nfs/rootfs目录下执行:mkdir opt将/opt/下的tslib拷贝到/nfs/roots/opt下cp /opt/* /nfs/rootfs/opt6,修改开发板的环境变量,vi /mnt/profileexport TSLIB_ROOT=/opt/tslibexport TSLIB_TSDEVICE=/dev/input/event0(触摸屏设备节点文件)exportLD_LIBRARY_PATH=$TSLIB_ROOT/lib:$LD_LIBRARY_PATH export TSLIB_FBDEVICE=/dev/fb0(framebuffer设备文件)export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts(tslib插件库目录)export TSLIB_CONSOLEDEVICE=none(tslib运行需要的控制台,这里是LCD屏幕,设定的控制台设备为none,默认为/dev/tty) export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf(tslib模块配置文件)export POINTERCAL_FILE=/etc/pointercal(告诉QTOPIA,pointercal文件在哪里)export TSLIB_CALIBFILE=/etc/pointercal(指定触摸屏校准文件pintercal的存放位置)export QWS_MOUSE_PROTO=TSLIB:/dev/input/event0(鼠标与触摸屏共存)7,进入/nfs/rootfs/opt/tslib/下进行第一次校正./ts_calibrate 比如:xres = 240, yres = 320Took 14 samples...Top left : X = 276 Y = 795Took 12 samples...Top right : X = 736 Y = 796Took 11 samples...Bot right : X = 735 Y = 248Took 7 samples...Bot left : X = 274 Y = 247Took 7 samples...Center : X = 505 Y = 524-33.156189 0.304019 -0.000832369.119629 0.000871 -0.401456Calibration constants: -2172924 19924 -54 24190624 57 -26 309 65536执行后屏幕上,依次出现5个点,依次点击进行校准,校准完毕后,在/etc下会产生pointercal文件,供其他用户使用,ts_calibrate 是一个应用程序,在屏幕上画几个按钮,将用户点击后从ts驱动获得的数据和屏上的坐标通过一套算法来获得校准的数据写到一个校准文件里./ts_print 将屏幕坐标打印出来,比如:1796351007.320859: 156 116 500 按下1796351007.355145: 156 116 0 抬起./ts_print_raw 将屏幕坐标的原始数据打印出来,比如:1796350964.530867: 216 865 1 按下1796350989.946831: 0 0 0 抬起./ts_test 检测一下校正的结果,屏幕上出现两个按钮,分别为,Drag时,光标随着手指移动,另一个Draw是在屏幕上画画屏幕最上方会出现二个按钮,分别为“Drag”、“Draw”,默认是第一个,因此,用触摸笔点击任何一处,十字光标便会到那里。
qt程序移植到arm开发板1、安装交叉编译⼯具链arm-linux-gcc●复制arm-linux-gcc-4.4.3.tar.gz到/home/tools⽂件夹⾥●解压命令tar xvzf arm-linux-gcc-4.4.3.tar.gz -C / (解压⽂件到根⽬录下)注意以上命令必须要有-C⽽且是⼤写,后边有个空格也要注意。
注意查看解压的路径,将解压⽣成的⽂件移动到usr/local/arm⽬录下●vi /etc/profile●在⽂件的末尾加上PATH=/usr/local/arm/4.4.3/bin:$PATH●输⼊命令:source /etc/profile(使刚修改的⽂件⽴即⽣效)●查看arm-linux-gcc版本arm-linux-gcc -v注意:此⽅法只对当前登录⽤户有效,更换⽤户后修改当前登录⽤户/etc/profile即可2、tslib编译与安装tslib是电阻式触摸屏⽤于校准的⼀个软件库,是⼀个开源的程序,能够为触摸屏驱动获得的采样提供诸如滤波、去抖、校准等功能,通常作为触摸屏驱动的适配层,为上层的应⽤提供了⼀个统⼀的接⼝。
因此这⾥先编译安装tslib,这样在后⾯编译Qt的时候才能打包编译进去。
●需要检查⼀下软件是否安装sudo apt-get install automakesudo apt-get install autogensudo apt-get install autoconf●确定以上⼯具都已经安装后,复制tslib-1.4.tar到/home/tools⽂件夹⾥tar -zxvf tslib-1.4.tar.gzcd tslib./autogen.sh./configure --host=arm-linux ac_cv_func_malloc_0_nonnull=yes --cache-file=arm-linux.cache -prefix=/usr/local/tslibmakemake install-prefix=/usr/local/tslib是指定安装路径,其实包括下⽂的安装配置,路径都可以不指定,默认就是安装到/usr/local/⽬录下若出现错误:configure.ac:25: error: possibly undefined macro: AC_DISABLE_STAT ICIf this token and others are legitimate, please use m4_pattern_al low.See the Autoconf documentation.configure.ac:26: error: possibly undefined macro: AC_ENABLE_SHARE Dconfigure.ac:27: error: possibly undefined macro: AC_LIBTOOL_DLOP ENconfigure.ac:28: error: possibly undefined macro: AC_PROG_LIBTOOL autoreconf: /usr/bin/autoconf failed with exit status: 1解决⽅法:apt-get install libtool3、Qt的交叉编译与安装和PC平台下的编译类似,通过运⾏./configure进⾏配置⽣成makefile⽂件,然后编译安装,只是因为是针对嵌⼊式平台需要进⾏⼀些针对性配置,这⾥⽣成⼀个⾃动配置⽂件,可以通过修改⽂件来⽅便的更改配置。
(VR虚拟现实)最具体的QT移植ARM开发板方法QT4移植到ARM9开发板1编译qte1.从下载源代码,选择开源版本(非商业版本),选择Qtlibraries4.5forembeddedlinux(128M)2.在源代码目录下执行:3../configure–embeddedarm-xplatformqws/linux-arm-g++-no-qt3support-qt-mouse-linuxtp4.在redhat9.0环境需要作一些修改才能编译通过:5.ln-s/usr/kerberos/include/_err.h/usr/include/6.ln-s/usr/kerberos/include/profile.h/usr/include/7.ln-s/usr/kerberos/include/krb5.h/usr/include/8.visrc/gui/text/qfontengine_ft.cpp,注释掉710行9.make(时间4个小时左右)10.makeinstall2编译busybox1.13.4从http:///article/1454969.html在主机/root目录下面新建一个文件#geditqte_env,添加如下内容exportQTDIR=/mnt/nfs/qtcore434exportPATH=$QTDIR/bin:$PATHexportLD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH需要交叉编译的时候,重新开一个终端,在/root目录下(主机上为了方便,我一直采用root用户登陆),先ls一下,看文件在不在,然后#.qte_env/***注意.后面有一个空格*****/这样即设定好了qteforarm的库路径,在此终端下面,进入要编译的工程文件路径下;#cd/mnt/nfs/qtcore434/demoes/wwjwedm#makeclean#qmake–project#qmake#make如果没出错即可以生成一个wwjwedm的二进制可执行文件#ls拷贝这个wwjwedm到开发板上去,不过我使用的是qt4的库太大,不能移植到开发板,我使用nfs挂载的方式,可以参考其他文章,如何建立交叉编译环境。
(VR虚拟现实)最具体的QT移植ARM开发板方法QT4移植到ARM9开发板1编译qte1.从下载源代码,选择开源版本(非商业版本),选择Qtlibraries4.5forembeddedlinux(128M)2.在源代码目录下执行:3../configure–embeddedarm-xplatformqws/linux-arm-g++-no-qt3support-qt-mouse-linuxtp4.在redhat9.0环境需要作一些修改才能编译通过:5.ln-s/usr/kerberos/include/_err.h/usr/include/6.ln-s/usr/kerberos/include/profile.h/usr/include/7.ln-s/usr/kerberos/include/krb5.h/usr/include/8.visrc/gui/text/qfontengine_ft.cpp,注释掉710行9.make(时间4个小时左右)10.makeinstall2编译busybox1.13.4从http:///article/1454969.html在主机/root目录下面新建一个文件#geditqte_env,添加如下内容exportQTDIR=/mnt/nfs/qtcore434exportPATH=$QTDIR/bin:$PATHexportLD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH需要交叉编译的时候,重新开一个终端,在/root目录下(主机上为了方便,我一直采用root用户登陆),先ls一下,看文件在不在,然后#.qte_env/***注意.后面有一个空格*****/这样即设定好了qteforarm的库路径,在此终端下面,进入要编译的工程文件路径下;#cd/mnt/nfs/qtcore434/demoes/wwjwedm#makeclean#qmake–project#qmake#make如果没出错即可以生成一个wwjwedm的二进制可执行文件#ls拷贝这个wwjwedm到开发板上去,不过我使用的是qt4的库太大,不能移植到开发板,我使用nfs挂载的方式,可以参考其他文章,如何建立交叉编译环境。
qt-embedded-3.1.1 tslib触摸屏校正+qte3移植+触摸屏支持+中文显示qt-embedded-3.1.1,觉得应该做个总结第一步利用tslib-1.3生成校正文件:因为qt3在正式开始运行之前需要对触摸屏进行校验,qt3是通过读取/etc/pointercal文件里面的内容进行校正的,但是在此之前我的板子上并没有安装qt环境,更不用说有这个文件了,因此在开始移植qt之前,我需要先利用tslib对触摸屏进行校正以生成相应的校正文件并重新烧入文件系统中。
下面就是编译和使用tslib进行校正的过程过程1、编译cd tslib-1.3export CC=/usr/local/arm/3.3.2/bin/arm-linux-gcc //指定交叉编译器./autogen.sh //生成config文件export PATH=/usr/local/arm/3.3.2/bin:$PATHecho "ac_cv_func_malloc_0_nonnull=yes">arm-linux.cache./configure --host=arm-linux --cache-file=arm-linux.cache --enable-inputapi=no如果你触摸屏驱动程序支持ioctl操作,上面的configure操作中的--enable-inputapi=no你可以删除vi src/ts_read_raw.c //修改内容如下****************************************************在make之前,为了支持触摸屏,打开src/ts_read_raw.c文件,查看触摸屏驱动程序数据结构,看与ts_read_raw.c结构中的哪个一样,就将代码中的char*defaulttseventtype="UCB1x00"; 修改为自己板子上对应的驱动结构。
1.从/downloads下载qt source code, 当前最新版本5.0.0.解压后放到Work/rootfs目录下, 重新命名为qt-<d.d.d>2. 修改qtbase/mkspecs/linux-arm-gnueabi-g++下的qmake.conf里的路径, 并添加:QT_QPA_DEFAULT_PLATFORM = linuxfbQMAKE_CFLAGS_RELEASE += -O2 -march=armv5teQMAKE_CXXFLAGS_RELEASE += -O2 -march=armv5teQT_QPA_DEFAULT_PLATFORM是必须的, 通常在mac上是cocoa, 在window上是windows, 在linux X11下是xcb, 如果有OPENGL 支持, 那么选eglfs.对于无硬件加速的设备, 选择linuxfb, minimal仅仅是让程序跑通, 不起任何作用(看不到界面).QPA是QT platform abstraction的缩写3. 添加编译器路径:export PATH=/opt/arm-<year>.<month>/bin:$PATH4. 查看configure的help./configure-xplatform linux-arm-gnueabi-g++ -help>config.help 不加xplatform选项会找不到make.*表示默认使能, +表示要评估.5. 配置./configure -xplatform linux-arm-gnueabi-g++ \-release \-opensource -confirm-license \-make libs \--prefix $PWD/_install \-no-c++11 (此项不加编译出错:atomic_0.h上)看打印信息是否与设备对应, 不对应的话手动使能/禁止一些设定.设定可以参考上面的help来做改动, 设定改动必须先清除config信息: make confclean6. 编译makemake install7. 路径设置export QT_QPA_PLATFORM_PLUGIN_PATH=/usr/lib/plugins (对应qtbase/plugins目录)export QT_QPA_PLATFORM=linuxfb:tty=/dev/tty0export QT_QPA_FONTDIR=/usr/lib/fonts移植时写到/etc/profile中去.8. Tslib整合系统没有自动编译tslib, 需要手动产生Makefile:<path>/qtbase/bin/qmake-o Makefile tslib.proMakefile手动添加tslib的路径(也可以在configure时指定, 不过configure太麻烦):-I/home/jie/Work/rootfs/tslib-1.0/_install/include-L/home/jie/Work/rootfs/tslib-1.0/_install/lib (加在"-lts"前)然后编译:makemake install模块放到$QT_QPA_PLATFORM_PLUGIN_PATH/generic下(其他模块也一样, 如imageformats, 也是对应的建立文件夹放文件)程序运行时加上:-plugin tslib:/dev/event0这里tslib是插件的名称, 见QTsLibPlugin::create, generic模块名必须前加libq后加plugin.另外还有一种方法是export插件:export QT_QPA_GENERIC_PLUGINS=tslib:/dev/event0 (用","分隔不同插件)实际应用中, 程序会找不到当前的视窗, 修改fbconvenience下的代码即可.9. Keypad整合把libqevdevkeyboardplugin.so拷到generic下, 运行时带上:-plugin evdevkeyboard:/dev/event1 (假设keypad是event1)执行的应用程序必须activateWindow, 使得keypad focus落在当前应用程序上.10. 运行错误解决iconv_open failed该问题主要是libc里的iconv函数版本有问题, 需要更新, 具体如下下载/gnu/libiconv/libiconv-1.14.tar.gz./configure -prefix=$PWD/_install -host=arm-none-linux-gnueabimakemake install把_install/lib下的preloadable_libiconv.so拷到系统的/usr/lib下, 加上路径:export LD_PRELOAD=/usr/lib/preloadable_libiconv.sosegmant error首先指定platform时要加上tty=..., 见7. 路径设置其次, 程序有个bug, 修改qlinuxfbscreen.cpp:- ioctl(ttyfd, KDGETMODE, &oldMode);+ ioctl(ttyfd, KDGETMODE, oldMode);。
40 •电子技术与软件工程 Electronic Technology & Software Engineering软件开发• Software Development【关键词】ARM QT 软件 虚拟调试1 引言ARM 公司于1991年成立于英国剑桥,主要设计了基于精简指令集的ARM 核微处理器,它只参与IP 核的设计,而不从事芯片的生产。
世界其他半导体厂商Philips 、Samsung 、Atmel 、 Analog Devices 、Sharp 、ST 、TI 、瑞芯微、全志等通过向ARM 公司购买其设计的ARM 微处理器核,加入自己的ARM 外围电路,形成了自己的ARM 处理器芯片。
如美国TI 公司的335X 系列、中国的全志A35系列、中国的瑞芯微RK3288系列等。
微处理器厂商基于ARM 嵌入式系统QT 软件模拟调试技术文/吕兴朝 王泽同通过和授权主板厂商或公司合作,开发基于ARM 处理器的开发板,用于各种工业控制、嵌入式应用等。
如飞凌嵌入式FET1012A 系列核心板、周立功ARM9系列开发板。
ARM 处理器体积小、低功耗、低成本、高性能,基于ARM 的嵌入式系统被广泛应用于医疗器械、工业控制、机械制造、机器人、人工智能、航空航天等诸多领域。
基于ARM 嵌入式系统通常运行的是linux 系统,主流可视化的应用程序的开发一般基于QT 进行开发。
2 QT开发环境搭建QT 开发需要准备的工具:(1)ubuntu 或debian 系统安装镜像。
(2)VmwarePlayer.工具(3)QT IDE 源码。
(4)交叉编译工具。
如果开发PC 是windows 系统,则首先要在windows 上安装虚拟机软件VmwarePlayer ,用于运行linux 。
如果开发PC 操作系统是ubuntu 或者debian 系统,则不需用工具1和2。
在VmwarePlayer 中新建虚拟机,安装ubuntu 或debian 系统。
如何校准触摸屏基准参数在触摸屏修理工作中,我们发觉电阻式触摸屏在嵌入式系统中用的较多,电阻式触摸屏可分为四线、五线、七线等几种,接下来,我们主要以WinCE触摸屏为例,分析如何校准触摸屏基准参数问题:在我们顺当完成驱动程序安装以及各种功能就都已经预备就绪了,现在就可以实际操作触摸屏幕了。
但一般来说,电阻式触摸屏需要校准,也就是说在驱动启动过程中MDD层要调用相应的DDSI函数来读取注册表中的校正数据校正触摸屏。
抱负状况下,校准程序只要在嵌入式设备初次加电测试过程中运行一次就可以了,参考值会被存储在非易失性存储器中,以免让用户在以后的加电启动期间再做校准。
不过,高质量的触摸屏驱动程序是应当要向用户供应一种进入校准例程的途径,从而在由于温度漂移或其它因素造成校准不精确时进行重新校准。
在抱负状况下,校正触摸屏基准只需两组原始数据,即在屏幕对角读取的最小和最大值。
但在实际应用中,由于很多电阻式触摸屏存在明显的非线性,假如只在最小和最大值之间简洁的插入位置数值会导致驱动程序特别的不精确。
因此,在WinCE中需要猎取多个校准点,常用的校准点数量为5个。
方法如下:1、首先驱动程序在函数DdsiTouchPanelGetDeviceCaps 中设置校准点的个数;2、是系统在TouchDriverCalibrationPointGet中猎取每个校准点的屏幕坐标;3、是在屏幕界面的校准点坐标处显示一个位置符号,用户需要精确地在位置符号按下触摸屏;4、驱动程序通过TouchPanelReadCalibrationPoint函数读取相应的触摸屏坐标值;5、然后再开头下一个校准点,直到循环设定的次数后将采集到的触摸屏坐标值和校准点屏幕坐标送到TouchPanelSetCalibration函数中进行处理,该函数将产生校准基准参数。
校准完成之后,触摸屏便可以开头正常的操作了。
Qt/Embedded 中与用户输入事件相关的信号,是建立在对底层输入设备的接口调用之上的,一般通过对设备文件的I/O 读写来实现。
大部分这样的驱动程序已经被封装进Qt 库当中,形成了相应的设备驱动接口,如显示卡驱动、鼠标、键盘、串口和并口等。
其中鼠标设备的抽象基类为QWSMouse Handler,从该类又重新派生出一些具体的鼠标类设备的实现类。
在3.3.4 版本系列的Qt/Embedded 中,鼠标类设备的派生结构如图3 所示。
图3 鼠标类设备的派生结构图(灰色线框表示可省略类结构)鼠标类设备的加载方式与KeyBoard 设备加载方式是类似的,在系统构造QWSServer 对象时,调用成员函数QWSServer:: openMouse,程序在QWSServer:: openMouse 函数中再调用QmouseDriverFactory::create () 或QmouseDriverPlugin:: create ()。
该函数根据Linux 系统的环境变量QWS_MOUSE_PROTO获得鼠标类设备的设备类型和设备节点。
打开并返回相应设备的基类指针QWSMouseHandler 给系统,系统通过操作该基类派生出的具体子类设备指针QWSCustomMouseHandler,获得对具体鼠标类设备的调用操作触摸屏和鼠标类设备在功能上基本是一致的,因此,在Qt 库中一般把触摸屏模拟成鼠标设备来实现对触摸屏设备的操作。
基于Qt的触摸屏校准程序头文件#include <QDialog>#include <QWSPointerCalibrationData>class CalibrationDialog : public QDialog{public:CalibrationDialog(QWidget *parent = 0);~CalibrationDialog();int exec();void close();protected:void paintEvent(QPaintEvent*);void mouseReleaseEvent(QMouseEvent*);void accept();private:QWSPointerCalibrationData data;int pressCount;};源文件#include "calibrationdialog.h"#include <QWSPointerCalibrationData>#include <QPainter>#include <QFile>#include <QTimer>#include <QApplication>#include <QDesktopWidget>#include <QMouseEvent>#include <QScreen>#include <QWSServer>#include "maindialog.h"#include "application.h"/************************************************************ 该文件为触摸屏校准窗口主程序************************************************************/ extern MainDialog *g_pMainDlg;/************************************************************ 根据屏幕上的TopLeft,TopRight,BottomRight,BottomLeft,Center 五个点进行触摸屏校准************************************************************/ static int location[5] = {QWSPointerCalibrationData::TopLeft,QWSPointerCalibrationData::TopRight,QWSPointerCalibrationData::BottomRight,QWSPointerCalibrationData::BottomLeft,QWSPointerCalibrationData::Center};/************************************************************ 描述:触摸屏校准窗口构造函数参数:parent - 父窗口指针返回:无************************************************************/ CalibrationDialog::CalibrationDialog(QWidget *parent) :QDialog(parent){setObjectName("CalibrationDialog");QRect desktop = QApplication::desktop()->geometry();desktop.moveTo(QPoint(0, 0));setGeometry(desktop);setFocusPolicy(Qt::StrongFocus);setFocus();setModal(true);int width = qt_screen->deviceWidth();int height = qt_screen->deviceHeight();int dx = width / 10;int dy = height / 10;QPoint *points = data.screenPoints;points[QWSPointerCalibrationData::TopLeft] = QPoint(dx, dy);points[QWSPointerCalibrationData::BottomLeft] = QPoint(dx, height - dy);points[QWSPointerCalibrationData::BottomRight] = QPoint(width - dx, height - dy);points[QWSPointerCalibrationData::TopRight] = QPoint(width - dx, dy);points[QWSPointerCalibrationData::Center] = QPoint(width / 2, height / 2);pressCount = 0;}/************************************************************描述:触摸屏校准窗口析构函数参数:无返回:无************************************************************/ CalibrationDialog::~CalibrationDialog(){}/************************************************************描述:运行触摸屏校准窗口参数:无返回:无************************************************************/int CalibrationDialog::exec(){((Application *)qApp)->setLCDOn();pressCount = 0;QWSServer::mouseHandler()->clearCalibration();grabMouse();//g_pMainDlg->m_pAbnormalMsgBox->hide();activateWindow();int ret = QDialog::exec();//show();//raise();releaseMouse();return ret;}/************************************************************描述:触摸屏校准窗口自绘函数参数:无返回:无************************************************************/void CalibrationDialog::paintEvent(QPaintEvent*){QPainter p(this);p.fillRect(rect(), Qt::white);QPoint point = data.screenPoints[location[pressCount]];// Map to logical coordinates in case the screen is transformedQSize screenSize(qt_screen->deviceWidth(), qt_screen->deviceHeight());point = qt_screen->mapFromDevice(point, screenSize);p.fillRect(point.x() - 6, point.y() - 1, 13, 3, Qt::black);p.fillRect(point.x() - 1, point.y() - 6, 3, 13, Qt::black);}/************************************************************描述:触摸屏校准窗口触摸屏/鼠标放开回调函数,记录下5个点的触摸数据,然后进行触摸屏校准计算参数:event - 鼠标事件返回:无************************************************************/void CalibrationDialog::mouseReleaseEvent(QMouseEvent *event){// Map from device coordinates in case the screen is transformedQSize screenSize(qt_screen->width(), qt_screen->height());QPoint p = qt_screen->mapToDevice(event->pos(), screenSize);data.devPoints[location[pressCount]] = p;if (++pressCount < 5)repaint();elseaccept();}/************************************************************ 描述:根据记录下的5个点的触摸数据进行触摸屏校准计算参数:event - 鼠标事件返回:无************************************************************/ void CalibrationDialog::accept(){Q_ASSERT(pressCount == 5);QWSServer::mouseHandler()->calibrate(&data);QDialog::accept();((Application *)qApp)->setLCDAndTimerOn();}。
触摸屏校准
注明:以下操作的前提是:内核已加载触摸屏驱动
QT移植成功
Tslib安装成功
要求:1.安装成功的tslib存放路径为:nfs挂载文件系统目录下的/usr/local/tslib
2.校准生成的文件存放路径为:nfs挂载文件系统目录下的/etc/pointercal
步骤:
1.打开nfs挂载文件系统目录下/etc/profile文件
在文件末尾添加环境变量:
export QWS_MOUSE_PROTO=Tslib:/dev/input/event1 //指定设备,决定选择触摸屏,而非鼠标export QWS_DISPLAY=LinuxFb:/dev/fb0 //指定设备
export QWS_DISPLAY="LinuxFb:mmWidth50:mmHeight130:0" //设置字体显示
export QWS_SIZE=800x480 //设置屏幕大小
保存关闭
2.删除nfs挂载文件系统目录下/etc/pointercal文件(旧的校准文件)
rm pointercal
3.连接开发板到主机,确保nfs挂载成功
在终端上运行:cd /usr/local/tslib
ls
./ts_calibrate //校准程序
这时因该看到开发板显示屏上出现十字架光标。
手持触摸杆,依次点击出现的5的十字架光标,校验程序运行完毕,此时已在/etc下生成新的pointercal校准文件。
再在终端运行:./ts_test //测试程序
同样在显示屏上出现光标,这是个测试程序,你可以用触摸杆点着光标并拖动,以测试触摸屏是否可用。
如无问题,则说明触摸屏已经可以正常使用。
说明:
1.Tslib是用来去抖、校准用的,里面包含了一些触摸屏的配置文件,校准库等。
2.单次校准的结果可能是触摸屏并不能完全不误差,可以在上述第三步的时候多校准几次
(重复操作)。
3.此种修改触摸屏的方法有一漏洞:触摸屏使用正常,但鼠标失效,也就是说鼠标和触摸屏
只能择其一。
Saladin于2010-11-30。