【转】Linux 多点触摸简介

本文介绍了Linux内核中多点触控的工作机制。详细解释了如何通过ABS_MT标志进行多点触摸数据包的发送,并说明了不同事件的作用,如ABS_MT_POSITION_X和ABS_MT_POSITION_Y用于确定触摸位置。

 

原文地址: http://blog.youkuaiyun.com/makefish/archive/2010/06/03/5645475.aspx

 

 

 

Linxu 内核中,手指信息被内核抽象为一个个 ABS 数据包,由驱动顺序的发送给应用。


多点触摸的 ABS 数据包通常由 ABS_MT 标志。驱动调用 input_mt_sync 发送 SYN_MT_REPORT 来表示一个 ABS 数据包结束。应用收到 SYN_MT_REPORT 事件后,会处理当前数据包并准备接收下一个数据包。如果本次多点触摸所有手指的数据包都发送完毕,需要调用 input_sync 发送 SYN_REPORT ,以通知上层本次多点触摸结束了。 input_sync 之后就进入了下一次多点触摸周期。

 

通常的多点触摸周期可以描述为:

ABS_MT_*|SYN_MT_REPORT|ABS_MT_*|SYN_MT_REPORT|SYN_REPORT

 

有些 ABS_MT 事件是必须实现的,如 ABS_MT_POSITION_XABS_MT_POSITION_Y 。而某些事件,如 ABS_MT_TOUCH_MAJORABS_MT_WIDTH_MAJOR 是否需要实现则取决于具体的硬件。

ABS_MT_TOUCH_MAJOR 表示了手指接触 TP 的直径的近似。 ABS_MT_WIDTH_MAJOR 是手指的直径的近似。当手指和触摸屏接触的越紧密,则压力越大,手指和屏幕接触的面积(直径)也会越大。而手指的直径通常是一个常量。这样 ABS_MT_TOUCH_MAJOR / ABS_MT_WIDTH_MAJOR 就可以用来表示压力了。而且这个值在 [0,1) 间。对于某些提供了压力值的 TP ,可以使用 ABS_MT_PRESSURE 来替代 ABS_MT_TOUCH_MAJOR

Linux 系统中,多点触摸屏驱动有多种情况。含有 HID 多点触摸控制器的触摸屏、触摸板由 "hid-multitouch" 驱动支持,若系统连接触摸屏无反应,通常是驱动未加载或者与触摸屏的 VID 与 PID 不适配 [^1]。 IIC 设备驱动常用于电容触摸 IC,其基本是 IIC 接口,大框架为 IIC 设备驱动通过中断引脚(INT)向 linux 内核上报触摸信息,需用到 linux 中断驱动框架。坐标上报在中断服务函数中完成,触摸屏的坐标信息、屏幕按下和抬起信息属于 linuxinput 子系统,向 linux 内核上报触摸屏坐标信息要使用 input 子系统,在中断处理程序中按照 linuxMT 协议上报坐标信息。linux 内核文档 Documentation/input/multitouch-protocol.txt 详细讲解了多点电容触摸屏协议,老版本中不支持此协议。MT 协议分为 TypeA 和 TypeB 两种类型,Type A 适用于触摸点不能被区分或者追踪,通常上报原始数据(实际使用少);Type B 适用于有硬件追踪并能区分触摸点的触摸设备,通过 slot 更新某一个触摸点的信息,如 FT5426 就属于此类型,一般的多点电容触摸屏 IC 都有此能力。Type A 时序为:x1–>y1–>mt - sync–>x2–>y2–>mt - sync–>input - sync;Type B 时序为:mt - slot–>mt - id–>x1–>y1–…–>sync [^2]。 从代码层面看,linux 各版本内核当中的多点触摸驱动有相关头文件引用,如: ```c #include <linux/module.h> #include <linux/init.h> #include <linux/delay.h> #include <linux/firmware.h> #include <linux/i2c.h> //可见maXTouch用的是I2C接口来实现多点触摸的 #include <linux/i2c/atmel_mxt_ts.h> //包含了一些自己的声明和定义 #include <linux/input/mt.h> #include <linux/interrupt.h> #include <linux/slab.h> ``` 此外,在函数方面,涉及到的函数参数和返回值含义如下:dev 是 MT 设备对应的 input_dev;tool_type 是触摸类型,可选择 MT_TOOL_FINGER(手指)、MT_TOOL_PEN(笔)或 MT_TOOL_PALM(手掌),对于多点电容触摸屏一般是手指;active 为 true 时表示连续触摸input 子系统内核会自动分配一个 ABS_MT_TRACKING_ID 给 slot,为 false 表示触摸点抬起,input 子系统内核会分配一个 -1 给 slot,表示触摸点溢出,函数返回值为空 [^3][^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值