基于内核对象的Linux输入子系统触摸屏的驱动设计

2018-02-12 20:21:08编辑:什么鱼 关键字:内核对象  Linux  触摸屏

    随着人们对操控要求的不断提高,电容触摸屏因为能支持多点触摸而得到广泛使用。本文基于Nokia和Intel公司合作开发的开源操作系统MeeGo,采用基于内核对象Linux输入子系统来设计触摸屏的驱动。该方案极大地方便了触摸屏的驱动开发,可应用在车载娱乐、上网本、智能手机等电子产品上。

    随着人们对操控要求的不断提高,市场上出现了越来越多的高端手机、平板电脑,这些产品共同的特点就是给人们提供了非常便利的操控方式,尤其是电容触摸屏的使用,它能很好地实现多点触控功能。多点触控技术是当今炙手可热的技术,它让人们的生活方式得到了前所未有的改变。电容触摸屏已经成为高端手机的标配,如苹果的iPhone以及HTC Motorola的一些高端手机,虽然目前电容屏的价格较贵,但随着工艺的提高,其价格必定会下降,再加上其给用户带来的丰富体验,电容触摸屏的使用必将越来越广泛。MeeGo是Intel和Nokia公司合作开发的开源操作系统,基于Linux内核,其良好的开源性为驱动程序的开发提供了很好的基础条件。本设计在MeeGo1.1版本下,并基于Linux 2.6.35内核来讨论实现电容式触摸屏的驱动开发技术。

    1 电容触摸屏原理

    电容式触摸屏是利用人体的电流感应工作的,分为表面电容式和投射电容式,前者不能识别多点,后者可以识别多点,因此设计采用投射电容式触摸屏。投射电容式触摸屏是传感器利用触摸屏电极发射出静电场线而工作的,分为交互电容和自我电容。设计采用的是交互电容式触摸屏。它是在玻璃表面用ITO(氧化铟锡)制作横向与纵向的电极,两组电极交叉之处将会形成电容,即这两组电极分别构成了电容的两极。

    当电容屏被手指触摸时,手指就会吸收一个很小的电流,从而改变了触摸点附近电极之间的藕合,这就会改变这两个电极之间的电容量。检测投射式电容屏大小时,横向的电极依次发射信号,纵向的所有电极同时接收信号,这样就能得到两电极交汇点的电容值大小,也就是整个触摸屏平面的电容大小。可以据此算出每一个触摸点的坐标,图1为投射式电容屏的等效电路示意图。

   

    2 Linux输入子系统

    Linux输入子系统(以下简称输入子系统)是基于内核对象kobject实现的,应用于Linux 2.6.35内核中。凭借该机制内核通过输入子系统向用户空间输出设备的各类消息,方便了对设备的管理。输入子系统由系统核心层、驱动层和事件处理层三部分组成。一个输入事件如鼠标移动、键盘按键按下等操作通过驱动层、系统核心层、事件处理层到达用户空间,传给应用程序。

    这样在设计驱动程序时只需要考虑驱动层的实现就可以了,减少了工作量,降低了设计难度。另外基于子系统的设计提高了驱动程序的可移植性和可适应性,因为基于子系统的驱动程序设计不用考虑向上层报告输入设备的接口没计,此工作由输入子系统来完成,而输入子系统对上层的接口具有通用性,可以使驱动程序的使用范围得到扩展。图2是Linux输入子系统的框架图。

   

    3 触摸屏驱动程序设计

    3.1 触摸屏驱动工作原理

    本设计重在提出触摸屏驱动的整体设计方案,该设计流程也适用于其他触摸屏驱动设计开发。此设计可以采用SPI总线作为触摸屏和处理器的接口,硬件连接示意图如图3所示。TOUCH SCREEN是电容式触摸屏,可采用FT5201电容式全屏触摸芯片,INT是中断引脚,当触摸屏被触摸时,通过INT引脚触发中断处理程序,CPU可采用Intel公司的Atom D510处理器。

   

    SPI总线是一种高速的、全双工、同步的通信总线,以主从方式工作,有4根线分别是SDI(数据输入)、SDO(数据输出)、CLK(时钟)、CS(片选)。SPI总线为了与外设进行数据交换,其输出串行同步时钟相位和极性可以根据外设工作要求进行配置。时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。如果CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。时钟极性(CPOL)对传输协议没有重大的影响,如果CPOL=0,串行同步时钟的空闲状态为低电平;如果CPOL=1,串行同步时钟的空闲状态为高电平。

 

    3.2 驱动程序软件设计

    依托Linux输入子系统架构,驱动程序的设计需要完成以下工作。

    (1)分配、注册、注销input设备

    各个接口函数如下:

    ◆分配函数为struct input_dev*input_alLOCate_devICe(void);

    ◆注册函数为int input_register_device(struct input_dev*devr);

    ◆注销函数为void input_unregister_device(struct input_dev*dev)。

    (2)设置input设备支持的事件类型

    通过set_bit()告诉所支持的事件类型,触摸屏的事件类型代码为EV_ABS(0x03)。

    (3)电容触摸屏参数设置

    由input_set_abs_params()函数完成,代码如下:

    input_set_abs_params(input,ABS_X,0,960,0,0);

    //屏幕分辨率为960×640

    Input_set_abs_params(input,ABS_Y,0.640,0,0);

    //X坐标范围0~960

    Input_set_abs_params(input,ABS_MAJOR,0,255,0,0);

    //Y坐标范围0~640

    (4)上报输入事件

    触摸屏被触摸感应时,通过input_report_abs()函数上报发生的事件及坐标值。

    3.3 驱动设计的主要函数

    (1)void spi_init()函数

    在该函数中通过spi_register_driver(strcut spi_driver*drv)来注册触摸屏SPI接口。

    (2)Touch_probe()函数

    在这个函数中,会对SPI总线的相关参数进行配置,并注册open()和close()函数。调用input_dev*input_allocate_device(void)进行输入设备分配;调用set_bit(EV_ABS,input_evbit)来设置触摸屏事件;调用input_set_params()设置坐标范围及接触点主轴长度范围;最后调用input_register_device(struct input_dev*dev)把触摸屏注册为输入子系统设备。

    (3)触摸屏中断注册及中断处理函数

    request_IRQ(TOUCH IRQ,Touch interrupt,0,“touch”,NULL)为中断函数注册,其中Touch_interrupt是中断处理函数。当触摸屏有感应时将拉低INT引脚,此时便触发中断处理函数Touch_interrupt。该中断函数调用intput_report_abs()将采集到的坐标数据上报给输入子系统,当为单点触摸时,上报该触点;当为多点触摸时,依次将每个点的坐标上报。这里为了消除抖动带来的误操作,在中断处理程序中启用了一个定时器init_timer(),进入中断后将延时5 ms,然后才对数据读取。

    3.4 数据的处理

    电容式触摸屏支持多点识别,所以必须要处理好多点数据的采集,为此将采集到的数据放到事先分配好的缓存read_data[]中。该缓存存有触点的个数以及各个触点的坐标值,为了保证每一点的准确性和完整性,需要用内核函数input_mt_sync()进行同步。具体的读取代码如下:

   


    结语

    多点触控技术的使用将成为这个时代的标志。本文基于MecGo平台,对电容屏的原理及驱动开发进行了详细的分析讨论,并基于Linux输入子系统的框架开发驱动,减少了驱动开发的工作量,提高了程序的可移植性。在此驱动基础上,并结合MeeGo提供的多点触摸界面框架(MeeGo Touch UI Framework,MTF),就可以实现多点触控的功能。


关键字:内核对象  Linux  触摸屏

来源: eefocus 引用地址:http://www.eeworld.com.cn/mcu/article_2018021237748.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:基于MPC8247处理器的嵌入式电力交换系统开发
下一篇:基于CAN总线的嵌入式控制器串行通讯的应用

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

S3C2440 Linux下的I2C驱动以及I2C体系下对EEPROM进行读写操作

这篇文档算上期末复习这段时间其实拖了有好久了,因为从一开始接触linux的i2c驱动体系我就各种凌乱,因为起初脑海中既没有整体框架也不熟悉相关体系下的结构,所以四处乱看,经常性的在看内核代码时看着看着就把自己看飞了。结果就总是无功而返。现在我决定当前阶段把结构熟悉,知道大致的驱动体系框架。日后真正做到此类项目时再来深入理解、巩固、总结。因为我所要操作的EEPROM使用的是I2C接口。那么自然要先了解一下I2C总线协议。对于I2C总线协议我的理解:两条线“SCL和SDA”,一个数据信号一个时钟脉冲信号。俩线都是高电平时,SDA从高到低发出一个跳变,便是开始信号;然后就是发送数据。若SDA从低到高再跳变一次就是结束信号。这期间,SCL
发表于 2018-07-15 22:30:09

浅析linux权限管理

“一切皆是文件”是Unix/Linux的基本哲学之一,目录、字符设备、块设备、套接字等在Unix/Linux都是以文件的形式存在。面对众多的文件,如何理解和管理他们的读、写、执行权限呢?在Windows下,可以通过鼠标右击文件,在属性栏查看文件的权限。Linux下的文件“哲学”是否与Windows相同呢?我们从以下几点分析。文件权限设定的作用文件权限的设定是为了保护系统及用户数据的安全性。对于用户来说,最重要的事情就是数据、文件的私密性及安全性。从系统管理员到普通用户,从文件属性到文件特殊加密 ,无不围绕着一个主题:权限管理。若一个关键文件被意外写入,轻则数据丢失,重则系统崩溃。以根目录下的/proc目录文件为例,该文
发表于 2018-06-28 10:44:51
浅析linux权限管理

康佳特与OSADL携手优化 Real-Time Linux 的支持

提供标准和定制化嵌入式计算机板卡与模块的领先供应商—德国康佳特科技,宣布与开源自动化开发实验室(OSADL, Open Source Automation Development Lab) 合作优化对实时Linux的板级支持,并且该板已在OSADL测试机架中展示。首先,OSADL对基于嵌入式服务器等级英特尔® 至强®处理器(E3-1578L v5 @ 2.00 GHz) conga-TS170模块上安装的康佳特最新实时Linux(Linux kernel 4.9.47-rt37)进行认证。该安装在conga-TEVAL评估板上的COM Express Type6 模块在测试中表现非常优异,其中实时性能测试的表现更是出类拔萃,令人
发表于 2018-06-26 09:22:36
康佳特与OSADL携手优化 Real-Time Linux 的支持

linux中S3C2440的物理地址映射到虚拟地址详解

linux-2.6.30.4\arch\arm\plat-s3c\include\plat\ map-base.h    #defineS3C_ADDR_BASE (0xF4000000)  #ifndef __ASSEMBLY__  #define S3C_ADDR(x)  ((void__iomem __force *)S3C_ADDR_BASE+ (x))  #else  #defineS3C_ADDR(x) 
发表于 2018-06-05 20:42:08

基于linux2.6.30.4的s3c2440寄存器的虚拟地址和物理地址的关系

1 想一次修改某个目录下所有文件的权限,包括子目录中的文件权限也要修改,要使用参数-R表示启动递归处理。刚开始学字符设备驱动,感觉最难的是驱动和底层硬件的连接。linux上的驱动程序,是基于操作系统之上的,他并不直接和底层的硬件打交道,但是我们写的驱动必须能使硬件“跑”起来,即与硬件紧密相连。就拿最简单的LED驱动来说,我们的驱动程序是在虚拟的内存上面跑的,但是最终,LED的点亮还是必须靠GPIO管脚的高低电平来控制。那么,我们的虚拟的内存怎么才能和实际的硬件上面的寄存器对应起来呢?这篇要写的就是ioremap这个映射函数,他可以将我们硬件上面的寄存器,映射为虚拟的内存,从而使驱动程序在我们的虚拟的内存中运行
发表于 2018-06-05 20:41:25

可以,这很Linux!第三个Ubuntu版本上架Windows 10商店

在微软打开Linux进入Windows 10的大门后,我们看到了大量的Linux发行版已经上架Windows商店。最新上架的Linux版本是Ubuntu的第三个版本,此前较早的Ubuntu 18.04和16.04 LTS版本已经推出。虽然后来的操作系统安装了它们的特定版本,但新版本简称为Ubuntu,安装最新的操作系统稳定版本。描述如下:此应用程序在Windows上安装最新的Ubuntu LTS稳定版本,第一版本的LTS版本。如果你想要使用特定的LTS版本(例如18.04),该情况下请在Windows上安装特定版本的Ubuntu 18.04应用程序。请注意,该应用程序会更新Ubuntu安装。请升级到新版本。
发表于 2018-06-04 20:18:03
可以,这很Linux!第三个Ubuntu版本上架Windows 10商店

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2018 EEWORLD.com.cn, Inc. All rights reserved