锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

Linux驱动开发学习笔记-电容触摸屏驱动

时间:2023-01-02 17:30:00 y系列电容6410电容屏驱动8合1电容笔电容触摸触控ic

<电容式触摸屏驱动框架>
事实上,电容触摸屏的驱动力如下 linux 驱动框架的组合:
① IIC 由于电容触摸,设备驱动 IC 基本都是 IIC 接口,所以大框架是 IIC 设备驱动。
② 中断引脚(INT)向 linux 内核报告触摸信息,需要使用 linux 中断驱动框架。在中断服务函数中完成坐标报告。
③ 触摸屏的坐标信息、屏幕按下和提升信息都属于 linux 的 input 因此,子系统向 linux 内核上报触摸屏坐标信息必须使用 input 子系统。


1. 多点触摸(MT)协议详解
1). MT 协议分为两种类型,TypeA 和 TypeB,这两种类型的区别如下:
TypeA:适用于无法区分或跟踪触摸点的设备,报告原始数据在实际使用中很少!
TypeB:适用于具有硬件跟踪和区分触摸点的触摸设备。这类设备是通过 slot 更新触摸点的信息。

2). 通过一系列的触摸点信息 ABS_MT 报告事件(有些信息也叫消息) linux 内核,
只有ABS_MT 多点触摸,ABS_MT 事件定义在文件 include/uapi/linux/input.h 中。

在众多的 ABS_MT 事件中最常用的是 ABS_MT_SLOT 、ABS_MT_POSITION_X 、ABS_MT_POSITION_Y 和 ABS_MT_TRACKING_ID 。
ABS_MT_SLOT:用于报告触摸点 ID
ABS_MT_POSITION_X/ABS_MT_POSITION_Y:用于报告触摸点 (X,Y) 坐标信息
ABS_MT_TRACKING_ID:对于 Type B 类型设 准备,用来区分触摸点

3). 对于 TypeA 通过类型设备 input_mt_sync()函数隔离不同触摸点的数据信息:
void input_mt_sync(struct input_dev *dev)
input_mt_sync()会触发 SYN_MT_REPORT 通知接收者获取当前的触摸数据,并准备接收下一个触摸点数据。

对于 TypeB 类型设备在报告触摸点信息时需要通过 input_mt_slot()函数区分哪个触点:
void input_mt_slot(struct input_dev *dev, int slot)
input_mt_slot()函数会触发 ABS_MT_SLOT 事件将告诉接收者目前正在更新哪个触摸点(slot)的数据。

无论哪种设备,最终都要调用 input_sync()函数识别多点触摸信息传输,
告诉接收者处理之前积累的所有信息,并准备下一次接收。

4). 对于 TypeA 内核驱动需要一次性报告触摸屏上所有触摸点信息,
每个触摸点的信息在本次上报事件流中的顺序不重要,因为事件的过滤和手指(触摸点)跟踪是在内核空间处理的。

5). TypeB 设备驱动需要分配每个被识别的触摸点 slot,以后用这个 slot 报告触摸点信息。
可以通过 slot 的 ABS_MT_TRACKING_ID 添加、替换或删除触摸点。 ID -1 这个 ID 表示未使用 slot。

6). 一些设备识别或跟踪的触摸点信息比他报告的要多。这些设备驱动器应分配硬件报告的每个触摸点 Type B 的 slot。
一旦检测到某个 slot 相关触点 ID 如果发生变化,驱动应该改变 slot 的 ABS_MT_TRACKING_ID,使这个 slot 失效。
如果硬件设备跟踪的触摸点比他正在报告的更多,则应发送驱动程序 BTN_TOOL_*TAP 并调用新闻
input_mt_report_pointer_emulation()函数,将函数的第二个参数 use_count 设置为 false。

7). TypeA 触摸点信息报告时间( 2 以触摸点为例)
ABS_MT_POSITION_X x[0] → 对应 input_report_abs函数
ABS_MT_POSITION_Y y[0] → 对应 input_report_abs函数
SYN_MT_REPORT → 对应 input_mt_sync函数
ABS_MT_POSITION_X x[1] → 对应 input_report_abs函数
ABS_MT_POSITION_Y y[1] → 对应 input_report_abs函数
SYN_MT_REPORT → 对应 input_mt_sync函数
SYN_REPORT → 对应 input_sync函数

8). TypeB 触摸点信息报告时序
ABS_MT_SLOT 0 → 对应 input_mt_slot函数
ABS_MT_TRACKING_ID 45 → 对应 input_mt_report_slot_state函数
ABS_MT_POSITION_X x[0] → 对应 input_report_abs函数
ABS_MT_POSITION_Y y[0] → 对应 input_report_abs函数
ABS_MT_SLOT 1 → 对应 input_mt_slot函数
ABS_MT_TRACKING_ID 46 → 对应 input_mt_report_slot_state函数
ABS_MT_POSITION_X x[1] → 对应 input_report_abs函数
ABS_MT_POSITION_Y y[1] → 对应 input_report_abs函数
SYN_REPORT → 对应 input_sync函数

9). MT 使用其他事件
ABS_MT_TOOL_TYPE 该事件用于报告触摸工具的类型,目前的协议支持MT_TOOL_FINGER(手指)、MT_TOOL_PEN(笔)
和 MT_TOOL_PALM使用手掌三种触摸设备类型 input_mt_report_slot_state 上报触摸工具类型的函数。

2. 使用多点触摸 API 函数
input_mt_init_slots 函数
用于初始化 MT 的输入 slots

input_mt_slot 函数
用于 Type B 该函数用于生成类型 ABS_MT_SLOT 事件报告触摸点坐标数据

input_mt_report_slot_state 函数
用于 Type B 用于生产的类型 ABS_MT_TACKING_ID 和 ABS_MT_TOOL_TYPE事件

    input_report_abs 函数
        TypeA 和 Type B 类型都使用此函数上报触摸点坐标信息

    input_mt_report_pointer_emulation 函数
        追踪到的触摸点数量多于当前上报的数量,
        驱动程序使用 BTN_TOOL_TAP 事件来通知用户空间当前追踪到的触摸点总数量,
        然后调用 input_mt_report_pointer_emulation 函数将 use_count 参数设置为 false。

3. devm_request_threaded_irq 函数:
    ①用于申请中断,作用和 request_irq 函数类似。            
    ②此函数的作用是中断线程化。

    中断线程化以后中断将作为内核线程运行,而且也可以被赋予不同的优先级,任务的优先级可能比中断线程的优先级高,
    这样做的目的就是保证高优先级的任务能被优先处理。虽然中断下半部可以被延迟处理,但是依旧先于线程执行,
    中断线程化可以让这些比较耗时的下半部与进程进行公平竞争。

    要注意,并不是所有的中断都可以被线程化,重要的中断就不能这么操作,需要自己根据实际情况去衡量。

4. 在 linux 内核中有很多的申请资源类的 API 函数都有对应的“devm_”前缀版本,
    使用“devm_”前缀的函数申请到的资源可以由系统自动释放,不需要我们手动处理。
    带有“devm_”前缀的都是一些和设备资源管理有关的函数。


 

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章