0
点赞
收藏
分享

微信扫一扫

Linux 下电容触摸屏驱动框架

最不爱吃鱼 2022-04-29 阅读 87

电容触摸屏驱动其实就是一下几种 linux 驱动框架的组合:
① IIC 设备驱动,因为电容触摸 IC 基本都是 IIC 接口的,因此大框架就是 IIC 设备驱动。
② 通过中断引脚(INT)向 linux 内核上报触摸信息,因此需要用到 linux 中断驱动框架。坐标的上报在中断
服务函数中完成。
③ 触摸屏的坐标信息、屏幕按下和抬起信息都属于 linux 的 input 子系统,因此向 linux 内核上报触摸屏
坐标信息就得使用 input 子系统。只是,我们得按照 linux 内核规定的规则来上报坐标信息。

input 子系统下的多点电容触摸协议

触摸点的信息通过一系列的 ABS_MT 事件(有的资料也叫消息)上报给 linux 内核,只有 ABS_MT 事件是用于多点触摸的。

MT 协议被分为两种类型,TypeA 和 TypeB,这两种类型的区别如下:
TypeA:适用于触摸点不能被区分或者追踪,此类型的设备上报原始数据(此类型在实际使用中非常少!)。
Type B:适用于有硬件追踪并能区分触摸点的触摸设备,此类型设备通过 slot 更新某一个触摸点的信

 #define ABS_MT_POSITION_X 0x35 
 #define ABS_MT_POSITION_Y 0x36

息,FT5426 就属于此类型,一般的多点电容触摸屏 IC 都有此能力。

 ABS_MT_POSITION_X 和 ABS_MT_POSITION_Y 用来上报触摸点的 (X,Y) 坐标信息

对于 Type B 类型的设备,上报触摸点信息的时候需要通过 input_mt_slot()函数区分是哪一个触摸点,
input_mt_slot()函数原型如下所示:
void input_mt_slot(struct input_dev *dev, int slot)

此函数有两个参数,第一个参数是 input_dev 设备,第二个参数 slot 用于指定当前上报的是哪个触摸点信息。input_mt_slot()函数会触发 ABS_MT_SLOT 事件,此事件会告诉接收者当前正在更新的是哪个触摸点(slot)的数据。

多点电容触摸驱动框架

① 多点电容触摸芯片的接口,一般都为 I2C 接口,因此驱动主框架肯定是 I2C。
② 当我们手点击屏幕的时候,首先屏幕会发生触摸中断,然后我们就要在中断服务函数里面启动中断下文,因为我们要做的事情非常耗时间,所以我们要在中断下文里面做这些事情 。linux 里面一般都是通过中断来上报触摸点坐标信息,因此需要用到中断框架。那么我们要使用中断下文,我们之前讲了实现中断下文的两种方法,第一种是 tasklet,第二种是工作队列,我们这里要使用哪一种呢?因为我们在使用i2c_transfer 进行读写的时候可能会发生休眠,所以说我们要用工作队列。
③ 多点电容触摸属于 input 子系统,因此还要用到 input 子系统框架。
④ 在中断下文里面使用 i2c 读数据并且通过输入子系统上报数据。

举报

相关推荐

0 条评论