基于嵌入式系统的触摸屏驱动设计与实现
2015-06-13王璐凡
王璐凡
(河南理工大学,454000;2.哈密职业技术学院,839000)
0 引言
触摸屏因其具有较高的透光度、精确性,支持触针和签名辨识性,已逐渐成为了控制系统的通用元件。触摸屏具有全玻璃的耐久性,位于屏幕各个角落的传感器可以测量出振动能量,触摸屏就是利用这些传感器工作的。通过先进的数字信号处理,触摸屏应用色散调整算法来分析信号并给出精确的触点坐标。这种方法有助于消除因屏幕污染和表面刮擦带来的问题,而且具有更高的手掌接触抑制能力。具有轻薄、形状适合、不易碎且耐磨损特点。作为与用户交互的终端媒介,触摸屏在生活中得到广泛的应用。如何在系统中集成触摸屏模块以及在嵌入式操作系统中实现其驱动程序,都成为嵌入式系统设计者需要考虑的问题。本文介绍了在S3C2410微处理器的硬件平台上进行基于嵌入式的触摸屏驱动程序设计,实现对触摸屏的操作。
1 触摸屏硬件系统构成
S3C6410是Samsung公司基于ARM1176JZF-S核心的一款MCU,集成了众多的外围设备,其中包括四线电阻式触摸屏控制器,带有8路模拟输入通道的ADC。ADC8个模拟输入通道中,AIN[5]和AIN[7]分别被设置为触摸屏的X方向和Y方向的模拟信号输入通道。在获得XY方向模拟信号后,然后触摸屏设备驱动程序要对某些寄存器进行读写,这样触摸屏控制器可以管理控制四路信号的高低电平,以便控制与触摸屏接口相连的NMOS和PMOS管的闭合,最终按X/Y顺序完成触点模拟信号的采集。
本文采用的是S3C2410微处理器与4线电阻式触摸屏,其电路原理如图1所示。触摸屏由横向和纵向的电阻丝构成,可以通过YMON、XMONn、YPON、nXPON四个控制信号来控制4个MOS管的通断变化。S3C2410微处理器一共有8个模拟输入通道,其中通道5是触摸屏接口的Y坐标输入(图1的AIN[5]),通道7是触摸屏接口的X坐标输入(图1的AIN[7])。电路原理如图1所示。在接入S3C2410 触摸屏接口之前,可以通过一个阻容式低通滤波器来滤除坐标信号噪声。如果传递给S3C2410 模拟输入接口的信号干扰太大,不利于后面的软件处理。在采样的过程中,S3C2410的触摸屏控制器会控制触摸屏接口来自动打开或关闭各个MOS管,然后按顺序完成X坐标点采集和Y坐标点采集。
2 触摸屏驱动软件设计实现
图1 触摸屏的硬件连接图
2.1 触摸屏驱动软件设计框图
根据嵌入式系统内核设备驱动程序开发原理,可以列出的触摸屏驱动程序的结构层次,内核的触摸屏驱动程序共有三个部分,包括:触摸屏事件驱动、触摸屏输入核心程序和触摸屏设备驱动,这三者的逻辑关系由上到下,上与应用程序通信,下控制硬件输入设备,示意图如图2所示,其中触摸屏事件驱动是与用户空间应用程序编程接口进行交互;而触摸屏输入设备在 serio总线上与触摸屏设备驱动程序进行通讯,底层触摸屏设备硬件响应用户输入操作时在触摸屏设备驱动中被转换预先定义的标准输入事件之后再被设备驱动向上报告给输入核心层,然后输入核心程序将标准事件上报给触摸屏事件驱动,在这里处理触摸屏的输入事件。因此触摸屏设备驱动只负责对触摸屏的硬件寄存器的数据读写和向上提交检测到的输入事件。
2.2 触摸屏驱动软件设计程序框图
由于用户会在什么时候会进行触摸动作的时间不确定, 因此采用中断方式工作对整个系统设计是比较好的选择。首先,在进行触摸屏程序设计时,要对其进行基本的初始化操作。其中最重要的是将S3C2410 的触摸屏控制接口设置为自动 X / Y 坐标转换模式和等待中断模式。一旦触摸笔按下,S3C2410触摸屏控制器就会产生一个触摸中断INT_TC,然后在进入INT_TC中断程序后触摸屏控制器会利用S3C2410 的自动X/Y 轴坐标转换模式将代表 X/Y 坐标的 AD 电压值读出来。触摸屏驱动程序要实现以下 5 个主要任务,具体步骤如图3的驱动程序流程图:
图2 触摸屏驱动软件设计框图
2.3 触摸屏驱动设计的部分重要函数
(1)在设备驱动程序中,用数据结构strcut driver定义一系列的函数操作接口,用这个数据结构将整个驱动连为一体,通过数据结构strcut driver能够看出整个驱动的脉络。由于触摸屏与CPU是利用是SPI总线连接的连接方式,因此要用到数据结构 struct spi_driver来将此设备注册为 SPI 设备。
图3 触摸屏驱动程序流程图
设计编写的数据结构如下:
static struct spi_driver ad7873_driver = {.driver = {
.name = "ad7873",
.bus = &spi_bus_type,
.owner = THIS_MODULE,
},
.probe = ad7873_probe,
.remove = __devexit_p(ad7873_emove),
.suspend = ad7873_suspend,
.resume = ad7873_resume,
};
在数据结构中,driver函数中定义了总线类型、驱动名称和驱动所有者。probe函数为触摸屏探测设备函数,其主要的作用就是对设备数据结构以及中断进行初始化、向设备发送控制字等。remove函数作为设备的移除函数,其主要作用是移除设备文件、释放中断和设备。Suspend是设备的暂停函数。Resume是设备的恢复函数。
(2)设备初始化函数 static int __init ad7873_nit(void)即是注册上述数据结构,也是注册一个驱动,初始化函数主要的内容为:
return spi_register_driver(&ad7873_driver);
(3)中断函数也是触摸屏驱动设计的一个重要函数,当触摸屏被安按下是产生中断,执行中断函数。启动定时器是中断函数中的重要工作,用来判断触摸发生后触摸笔是被提起还是继续按下。中断函数原型设计为:
static irqreturn_t ads7873_irq(int irq, void*handle);
(4)用来判断触摸屏是否已经被提起需要用定时器函数,一旦触摸笔被提起就立刻将新设备的数据刷新到应用层,否则就需要进行另外的测量。定时器函数原型设计为:
static void ads7873_timer(unsigned long handle);
3 结论
在完成了触摸屏基本控制之后,进行后续的SD卡、文件系统的读写 功能。本文介绍了基于S3C2410微处理器,利用触摸屏与S3C2410的接口,及中断与查询两种方式的优点,用外部晶体管连接触摸屏到S3C2410的接 口电路,并通过S3C241的等待中断模式和自动XY坐标转换工作模式,读出与 XY坐标有关的电压值,高效地完成了触摸状态的检测以及触摸数据的转换,基于嵌入式系统的触摸屏驱动设计方法具有简单便捷、易于实现的特点。
[1]胡思捷.基于Android平台的触摸屏系统设计及实现[D].天津:南开大学.2011.
[2]刘瑞.触摸屏技术及其性能分析[J].装备制造技术.2010.
[3]李善平、刘文峰、王焕龙.Linux与嵌入式系统[M].清华大学出版社.2006.