----------------------------------------------------------------------------------------------------------------------------
开发板 :NanoPC-T4
开发板eMMC
:16GB
LPDDR3
:4GB
显示屏 :15.6
英寸HDMI
接口显示屏u-boot
:2023.04
linux
:6.3
----------------------------------------------------------------------------------------------------------------------------
一、触摸屏接口分类
触摸屏主要包括电阻触摸屏和电容触摸屏,这个我们在《linux
驱动移植-LCD
触摸屏设备驱动》中已经详细介绍了,这里不再重复介绍。
在《linux
驱动移植-LCD
触摸屏设备驱动》这篇文章中我们介绍了SoC
S3C2440
触摸屏驱动的实现,对于S3C2440
来说,其只支持四线电阻触摸屏。在测试时我们使用的LCD
型号为LCD-T35(TD035STEB4)
,其4线连接在S3C2440
的AIN4~AIN7
引脚上,通过AIN4~AIN7
引脚来接收模拟输入信号。
在驱动程序中,我们通过接收触摸屏按下/松开中断,在中断处理程序中获取ADC
采样值,计算X/Y
坐标,并上报坐标、点击等事件。
当前市面上使用的触摸屏一般都使用了I2C
接口,当然也有SPI
、USB
等接口。同时支持多点触摸,那什么是多点触摸呢?
顾名思义,多点触摸技术指的是允许用户同时通过多个手指来控制图形界面的一种技术,与多点触摸技术相对应的当然就是单点触摸。
1.1 I2C
接口触摸屏
首先,需要了解I2C
触摸屏的工作原理。I2C
触摸屏是一种通过I2C
接口连接到SoC
的输入设备,它的工作原理类似于普通的触摸屏。一般来言,I2C触摸屏
内部驱动板都会有一个触摸IC
,比如FT5426
;
- 此芯片一端连接触摸屏的模拟信号,对触摸动作采样然后
AD
转换; - 另一端通过
I2C
连接SoC
,即将AD
转换后的数据通过I2C
接口发给SoC
;
对于I2C
接口触摸屏来说:
-
所谓的触摸驱动本质上就是
I2C
设备驱动; -
触摸
IC
提供了中断信号引脚,当检测到触摸信息后就会触发中断,那么就要在中断处理程序里来读取触摸信息;得到的是触摸位置绝对信息以及触摸屏是否有按下;
1.2 USB
接口触摸屏
现在我手里有一个NanoPC-T4
开发板,同时还有一个15.6
英寸HDMI
接口显示屏,并且该显示屏支持Type-C
十点触摸。因此我的目标,就是移植USB
触摸屏驱动到内核6.3
版本上。
首先,需要了解usb
触摸屏的工作原理。USB
触摸屏是一种通过USB
接口连接到SoC
的输入设备,它的工作原理类似于普通的触摸屏。一般来言,USB
触摸屏内部驱动板都会有一个USB
芯片;
- 此芯片一端连接触摸屏的模拟信号,对触摸动作采样然后AD转换;
- 另一端通过
USB
连接SoC
,即将AD
转换后的数据通过USB
接口发给SoC
;
在linux
内核中,USB HID transport layer
驱动程序实现了USB
接口的HID
设备,其中包括USB
接口的keyboards
(键盘)、mice
(鼠标)、joysticks
(摇杆)、graphic tablets
(绘图板)、触摸屏等其他的。具体来说,它会通过USB
总线获取来自触摸屏的数据,并将其转换为标准的输入事件(例如按键、鼠标移动等),然后将其传递给系统。
二、多点触摸
2.1 多点触摸协议
在linux
内核中有一份详细的文档介绍了多点电容触摸协议,位置在Documentation/input/multi-touch-protocol.rst
,多点触摸协议又简称MT
协议,MT
协议又分为:
TypeA
:适用于触摸点不能被区分或者跟踪触摸设备,此类型的设备上报原始数据,这种类型用得比较少;TypeB
:适用于触摸点能够被硬件追踪并区分触摸点的触摸设备,两次相同的触摸数据不上报,而是缓存在slot
对象中,且通过slot
更新某一个触摸点的信息;FT5626
就属于才类型,一般的多点触摸IC
都有此能力。
2.2 多点触摸事件
触摸点的信息是通过一系列ABS_MT
事件上报给linux
内核,只有ABS_MT
事件用于多点触摸,ABS_MT
事件定义在文件include/uapi/linux/input-event-codes.h
中,相关定义为:
/*
* 0x2e is reserved and should not be used in input drivers.
* It was used by HID as ABS_MISC+6 and userspace needs to detect if
* the next ABS_* event is correct or is just ABS_MISC + n.
* We define here ABS_RESERVED so userspace can rely on it and detect
* the situation described above.
*/
#define ABS_RESERVED 0x2e
#define ABS_MT_SLOT 0x2f /* MT slot being modified */
#define ABS_MT_TOUCH_MAJOR 0x30 /* Major axis of touching ellipse */
#define ABS_MT_TOUCH_MINOR 0x31 /* Minor axis (omit if circular) */
#define ABS_MT_WIDTH_MAJOR 0x32 /* Major axis of approaching ellipse */
#define ABS_MT_WIDTH_MINOR 0x33 /* Minor axis (omit if circular) */
#define ABS_MT_ORIENTATION 0x34 /* Ellipse orientation */
#define ABS_MT_POSITION_X 0x35 /* Center X touch position */
#define ABS_MT_POSITION_Y 0x36 /* Center Y touch position */
#define ABS_MT_TOOL_TYPE 0x37 /* Type of touching device */
#define ABS_MT_BLOB_ID 0x38 /* Group a set of packets as a blob */
#define ABS_MT_TRACKING_ID 0x39 /* Unique ID of initiated contact */
#define ABS_MT_PRESSURE 0x3a /* Pressure on contact area */
#define ABS_MT_DISTANCE 0x3b /* Contact hover distance */
#define ABS_MT_TOOL_X 0x3c /* Center X tool position */
#define ABS_MT_TOOL_Y 0x3d /* Center Y tool position */
其中:
ABS_MT_SLOT
:上报触摸点ID
;ABS_MT_TRACKING_ID
:为触摸点分配ID
,用于轨迹跟踪;ABS_MT_POSITION_X
&