linux触摸屏两指缩放_Linux内核触摸屏驱动--多点触摸 【转】
简介
为了使用功能强大的多点触控设备,就需要一种方案去上报用户层所需的详细的手指触摸数据。这个文档所描述的多点触控协议可以让内核驱动程序向用户层上报任意多指的数据信息。
使用说明
单点触摸信息是以ABS承载并按一定顺序发送,如BTN_TOUCH、ABS_X、ABS_Y、SYNC。而多点触摸信息则是以 ABS_MT承载并按一定顺序发送,如ABS_MT_POSITION_X、ABS_MT_POSITION_Y,然后通过调用 input_mt_sync()产生一个 SYN_MT_REPORT event来标记一个点的结束,告诉接收方接收当前手指的信息并准备接收其它手指的触控信息。最后调用 input_sync()函数上报触摸信息开始动作并告诉接收方开始接收下一系列多点触摸信息。
协议定义了一系列ABS_MT事件,这些事件被分为几大类,充许只应用其中的一部份,多点触摸最小的事件集中应包括 ABS_MT_TOUCH_MAJOR、ABS_MT_POSITION_X和 ABS_MT_POSITION_Y,以此来实现多点触摸。如果设备支持ABS_MT_WIDTH_MAJOR这个事件,那么此事件可以提供手指触摸接触 面积大小。触摸方向等信息可以由ABS_MT_TOUCH_MINOR, ABS_MT_WIDTH_MINOR and ABS_MT_ORIENTATION提供。ABS_MT_TOOL_TYPE提供触摸设备的类别,如手或是笔或是其它。最后有些设备可能会支持 ABS_MT_TRACKING_ID,用来支持硬件跟踪多点信息,即该点属于哪一条线等。
下面是两点触摸支持的最小事件集序列:
ABS_MT_TOUCH_MAJOR
ABS_MT_POSITION_X
ABS_MT_POSITION_Y
SYN_MT_REPORT //上报第一个点
ABS_MT_TOUCH_MAJOR
ABS_MT_POSITION_X
ABS_MT_POSITION_Y
SYN_MT_REPORT //上报第二个点
SYN_REPORT //开始动作
Event 原语
“接触”一词用来描述一个物体直接碰到另一个物体的表面。
ABS_MT_TOUCH_MAJOR描述了主接触面的长轴,它和X,Y同一个单位,如果一个面的分辨率为X*Y,则ABS_MT_TOUCH_MAJOR的最大值为sqrt(X^2 Y^2)
ABS_MT_TOUCH_MINOR描述了接触面的短轴,如果接触面是圆形,它可以不用。
ABS_MT_WIDTH_MAJOR描述了接触工具的长轴
ABS_MT_WIDTH_MINOR描述了接触工具的短轴
ABS_MT_TOUCH_MAJOR := max(X, Y)
ABS_MT_TOUCH_MINOR := min(X, Y)
ABS_MT_ORIENTATION := bool(X > Y)
以上四个参数可以用来生成额外的触摸信息,如ABS_MT_TOUCH_MAJOR/ABS_MT_WIDTH_MAJOR的比率可以用来描述压力。
ABS_MT_ORIENTATION
ABS_MT_POSITION_X接触面的中心点X坐标
ABS_MT_POSITION_Y接触面的中心点Y坐标
ABS_MT_TOOL_TYPE描述接触工具类型,很多内核驱动无法区分此参数如手指及笔,如果是这样,该参数可以不用,协议目前支持MT_TOOL_FINGER和MT_TOOL_PEN两种类型。
ABS_MT_BLOB_ID形状集ID,集合几个点以描述一个形状,很多驱动没有形状属性,此参数可以不用。
ABS_MT_TRACKING_ID描述了从接触开始到释放的整个过程的集合,如果设备不支持,此参数可是不用。
触摸轨迹
仅有少数设备可以明触的标识真实的 trackingID,多数情况下 trackingID只能来标识一次触摸动作的过程。
手势
多点触摸指定的应用是创建手势动作, TOUCH和 WIDTH参数经常用来区别手指的压力和手指间的距离,另外 MINOR类的参数可以用来区别设备的接触面的大小(点接触还是面接触),ORIENTATION可以产生旋转事件。
参考代码:
(1)注册多点触摸设备
ts->input_dev = input_allocate_device();
if (ts->input_dev == NULL) {
ret = -ENOMEM;
printk(KERN_ERR "Failed to allocate input device\n");
goto err_input_dev_alloc_failed;
}
ts->input_dev->name = "MT-touchscreen";
set_bit(EV_SYN, ts->input_dev->evbit);
set_bit(EV_KEY, ts->input_dev->evbit);
set_bit(EV_ABS, ts->input_dev->evbit);
set_bit(BTN_TOUCH, ts->input_dev->keybit);
max_x=0x77b;
max_y=0xb38;
input_set_abs_params(ts->input_dev, ABS_X, 0, max_x, 0, 0);
input_set_abs_params(ts->input_dev, ABS_Y, 0, max_y, 0, 0);
input_set_abs_params(ts->input_dev, ABS_PRESSURE, 0, 255, 0, 0);
input_set_abs_params(ts->input_dev, ABS_TOOL_WIDTH, 0, 15, 0, 0);
input_set_abs_params(ts->input_dev, ABS_MT_POSITION_X, 0, max_x, 0, 0);
input_set_abs_params(ts->input_dev, ABS_MT_POSITION_Y, 0, max_y, 0, 0);
input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0);
input_set_abs_params(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0, 15, 0, 0);
ret = input_register_device(ts->input_dev);
if (ret) {
printk(KERN_ERR "Unable to register %s input device\n", ts->input_dev->name);
goto err_input_register_device_failed;
}
(2) 报点
if(finger==2)
{
input_report_key(ts->input_dev,ABS_MT_TRACKING_ID,0);
input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, f1R);
input_report_abs(ts->input_dev, ABS_MT_POSITION_X, f1x);
input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, f1y);
input_mt_sync(ts->input_dev);
input_report_key(ts->input_dev,ABS_MT_TRACKING_ID,1);
input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, f2z);
input_report_abs(ts->input_dev, ABS_MT_POSITION_X, f2x);
input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, f2y);
input_mt_sync(ts->input_dev)
input_sync(ts->input_dev);
}
else if(finger==1)
{
input_report_key(ts->input_dev,ABS_MT_TRACKING_ID,0);
input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, f1R);
input_report_abs(ts->input_dev, ABS_MT_POSITION_X, f1x);
input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, f1y);
input_mt_sync(ts->input_dev);
input_sync(ts->input_dev);
}
linux触摸屏两指缩放_Linux内核触摸屏驱动--多点触摸 【转】相关推荐
- linux触摸屏两指缩放_自定义TextView实现单指拖动,双指缩放旋转
由于在网上找到的教程中双指旋转需要通过获取手指落点相对于父控件的坐标点来计算,所以采用重写RelativeLayout的方法,如果有其他的方法不需要重写RelativeLayout,希望可以和我联系 ...
- 【虚幻引擎】UE4/UE5 实现单指旋转,两指缩放
B站教学链接:https://space.bilibili.com/449549424?spm_id_from=333.1007.0.0 一.原理解析 单指旋转主要是调节控制摄像机摇臂的旋转,通过将摄 ...
- Linux音频设备两种框架OSS和ALSA驱动
在Linux中,先后出现了音频设备的两种框架OSS和ALSA,本节将在介绍数字音频设备及音频设备硬件接口的基础上,展现OSS和ALSA驱动的结构. 17.1-17.2节讲解了音频设备及PCM.IIS和 ...
- linux 带ifdef运行程序_Linux内核分析——可执行程序的装载
马悦+原创作品转载请注明出处+<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 第七周 可执行程序的装 ...
- linux 带ifdef运行程序_Linux内核如何装载和启动一个可执行程序
郑斌+ 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验要求: 理解编译 ...
- linux主机解析虚拟机超时_Linux 内核超时导致虚拟机无法正常启动
问题描述 当 Linux 虚拟机启动时,通过串口输出或者启动日志, 观察到超时的报错.导致虚拟机无法正常启动和连接. 问题分析 常见的超时报错范例如下: 复制 INFO: task swapper:1 ...
- linux history 看更多历史记录_Linux内核5.3+将更多支持F2FS
F2FS (Flash Friendly File System) 是专门为基于 NAND 的存储设备设计的新型开源 flash 文件系统.特别针对NAND 闪存存储介质做了友好设计.F2FS 于20 ...
- Linux设备驱动开发详解【三】_Linux 内核及内核编程
本文简介 由于 Linux 驱动编程本质属于 Linux 内核编程,因此有必要掌握 Linux 内核及内核编程的基础知识. 3.1-3.2 节讲解 Linux 内核的演变及 Linux ...
- linux嵌入式arm基础笔记3之触摸屏原理与输入子系统
==================== 输入子系统================= 触摸屏原理 从技术原理角度讲,触摸屏是一套透明的绝对定位系统,因此他必须具备三个特性: 第一是透明性能:透明材质 ...
- 触摸板触摸屏禁止手指缩放,这么处理才行
禁止缩放 有天,辛苦做了个复杂操作功能的页面,上线后有用户反馈:很多功能使用不了.惊了,以为是哪里出了bug. 立马联系用户,才发现原来是用户使用笔记本电脑,没有禁用触控板,然后不小心碰到导致整个界面 ...
最新文章
- CentOS系统启动及内核大破坏模拟实验
- php基础遍历,php 数据遍历
- php获取本月工作日,ThinkPHP中获取指定日期后工作日的具体日期方法
- Rider 2021.3 Beta 现已推出
- 软件工程---08.软件测试
- 关于shell脚本编程一些有用资源的小结
- java形参、实参、值传递、引用传递
- 大数据:技术与应用实践指南(中国工程院院士倪光南倾情作序,雷万云、毛新生、段永朝、安晖联合力荐)
- 深度系统安装移动硬盘启动_国产操作系统深度(deepin)系统安装教程
- 2016.12.10
- 计算机键盘时好时坏,电脑鼠标时好时坏的解决方法
- 苹果是如何让iOS12加速的
- 移动端APP第一次登录和自动登录流程
- web编程技术的知识点---HTML
- ES6之变量的解构赋值
- 抖音无水印解析网站精美源码-无需数据库 安装
- Python 内存管理与垃圾回收机制
- Electron桌面悬浮球工具,支持拖动及配置,提供了待办事项、快速笔记等功能。
- Visual Studio2017下载MSDN帮助文档
- 华为鸿蒙手表实现除夕夜烟花燃放效果