触摸屏控制器芯片完成触摸屏">触摸屏模块的设计。具体包括在嵌入式Linux操作系统中的软件驱动开发,采用内核定时器的下半部机制进行了触摸屏">触摸屏硬件中断程序设计,采用16个时钟周期的坐标转换时序,实现触摸点数据采集的方法," />
当前位置:文档之家› 基于S3C2410的触摸屏驱动程序设计

基于S3C2410的触摸屏驱动程序设计

基于S3C2410的触摸屏驱动程序设计
基于S3C2410的触摸屏驱动程序设计

基于S3C2410的触摸屏驱动程序设计

作者:沈阳农业大学徐昕朴在林许童羽李征明时间:2007-02-06 来源:电子产品世界

摘要:本文介绍了基于三星S3C2410X微处理器,采用SPI接口与ADS7843触摸屏">触摸屏控制器芯片完成触摸屏">触摸屏模块的设计。具体包括在嵌入式Linux操作系统中的软件驱动开发,采用内核定时器的下半部机制进行了触摸屏">触摸屏硬件中断程序设计,采用16个时钟周期的坐标转换时序,实现触摸点数据采集的方法,给出了坐标采集的流程。设计完成的触摸屏">触摸屏驱动程序在博创公司教学实验设备

UP-NETARM2410-S平台上运行效果良好。

关键词:ADS7843;SPI;嵌入式Linux;触摸屏">触摸屏;S3C2410S;驱动程序

引言

随着信息家电和通讯设备的普及,作为与用户交互的终端媒介,触摸屏">触摸屏在生活中得到广泛的应用。如何在系统中集成触摸屏">触摸屏模块以及在嵌入式操作系统中实现其驱动程序,都成为嵌入式系统设计者需要考虑的问题。本文主要介绍在三星S3C2410X 微处理器的硬件平台上进行基于嵌入式Linux的触摸屏">触摸屏驱动程序设计。

硬件实现方案

SPI接口是Motorola推出的一种同步串行接口,采用全双工、四线通信系统,S3C2410X 是三星推出的自带触摸屏">触摸屏接口的ARM920T内核芯片,ADS7843为Burr-Brown 生产的一款性能优异的触摸屏">触摸屏控制器。本文采用SPI接口的触摸屏">触摸屏控制器ADS7843外接四线电阻式触摸屏">触摸屏,这种方式最显著的特点是响应速度更快、灵敏度更高,微处理器与触摸屏">触摸屏控制器间的通讯时间大大减少,提高了微处理器的效率。ADS7843与S3C2410的硬件连接如图1所示,鉴于ADS7843差分工作模式的优点,在硬件电路中将其配置为差分模式。

图1 触摸屏">触摸屏输入系统示意图

嵌入式Linux系统下的驱动程序

设备驱动程序是Linux内核的重要组成部分,控制了操作系统和硬件设备之间的交互。Linux的设备管理是和文件系统紧密结合的,各种设备都以文件的形式存放在/dev目录下,成为设备文件。应用程序可以打开、关闭、读写这些设备文件,对设备的操作就像操作普通的数据文件一样简便。为开发便利、提高效率,本设计采用可安装模块方式开发调试触摸屏">触摸屏驱动程序。

设备驱动在加载时首先需要调用入口函数init_module(),该函数完成设备驱动的初始化工作。其中最重要的工作就是向内核注册该设备,对于字符设备调用

register_chrdev()完成注册,对于块设备需要调用register_blkdev()完成注册。注册成功后,该设备获得了系统分配的主设备号、自定义的次设备号,并建立起与文件系统的关联。字符设备驱动程序向Linux内核注册登记时,在字符设备向量表chrdevs 中增加一个device_struct数据结构条目,这个设备的主设备标识符用作这个向量表的索引。向量表中的每一个条目,即一个device_struct数据结构包括两个元素:一个登记的设备驱动程序的名称的指针和一个指向一组文件操作的指针。这块文件操作本身位于这个设备的字符设备驱动程序中,每一个都处理特定的文件操作,比如打开、读写和

关闭。所谓登记,就是将由模块提供的file_operations结构指针填入device_struct 数据结构数组的某个表项。登记以后,位于上层的模块(内核)可以“看见”这个模块了。但是,应用程序却还不能“看见”它,因而还不能通过系统调用它。要使应用程序能“看见”这个模块或者它所驱动的设备,就要在文件系统中为其创建一个代表它的节点。通过系统调用mknod()创建代表此项设备的文件节点——设备入口点,就可使一项设备在系统中可见,成为应用程序可以访问的设备。另外,设备驱动在卸载时需要回收相应的资源,令设备的相应寄存器值复位并从系统中注销该设备。

Linux操作系统通过系统调用和硬件中断完成从用户空间到内核空间的控制转移。设备驱动模块的功能就是扩展内核的功能,主要完成两部分任务:一个是系统调用,另一个是处理中断。图2是一个设备驱动模块动态挂接、卸载和系统调用的全过程。系统调用部分则是对设备的操作过程,比如open,read,write,ioctl等操作,设备驱动程序所提供的这组入口点由几个结构向系统进行说明,分别是file_operations数据结构、inode数据结构和file 数据结构。内核内部通过file结构识别设备,通过

file_operations数据结构提供文件系统的入口点函数,也就是访问设备驱动的函数,结构中的每一个成员都对应着一个系统调用。在嵌入式系统的开发中,我们一般仅仅实现其中几个接口函数:read、write、open、ioctl及release就可以完成应用系统需要的功能。写驱动程序的任务之一就是完成file_operations中的函数指针。

触摸屏">触摸屏驱动程序设计

触摸屏">触摸屏驱动程序中重要数据结构

typedef struct {

unsigned short pressure;

unsigned short x;

unsigned short y;

unsigned short pad;

} TS_RET;

typedef struct {

unsigned int PenStatus;

TS_RET buf[MAX_TS_BUF];

unsigned int head, tail;

wait_queue_head_t wq;

spinlock_t lock;

} TS_DEV;

static struct file_operations s3c2410_fops = {

owner: THIS_MODULE,

open: s3c2410_ts_open,

read: s3c2410_ts_read, release: s3c2410_ts_release,

poll: s3c2410_ts_poll, };

在程序中有三个重要的数据结构:用于表示笔触点数据信息的结构TS_RET,表示ADS7843中有关触摸屏">触摸屏控制器信息的结构TS_DEV,以及驱动程序与应用程序的接口file_operations结构的s3c2410_fops。

TS_RET结构体中的信息就是驱动程序提供给上层应用程序使用的信息,用来存储触摸屏">触摸屏的返回值。上层应用程序通过读接口,从底层驱动中读取信息,并根据得到的值进行其他方面的操作。

TS_DEV结构用于记录触摸屏">触摸屏运行的各种状态,PenStatus包括PEN_UP、PEN_DOWN和PEN_FLEETING。buf[MAX_TS_BUF]是用来存放数据信息的事件队列,head、tail分别指向事件队列的头和尾。程序中的笔事件队列是一个环形结构,当有事件加入时,队列头加一,当有事件被取走时,队列尾加一,当头尾位置指针一致时读取笔事件的信息,进程会被安排进入睡眠。wq等待队列,包含一个锁变量和一个正在睡眠进程链表。当有好几个进程都在等待某件事时,Linux会把这些进程记录到这个等待队列。它的作用是当没有笔触事件发生时,阻塞上层的读操作,直到有笔触事件发生。lock使用自旋锁,自旋锁是基于共享变量来工作的,函数可以通过给某个变量设置一个特殊值来获得锁。而其他需要锁的函数则会循环查询锁是否可用。

MAX_TS_BUF的值为16,即在没有被读取之前,系统缓冲区中最多可以存放16个笔触数据信息。

s3c2410_fops就是内核对驱动的调用接口,完成了将驱动函数映射为标准接口。上面的这种特殊表示方法不是标准C的语法,而是GNU编译器的一种特殊扩展,它使用名字进行结构字段的初始化,它的好处体现在结构清晰,易于理解,并且避免了结构发生变化带来的许多问题。

init_module函数

这是模块的入口函数。在函数内部通过s3c2410_ts_init( )实现模块的初始化工作。在本设计中设备与系统之间以中断方式进行数据交换。整个触摸屏">触摸屏的驱动程序处理比较复杂,而且耗时较长,因而触摸屏">触摸屏驱动程序不可能在中断服务程序中完成。在Linux操作系统中一般把中断处理切为两个部分或两半。中断处理程序是上半部——接收到一个中断,它就立即开始执行,但只做有严格时限的工作,例如对接收的中断进行应答或复位硬件。这些工作都是在所有中断被禁止的情况下完成的,能够被允许稍后完成的工作会推迟到下半部去。在Linux中下半部的实现有多种机制。按触摸屏">触摸屏时,从ADS7843输出的数值有一个抖动过程,即从ADS7846输出的数值有一个不稳定时期,这个过程大约为10ms。所以中断处理程序的下半部处理函数采用内核定时器机制,使下半部在中断发生50ms后再作处理。这样有效地避开了ADS7843输出值的不稳定时期,使中断服务程序和中断处理任务串行化,达到了处理时间较长的触摸屏">触摸屏事件的目的。驱动程序通过request_irq函数注册并激活一个中断处理程序,以便处理中断。

图2 设备驱动在内核中的挂接、卸载和系统调用过程

int reguest_irq(unsigned int irq, void(*handler)(int, void *, struct pt_regs *), unsigned long irq_flags, const char *dev_name, void *dev_id)

参数irq表示所要申请的中断号;handler为向系统登记的中断处理子程序,中断产生时由系统来调用;dev_name为设备名;dev_id为申请时告诉系统的设备标识符;irq_flags是申请时的选项,它决定中断处理程序的一些特性,其中最重要的是中断处理程序是快速处理程序还是慢速处理程序。

本设计中触摸屏">触摸屏控制器ADS7843的中断输出通过外部中断5接在中断控制器上,当触摸屏">触摸屏上有触摸事件发生时,会引发中断号为IRQ_EINT5的中断服务程序

s3c2410_isr_tc()。图3所示为该中断处理程序的流程图。

图3 触摸屏">触摸屏硬件中断处理程序流程图

在s3c2410_isr_tc()中设定了定时器的定时时间为50ms,并立即激活。因此有触摸屏">触摸屏硬件中断的情况下50ms后就会引发定时中断,中断服务程序为

ts_timer_handler(),这个程序实现了触摸屏">触摸屏中断的下半部,即在过了抖动时间之后如果触摸屏">触摸屏确实有有效事件发生则采集触摸屏">触摸屏坐标,并将定时器的时间重新设为100ms并重新激活,这样做的目的是如果触摸笔是拖动的情况,以后每100ms采集一次坐标值,并存入缓冲区,如果不是拖动在采集一次坐标值之后,在第二次进入ts_timer_handler()时,查询管脚的状态值,则变为高电平,就将触摸屏">触摸屏状态tsdev.PenStatus设为PEN_UP,并释放定时器,为下次触摸屏">触摸屏事件做好准备,定时中断服务程序流程图如图4所示。

图4 定时中断服务程序流程图

在s3c2410_ts_init()中的另一个重要任务是执行接口函数s3c2410_ts_open(),在这个函数中初始化缓冲区的头尾指针、触摸屏">触摸屏状态变量及触摸屏">触摸屏事件等

待队列。

module_exit()

该函数调用s3c2410_ts_exit(),主要任务是撤销驱动程序向内核的登记以及释放申

请的中断资源。

接口函数s3c2410_ts_read( )

这个函数实现的任务是将事件队列从设备缓存中读到用户空间的数据缓存中。实现的过程主要是通过一个循环,只有在事件队列的头、尾指针不重合时,才能成功的从tsdev.tail指向的队列尾部读取到一组触摸信息数据,并退出循环。否则调用读取函数

的进程就要进入睡眠。

坐标读取函数s3c2410_get_XY()

在定时器中断处理程序中,当查询到与相连的EINT5/GPF5为低电平时,即表示有有效事件,应该调用s3c2410_get_XY()函数采集笔触信息。

ADS7843有多种转换时序,时序规定了芯片与设备及CPU间是如何配合工作的。设计中采用16个时钟周期启动一次转换的坐标转换方式。ADS7843的操作时序如图5所示。坐标的读取是通过多次采集取平均值的方法,以X坐标的读取为例,其读取过程如图6所示。循环过程中的每一步都在8个时钟周期内完成,数据的处理严格按照时序进行,

Y坐标的采集与X坐标类似。

图5 ADS7843操作时序

图6 X坐标采集流程

结语

在触摸屏">触摸屏的设计中,抗干扰设计是难点和重点,直接关系到触摸屏">触摸屏的工作性能。实验发现坐标采集时,丢弃第一次采集值读取的坐标转换值效果较好。本文所介绍的驱动程序已经在博创公司的教学实验设备UP-NETARM2410-S平台上经过实际验证,从数据稳定性和系统负载的角度看,效果良好。同时通过修改程序内部的定时器时钟频率可以改变笔在屏上移动所产生的数据量。

参考文献:

1. 毛德操,胡希明著.Linux内核源代码情景分析.杭州:浙江大学出版社,2001

2. 孙天泽,袁文菊,张海峰等.嵌入式设计及Linux驱动开发指南.北京:电子工业出版社,2005

3. R Love. Linux内核设计与实现. 陈莉君,康华,张波等译.北京:机械工业出版社,2006

4. 殷惠莉,刘少君,黄道平.基于uClinux触摸屏">触摸屏的设计.电子工程师.2004(2)

触摸屏驱动

二、前提知识 1、Linux输入子系统(Input Subsystem): 在Linux中,输入子系统是由输入子系统设备驱动层、输入子系统核心层(Input Core)和输入子系统事件处理层(Event Handler)组成。其中设备驱动层提供对硬件各寄存器的读写访问和将底层硬件对用户输入访问的响应转换为标准的输入事件,再通过核心层提交给事件处理层;而核心层对下提供了设备驱动层的编程接口,对上又提供了事件处理层的编程接口;而事件处理层就为我们用户空间的应用程序提供了统一访问设备的接口和驱动层提交来的事件处理。所以这使得我们输入设备的驱动部分不在用关心对设备文件的操作,而是要关心对各硬件寄存器的操作和提交的输入事件。下面用图形来描述一下这三者的关系吧! 另外,又找了另一幅图来说明Linux输入子系统的结构,可能更加形象容易理解。如下:

2、输入子系统设备驱动层实现原理: 在Linux中,Input设备用input_dev结构体描述,定义在input.h中。设备的驱动只需按照如下步骤就可实现了。 ①、在驱动模块加载函数中设置Input设备支持input子系统的哪些事件; ②、将Input设备注册到input子系统中; ③、在Input设备发生输入操作时(如:键盘被按下/抬起、触摸屏被触摸/抬起/移动、鼠标被移动/单击/抬起时等),提交所发生的事件及对应的键值/坐标等状态。 Linux中输入设备的事件类型有(这里只列出了常用的一些,更多请看linux/input.h中):

三、触摸屏驱动的实现步骤 1、硬件原理图分析: S3c2440芯片内部触摸屏接口与ADC接口是集成在一起的,硬件结构原理图请看: S3C2440上ADC驱动实例开发讲解中的图,其中通道7(XP或AIN7)作为触摸屏接口的X坐标输入,通道5(YP或AIN5)作为触摸屏接口的Y坐标输入。在"S3C2440上ADC驱动实例开发讲解"中,AD转换的模拟信号是由开发板上的一个电位器产生并通过通道1(AIN0)输入的,而这里的模拟信号则是由点触触摸屏所产生的X坐标和Y坐标两个模拟信号,并分别通过通道7和通道5输入。S3c2440提供的触摸屏接口有4种处理模式,分别是:正常转换模式、单独的X/Y位置转换模式、自动X/Y位置转换模式和等待中断模式,对于在每种模式下工作的要求,请详细查看数据手册的描述。本驱动实例将采用自动X/Y位置转换模式和等待中断模式。 注意:在每步中,为了让代码逻辑更加有条理和容易理解,就没有考虑代码的顺序,比如函数要先定义后调用。如果要编译此代码,请严格按照C语言的规范来调整代码的顺序。 2、建立触摸屏驱动程序my2440_ts.c,首先实现加载和卸载部分,在驱动加载部分,我们主要做的事情是:启用ADC所需要的时钟、映射IO口、初始化寄存器、申请中断、初始化输入设备、将输入设备注册到输入子系统。代码如下:

各类型触摸屏故障及维修方法

?关键词:触摸屏故障触摸屏 ?摘要:触摸屏是经常使用的电子产品,难免会出现问题,相信很多人在使用触摸屏时,都遇到触摸屏因出现故障而不能使用的情况。那么触摸 屏这些常见的故障该如何维修呢?本文就按触摸屏类型介绍一些常见故障的解决与维护方法: 触摸屏是经常使用的电子产品,难免会出现问题,相信很多人在使用触摸屏时,都遇到触摸屏因出现故障而不能使用的情况。那么触摸屏这些常见的故障该如何维修呢?本文就按触摸屏类型介绍一些常见故障的解决与维护方法: 一、表面声波触摸屏 ⑴故障一:触摸偏差 现象1:手指所触摸的位置与鼠标箭头没有重合。 原因1:安装完驱动程序后,在进行校正位置时,没有垂直触摸靶心正中位置。 解决1:重新校正位置。 现象2:部分区域触摸准确,部分区域触摸有偏差。 原因2:表面声波触摸屏四周边上的声波反射条纹上面积累了大量的尘土或水垢,影响了声波信号的传递所造成的。 解决2:清洁触摸屏,特别注意要将触摸屏四边的声波反射条纹清洁干净,清洁时应将触摸屏控制卡的电源断开。 ⑵故障二:触摸无反应 现象:触摸屏幕时鼠标箭头无任何动作,没有发生位置改变。 原因:造成此现象产生的原因很多,下面逐个说明: ①表面声波触摸屏四周边上的声波反射条纹上面所积累的尘土或水垢非常严重,导致触摸屏无法工作; ②触摸屏发生故障; ③触摸屏控制卡发生故障; ④触摸屏信号线发生故障; ⑤计算机主机的串口发生故障;

⑥计算机的操作系统发生故障; ⑦触摸屏驱动程序安装错误。 解决方法: ①观察触摸屏信号指示灯,该灯在正常情况下为有规律的闪烁,大约为每秒钟闪烁一次,当触摸屏幕时,信号灯为常亮,停止触摸后,信号灯恢复闪烁。 ②如果信号灯在没有触摸时,仍然处于常亮状态,首先检查触摸屏是否需要清洁;其次检查硬件所连接的串口号与软件所设置的串口号是否相符,以及计算机主机的串口是否正常工作。 ③运行驱动盘中的COMDUMP命令,该命令为DOS下命令,运行时在COMDUMP后面加上空格及串口的代号1或2,并触摸屏幕,看是否有数据滚出。有数据滚出则硬件连接正常,请检查软件的设置是否正确,是否与其他硬件设备发生冲突。如没有数据滚出则硬件出现故障,具体故障点待定。 ④运行驱动盘中的SAWDUMP命令,该命令为DOS下命令,运行程序时,该程序将寻问控制卡的类型、连接的端口号、传输速率,然后程序将从控制卡中读取相关数据。请注意查看屏幕左下角的X轴的AGC和Y轴的AGC 数值,任一轴的数值为255时,则该轴的换能器出现故障,需进行维修。 ⑤安装完驱动程序后进行第一次校正时,注意观察系统报错的详细内容。“没有找到控制卡”、“触摸屏没有连接”等,根据提示检查相应的部件。如:触摸屏信号线是否与控制卡连接牢固,键盘取电线是否全部与主机连接等。 ⑥如仍无法排除,请专业人员维修。 二、五线电阻触摸屏 ⑴故障一:触摸偏差 现象1:手指所触摸的位置与鼠标箭头没有重合。 原因1:①安装完驱动程序后,在进行校正位置时,没有垂直触摸靶心正中位置; ②触摸屏上的信号线接触不良或断路。 解决1:重新校正位置;查找断点,重新连接,或更换触摸屏。 现象2:不触摸时,鼠标箭头始终停留在某一位置;触摸时,鼠标箭头在触摸点与原停留点的中点处。

linux 触摸屏驱动程序设计

物理与电子工程学院 《嵌入式系统设计》 课程小论文 课题题目linux 触摸屏驱动程序设计系别物理与电子工程学院 年级08级 专业电子科学与技术 学号050208110 学生姓名储旭 日期2011-12-21

目录 第 1 章嵌入式 linux 触摸屏驱动程序设计........................................................................ - 2 - 1.1 课题设计的目的.......................................................................................................... - 2 - 1.2 课题设计要求.............................................................................................................. - 2 - 第二章课题设计平台构建与流程............................................................................................ - 2 - 2.1 嵌入式系统开发平台构建.......................................................................................... - 2 - 2.1.1 cygwin 开发环境............................................................................................ - 2 - 2.1.2 Linux 开发环境.............................................................................................. - 5 - 2.1.3 Embest IDE 开发环境.................................................................................... - 5 - 2.2 触摸屏设计流程.......................................................................................................... - 5 - 2.3 课题设计硬件结构与工作原理.................................................................................. - 6 - 2.3.1 硬件结构概述.................................................................................................. - 6 - 2.3.2 触摸屏工作原理.............................................................................................. - 8 - 第三章 Bootloader 移植与下载.............................................................................................. - 9 - 3.1 Vivi 源代码的安装.................................................................................................... - 9 - 3.2 Vivi 源代码分析...................................................................................................... - 10 - 3.3 Vivi 源代码的编译与下载...................................................................................... - 11 - 第四章 Linux 内核移植与下载.............................................................................................. - 12 - 4.1 Linux 内核源代码的安装........................................................................................ - 12 - 4.2 Linux 内核源代码分析与移植................................................................................ - 14 - 4.3 Linux 内核编译与下载............................................................................................ - 14 - 第五章触摸屏功能模块程序设计与交叉编译...................................................................... - 16 - 5.1 功能模块驱动程序设计............................................................................................ - 16 - 5.2 触摸屏功能模块交叉编译........................................................................................ - 20 - 第六章根文件系统建立与文件系统下载.............................................................................. - 20 - 6.1 Cramfs 根文件系统分析.......................................................................................... - 20 - 6.2 文件系统映像文件生成............................................................................................ - 21 - 6.3 功能模块运行与调试................................................................................................ - 22 - 第七章课题设计总结与体会.................................................................................................. - 26 - 参考文献:................................................................................................................................ - 27 -

触摸屏控制器驱动程序设计

触摸屏控制器驱动程序设计 在便携式的电子类产品中 ,触摸屏由于其便、灵活、占用空间少等优点 ,已经逐渐取代键盘成为嵌入式计算机系统常选用的人机交互输入设备。 触摸屏输入系统由触摸屏、触摸屏控制器、微控制器及其相应的驱动 程序构成。本文从触摸屏控制器的驱动程序设计着手 ,介绍触摸屏控制 器 ADS7843 的内部结构及工作原理和在嵌入式 Linux 操作系统中基于 PXA255微处理器的ADS784羽驱动程序设计。 1触摸屏控制器ADS7843的介绍 1.1ADS7843的内部结构 ADS7843内驻一个多路低导通电阻模拟开关组成的供电-测量电路网络、 12bit逐次逼近A/D转换器和异步串行数据输入输出,ADS7843艮据微 控制器发来的不同测量命令导通相应的模拟开关 ,以便向触摸屏电极对提供电压 ,并把相应电极上的触点坐标位置所对应的电压模拟量引入 A/D转换器,图1为ADS7843内部结构图。X+、Y+ X-、丫为触摸屏电 极模拟电压输入;CS为ADS7843的片选输入信号,低电平有效;DCLK接外部时钟输入 ,为芯片进行 A/D 转换和异步串行数据输入 /输出提供时 钟;DIN串行数据输入端,当CS低电平时,输入数据在时钟的上升沿将串行数据锁存;DOUT串行数据输出端,在时钟下降沿数据由此移位输出,当 CS 为高电平时,DOUT呈高阻态。BUSY为系统忙标志端,当CS为低电平, 且BUSY为高电平时,表示ADS7843正在进行数据转换;VREF参考

电压输入端,电压值在+1V到+VCC之间变化;PENIRC为笔触中断,低电平有效;IN3、IN4为辅助ADC转换输入通道;+VCC为电源输入。 图1ADS7843内部结构 1.2ADS7843的转换时序 ADS7843完成一次数据转换需要与微控制器进行3次通信,第一次微处理器通过异步数据传送向 ADS843 发送控制字 ,其中包括起始位、通道选择、 8/12 位模式、差分 /单端选择和掉电模式选择 ,其后的两次数据传送则是微控制器从 ADS7843 取出 16bitA/D 转换结果数据(最后四位自动补零),每次通信需要 8 个时钟周期 ,完成一次数据转换共需 24 个时 钟周期周2为ADS7843转换时序。 图2ADS7843转换时序 2ADS7843与 PXA255硬件接口 PXA255微处理器是In tel公司生产的第二代基于32位XScaie微架构的 集成系统芯片(ISOC),PXA25具有高性能、低功耗等优点,它除了 XScale 微内核外 ,还集成了许多适用于手持设备市场需要的外围设备。图 3 为ADS7843触摸屏控制器与PXA255微处理器的硬件连线示意图。当屏触发生时ADS7843向PXA255发出中断请求,由PXA255响应该中断

android下触摸屏驱动实现

最近学习了电容触摸屏的驱动及其上层工作原理,拿出来和大家分享! 转]Android触摸屏校准程序的实现 一,校准的触摸算法如下: 触摸屏校准通用方法。 (XL, YL是显示屏坐标,XT, YT是触摸屏坐标,) XL = XT*A+YT*B+C YL = XT*D+YT*E+F 由于具体计算是希望是整数运算,所以实际中保存的ABCDEF为整数,而增加一个参数Div XL = (XT*A+YT*B+C) / Div YL = (YT*D+YT*E+F) / Div TSLIB把以上的7个参数ABCDEF Div 保存在pointercal 文件中。 不校准的数据:A=1, B=0, C=0, D=0, E=1, F=0, Div=1 A B C D E F Div -411 37818 -3636780 -51325 39 47065584 65536 二,Android 事件处理机制 android 事件的传入是从EventHub开始的,EventHub是事件的抽象结构,维护着系统设备的运行情况(设备文件放在/dev/input里),设备类型包括Keyboard、TouchScreen、TraceBall。它在系统启动的时候会通过open_device方法将系统提供的输入设备都增加到这个抽象结构中,并维护一个所有输入设备的文件描述符,如果输入设备是键盘的话还会读取/system/usr/keylayout/目录下对应键盘设备的映射文件(修 改./development/emulator/keymaps /qwerty.kl来改变键值的映射关系),另外getEvent 方法是对EventHub中的设备文件描述符使用poll操作等侍驱动层事件的发生,如果发生的事件是键盘事件,则调用Map函数按照映射文件转换成相应的键值并将扫描码和键码返回给KeyInputQueue. frameworks/base/services/jni/com_android_server_KeyInputQueue.cpp 根据事件的类型以及事件值进行判断处理,从而确定这个事件对应的设备状态是否发生了改变并相应的改变对这个设备的描述结构InputDevice。 Windowmanager会创建一个线程(InputDispatcherThread),在这个线程里从事件队列中读取发生的事件(QueuedEvent ev = mQueue.getEvent()),并根据读取到事件类型的不同分成三类(KEYBOARD、TOUCHSCREEN、TRACKBALL),分别进行处理,例如键盘事件会调用dispatchKey((KeyEvent)ev.event, 0, 0)以将事件通过Binder发送给具有焦点的窗口应用程序,然后调用mQueue.recycleEvent(ev)继续等侍键盘事件的发生;如果是触摸屏事件则调用dispatchPointer(ev, (MotionEvent)ev.event, 0, 0),这里会根据事件的种类(UP、DOWN、MOVE、OUT_SIDE等)进行判断并处理,比如Cancel或将事件发送到具有权限的指定的窗口中去; 移植方案 Android本身并不带触摸屏校准。Android获取到的数据就是驱动上报的原始数据。 方案一: 移植TSLIB,通过TSLIB产生pointercal 校准参数文件。 方案二: 从Android框架层获取OnTouch事件产生pointercal 校准参数文件 方案一: 数据的校准在驱动中完成。即把pointercal 的参数数据通过某种方式(sysfs)传递给驱动程序进行校准。

基于STM32F103的触摸屏驱动模块设计

基于STM32F103x的LCD触摸屏驱动的设计 姓名:______徐进东_______ 学号:______10030227_____ 班级:______10 计卓______

目录 1 概述 (3) 2 LCD液晶显示屏 (3) 2.1 LCD液晶显示屏原理 (3) 2.2 LCD液晶显示屏分类 (3) 3 触摸屏驱动原理概述 (4) 3.1 电阻触摸屏工作原理 (4) 3.2 触摸屏控制实现 (4) 4 设计目标 (4) 5 系统硬件设计 (5) 5.1 STM32微处理器FSMC接口 (5) 5.2 LCD液晶显示屏介绍 (7) 5.3 触摸屏控制板 (8) 6 系统软件设计 (10) 6.1 系统软件结构 (10) 6.2 头文件设计 (11) 6.2 硬件初始化程序 (11) 6.3 3寸LCD模块驱动程序 (14) 6.4 触摸坐标获取程序 (19) 6.5 LCD控制器控制程序 (22) 7 总结 (24)

1 概述 LCD液晶显示屏与触摸屏在嵌入式系统中的应用越来越普及。他们是非常简单、方便、自然的人机交互方式,目前广泛应用于便携式仪器、智能家电、掌上设备等领域。触摸屏与LCD液晶显示技术的紧密结合,成了主流配置。 LCD液晶显示屏(LCD Module , LCM)是一种将液晶显示器件、连接件、集成电路、PCB线路板、背光源以及结构件装配在仪器的组件。 触摸屏技术在我国的应用时间不是太长,但它已经成长为人们最为接受的输入方式。利用这种技术人们只需触碰屏幕就可以对主机进行操作,是人机交互更为方便,直截了当。 本文档是对LCD液晶显示屏和触摸屏驱动的设计做深入介绍。 2 LCD液晶显示屏 2.1 LCD液晶显示屏原理 液晶(Liquid Crystal):是一种介于固态和液态之间的具有规则性分子排列,及晶体的光学各向异性的有机化合物,液晶在受热到一定温度的时候会呈现透明状的液体状态,而冷却则会出现结晶颗粒的混浊固体状态,因为物理上具有液体与晶体的特性,故称之为“液晶”。 液晶显示器LCD(Liquid Crystal Display):是新型平板显示器件。显示器中的液晶体并不发光,而是控制外部光的通过量。当外部光线通过液晶分子时,液晶分子的排列扭曲状态不同,使光线通过的多少就不同,实现了亮暗变化,可重现图像。液晶分子扭曲的大小由加在液晶分子两边的电压差的大小决定。因而可以实现电到光的转换。即用电压的高低控制光的通过量,从而把电信号转换成光像。 2.2 LCD液晶显示屏分类 1.位段型液晶显示模块 位段型液晶显示模块是一种由位段型液晶显示器件与专用的集成电路组装成一体的功能部件。 2.字符型液晶显示模块 字符型液晶显示模块是由字符液晶显示器件与专用的行、列驱动器、控制器、必要的连接件以及结构件装配而成,可以显示数字和西文字符。 3.图形点阵型液晶显示模块 图形点阵型显示模块就是可以动态地显示字符和图片的LCD。图形点阵液晶模块的点阵像素连续排列,行和列在拍布中均没有空隔,不仅可以显示字符,还可以显示连续完整的图像。图形点阵型液晶显示模块有三种类型可供选择:行列驱动型,行列驱动控制型及行列控制型。

史上最详细的触摸屏驱动分析

/*触摸屏驱动程序及分析*/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* For ts.dev.id.version */ #define S3C2410TSVERSION 0x0101 #define WAIT4INT(x) (((x)<<8) | \ S3C2410_ADCTSC_YM_SEN | S3C2410_ADCTSC_YP_SEN | S3C2410_ADCTSC_XP_SEN | \ S3C2410_ADCTSC_XY_PST(3)) #define AUTOPST (S3C2410_ADCTSC_YM_SEN | S3C2410_ADCTSC_YP_SEN | S3C2410_ADCTSC_XP_SEN | \ S3C2410_ADCTSC_AUTO_PST | S3C2410_ADCTSC_XY_PST(0)) static char *s3c2410ts_name = "s3c2410 TouchScreen"; static struct input_dev *dev; static long xp; static long yp; static int count; extern struct semaphore ADC_LOCK; static int OwnADC = 0; static void __iomem *base_addr; /*把GPG12~15 设置为保留模式*/ static inline void s3c2410_ts_connect(void)

我的触摸屏驱动源代码

我的触摸屏驱动源代码 /*C头文件*/ #include "au_types.h" #define DEVICE_NAME "tpanel" #define IRQ_1 7 #define GPIO_1_PORT GPIO_1 #define GPIO_1_PORT_ADDR GPIO_1_BASE // 触摸屏返回值结构体 typedef struct { uint32 pressure; uint32 x; uint32 y; }TS_RET; // 校准值结构体 typedef struct { int32 x; int32 y; }TS_POINT; static TS_POINT TsPoint[10]; #define TS_IOC_MAGIC 0xd9 #define CALIBRATE _IOW(TS_IOC_MAGIC, 1, sizeof(TsPoint)) #define CALIBRATE_START _IOW(TS_IOC_MAGIC, 2, sizeof(uint8)) // 以下为触摸屏控制器管脚设置 #define ADS7843_CSS() writew(0xff, (GPIO_1_PORT_ADDR + 0x200)) // cs = 1 (p1.7) #define ADS7843_CSC() writew(0x00, (GPIO_1_PORT_ADDR + 0x200)) // cs = 0 #define ADS7843_DCLKS() writew(0xff, (GPIO_1_PORT_ADDR + 0x40)) // dclk = 1(p1.4) #define ADS7843_DCLKC() writew(0x00, (GPIO_1_PORT_ADDR + 0x40)) // dclk = 0

linux触摸屏驱动

linux-触摸屏驱动(2009-04-23 14:50) 分类:driver 开发触摸屏驱动,最好的范例莫过于mc68328digi.c的实现。在没有看到原文之前,我把其中用到的结构解析一下。 1,struct ts_pen_info 该结构是触摸屏的核心数据结构。用户程序和驱动程序的交互就是通过该数据结构完成的。结构体里面的x,y坐标和状态是gui中事件驱动的原始数据源。 2,环形队列 gui程序通过read完成对ts_pen_info的提取。而在内核中维护了一个环形队列,只要队列不为空,将立即返回数据给应用程序。 3,中断驱动机制 触摸屏是输入设备,因此使用的是中断驱动机制。只要有触摸事件发生,即向环形队列里面填充一项。 4,定时器的必要性 触摸屏的中断处理函数必然启动一个定时器。定时器的使用是为了检测出Drag操作。当按下触摸屏一直没有松开时,中断只会相应一次。这和触发方式关系不大,不是沿触发和电平触发的问题。主要是触摸屏的中断处理函数没有处理到松开是不会开放中断的。在这段时间内,就是通过定时器不停的启动,检测触摸屏的新坐标的。 5,misc驱动 触摸屏采用Misc结构的驱动。 12.2.1 触摸屏的硬件原理 12.2 触摸屏的设备驱动 12.2.1 触摸屏的硬件原理 按照触摸屏的工作原理和传输信息的介质,我们把触摸屏分为4种:电阻式、电容感应式、红外线式以及表面声波式。 电阻式触摸屏利用压力感应进行控制,包含上下叠合的两个透明层,通常还要用一种弹性材料来将两层隔开。在触摸某点时,两层会在此点接通。四线和八线触摸屏由两层具有相同表面电阻的透明阻性材料组成,五线和七线触摸屏由一个阻性层和一个导电层组成。 所有的电阻式触摸屏都采用分压器原理来产生代表X坐标和Y坐标的电压。如图12.4所示,分压器是通过将两个电阻进行串联来实现的。电阻R1连接正参考电压VREF,电阻R2接地。两个电阻连接点处的电压测量值与R2的阻值成正比。

触摸屏驱动总结

触摸屏驱动总结 触摸屏工作原理 触摸屏的工作原理概括来说就是上报坐标值,X轴、Y轴的值。电容式触摸屏不依靠手指按力创造、改变电压值来检测坐标的,电容屏通过任何持有电荷的物体包括人体皮肤工作(人体所带的电荷)。电容式触摸屏是由诸如合金或是銦錫氧化物(ITO)这样的材料构成,电荷存储在一根根比头发还要细的微型静电网中。当手指点击屏幕,会从接触点吸收小量电流,造成角落电极的压降,利用感应人体微弱电流的方式来达到触控的目的。(这是为什么当你带上手套触摸屏幕时,没有反应的原因),下图可以清晰的说明电容屏的工作原理。

上图显示了触摸屏的组成,可以看到触摸屏由IC控制电路、接口电路、触摸屏感应区组合而成。 当然触摸屏的工作原理我们并不需要去详细了解,我们仅需要知道如何从接口电路获取输入信号、向接口电路输出信号即可。 SPI总线总结 SPI是串行外设接口(Serial Peripheral Interface)的缩写。SPI,是一种高速的,全双工,同步的通信总线。 SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个

从设备,需要至少4根线,事实上3根也可以(单向传输时)。也是所有基于SPI的设备共有的,它们是SDI(数据输入)、SDO(数据输出)、SCLK(时钟)、CS(片选)。 (1)SDO –主设备数据输出,从设备数据输入; (2)SDI –主设备数据输入,从设备数据输出; (3)SCLK –时钟信号,由主设备产生; (4)CS –从设备使能信号,由主设备控制。 其中,CS是控制芯片是否被选中的,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),对此芯片的操作才有效。这就允许在同一总线上连接多个SPI设备成为可能。 structboardinfo { structlist_head list; //用于挂接到链表头board_list上 unsigned n_board_info; //设备信息号,spi_board_info成员的编号structspi_board_infoboard_info[0]; //内嵌的spi_board_info结构 }; //其中内嵌的描述spi设备的具体信息的结构structspi_board_info为: structspi_board_info { /* the device name and module name are coupled, like platform_bus; * "modalias" is normally the driver name. * platform_data goes to spi_device.dev.platform_data, * controller_data goes to spi_device.controller_data, * irq is copied too */ char modalias[SPI_NAME_SIZE]; //名字 const void *platform_data //如同注释写的指向spi_device.dev.platform_data void *controller_data; //指向spi_device.controller_data intirq; //中断号 /* slower signaling on noisy or low voltage boards */ u32 max_speed_hz; //时钟速率 /* bus_num is board specific and matches the bus_num of some * spi_master that will probably be registered later. * * chip_select reflects how this chip is wired to that master; * it's less than num_chipselect. */ u16 bus_num; //所在的spi总线编号 u16 chip_select; /* mode becomes spi_device.mode, and is essential for chips * where the default of SPI_CS_HIGH = 0 is wrong. */ u8 mode; //模式 /* ... may need additional spi_device chip config data here. * avoid stuff protocol drivers can set; but include stuff * needed to behave without being bound to a driver:

2440触摸屏驱动详解

2440触摸屏驱动详解 一、开发环境 ·主机:VMWare--Fedora 9 ·开发板:Mini2440--64MB Nand, Kernel:2.6.30.4 ·编译器:arm-linux-gcc-4.3.2 二、前提知识 1、Linux输入子系统(Input Subsystem): 在Linux中,输入子系统是由输入子系统设备驱动层、输入子系统核心层(Input Core)和输入子系统事件处理层(Event Handler)组成。其中设备驱动层提供对硬件各寄存器的读写访问和将底层硬件对用户输入访问的响应转换为标准的输入 事件,再通过核心层提交给事件处理层;而核心层对下提供了设备驱动层的编程接口,对上又提供了事件处理层的编程接口;而事件处理层就为我们用户空间的应用程序提供了统一访问设备的接口和驱动层提交来的事件处理。所以这使得我们输入设备的驱动部分不在用关心对设备文件的操作,而是要关心对各硬件寄存器的操作和提交的输入事件。下面用图形来描述一下这三者的关系吧! 另外,又找了另一幅图来说明Linux输入子系统的结构,可能更加形象容易理解。如下:

2、输入子系统设备驱动层实现原理: 在Linux中,Input设备用input_dev结构体描述,定义在input.h中。设备的驱动只需按照如下步骤就可实现了。 ①、在驱动模块加载函数中设置Input设备支持input子系统的哪些事件; ②、将Input设备注册到input子系统中; ③、在Input设备发生输入操作时(如:键盘被按下/抬起、触摸屏被触摸/抬起/移动、鼠标被移动/单击/抬起时等),提交所发生的事件及对应的键值/坐标等状态。 Linux中输入设备的事件类型有(这里只列出了常用的一些,更多请看 linux/input.h中):

触摸屏学习及触控程序开发(一)

触摸屏学习及触控程序开发(一) 2009-05-09 15:22:56 来源:环球触摸屏网作者: 【大中小】浏览:319次评论:0条为标准触摸屏编写驱动程序 尽管触摸屏正在迅速普及开来,但大多数开发人员以前从来没有开发过触摸屏产品。本文详细介绍了触摸屏产品的设计步骤,指导读者了解使触摸屏首次工作需要的软硬件细节。 触摸屏如今随处可见。工业控制系统、消费电子产品,甚至医疗设备上很多都装备了触摸屏输入装置。我们平时不经意间都会用到触摸屏。在ATM机上取款、签署包裹,办理登机手续或查找电话号码时都可能会用到触摸屏。 本文介绍了二种较新的CPU,它们都内建了对触摸屏输入的支持。本文将介绍如何编写软件驱动程序,从而能够使用这些微处理器配置、校准触摸屏以及对触摸屏输入持续响应。最终将提供可免费下载和使用的工作代码,作为读者进一步设计的基础。 触摸屏作为输入手段的优点和缺点 没有一种输入方式是十全十美的,对某些特定的应用和产品类型来说,触摸屏不是最好的输入手段。为了让读者清楚的了解触摸屏的特性,下面先概括使用触摸屏作为输入手段的优点和缺点。 首先是优点:触摸屏不可否认的具有酷的感觉,立刻就能使产品的使用变得更有乐趣。同时触摸屏也非常直观。当用户想要选择A选项时,他伸出手指碰一下A选项就可以了。这还不够直观吗?连两岁的婴儿都知道怎样伸手去触摸他(或她)想要的东西。 最后要说的是,触摸屏作为输入装置和系统固定在了一起。如果用户忘记遥控器或鼠标放的位置,就会无法进行输入。而如果具有触摸屏的设备放在用户前面,用户马上就可以用触摸屏进行输入。 再说缺点,触摸屏可能会在不合适的场合下被错误的使用。这里我是指对安全性要求严格的设备,对

触摸屏原理维护与维修

触摸屏原理维护与维修 触摸屏的日常维护 由于技术上的局限性和环境适应能力较差,尤其是表面声波屏,屏幕上会由于水滴、灰尘等污染而无法正常使用,所以触摸屏幕也同普通机器一样需要定期保养维护。并且由于触摸屏是多种电器设备高度集成的触控一体机,所以在使用和维护时应注意以下的一些问题。 1)每天在开机之前,用干布擦拭屏幕。 2)水滴或饮料落在屏幕上,会使软件停止反应,这是由于水滴和手指具有相似的特性,需把水滴擦去。 3)触摸屏控制器能自动判断灰尘,但积尘太多会降低触摸屏的敏感性,只需用干布把屏幕擦拭干净。 4)应用玻璃清洁剂清洗触摸屏上的脏指印和油污。 描硬盘错误,应用程序中最好能设置秘密方式退出应用程序和Windows再断电,例如:四角按规定次序点一下。 7)纯净的触摸屏程序是不需要鼠标光标的,光标只会使用户注意力不集中。 8)应选择足够应用程序使用的最简单的防鼠标模式,因为复杂的模式需要牺牲延时和系统资源。 9)在Windows中,启动较慢的应用程序时,用户有机会进入其他系统。解决的办法是修改SYSTEM.INI文件:将shell=progman.exe(Windows3.x下)或shell=Explorer.exe(Windows95上)直接改为.exe文件。但应用程序应能够直接退出Windows,否则系统无法退出。 10)视环境恶劣情况,定期打开机头清洁触摸屏的反射条纹和内表面。具体的方法是:在机内两侧打开盖板,可以找到松开扣住机头前部锁舌的机关,打开机关即可松开锁舌。抬起机头前部,可以看到触摸屏控制卡,拔下触摸屏电缆,向后退机头可卸下机头和触摸屏。仔细看清楚固定触摸屏的方法后,卸下触摸屏清洗,注意不要使用硬纸或硬布,不要划伤反射条纹。最后,按相反顺序和原结构将机头复原。 三、触摸屏常见故障解析 相信很多人在使用触摸屏时,都遇到触摸屏因出现故障而不能使用的情况。这主要是由于触摸屏是一种比较精密的设备,加之触摸屏多是面向大众开放使用的性质,其使用频率高、使用人员素质良莠不齐,从而造成其故障频繁出现,下面就为大家介绍触摸屏一些常见故障的解决与维护方法: 当触摸屏出现故障后,应首先检查控制卡供电是否正常,Windows驱动是否正常安装,然后检查是否完成了Windows下的触屏校准,“TouchscreenControl”中的参数是否正确,还需要检查串口是否正常和串口线是否连接正常。 下面通过一些实例来说明触摸屏故障的诊断处理方法。 1.触摸屏不准 [故障现象] 一台表面声波触摸屏,用手指触摸显示器屏幕的部位不能正常地完成对应的操作。 [故障分析处理] 这种现象可能是声波触摸屏在使用一段时间后,屏四周的反射条纹上面被灰尘覆盖,可用一块干的软布进行擦拭,然后断电、重新启动计算机并重新校准。还有可能是声波屏的反射条纹受到轻微破坏,如果遇到这种情况则将无法完全修复。 如果是电容触摸屏在下列情况下可运行屏幕校准程序开始--程序--MicrotouchTouchware) 1)第一次完成驱动软件的安装。 2)每次改变显示器的分辨率或显示模式后。 3)每次改变了显示的显示区域后。 4)每次调整了控制器的频率后。 5)每次光标与触摸点不能对应时。 校准后,校准后的数据被存放在控制器的寄存器内,所以每次启动系统后无需再校准屏幕。 2.触摸屏无响应 [故障现象]

触摸屏常见故障解决办法

触摸屏常见故障维修指南 一、触摸屏类 1.表面声波触摸屏 (1) 故障一:触摸偏差 现象1:手指所触摸的位置与鼠标箭头没有重合。 原因1:安装完驱动程序后,在进行校正位置时,没有垂直触摸靶心正中位置。 解决1:重新校正位置。 现象2:部分区域触摸准确,部分区域触摸有偏差。 原因2:表面声波触摸屏四周边上的声波反射条纹上面积累了大量的尘土或水垢,影响了声波信号的传递所造成的。 解决2:清洁触摸屏,特别注意要将触摸屏四边的声波反射条纹清洁干净,清洁时应将触摸屏控制卡的电源断开。 (2) 故障二:触摸无反应 现象:触摸屏幕时鼠标箭头无任何动作,没有发生位置改变。 原因:造成此现象产生的原因很多,下面逐个说明: ①表面声波触摸屏四周边上的声波反射条纹上面所积累的尘土或水垢非常严重,导致触摸屏无法工作; ②触摸屏发生故障; ③触摸屏控制卡发生故障; ④触摸屏信号线发生故障; ⑤计算机主机的串口发生故障; ⑥计算机的操作系统发生故障; ⑦触摸屏驱动程序安装错误。 解决: ①观察触摸屏信号指示灯,该灯在正常情况下为有规律的闪烁,大约为每秒钟闪烁一次,当触摸屏幕时,信号灯为常亮,停止触摸后,信号灯恢复闪烁。 ②如果信号灯在没有触摸时,仍然处于常亮状态,首先检查触摸屏是否需要清洁;其次检查硬件所连接的串口号与软件所设置的串口号是否相符,以及计算机主机的串口是否正常工作。 ③运行驱动盘中的COMDUMP命令,该命令为DOS下命令,运行时在COMDUMP后面加上空格及串口的代号1或2,并触摸屏幕,看是否有数据滚出。有数据滚出则硬件连接正常,请检查软件的设置是否正确,是否与其他硬件设备发生冲突。如没有数据滚出则硬件出现故障,具体故障点待定。 ④运行驱动盘中的SAWDUMP命令,该命令为DOS下命令,运行程序时,该程序将寻问控制卡的类型、连接的端口号、传输速率,然后程序将从控制卡中读取相关数据。请注意查看屏幕左下角的X 轴的AGC和Y轴的AGC数值,任一轴的数值为255时,则该轴的换能器出现故障,需进行维修。 ⑤安装完驱动程序后进行第一次校正时,注意观察系统报错的详细内容。" 没有找到控制卡"、"触摸屏没有连接"等,根据提示检查相应的部件。如:触摸屏信号线是否与控制卡连接牢固,键盘取电线是否全部与主机连接等。⑥如仍无法排除,请专业人员维修。 故障总结 1. 上电无反应 主板逆变器部分损坏 2. 上电烧保险 逆变器烧坏 三极管D667击穿 3. 上电蓝屏,通电十分钟后屏幕变为蓝屏 主板CPU坏

相关主题
文本预览
相关文档 最新文档