qt-embedded-3.1.1 tslib触摸屏校正+qte3移植+触摸屏支持+中文显示

qt-embedded-3.1.1 tslib触摸屏校正+qte3移植+触摸屏支持+中文显示

2011-7-11 18:13:35  作者:hill1977  点击数:198

qt-embedded-3.1.1,觉得应该做个总结。

 

第一步 利用tslib-1.3生成校正文件:

 

    因为qt3在正式开始运行之前需要对触摸屏进行校验,qt3是通过读取/etc/pointercal文件里面的内容进行校正的,但是在此之前我的板子上并没有安装qt环境,更不用说有这个文件了,因此在开始移植qt之前,我需要先利用tslib对触摸屏进行校正以生成相应的校正文件并重新烧入文件系统中。下面就是编译和使用tslib进行校正的过程过程

 

1、编译

 

cd tslib-1.3

export CC=/usr/local/arm/3.3.2/bin/arm-linux-gcc   //指定交叉编译器

./autogen.sh   //生成config文件

export PATH=/usr/local/arm/3.3.2/bin:$PATH

echo "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"; 修改为自己板子上对应的驱动结构。因为我的驱动对应的是h3600_ts_event结构,虽然我的驱动程序是/dev/ts,但是它的结构和h3600_ts一样

typedef struct {

unsigned short pressure;

unsigned short x;

unsigned short y;

unsigned short pad;

} TS_RET;

所以修改为:

   char *defaulttseventtype="H3600";

************************************

如果不修改源代码,也可以在后面的测试中重新指定环境变量

export TSLIB_TSEVENTTYPE=H3600 //通过这个对tslib中的设备结构体定义

*****************************************************

make

make install //只用通过这个命令才能在/usr/local/share/ts/plugins/目录下找到相应的.so共享库,不然无法生成.so的库,只能看到.o文件

*************************************************

 

2.测试:

 

2.1 我在/root/share下新建了一个tslib目录,只copy了一些需要的文件

mkdir /root/share/tslib

mkdir /root/share/tslib/tests

mkdir /root/share/tslib/plugins

mkdir /root/share/tslib/lib

mkdir /root/share/tslib/etc

cp /root/tslib-1.3/tests/.libs/ts_* /root/share/tslib/tests/           //几个所需的测试文件,比如生成的校准文件,测试文件等等

cp /root/tslib-1.3/src/.libs/libts-0.0.so.0* /root/share/tslib/lib/    //几个所需的库文件

cp /root/tslib-1.3/src/.libs/libts.so /root/share/tslib/lib/          //几个所需的库文件          

cp /root/tslib-1.3/plugins/*.so /root/share/tslib/plugins/            //触摸屏插件模块库

cp /root/2410s/tslib-1.3/etc/ts.conf /root/share/tslib/etc/                 //配置文件    

 

2.2 连接板子

执行minicom

mount –t nfs –o nolock 192.168.1.130:/root/share /mnt使板子mount上PC,共享路径/root/share

 

2.3 做链接

ln -s /dev/fb/0 /dev/fb0

//帧缓冲设备板子上为/dev/fb/0,但程序默认为/dev/fb0,所以做了一个链接/dev/fb0到/dev/fb/0

ln -sf /dev/touchscreen/0raw /dev/ts

//qtopia要打开/dev/ts,你没有这个文件, 所以 dev下边应该有触摸平的节点,

相当于, qtopia启动要找 /dev/ts, 但是你只有/dev/touchscreen/0raw,

所以你把ts链接到你的触摸屏的文件就可以了!

假设触摸屏设备节点文件为/dev/touchscreen/0raw,所以,建立链接 /dev/ts 到/dev/touchscreen/0raw

(这里要自己针对自己板子具体的文件进行设置,要不然也会报错)

 

2.4 指定环境变量

export QWS_MOUSE_PROTO=TPanel:/dev/ts

export T_ROOT=/mnt/tslib

export LD_LIBRARY_PATH=$T_ROOT/lib:$LD_LIBRARY_PATH //指定tslib库文件路径

export TSLIB_CONSOLEDEVICE=none //tslib运行需要的控制台,这里就是LCD屏幕 ,设定控制台设备为none,否则默认为/dev/tty,

export TSLIB_FBDEVICE=/dev/fb0    //指定帧缓冲设备

export TSLIB_TSDEVICE=/dev/ts         //指定触摸屏设备节点文件

export TSLIB_CALIBFILE=$T_ROOT/etc/pointercal     //指定触摸屏校准文件pintercal的存放位置

********************************************************************

注:qte的/src/kernel/qwsmouse_qws.cpp里面校准文件默认打开是在/etc下面为/etc/pointercal,

可是我得板子的根文件系统为只读,所以我放在/mnt/tslib/etc下面了,

所以在交叉编译qte的时候需要修改qwsmouse_qws.cpp

**************************************************

export TSLIB_CONFFILE=$T_ROOT/etc/ts.conf   //指定TSLIB配置文件的位置

export TSLIB_PLUGINDIR=$T_ROOT/plugins    //指定触摸屏插件所在路径

 

2.5 校准

运行校准程序校准屏幕(5点校准)

cd $T_ROOT/tests

./ts_calibrate   //板子上陆续出现5个光标,点击完毕后会生成校准文件pintercal存放在$T_ROOT/etc/下面

********************************************

ts_calibrate是一个应用程序,在屏幕上画几个按钮,将用户点击后从ts驱动获得的数据和

屏上的坐标位置通过一套算法来获得校准数据写到一个校准文件里。

******************************************

 

2.6 重新烧写文件系统

上面得到校正文件之后就把它放到文件系统的/etc/目录下,然后重新生成新的文件系统镜像并下载到开发板上,那样移植的qt程序就能正确获得触摸屏校正文件了。

 

3. 可能遇到的错误分析:

 

在测试的时候,运行./ts_calibrate又出现了令人十分之郁闷的错误:

ts_config: Success

追查后应该是在打开ts_config中出现了错误(居然报Success,无欲至极)

在网上发现多是这个错误(这是1.4版本的错):

Couldnt load module input

No raw modules loaded

tsconfig: Success

我没有上面那两行的错误,不过应该是一样的错误原因

那么错误就定位在 ts_config 里。并且可以进一步确定是在加载插件模块时出的错

查询了ts_load_module.c这个文件发现网上和自己的不太一样(网上公布的源码是1.4或者是0.1.1的吧)我的是1.3的

我下载了tslib-0.1.1的后重新实验 就发现错误的是这样子的(第一个错误是由ts.conf所决定的)

Couldnt load module pthres

No raw modules loaded

tsconfig: Success

阅读了tslib 的原代码,知道了cstdlib 库里的一个函数: getenv

是用来得到指定系统环境变量的值。是为了测试 tslib 是否得到正确的环境变量。

其环境变量默认的值在readme中有注明。

加载插件模块时出出错分析:

ts_calibrate会打开ts_config

ts_config函数里首先会读取 tslib 配置文件(ts.conf,由 TSLIB_CONFFILE环境变量指定,在tslib/etc下面),

然后根据这个文件逐个加载插件库,1.3版本的ts.conf内容为:

module mousebuts

moudle variance xlimit=50 ylimit=50 pthreshold=3

moudle dejitter xdelta=1 ydelta=1 pthreshold=3

moudle linear

ts_config又会调用ts_load_module加载库。从这个函数里,程序先是得到配置文件中指定加载的模块名,

然后根据模块名构造了一个 so 文件文件名,然后调用了系统函数 dlopen 加载库!

Linux 下的加载dlopen 类似于 Windows 下动态链接库的函数:dlopen

错误就应该出在构造的库文件名是错误的---其指定的文件不存在

---从而导致 dlopen无法加载。所以才提示找不到文件或目录!

那么这样就是应该把需要的mousebuts.so variance.so dejitter.so linear.so应该复制到/tslib/plugins中

(上面修正后作了这一步,就可以拉,就不会出现错误拉)

 

参考:http://blog.chinaunix.net/u1/33412/showart_282396.html

 

 

第二步 QTE3.1.1的安装

1、QT/x11 3.1.1的安装

解压QT/X11安装包

设定环境

QTDIR=你的QT/X11安装目录

PATH=$QTDIR/bin:$PATH

    ./configure 各种参数可用./configure –help查看,我用的是

./configure –static –no-xft –thread –no-sm

make

结束以后,进入QT/X11下的tools/qvfb目录。直接make,产生qvfb可执行文件。Qvfb是虚拟帧缓存工具,可以让在xwindow环境下虚拟帧缓存,而不必退出xwindow环境。这是为了测试QTE程序用的。

 

2、QTE3.1.1的安装

QTE的安装分两种,一种是在宿主机上用的,也就是安装在你的本机上用的。这种QTE是不需要交叉编译的。一种是在发布程序到目标板上用的,也就是你的开发板上用的。这个QTE是需要交叉编译的。下面分别说明下这两种QTE的安装。

 

宿主机上的安装:

1.确认系统已安装QT/X11。

2.解压QTE的安装包。

3.设定QTE的环境变量。

要设定的环境变量为

QTDIR=你的QTE的安装路径。(如你已成功安装QT/X11,这个变量系统中已存在,但是指向QT/X11的。)

Export PATH=$QTDIR/bin:$PATH (加QTE的bin目录加入系统PATH变量)

4.执行configure

进入QTE的安装目录,(此时就是QTDIR的目录),运行./configure,此命令的参数项可用./configure –help查看,你可根据你的需要选择参数。我用的参数是这样

./configure –no-xft –qvfb –thread –depths 4,8,16,32 其中 –qvfb参数是让QTE能支持QVFB工具。-thread是让QTE支持多线程,这个建议选上。

5.将QT/X11 bin下的uic可执行文件拷入QTE安装目录下的bin。(如没有此目录,手工建一个。)

6、执行make。

 

目标板所用QTE的安装

tar zxvf qt-embedded-3.1.1.tar.gz

mv qt-embedded-3.1.1 qt-e

cd qt-e

export QTEDIR=$PWD

export QTDIR=$QTEDIR

export PATH=$QTDIR/bin:$PATH

cp ../qt-x11/bin/?* ./bin/        //拷贝刚刚安装完成的qt-x11中的程序uic等

cp qtopia-1.7.0/src/qt/qconfig-qpe.h   ./src/tools/

在使用configure生成makefile文件的时候需要指定相应的配置文件。

在configure之前要指定配置文件,也就是目录src/tools/下的qconfig-qpe.h(我是采用通过拷贝老版本的qt中的文件过来的),当然也可以采用本来就有的qconfig-large.h等。

对其中的参数进行修改,

vi src/tools/qconfig-qpe.h

a.       注释掉QT_NO_CODE选项,使得qt支持unicode编码

b.       注释掉QT_NO_BDF选项,需要使用字库

c.       注释掉QT_NO_DRAGANDDROP,不然会编译错误

d.       注释掉QT_NO_TRANSFORMATIONS,

 

修改触摸屏相关文件

vi src/embedded/qmouselinuxtp_qws.h

       加上#define QT_QWS_IPAQ

              #define QT_QWS_IPAQ_RAW这两个选项是为了支持ipaq的触摸屏类型。

vi src/embedded/qmouslinuxtp_qws.cpp

       修改驱动设备文件为/dev/ts,因为我的开发板子上的触摸屏驱动文件是/dev/ts,有些开发板并不是这个,需要对其做相应的修改。

./configure –embedded arm –xplatform qws/linux-ipaq-g++ –no-xft –thread –no-qvfb –qt-mouse-linuxtp –qconfig qpe –depths 4,8,16,32

make

 

在板子上运行qt程序:

通过nfs加载相应目录(主要是lib/目录和bin/目录),在板子上设定环境参数,加载到目录/mnt/qt3下,lib/目录主要的文件包括fontdir mkfontdir.qws unifont*(中文支持),以及.so库文件。

export QTDIR=/mnt/qt3

export LD_LIBRARY_PATH=/mnt/qt3/lib:LD_LIBRARY_PATH

export PATH=/mnt/qt3/bin:$PATH

export QWS_MOUSE_PROTO=LinuxTP:/dev/ts

然后就可以在板子上运行测试程序了

./qt-hello –qws

 

加中文支持:

虽然上面已经将QTE移植到开发板子上,但是却还不能正确显示中文,为了在qt程序中显示中文,需要做两方面的支持,界面中文支持和读取文件数据中文支持。

1.  用户界面加中文支持

用户界面的中文支持比较简单,可以使用刚才编译生成的应用程序lupdate和lingust,具体方法如下:

进入到qt程序的工程文件所在目录

cd /home/qt-arm/hello/

修改工程文件

vi hello.pro

       加上TRANSLATIONS += lang_zh.ts,表示要提取程序界面中的中文内容并保存到lang_zh.ts文件里面。Lang_zh.ts文件的格式如下:

    hello

   

        你好!

        你好!

 

 

文件中标签之间的内容就是需要翻译的内容,< translation >之间的内容就是相应的翻译。所以如果要加上什么其他的翻译内容,可以按照上面格式进行添加。

通过lingust进行翻译,并生成相应的翻译库文件lang_zh.qm

lingust lang_zh.ts

编译之后点击 File->release生成lang_zh.qm文件。

将lang_zh.qm拷贝到目标板子上相应的hello目录下,然后对hello工程中的main.cpp文件进行修改,修改如下:

a.加上setFont(QFont(“unifont”,10,QFont::Unicode));

b.加上QTranslator *translator=new QTranslator(0);

c.加上translator->load(“lang_zh”);加载刚才生成的翻译文件lang_zh.qm

       d.加上app.installTranslator(translator);

参考:《让QT/Embedded支持国际化.doc》

 

2.  读取文件数据的中文显示

上面的方法只能对界面上的中文进行显示,但是当应用程序从文件中读取中文数据并要把他们显示出来的时候,上面的方法是行不通的。只能用一下的方法。

在main.cpp文件中加入以下内容:

QTextCodec::SetCodecForTr(QTextCodec::codecForName(“GB2312”));//显示兼容GB2312的中文。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值