- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
测控系统中触摸屏驱动的研发
1 引言
21世纪计算机迈入新的充满机遇的后PC时代,人们越来越多地接触到嵌入式这个概念。S3c2410是韩国三星公司生产的基于ARM公司16/32位微控制器ARM920T内核的RISC微处理器,主频最高可达到203MHZ[1]。S3c2410以其卓越的性能和良好的扩展性为手持设备和一般类型应用提供了低价格、低功耗、高性能的小型嵌入式微控制器的解决方案,从而可以应用于智能手机、数码相机、信息家电、PDA、移动终端、GPS等领域。Linux操作系统有成本低廉、支持多硬件平台、源代码开放、可订制内核、性能优异、有良好的网络支持等优势。Linux遵守GPL协议,可以在GNU精神下任意修改和裁减其内核,并且使用了众多的GNU开源软件,从而降低了项目的开发成本。嵌入式Linux继承了Linux的全部优点,成为在嵌入式开发中最常被应用的操作系统之一。触摸屏由于其操作简单、方便灵活、便于携带、占用空间小、友好的操作界面,逐渐取代键盘和普通显示器,成为新的人机交流的平台。本文里将讨论在S3c2410平台条件下,触摸屏在Linux操作系统中,驱动程序的研究与开发。
2硬件系统组成
2.1触摸屏原理
本文采用四线电阻式触摸屏,这种触摸屏利用压力感应进行控制。电阻触摸屏的主要部分是一块与显示器表面非常配合的电阻薄膜屏,这是一种多层的复合薄膜,它以一层玻璃或硬塑料平板作为基层,表面涂有一层透明氧化金属(透明的导电电阻)导电层,上面再盖有一层外表面硬化处理、光滑防擦的塑料层、它的内表面也涂有一层涂层、在他们之间有许多细小的(小于1/1000英寸)的透明隔离点把两层导电层隔开绝缘。当手指触摸屏幕时,两层导电层在触摸点位置就有了接触,电阻发生变化,在X和Y两个方向上产生信号,然后送触摸屏控制器。控制器侦测到这一接触并计算出X和Y的位置,再根据模拟鼠标的方式运作。这就是电阻技术触摸屏的最基本的原理[2]。四线电阻模拟量技术的两层透明金属层工作时每层均增加5V恒定电压:一个竖直方向,一个水平方向。总共需四根电缆。四线电阻触摸屏具有高解析度,高速传输反应,表面硬度处理,减少擦伤、刮伤及防化学处理,具有光面及雾面处理,一次校正,稳定性高,永不漂移的特点[3]。
2.2S3c2410芯片介绍
S3c2410是Samsung公司开发的16/32位微处理器。S3c2410采用了ARM920T的内核,主频最靠可达203MHZ,它为开发者提供了丰富的内部设备(见图1):分开的16KB的指令Cache和16KB数据Cache,MMU虚拟存储器管理,LCD控制器(支持STN&TFT),支持Nand Flash系统引导,系统管理器(片选逻辑和SDRAM控制器),3通道UART,4通道DMA,4通道PWM定时器,I/O端口,RTC,8通道10位ADC和触摸屏接口,IIC-BUS接口,USB主机,USB设备,SD主卡—MMC卡接口,2通道的SPI以及内部PLL时钟倍频器[4]。
图1 S3C2410系统框架
2.3S3c2410触摸屏控制器
S3C2410具有8通道模拟输入的10位CMOS模数转换器(ADC)。它将输入的模拟信号转换为10位的二进制数字代码。在2.5MHz的A/D转换器时钟下,最大转化速率可达到500KSPS。A/D转换器支持片上采样和保持功能,并支持掉电模式。S3C2410的AIN[7]和AIN[5]用于连接触摸屏的模拟信号输入。触摸屏接口电路一般由触摸屏,4个外部晶体管和一个外部电压源组成。触摸屏接口的控制和选择信号(nYPON,YMON,nXPON和XMON) 连接切换X坐标和Y坐标转换的外部晶体管。模拟输入引脚(AIN[7],AIN[5])则连接到触摸屏引脚[5]。触摸屏控制接口包括一个外部晶体管控制逻辑和具有中断产生逻辑的ADC接口逻辑(见图2)。
2.4触摸屏接口工作模式
2.4.1普通转换模式
普通转换模式是用作一般目的下的ADC转换。这个模式可以通过设置ADCCON和ADCTSC来进行对AD转换的初始化;而后读取ADCDAT0的XPDATA域的值来完成转换。
2.4.2独立的X/Y轴的坐标转换模式
独立的X/Y轴坐标转换模式可以分为两个转换步骤:X轴坐标转换和Y轴坐标转换,这两个过程是各自独立完成的。
2.4.3连续X/Y轴坐标转换模式
触摸屏控制器将自动地切换X轴坐标和Y轴坐标并读取两个坐标轴方向上的坐标。
2.4.4中断模式
静态模式实际上是在等待触摸笔的点击。在触摸笔点击到触摸屏上时,控制器产生中断信号。中断产生后,就可以通过设置适当的转换模式来读取X和Y的位置。
2.4.5静态(Standby)模式
当ADCCON寄存器的STDBM位被设为1时,Standby模式被激活。在该模式下,A/D转换操作停止,ADCDAT0寄存器的XPDATA域和ADCDAT1寄存器的YPDATA域保持着先前转换所得的值。
图2 S3c2410与四线电阻式触摸屏连接电路原理图
3Linux系统中触摸屏驱动程序的实现
Linux操作系统将硬件设备作为一般文件,我们可以通过访问设备文件来访问我们所要使用的设备。在Linux操作系统中,设备文件分字符设备和块设备,触摸屏属于字符设备[6]。字符设备是指在I/O传输过程中以字符为单位进行传输的设备,当一台字符型设备在硬件上与主机相连之后,必须为这台设备创建字符特别文件。设备与驱动程序的通信方式依赖于硬件接口。当设备上的数据传输完成时,硬件通过总线发出中断信号导致系统执行一个中断处理程序。中断处理程序与设备驱动程序协同工作完成数据传输的底层控制[7]。
3.1屏驱动模块的初始化
S3c2410触摸屏驱动模块的加载和卸载是通过加载函module_init(s3c2410_ts_init)和卸载函数module_exit(s3c2410_ts_exit)来实现。
主要的触摸屏模块初始化程序如下:
Ret=register_chrdev (0, DEVICE_NAME, &s3c2410_fops);
//调用register_chrdev(),向系统申请,系统为驱动程序动态的分配一个主设备号
set_GPIO_mode (GPIO106_nYPON_MD);
set_GPIO_mode (GPIO105_YMON_MD);
set_GPIO_mode (GPIO104_nXPON_MD);
set_GPIO_mode (GPIO103_XMON_MD);
//设置IO端口为XP,YM,YP和YM
ret=request_irq (IRQ_ADC_DONE, s3c2410_isr_adc, SA_INTERRUPT, DEVICE_NAME, s3c2410_isr_adc);
//设置了IRQ_ADC_DONE中断,按下触摸屏时触发,中断处理函数为s3c2410_isr_adc
ret=request_irq (IRQ_TC, s3c2410_isr_tc, SA_INTERRUPT, DEVICE_NAME, s3c2410_isr_tc);
//设置了IRQ_TC中断,松开触摸屏时触发,中断处理函数为s3c2410_isr_tc
devfs_tsraw=devfs_register (devfs_ts_dir,”0raw”, DEVFS_FL_DEFAULT, tsMajor, TSRAW_MINOR, S_IFCHR|S_IRUSR|S_IWUSR, &s3c2410_fops, NULL);
//设备驱动程序的注册
Static struck file operations s3c2410_fops=
{
owner::THIS_MODULE;
open::s3c2410_ts_open;
read: s3c2410_ts_read;
release: s3c2410_ts_release;
poll: s3c2410_ts_poll;
}
//对驱动程序与应用程序接口file operations结构的s3c2410_fops定义
static int s3c2410_ts_open (struck inode *inode, struct file *file)
{
tsdev.head=tsdev.tail=0;
tsdev.penStatus=PEN_UP;
#ifdef HOOK_FOR_DRAG
init_timer (&ts_timer); ts_timer.function=ts_timer_handler;
#endif
TsEvent=tsEvent_raw;
init_waitqueue_head (& (tsdev.wq));
MOD_INC_USE_COUNT;
return 0 ;}
//打开设备时对定时器进行初始化
3.2中断处理函数
主要是分别在static void s3c2410_isr_adc(int irq,void *dev_id,struct pt_regs *reg)和static void s3c2410_isr_tc(int irq,void *dev_id,struct pt_regs *reg)调用s3c2410_get_XY()函数实现的。
3.3触摸屏数据的读取,处理与传递
触摸操作时具有,PEN_UP, PEN_DOWN和PEN_SAMPLE三种工作状态,当出现触摸屏动作时,PEN_DOWN动作开始,并打开定时器,进行数据采集,最后得到LCD的坐标[8],主要核心是得到坐标的函数static inline void s3c2410_get_XY(void)。
最终应用程序通过调用read()函数获取触摸屏的数据,并把数据传递给应用程序。
count=tsRead (&ts_ret);
if (count) copy_to_user (buffer,(char *)&te_ret,count);
//读取触摸屏数据,并传向用户
4结论
本文简单的介绍了四线电阻式触摸屏工作原理和S3c2410的内部组成,并且构建了S3c2410和四线电阻式触摸屏的接口电路,开发了在Linux操作系统中的触摸屏驱动程序,并使其成功应用于野外测量和检测的工作中去,为野外检测工作提供了,稳定,高性能,便于携带的嵌入式平台仪器。