触摸屏和鼠标共存

big_anana 2019-12-05 16:46:00 2363

嵌入式QT程序需要支持触屏和鼠标同时使用,一般会使用tslib库(tslib和qt编译请参照网上其他帖子)

qt和tslib配置如下:

注意替换库文件路径和对应的设备文件路径

LIB_ROOT=/usr
QT_DIR=${LIB_ROOT}/qt4.8.6
TS_DIR=${LIB_ROOT}/tslib-1.8

export LD_LIBRARY_PATH=${LIB_ROOT}/lib:${QT_DIR}/lib:${TS_DIR}/lib:${ShellPath}
export QT_QWS_FONTDIR=${QT_DIR}/lib/fonts
export QWS_DISPLAY="LinuxFb:/dev/fb1"
export QWS_MOUSE_PROTO="mouseman:/dev/input/mice tslib:/dev/input/touchscreen0"
export TSLIB_TSDEVICE="/dev/input/touchscreen0"
export TSLIB_CONFFILE=${TS_DIR}/etc/ts.conf
export POINTERCAL_FILE=${TS_DIR}/etc/pointercal
export TSLIB_CALIBFILE=${TS_DIR}/etc/pointercal
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb1
export TSLIB_PLUGINDIR=${TS_DIR}/lib/ts

使用这个配置时,鼠标可以正常操作,触屏操作就显得有些魔性了...

解决思路:这个问题是由于触屏设备在input子系统注册的时候,会被视为一个mouse设备。/dev/input/mice这个设备会连接所有的mouse设备,导致触屏设备上报坐标变化时,/dev/input/mice也会上报,此时mice上报的数据点不准确。

2个解决办法(推荐使用第二种):

  1. 在配置中不使用mice,将指定鼠标的event handler固定(如固定为event1,配置时将mice替换为event1即可)。

参照另一个帖子固定event handler. 点我传送

  1. 修改内核源码中的drivers/input/mousedev.c文件。在将鼠标设备连接到mice的时候,忽略触屏设备,使触屏设备与mice互相独立,互不影响。修改如下:

文件顶部头文件添加

#include <linux/string.h>

mousedev_connect 、 mousedev_disconnect 函数修改(此处我的触屏设备名为touchScreen)

static int mousedev_connect(struct input_handler *handler,
                struct input_dev *dev,
                const struct input_device_id *id)
{
    struct mousedev *mousedev;
    int minor;
    int error;

    // add by wx: ignore touch screen
    static const char* tsname = "touchScreen";
    printk(KERN_INFO "%s: %s", __func__, dev->name);

    for (minor = 0; minor < MOUSEDEV_MINORS; minor++)
        if (!mousedev_table[minor])
            break;

    if (minor == MOUSEDEV_MINORS) {
        printk(KERN_ERR "mousedev: no more free mousedev devicesn");
        return -ENFILE;
    }

    mousedev = mousedev_create(dev, handler, minor);
    if (IS_ERR(mousedev))
        return PTR_ERR(mousedev);

    // add by wx: (mixdev_add_device) ignore touch screen
    if (!strcmp(dev->name, tsname))
        return 0;

    error = mixdev_add_device(mousedev);
    if (error) {
        mousedev_destroy(mousedev);
        return error;
    }

    return 0;
}
static void mousedev_disconnect(struct input_handle *handle)
{
    struct mousedev *mousedev = handle->private;

    // modify by wx: (mixdev_remove_device) ignore touch screen
    static const char* tsname = "touchScreen";
    printk(KERN_INFO "%s: %s", __func__, handle->dev->name);
    if (strcmp(handle->dev->name, tsname))
        mixdev_remove_device(mousedev);

    mousedev_destroy(mousedev);
}
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 点赞 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
big_anana
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区