当前位置:首页 > 嵌入式 > 嵌入式教程
[导读]基于I2C的嵌入式多点触摸屏幕驱动设计

摘要:采用了三星公司的S3C6410X处理器,通过嵌入式Linux的驱动管理系统实现了对Cypress 7958、SnapticsTM1444等基于I2C总线协议的多点触摸屏幕的驱动设计。实践证明,在基于Linux核心的Qtopia平台以及Andriod嵌入式操作系统上运行流畅,识别度与准确度很高。
关键词:多点触摸屏幕;S3C6410X;I2C总线;嵌入式Linux;电容触摸屏

引言
    随着嵌入式设备的开发和推广,触摸屏作为新式输入设备已经随处可见,手机、PDA、MID以及ATM机等设备都已经用到了触摸屏。而科技在不断发展,触摸屏也由一开始的4线式单点电阻触摸屏发展到今天的各种多点式电容触摸屏。本文通过对以Cypress 7958为代表的I2C总线接口电容式多点触摸屏的研究,设计了针对Linux操作系统的多点触摸的屏幕驱动,以及不运行操作系统前提下的单片机对触摸屏的驱动,取得了良好的效果。

1 研究平台介绍
1.1 ARM11处理器S3C6410X
    S3C6410X是基于ARM1176JZF-S核的用于手持、移动等终端设备的通用处理器。S3C6410X是一款低功率、高性价比、高性能的用于移动电话和通用处理RSIC处理器。为2.5G和3G通信服务提供了优化的硬件性能,采用64/32位的内部总线架构,融合了AXI、AHB、APB总线。还有很多强大的硬件加速器,包括运动视频处理、音频处理、2D加速、显示处理和缩放。
1.2 电容式多点触摸屏
    电容式触摸屏在触摸屏4边均镀上狭长的电极,在导电体内形成一个低电压交流电场。在触摸屏幕时,由于人体电场,手指与导体层间会形成一个耦合电容,4边电极发出的电流会流向触点,而电流强度与手指到电极的距离成正比,位于触摸屏幕后的控制器会计算电流的比例及强弱,准确算出触摸点的位置。电容触摸屏的双玻璃不但能保护导体及感应器,更有效地防止外在环境因素对触摸屏造成影响,就算屏幕沾有污秽、尘埃或油渍,电容式触摸屏依然能准确算出触摸位置。与电阻触摸屏相对比,电容式触摸屏就是支持多点触摸的人机交互方式,普通电阻式触摸屏只能进行单一点的触控。
1.3 ARM工具链
    本文针对ARM核的单片机使用了arm-none-linux-gnueabi-4.3.2交叉编译链,实现对ARM支持的二进制文件编译,用以成功编译ARM-Linux 2.6.28内核。
1.4 移植条件
    对于本文所述内容,所有支持Linux操作系统运行的处理器(包括嵌入式处理器)都可以运行,而所有支持I2C总线协议的单片机也可以在不使用操作系统的前提下将触摸屏作为一种普通输入设备进行使用。

2 研究过程
    图1显示了本文中针对嵌入式Linux平台下的驱动软硬件结构体系。


2.1 I2C设备在平台部分声明
    Cypress 7958多点触摸屏的I2C地址为0x20,在使用前需要在平台设备处进行I2C设备声明,这样才可以使Linux驱动找到其对应的I2C地址进行操作。首先要声明该I2C设备结构体,代码如下:

[!--empirenews.page--]
2.2 Cypress 7958驱动部分设计
2.2.1 注册和注销模块
    首先建立I2C驱动结构体,cypress_7958_driver,代码如下:

2.2.2 触摸屏驱动入口函数的设计
    由上节中声明的I2C结构体得知,在设备被检查到的时候进入static int synaptics_ts_probe(struct i2c_client *client,const struct i2c_device_id*id)函数,在该函数中需要进行触摸屏工作模式的初始化,对作为输入设备的触摸屏驱动在Linux平台下的设备名注册,同时初始化触摸事件触发时引起的中断操作。
    (1)Cypress 7958模式初始化
    作为多点触摸屏幕,Cypress 7958有很多相关的配置寄存器,本文中不再赘述,初始化部分仅需对屏幕是否工作在正常工作模式下进行检查,通过读取0x28地址的寄存器,如果值为0x07,则屏幕工作正常,否则返回错误值。

(2)输入设备名注册
    创建struct input_dev结构体,通过input_allocate_de-vice()函数进行设备名的创建,然后通过set bit函数进行输入设备功能声明。因为是多点触摸屏,可以产生EVSYN,EV_KEY,BTN_TOUCH,BTN_2(多点触摸),EV_ABS等功能,故对之进行声明:

    最后通过input_register_device(ts->input_dev)函数完成对该设备名的注册。[!--empirenews.page--]
    (3)驱动事件产生中断函数初始化
    Cypress 7958触摸屏在触摸事件产生时会在IRQ引脚产生一个低电平信号,将该引脚连接到GPN(15)引脚上,同时创建GPIO中断函数:


    当驱动事件被触发之后通过queue_work函数进入驱动工作区cypress_7958_wq,进行驱动层对应用层的信息上报。
2.2.3 触摸屏工作区函数设计
    触摸屏工作区函数需要完成事件信息获取以及驱动层对应用层的信息上报功能,通过INIT_WORK(&ts->work,cypress_7958_work_fun-e)函数完成驱动工作区函数的初始化声明,在驱动事件中断产生之后进入工作区函数cypress_7958_work_func。
    (1)触摸屏事件信息获取
    Cypress 7958的事件触发信息存储在寄存器中,只需要通过i2c_smbus_read_byte_data函数对其寄存器信息进行读取即可完成其事件信息的获取,也可以通过i2c_transfer完成对其寄存器信息的批量读取:
[!--empirenews.page--]
    (2)触摸屏事件信息上报
    通过对buf数组的分析,获取当前事件具体信息,然后通过input_report系列函数进行事件信息的应用层上报:


2.3 Cypress 7958驱动在内核中的移植
    通过改写Makefile与KCONFIG完成Cypress 7985在内核中的移植,以帮助GCC工具链实现对内核的编译。
2.3.1 Kconfig的修改
    在/driver/input/touchsereen/Kconfig中添加如下语句:


    以实现将文件编译选项添加到MAKE MENUCONFIG中。由于触摸屏驱动属于系统基本输入设备驱动,本身调用了I/O中断,不能实现模块编译,只能完全编译进内核。在后续的研发中发现可以使用时钟中断将其模块化编译进内核,但由于时钟中断影响UCLINUX时间片的运行,故弃之不用。
2.3.2 Makefile的修改
    然后在/driver/input/touchscreen/Makefile中添加对应编译信息:

    最终在编译选项中将/MAKEFILE中的ARCH选项设置为S3C6410,在make menuconfig命令之后的选项中选择TOUCHSREEN_CYPRESS选项并选择编译进内核。

结语
    本设计以I2C方式对多点触摸屏进行驱动,通过嵌入式Linux将多点触摸输入方式应用到嵌入式应用系统中,丰富了单一的键盘输入与单点输入方式,减小了系统尺寸,提高了系统的可靠性。使得嵌入式系统的输入方式简单易行,同时也增强了嵌入式系统与人之间的通信能力,简化了繁琐的调试。采用三星公司的S3C6410ARM11处理器,加快了实验的操作步骤。实践证明,该设计驱动多点触摸屏幕的速度以及稳定性满足调试要求。该设计只需对底层驱动进行简单修改,就可直接应用于单片机以及其他全部可以运行Linux的嵌入式系统中。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭