基于ARM9的触摸屏设计与研究Word文件下载.docx
《基于ARM9的触摸屏设计与研究Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于ARM9的触摸屏设计与研究Word文件下载.docx(18页珍藏版)》请在冰点文库上搜索。
2.3、触摸屏的驱动程序开发-9-
3、触摸屏简单程序设计-11-
3.1、触摸屏的校准-11-
3.2、触摸屏编程实例-13-
3.2.1触摸屏的程序设计方法-13-
3.2.2、部分程序代码-13-
4、总结-15-
参考文献-16-
基于ARM9处理器的S3C2440触摸屏研究与设计
金鹏举(河南大学2011级测控专业)
摘要:
随着计算机技术、微电子技术和网络技术的迅速发展,嵌入式系统在工农业等诸多领域得到了广泛的应用。
本文简要介绍了嵌入式系统的结构、特点及其发展状况,并简述了ARM9处理器S3C2440触摸屏接口及四线电阻式触摸屏的相关原理,着重讲述了基于ARM9处理器S3C2440触摸屏的驱动开发和触摸屏坐标校准方法以及简单程序设计思路。
经过验证,该驱动程序运行良好,基于触摸屏的简单程序设计达到预期目标。
关键词:
嵌入式Linus,触摸屏,S3C2440,驱动
Abstract:
Withtherapiddevelopmentofcomputertechnology,microelectronictechnologyandnetworktechnology,embeddedsystemsinindustryandagriculture,andmanyotherfieldshasbeenwidelyused.Thispaperdescribesthestructure,characteristicsanddevelopmentofembeddedsystemsandrelatedprinciplesoutlinedS3C2440ARM9processortouchscreeninterfaceandfour-wireresistivetouchscreen,focusesontheARM9processorS3C2440-basedtouchscreendriverdevelopmentandtouchscreencoordinatecalibrationmethodandasimpleprogrammingideas.Afterverification,thedriverisrunningwell,basedonasimpletouchscreendesignprogramachievethedesiredobjectives.
Keywords:
EmbeddedLinus,touchscreen,S3C2440,driving
1、嵌入式系统概述
1.1、课题研究背景
随着计算机相关技术的发展,ARM嵌入式系统受到越来越广泛的应用,与人们生活的结合也越来越紧密。
触摸屏设备因其友善的人机交互性,操作方便灵活,输入速度快,被广泛的应用于这种嵌入式领域中。
嵌入式Linux系统具有开发源代码、内核稳定、可裁减性等特点,吸引着众多商业公司和自由软件开发者的目光,成为嵌入式系统领域不可或缺的操作系统之一。
触摸屏是一种输入设备,操作简单易学,可靠性高,不占额外的空间,是最常用的便携式系统的输入设备。
特别是电阻式触摸屏,它结构简单、成本低,透光效果好,工作环境和外界完全隔离,不怕灰尘和水气,同时具有高解析度、高速传输反应、一次校正、稳定性高、不漂移等特点,因而被广泛用于工业控制领域。
1.2、嵌入式系统概述
嵌入式系统(EmbeddedSystem)的一般定义为:
“嵌入式系统是以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应于应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统”。
它的主要特点是嵌入、专用。
按照历史性、本质性、普遍性的要求,嵌入式系统定义为:
“嵌入到对象体系中的专用计算机系统”。
对象系统则是指嵌入式系统所嵌入的宿主系统。
嵌入式系统的特点是其目的性与针对性,即每一套嵌入式系统的开发设计都有其特殊的应用场合与特定功能,这也是嵌入式系统与通用的计算机系统最主要的区别。
另外,嵌入式技术对实时性要求较高,由于嵌入式系统是为特定的目的而设计的,且常常受到空间、成本、存储、带宽等条件的限制,因此,它必须最大限度地在硬件上和软件上“量身定做”以提高效率,从而缩短开发周期、降低成本。
1.2.1嵌入式处理器的种类
嵌入式处理器的体系结构一般为RISC(精简指令集),位数一般为32位,寻址空间可以从64KB到256MB,处理器工作频率可以达到上百MHz。
嵌入式微处理器的主要发展方向是小体积、高性能、低功耗。
专业分工也越来越明显,从功能上看,用于嵌入式系统的嵌入式处理器主要分为4类:
嵌入式微处理器、嵌入式微控制器、嵌入式DSP、嵌入式片上系统
(1).嵌入式微处理器
嵌入式微处理器的基础是通用计算机中的CPU。
在应用中,将微处理器装配
在专门设计的电路板上,只保留和嵌入式应用有关的功能,这样可以大幅度减小系统体积和功耗。
为了满足嵌入式应用的特殊要求,嵌入式微处理器虽然在功能上和标准微处理器基本是一样的,但在工作温度、抗电磁千扰、可靠性等方面一般都做了各种增强。
嵌入式微处理器主要包括:
ARM、PowerPC、MIPS。
ARM即AdvancedRISCMachines的缩写。
既是一个公司的名字,也是一类微处理器的通称,还可以认为是一种技术的名字。
ARM公司成立于1990年,是知识产权供应商,本身并不生产芯片,靠转让设计许可,由合作伙伴公司来生产各具特色的芯片。
现在,ARM微处理器及技术的应用已经深入到工业控制、无线通讯、网络应用、消费类电子产品、成像和安全产品等各个领域,并会在将来得到更加广泛的应用。
(2).嵌入式微控制器
嵌入式微控制器又称单片机。
就是将整个计算机系统集成到一块芯片中。
嵌入式微控制器一般以某一种微处理器内核为核心,芯片内部集成ROM/EPROM,RAM、总线、总线逻辑、定时1计数器、WatchDog,VO、串行口、脉宽调制输出、A/D,D/A,FlashRAM.EEPROM等各种必要功能模块。
为适应不同的应用需求,一般一个系列的单片机具有多种衍生产品。
(3).嵌入式DSP处理器
DSP处理器对系统结构和指令进行了特殊设计,使其适合于执行DSP算法,编译效率较高,指令执行速度也较高。
在数字滤波、FFT、谱分析等方面DSP算法正在大量进入嵌入式领域,DSP应用正在从通用单片机中以普通指令实现DSP功能,过渡到采用嵌入式DSP处理器。
(4).嵌入式片上系统(SystemOnChip)
随着VLSI设计的普及化及半导体工艺的迅速发展,可以在一块硅片上实现一个更为复杂的系统,这就是SystemOnChip(SOC)。
各种通用处理器内核将作为SOC设计公司的标准库,和许多其它嵌入式系统外设一样,成为VLSI设计中一种标准的器件,用标准的VHDL等语言描述,存储在器件库中。
1.2.2嵌入式操作系统概述
为了使嵌入式系统的开发更加方便和快捷,需要有专门负责管理存储器分配、中断处理、任务调度等功能的软件模块,这就是嵌入式操作系统。
嵌入式操作系统是用来支持嵌入式应用的系统软件,通常包括与硬件相关的底层驱动程序、系统内核、设备驱动接口、通信协议、图形用户界面(GUI)等。
由于嵌入式操作系统屏蔽了底层硬件的复杂性,使得开发者通过操作系统提供的API函数就可以完成大部分工作,因此大大简化了开发过程,提高了系统的稳定性。
嵌入式系统的开发者现在已经从反复进行硬件平台设计的过程中解脱出来,从而可以将主要精力放在满足特定的需求上。
目前流行的嵌入式操作系统可以分为两类:
一类是将运行在个人电脑上的操作系统向下移植到嵌入式系统中,形成的嵌入式操作系统,如微软公司的WinCE及其新版本,SUN公司的Java操作系统,朗讯科技公司的Inferno,嵌入式Linux等。
这类系统经过个人电脑或高性能计算机等产品的长期运行考验,技术日趋成熟,其相关的标准和软件开发方式己被用户普遍接受,同时积累了丰富的开发工具和应用软件资源。
另一类是专门为嵌入式开发的操作系统,如WindRiver公司的VxWorks,QSSL公司的QNX,ATI公司的Nucleus,这类产品在操作系统的结构和实现上都针对所面向的应用领域,对实时性、高可靠性等进行了精巧的设计,而且提供了独立而完备的系统开发和测试工具,较多地应用在军用产品和工业控制等领域中。
1.2.3Linux嵌入式系统的基本结构
Linux嵌入式系统的基本结构如图1-1所示。
第一层为底层的硬件设备,包括嵌入式微处理器以及各种外围设备,例如ROM、RAM、显示屏、串口等,第二层为用于操作系统引导BootLoader,第三层是Linux操作系统以及支持操作系统读取数据的根文件系统,第四层是设备驱动程序和系统库函数,第五层是针对特定应用的应用程序。
1.3嵌入式系统的发展现状
国外早在20世纪70、80年代就开始研究使用嵌入式,发展到现在已经较为成熟。
芯片方面,各大微处理器制造厂商都有自己的嵌入式处理器产品,并且其设计理念和制造工艺仍然在不断提高。
嵌入式操作系统方面,早在80年代就出现了嵌入式操作系统,相应嵌入式产品也层出不穷。
随着应用的发展,嵌入式产品的涵盖范围和领域也越来越广泛,几乎包括了我们周围的所有电器设备,如电视机顶盒、掌上PDA、移动计算设备、多媒体设备、医疗仪器乃至路由器、交换机等。
进入20世纪90年代,随着信息化、智能化、网络化的发展,嵌入式系统技术也获得了更为广阔的发展空间,嵌入式技术全面展开,目前已成为通信和消费类产品的共同发展方向。
在自动控制领域,嵌入式系统不仅应用于ATM机、自动售货机、工业控制等专用设备,它还与移动通信设备、GPS、娱乐、PDA设备等相结合,发挥出巨大作用。
目前,嵌入式系统己经广泛应用到工业、交通、能源、通信、科研、医疗卫生、国防以及日常生活等领域。
国内的嵌入式技术研究起步晚,到目前为止还没有比较成功的嵌入式微处理器上市,嵌入式实时操作系统方面,拥有自主知识产权的产品也很少,一般都使用国外的商业嵌入式操作系统或开源的操作系统。
目前国内的嵌入式产品种类比较多,包括了消费电子,汽车电子,医疗器械,工业控制,家用电子各个方面。
目前市面上主要使用的嵌入式处理器有三种:
美国MIPS公司研发的MIPS处理器;
英国ARM公司研发的ARM处理器;
IBM、Apple、Motorola公司开发的PowerPC芯片。
其中ARM处理器占有最大的市场份额。
嵌入式操作系统方面,嵌入式Linux和WinCE两者的应用最广泛,面对Linux开源操作系统不断争夺市场份额,Microsoft已经降低WinCE的版权费用,并且在5.0版本中对部分代码开源,6.0版本更是扩大了开源代码的比重。
2、触摸屏驱动开发
2.1、触摸屏简介
触摸屏作为人机交互的输入设备,由于其操作方便灵活,输入速度快,被广泛的应用于这种嵌入式领域中。
按照工作原理和传输信息的介质不同,触摸屏分为电阻式、电容感应式、红外线式以及表面声波式。
生活中常见的触摸屏有电容式触摸屏和电阻式触摸屏两大类。
其中电容式触摸屏反应灵敏,并且支持多点触控;
而电阻式触摸屏的抗干扰能力比较强,适用于比较恶劣的环境。
2.2、电阻式触摸屏的工作原理
触摸屏一般安装在显示屏的前端,主要由触摸屏检测部件和触摸屏控制器组成。
在这里采用的是四线电阻式触摸屏。
四线电阻式触摸屏是电阻式家族中应用最广、最普及的一种。
其结构由下线路导电ITO层和上线路导电ITO层组成。
中间有细微绝缘点隔开,当触摸屏表面无压力时,上下线路成开路状态。
一旦有压力施加到触摸屏上,上下线路导通,控制器通过下线路导电ITO层在X坐标方向上施加驱动电压,通过上线路导电ITO层上的探针,,通过控制器改变施加电压的方向,侦测Y方向上的电压。
由于按压点不同,所测得的X和Y方向的电压值也不同,屏幕的坐标与电压值有着一一对应的关系,可以通过采样得到的电压值推算出触点的X坐标和Y坐标,从而明确触点位置。
2.3、S3C2440触摸屏接口电路
1、普通转换模式:
只作为AD转换器使用,不适用触摸屏
2、分离的X/Y方向转换模式:
触摸屏控制器可以工作在两个转换模式之一,X方向转换模式写X方向转换数据到ADCDAT0,故触摸屏接口产生中断源给中断控制器。
Y方向转换模式写X方向转换数据到ADCDAT1,故触摸屏接口产生中断源给中断控制器。
3、自动顺序X/Y方向转换模式:
触摸屏控制器在写入X方向转换数据到ADCDAT0和写入Y方向转换数据到ADCDAT1后,触摸屏接口产生中断源给中断控制器。
4、等待中断模式:
当笔尖落下时,触摸屏控制器产生中断信号,然后必须清除等待中断模式。
所以每次点击触摸屏之前,触摸屏控制器都应设置成这种工作模式。
ADC和触摸屏接口功能方框图
2.3.2和触摸屏相关的寄存器
(1)、ADC控制寄存器ADCCON
(2)、ADC触摸屏控制寄存器ADCTSC
ADC启动延时寄存器ADCDLY
(3)、ADC数据转换寄存器ADCDAT0
(4)、ADC数据转换寄存器ADCDAT1
2.3、触摸屏的驱动程序开发
设备驱动程序在Linux内核中扮演着特殊的角色,使某个特定硬件响应一个定义良好的内部编程接口,用户的操作通过一组标准化的调用执行,而这些调用独立于特定的驱动程序。
将这些调用映射到作用于实际硬件的设备特有操作上,则是设备驱动程序的任务。
采用外部晶体管接触摸屏到触摸屏中断服务程序中断到来以后立即屏蔽掉中断,使中断不能再次进入。
由于触摸屏一段时间内是被连续按下的,所以这里还需要设置一个timer()函数,用于不断读取触摸屏坐标数据。
Read函数用于读取触摸屏座标。
当触摸笔抬起后退出触摸屏的中断服务程序,使中断使能,以便触摸笔再次按下时响应中断。
1)中断处理当触摸笔按下时,内核响应中断,进入中断处理程序。
中断设为下降沿有效,当中断到来后,屏蔽中断,以保证在触摸屏被连续按下时,不会连续的触发中断,进入中断处理程序。
在中断处理程序中设置一个timer函数,这样连续监测从触摸屏取得的值。
如果触摸笔按下就读取坐标放到缓冲区中;
如果触摸屏抬起,就在缓冲区中放入抬起信号。
当触摸笔抬起时,打开中断,保证下一次触摸屏被按下时可以触发。
为了加快中断的响应速度,不在一个中断处理程序中停留过久,将digi_tasklet压入任务调度后立即退出,从而加快了整个系统的速度。
在digi_tasklet中已经将初始化digi_tasklet_init()为其调度任务,通过调用digi_tasklet_action()函数来读取触摸屏坐标,并且在digi_taskelet中设置wake_up_interruptible()用于唤醒休眠的进程。
StaticvoidS3C2410_isr_ts(intirq,void*dev_id,
structpt_regs*regs)
{If(tsdev.penstatus=pen_down)//如果有笔按下
{Touch_pan_clear_inter();
//清中断
Touch_pan_disable_inter();
Tasklet_schedule(&
digi_tasklet);
//进程调度
}
return;
2)read()函数首先启动AD转换,写ADC控制寄存器的控制字以及ADCTSCADC(触摸屏控制寄存器)控制字,设置的判断返回触摸点坐标值是否在有效范围内,如果在有效范围内采样标志ts1pressure=1,如果不在有效范围之内采样标志ts1pressure=0;
read函数中通过调用copy_to_user(),实现将内核空间数据拷贝到用户空间。
如果驱动程序无法立即满足请求或调用read()函数时没有数据可读,采用阻塞I/O方式,使该进程在read上休眠,另一个进程开始运行,只有当进程被唤醒后,该进程重新开始运行。
等待队列wait_queue_head_,t就相当于一个进程链表,包含了等待某个特定事件的所有进程。
等待队列为空,没有数据可读,如果指定的是非阻塞I/O,返回-EAGAIN;
如果是阻塞I/O的话,则要进行休眠Wait_event_interruptible(wq,tsdev.head=tsdev.tail)。
Read()
{start_adc_x();
//启动X轴的AD转换
ADCCON=0X447a;
//定义ADC控制寄存器,普通模式,
//模拟输入通道AIN7
mode_x_axis();
//设置ADC触摸屏控制其寄存器
//(ADCTSC)
X=(ADCDAT0&
0x3ff);
//ADCDATA0为ADC转换数据
//寄存器,存放转换数据
Start_adc_Y();
//启动Y轴的AD转换
ADCCON=0XC46a;
//启动ADC控制寄存器,普通模
//式,模拟输入通道AIN5
mode_Y_axis();
Y=(ADCDAT1&
//转换的数据放入数据寄存器中
ts.penstatus=pen_down;
//笔中断的状态设置为按下
ts.x=x;
ts.y=y//存放转换后的数据
If(ts.x<
92||ts.y<
72||ts.x>
979||ts.y>
1002)
//如果在触摸屏范围之外,状态设置为0
{ts.pressure=0;
}else{
ts.pressure=1;
Copy_to_user()//将内核空间的数据拷贝到用户空间}
3、触摸屏简单程序设计
3.1、触摸屏的校准
在实际的应用中,通常触摸屏是作为与显示屏配合使用的输入设备,需要从触摸屏采样得到的坐标与屏幕的显示坐标做一个映射。
常用的触摸屏校准方法有三点校准法和五点校准法。
以下仅对三点校准法做简单介绍
三点校准法当触摸屏与液晶屏间的角度差很小时,经过推理可以假设触摸屏与液晶显示器各点之间的对应关系为(设液晶显示器的坐标为(XL,YL),触摸屏的坐标为(X,Y)):
XL=AX+BY+C
YL=DX+EY+F
因为要取三个点进行校准,所以存在六个变量,即要通过六个方程式求出液晶显示器的坐标。
此处要求三个点尽量分散,最好为左上角、中间、右下角三点。
得:
XL1=AX1+BY1+C
XL2=AX2+BY2+C
XL3=AX3+BY3+C
YL1=DX1+EY1+F
YL2=DX2+EY2+F
YL3=DX3+EY3+F
可求出A、B、C、D、E、F的值,一旦这些参数值定下来,便可利用上面的方程组,通过触摸屏上的原始数据计算出它在LCD显示器上的对应点。
上述联立方程组的未知量已求解出,此处不再推导。
这里直接跳过中间步骤得出最后结论,将K作为各方程式的公分母,便可得出未知量:
K=(X1-X3)(Y2-Y3)-(X2-X3)(Y1-Y3)
A=((XLl-XL3)(Y2-Y3)-(XL2-XL3)(Y1-Y3))/K
B=((X1-X3)(XL2-XL3)-(XL1-XL3)(X2-X3))/K
C=(Y1(X3XL2-X2XL3)+Y2(XlXL3-X3XL1)+Y3(X2XL1-X1XL2))/K
D=((YL1-YL3)(Y2-Y3)-(YL2-YL3)(Y1-Y3))/K
E=((X1-X3)(YL2-YL3)-(YLl-YL3)(X2-X3))/K
F=(Y1(X3YL2-X2YL3)+Y2(X1YL3-X3YL1)+Y3(X2YL1-X1YL2))/K
基于此,通过三个校准点便可确定触摸屏与液晶屏的对应关系,进行校准。
当
Xl=Ax+By+C
Yl=Dx+Ey+F时
y=(Yl-D*Xl+C*D-F)/(E-D*B)
x=(Xl-B*y-C)/A
3.2、触摸屏编程实例
3.2.1触摸屏的程序设计方法
在触摸的过程中,CPU需要知道三件事情:
1、触摸屏在什么时候被按下2、触摸屏被按下后要进行X和Y方向的电压测量3、触摸屏在什么时候抬起
对触摸屏进行初始化的步骤如下:
1.设置ADC工作时钟
2.设置触摸屏工作模式
3.开触摸屏中断,设置中断服务函数
中断服务函数:
1.设置触摸屏接口模式
2.设置ADC启动延时时间
3.启动A/D转换
4.等待A/D转换完成
5.读取X和Y方向转换数据
6.设置为等待抬起中断模式,循环检测是否发生中断
7.重新设置为按下中断模式
3.2.2、部分程序代码
LCD的初始化:
voidLCD_Init(void)
{
/*第一步:
配置GPIO为LCD功能引脚*/
rGPCUP=0x00000000;
rGPCCON=0xaaaa02aa;
rGPDUP=0x00000000;
rGPDCON=0xaaaaaaaa;
//InitializeVD[15:
8]
/*第二步:
配置LCD_PWRDN背光引脚*/
rGPGCON=rGPGCON|(3<
<
8);
/*第三步:
配置LCDCON1~5*/rLCDCON1=(CLKVAL_TFT<
8)|(MVAL_USED<
7)|(PNRMODE_TFT<
5)|(BPPMODE_TFT<
1)|0;
rLCDCON2=(VBPD<
24)|(LINEVAL<
14)|(VFPD<
6)|(VSPW);
rLCDCON3=(HBPD<
19)|(HOZVAL<
8)|(HFPD);
rLCDCON4=(HSPW);
rLCDCON5=(FRM565<
11)|(INVVCLK<
10)|(INVVLINE<
9)|(INVVFRAME<
8)|(INVVD<
7)|(INVVDEN<
6)|(INVPWREN<
5)|(INVLEND<
4)