Rockchip RK3399 - USB触摸屏接口驱动

----------------------------------------------------------------------------------------------------------------------------

开发板 :NanoPC-T4开发板eMMC16GBLPDDR34GB
显示屏 :15.6英寸HDMI接口显示屏u-boot2023.04linux6.3
----------------------------------------------------------------------------------------------------------------------------

一、触摸屏接口分类

触摸屏主要包括电阻触摸屏和电容触摸屏,这个我们在linux驱动移植-LCD触摸屏设备驱动》中已经详细介绍了,这里不再重复介绍。

linux驱动移植-LCD触摸屏设备驱动》这篇文章中我们介绍了SoC S3C2440触摸屏驱动的实现,对于S3C2440来说,其只支持四线电阻触摸屏。在测试时我们使用的LCD型号为LCD-T35(TD035STEB4),其4线连接在S3C2440AIN4~AIN7引脚上,通过AIN4~AIN7引脚来接收模拟输入信号。

在驱动程序中,我们通过接收触摸屏按下/松开中断,在中断处理程序中获取ADC采样值,计算X/Y坐标,并上报坐标、点击等事件。

当前市面上使用的触摸屏一般都使用了I2C接口,当然也有SPIUSB等接口。同时支持多点触摸,那什么是多点触摸呢?

顾名思义,多点触摸技术指的是允许用户同时通过多个手指来控制图形界面的一种技术,与多点触摸技术相对应的当然就是单点触摸。

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&
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Graceful_scenery

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值