首页专栏详情
打赏
触摸屏和鼠标共存
易百纳技术社区 big_anana 2019-12-05 16:46:00

嵌入式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);
}
1266
收藏
点赞
打赏
给作者打赏,鼓励他抓紧创作吧~
评论
0个
内容存在敏感词
相关专栏
打赏作者
易百纳技术社区
big_anana
您的支持将鼓励我继续创作!
打赏金额:
¥1 易百纳技术社区
¥5 易百纳技术社区
¥10 易百纳技术社区
¥50 易百纳技术社区
¥100 易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区 微信支付
易百纳技术社区
打赏成功!

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

审核成功

发布时间设置
发布时间:

审核失败

失败原因
备注
Loading...
易百纳技术社区
确定要删除此文章、专栏、评论吗?
确定
取消
易百纳技术社区
易百纳技术社区
在专栏模块发布专栏,可获得其他E友的打赏
易百纳技术社区
回答悬赏问答,被题主采纳后即可获得悬赏金
易百纳技术社区
在上传资料时,有价值的资料可设置为付费资源
易百纳技术社区
达到一定金额,收益即可提现~
收益也可用来充值ebc,下载资料、兑换礼品更容易
易百纳技术社区
活动规则
  • 1.周任务为周期性任务,每周周一00:00刷新,上周完成的任务不会累计到本周,本周需要从头开始任务,当前任务完成后才可以完成下一个任务
  • 2.发布的专栏与资料需要与平台的板块有相关性,禁止注水,专栏/资料任务以审核通过的篇数为准
  • 3.任务完成后,现金奖励直接打款到微信账户;EBC/收益将自动发放到个人账户,可前往“我的钱包”查看;其他奖励请联系客服兑换
  • 4.每周最后三个任务将会有以下奖品掉落:社区热卖开发板、小米音响、视频年度会员、京东卡、华为手机等等
易百纳技术社区
升级提醒
易百纳技术社区

恭喜您由入门

社区送出礼品一份

请填写您的收件地址,礼品将在3个工作日寄出

易百纳技术社区