linux 内核 触摸屏,7. Linux - 触摸屏(电阻屏)驱动程序实现

一、触摸屏概述

触摸屏作为一种输入设备,是目前最简单、方便、自然的一种人机交互方式。按照触摸屏的工作原理和传输信息的介质,可以将触摸屏分为四种:电阻式、电容感应式、红外线式和表面声波式。每一种触摸屏都有其各自的优缺点,要了解哪种触摸屏适用于哪种场合,关键就在要了解每一类触摸屏的工作原理和特点。本节我们主要介绍的是4线电阻式触摸屏。

1.1 电阻式触摸屏

电阻式触摸屏利用压力感应进行控制。电阻触摸屏的主要部分是一块与显示器表面紧密结合的电阻薄膜屏,这是一种多层的复合薄膜,以一层玻璃或硬塑料平板作为基层,表面涂有一层透明氧化金属(透明的导电电阻)导电层,上面再盖有一层外表面硬化处理、光滑防擦的塑料层、它的内表面也涂有一层涂层、在他们之间有许多细小的的透明隔离点把两层导电层隔开绝缘。所有的电阻式触摸屏都采用分压器原理来产生代表X坐标和Y坐标的电压。分压器是通过将两个电阻进行串联来实现的。电阻R1连接正参考电压VREF,电阻R2接地。两个电阻连接点处的电压测量值与R2的阻值成正比。当手指触摸屏幕时,两层导电层在触摸点位置就有了接触,电阻发生变化,在X和Y两个方向上产生信号,然后送触摸屏控制器。控制器侦测到这一接触并计算出(X,Y)的位置,再根据模拟鼠标的方式运作。这就是电阻技术触摸屏的最基本原理。实际上就是欧姆定律的巧妙运用!

bbcccc52e929

1.2 电阻式触摸屏信号测量

4线触摸屏包含了两个阻性层,如下图所示:

bbcccc52e929

当没有触摸按下时,X层和Y层是分离的,此时就测不到电压。

X坐标方向值测量:

将XP接到3.3V , XM接0V, YP和YM悬空,我们以按压X坐标的中间位置, X层和Y层便闭合了,此时触摸屏控制器 (ADC)就可测量到YP输出的当前X坐标值1.66V,如下图:

bbcccc52e929

Y坐标方向值测量:

将YP接3.3V , YM接0V, XP和XM悬空,我们以按压X坐标的中间位置, X层和Y层便闭合了,此时触摸屏控制器 (ADC)就可测量到XP输出的当前Y坐标值1.66V,如下图:

bbcccc52e929

二、触摸屏驱动模型

Linux内核中触摸屏驱动实现基于输入子系统架构,具体请移步 Linux - 输入子系统框架详解 ;

bbcccc52e929

对于触摸屏驱动开发者,核心层和事件处理层由Linux内核提供,主要实现xxx_ts.c,

1)分配一个input_dev结构体

2)设置input_dev的成员

3)注册input_dev 驱动设备到内核中

4)设置触摸屏相关的硬件

触摸屏使用过程简单处理简述如下(流程):

按下,产生中断;

在中断服务程序里,启动ADC,转换X,Y坐标;

ADC结束,产生ADC中断;

在ADC中断处理函数里上报(input_event),启动定时器;

定时器时间到,执行2再次启动ADC,转换X,Y坐标;(处理长按、滑动)

松开

二、触摸屏驱动相关的重要数据结构和函数

在输入子系统架构中,会将设备抽象出一个input_dev结构体;它是驱动的主体。每个struct input_dev代表一个输入设备。

2.1 struct input_dev结构体

struct input_dev {

void *private;

const char *name; //设备名字

const char *phys; //文件路径,比如 input/buttons

const char *uniq;

struct input_id id;

unsigned long evbit[NBITS(EV_MAX)]; //表示支持哪类事件,常用有以下几种事件(可以多选)

//EV_SYN 同步事件,当使用input_event()函数后,就要使用这个上报个同步事件

//EV_KEY 键盘事件

//EV_REL (relative)相对坐标事件,比如鼠标

//EV_ABS (absolute)绝对坐标事件,比如摇杆、触摸屏感应

//EV_MSC 其他事件

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux 内核中,添加触摸屏驱动需要在内核配置文件(kconfig)中进行定义。以下是示例代码: ``` config TOUCHSCREEN_MYDRIVER tristate "My Touchscreen Driver" depends on I2C && INPUT help Say Y here if you want to enable support for My Touchscreen Driver. This driver supports a touch controller connected via I2C. If unsure, say N. config TOUCHSCREEN_MYDRIVER_I2C_ADDR hex "I2C address of the touch controller" default 0x48 depends on TOUCHSCREEN_MYDRIVER help Enter the I2C address of the touch controller chip. The default value is 0x48. config TOUCHSCREEN_MYDRIVER_MAX_POINTS int "Maximum number of simultaneous touch points" default 5 depends on TOUCHSCREEN_MYDRIVER help Enter the maximum number of simultaneous touch points that the touch controller can handle. The default value is 5. ``` 在上面的示例代码中,我们定义了一个名为 `TOUCHSCREEN_MYDRIVER` 的触摸屏驱动。该驱动使用 I2C 总线连接到触摸屏控制器,并依赖于 `INPUT` 和 `I2C` 子系统。我们还定义了两个配置选项: - `TOUCHSCREEN_MYDRIVER_I2C_ADDR`:这个选项用于设置触摸屏控制器的 I2C 地址。默认值为 0x48。 - `TOUCHSCREEN_MYDRIVER_MAX_POINTS`:这个选项用于设置触摸屏控制器支持的最大触摸点数。默认值为 5。 当用户编译 Linux 内核时,可以使用 `make menuconfig` 命令进入内核配置界面,找到 `Device Drivers -> Input device support -> Touchscreens` 选项,然后选择要启用的触摸屏驱动。用户还可以在该界面中设置 `TOUCHSCREEN_MYDRIVER_I2C_ADDR` 和 `TOUCHSCREEN_MYDRIVER_MAX_POINTS` 配置选项的值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值