您的位置:首页 > 编程语言 > Qt开发

关于嵌入式x86平台tslib1.4+qt4.8.4移植

2013-01-10 10:08 459 查看
由于我的嵌入式平台为x86的。网上大多数资料都是ARM平台的。可能x86的更简单些,但是我也遇到不少问题。过程和问题如下:

tslib版本 tslib 1.4

 下载地址:http://download.csdn.net/detail/mmz_xiaokong/4980129

qt版本:4.8.4

 下载地址:http://qt-project.org/downloads

触摸屏控制器:penmount 6000 usb

1、编译tslib 1.4

    ./configure --prefix=/usr/local/qte/tslib/

sudo make;sudo make install

2、修改ts.conf内容

# vi /usr/local/qte/tslib/etc/ts.conf

module_raw input

module pthres pmin=1

module variance delta=30

module dejitter delta=100

module linear

3、开发板配置环境变量

通过超级终端,# vi /etc/profile

添加如下内容(绿色):

export TSLIB_ROOT=/usr/local/qte/tslib

export TSLIB_TSDEVICE=/dev/input/event4

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

如下注释

export TSLIB_ROOT=/usr/local/qte/tslib

export TSLIB_TSDEVICE=/dev/input/event4 指定触屏设备

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

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

export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts 指定触摸屏插件所在路径

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

export TSLIB_CONSOLEDEVICE=none 设定控制台设备为 none ,否则默认为 /dev/tty ,这样可以避免出现“open consoledevice: No such file or directory KDSETMODE: Bad file descriptor ” 的错误

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TSLIB_ROOT/lib

4、执行测试命令

./bin/ts_calibrate ./bin/test

*********************************************************************** 问题汇总 ***********************************************************************

问题1:

./autogen.sh: 4: autoreconf: not found

是在不同版本的 tslib 下执行 autogen.sh 产生。它们产生的原因一样,是

因为没有安装automake 工具, (ubuntu 10.04)用下面的命令安装好就可以了。

sudo apt-get install autoconf automake libtool

问题2:

错误: inlined from ‘main’ at ts_calibrate.c:229:11:

/usr/include/bits/fcntl2.h:51:24: error: call to ‘__open_missing_mode’ declared with attribute error: open with O_CREAT in second argument needs 3 arguments

make[2]: *** [ts_calibrate.o] 错误 1

make[2]:正在离开目录 `/home/kongdepeng/work/QTE_DSF/tslib/tests'

make[1]: *** [all-recursive] 错误 1

make[1]:正在离开目录 `/home/kongdepeng/work/QTE_DSF/tslib'

make: *** [all] 错误 2

解决办法:

gcc 新版本编译器对语法检查严格,在源文件 ./tests/ts_calibrate.c 中

// 源文件

// if ((calfile = getenv("TSLIB_CALIBFILE")) != NULL) {

// cal_fd = open (calfile, O_CREAT | O_RDWR);

// } else {

// cal_fd = open ("/etc/pointercal", O_CREAT | O_RDWR);

// }

// 需要更改成如下形式

if ((calfile = getenv("TSLIB_CALIBFILE")) != NULL) {

cal_fd = open (calfile, O_CREAT | O_RDWR, 0777);

} else {

cal_fd = open ("/etc/pointercal", O_CREAT | O_RDWR, 0777);

问题3:

./ts_calibrate: error while loading shared libraries: libts-0.0.so.0: cannot open shared object file: Error 40

./ts_calibrate: error while loading shared libraries: libts-0.0.so.0: cannot open shared object file: No such file or directory

解决方法:

#echo $LD_LIBRARY_PATH // 查看lib路径

#export LD_LIBRARY_PATH=$TSLIB_ROOT/lib

问题4:

ts_open: No such file or directory

解决方法:

#export TSLIB_TSDEVICE=/dev/input/event0 // 触摸屏设备路径

问题5:

Couldnt open tslib config file: No such file or directory

ts_config: Illegal seek

解决方法:

#export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf

问题6:

Couldnt load module pthres No raw modules loaded.

ts_config: Success

解决方法:

#export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts

问题7:

No raw modules loaded.

ts_config: No such file or directory

解决方法:

修改$TSLIB_ROOT/etc/ts.conf,至少放开一个module_raw,打开tslib-1.4/etc/ts.conf文件,

去掉其中一个modules_raw前面的#符号,并删除空格即可并去掉前面空格

问题8:

framebuf cannot connect

需要打开framebuf

就是在grub.conf启动列表的kernel最后添加vga参数

如 kernel /bzImage vga=789 root=/dev/ram rw splash=silent quiet

色彩 640x400 640x480 800x600 1024x768 1280x1024 1600x1200

4bits ? ? 0x302 ? ? ?

8bits 0x300 0x301 0x303 0x305 0x307 0x31C

15bits ? 0x310 0x313 0x316 0x319 0x31D

16bits ? 0x311 0x314 0x317 0x31A 0x31E

24bits ? 0x312 0x315 0x318 0x31B 0x31F

32bits ? ? ? ? ? ?

问题9:elected device is not a touchscreen I understand

查看源码后,将input_raw.c的代码替换为pm6000(触摸屏控制器名)的代码。
http://www.pudn.com/downloads50/sourcecode/embed/detail170685.html http://people.linux.org.tw/~fred/drivers/pm6000_tslib.tgz
或者编译后,将ts-config中的pm6000打开。

需要了解的可以看readme

问题10:如何得知你的触摸屏设备节点

cat /proc/bus/input/devices

看看哪个是你的 ts 设备。正确设置你的event.

问题11:kernel正确的触摸屏驱动,测试并确认/dev/input中的输入设备,假设测试event1设备文件是否为触摸屏设备文件:

cat /dev/input/mice | hexdump 触控触摸屏将有数据在终端输出,如下解析了,如何进行测试。不是所有的设备都是一样的节点,这个可以自己进行测试。

/dev/input/mouse4 是我的 。

问题12:由网友测试触摸屏不准确的问题如下:

-------------------------------------------------------------------------------------------------------------

现象:点击触摸屏有反映,但是触点与鼠标图标之间总是有距离,而且距离随着触控操作变化: 如,点击屏角,使触控点和鼠标位置很接近,

随后的触控操作能保持这种近距离, 但随着后继触控操作距离会变化.

问题分析:触摸屏有反映说明tslib有触控事件送往QWSTslibMouseHandler,怀疑只是送往QWSTslibMouseHandler的坐标信息未矫正

=> 直接运行tslib的配套工具 ts_calibrate, 并用ts_test验证,坐标校验成功,但是Qt应用程序仍然存在触点偏移。

=> google 类似问题,多为校验问题,有些文章提到QWS_MOUSE_PROTO显示指定鼠标事件来源,结合以上总结,怀疑是否使Qt默认没有使用正确的鼠标事件. Qt for Embedded Linux Pointer Handling 证明了这点: Note that Qt for Embedded Linux does not support auto-detection of touch panels in which case the driver must be specified explicitly
to determine which device to use.

=> QWS_MOUSE_PROTO

Specifies the driver for pointer handling. For example, if the current shell is bash, ksh, zsh or sh:

export QWS_MOUSE_PROTO=<driver>[:<driver specific options>]

<driver> areMouseMan,IntelliMouse,Microsoft,VR41xx,LinuxTP,Yopy,Tslib

andkeys identifying custom drivers. (即此参数同对应QMouseDriverFactory或QMouseDriverPlugin的keys()返回的字符串)

<driver specific options> are typically a device, e.g.,/dev/mouse for mouse devices and/dev/ts for touch panels. 确认设备的方法: 如,测试/dev/input/mice 是否是输入设备: cat /dev/input/mice | hexdump, 测试移动鼠标应该有数据输出

Multiple mouse drivers can be specified in one go:

export QWS_MOUSE_PROTO="<driver>[:<driver specific options>] <driver>[:<driver specific options>] <driver>[:<driver specific options>]"

=> 使用cat发现目标设备的触摸屏设备文件为/etc/input/event1, 所以设置export QWS_MOUSE_PROTO=tslib:/etc/input/event1, 累计偏移故障消失

=> 为同时使用USB鼠标,用cat发现/etc/input/mice为USB鼠标输入,所以设置:export QWS_MOUSE_PROTO="tslib:/etc/input/event1 interlliMouse:/etc/input/mice". 此时USB鼠标可用,但是触摸屏鼠标又出现累计偏差,怀疑和mice (mouse的复数)有关,是否mice是一个叠加输入?

应该有单独输入的设备文件.

=> 用cat测试/dev/input下的设备文件,发现USB鼠标的输入文件还有/dev/input/mouse1, 反过来触控触摸屏/dev/input/mice也有输出,但是比较event1与mice的数据发现不同

=> QWS_MOUSE_PROTO中针对USB鼠标和触摸屏分别使用各自独立的设备文件export QWS_MOUSE_PROTO="tslib:/etc/input/event1 interlliMouse:/etc/input/mouse1", 问题解决.

=> 结论: mice是所有鼠标设备的设备文件(USB/PS2鼠标 或 触摸屏鼠标等), 其可能源自mouse1,event1, 并且其数据做了处理, mice作为默认鼠标设备文件优先使用, 而tslib需要的是提供原生触摸屏数据的event1,导致触摸屏定位总有偏差

重启开发板,在 /usr/local/tslib/bin 目录下,输入./ts_calibrate,出现tslib的触摸屏五点校准画面,至此,tslib的安装移植成功完成。

关于qt4.8.4的移植,在下一篇中说明。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: