使用tslib来校准usb接口的触摸屏

来源:互联网 发布:中文移动域名争议通知 编辑:程序博客网 时间:2024/05/17 06:45

现在使用eGalax的usb触摸屏设备。然后使用LinuxInput的Qt库,之前使用的是Qt里面的校准程序。但是发现,程序里面能够分辨的,设备的右下角坐标,总是等于内核的分辨率,也就是800*600。在开发板的环境变量里面有个,QWS_SIZE这个东西,我设置了也没见什么效果,删除了也没什么问题。所以校准出来的结果是,触摸屏左上四分之一,就已经能够表达显示器的全屏了,即800*600。
但是,这没法用。所以最后又把目光投向tslib,之前就想过自己修改tslib,这回也许是瞎猫和耗子的关系,竟然真的实现了。
在之前使用tslib时,打开usb设备,会经过fd_check()这个函数。它会对当前设备进行判断,看看是不是触屏设备(当然是了)。但是不知道是什么原因,usb的触屏就是不认,EV_VERSION这个东西我也修改了,发现不行,因为还有其他的很多判断条件。索性我直接在input-raw.c里面的,mod_init()这个函数里面把i->sane_fd = 0;这个修改成1。即
TSAPI struct tslib_module_info *mod_init(struct tsdev *dev, const char *params)
{
struct tslib_input *i;

i = malloc(sizeof(struct tslib_input));if (i == NULL)    return NULL;i->module.ops = &__ts_input_ops;i->current_x = 0;i->current_y = 0;i->current_p = 0;i->sane_fd = 1;i->using_syn = 0;return &(i->module);

}这样就直接屏蔽了fd_check()这个过程。继续测试,发现还是不行,打开debug发现其实x、y坐标已经有了,但是就因为没有pressure的值,所以在tests\Testutils.c文件中有个while循环过不去。见getxy()函数中,
do {
if (ts_read_raw(ts, &samp[0], 1) < 0) {
perror(“ts_read”);
close_framebuffer ();
exit(1);
}

} while (samp[0].pressure == 0);所以我在ts_input_read()函数中#ifdef DEBUG            fprintf(stderr, "RAW---------------------------> %d %d %d\n",                samp->x, samp->y, samp->pressure);#endif   /*DEBUG*/

这个地方加了一句,samp->pressure = 1;
编译测试。成功了!!!当然方法比较傻,暂时能够实现。因为不太会linux下面的编程,特别是关于驱动的。如果会的话,我觉得应该可以参考tslib,自己写一个校准软件出来。

0 0
原创粉丝点击