当前位置:文档之家› 触摸屏驱动

触摸屏驱动

触摸屏驱动
触摸屏驱动

二、前提知识

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口、初始化寄存器、申请中断、初始化输入设备、将输入设备注册到输入子系统。代码如下:

#include

#include

#include

#include

#include

#include

#include

#include

#include

/*用于保存从平台时钟列表中获取的ADC时钟*/

static struct clk *adc_clk;

/*定义了一个用来保存经过虚拟映射后的内存地址*/

static void __iomem *adc_base;

/*定义一个输入设备来表示我们的触摸屏设备*/

static struct input_dev *ts_dev;

/*设备名称*/

#define DEVICE_NAME "my2440_TouchScreen"

/*定义一个WAIT4INT宏,该宏将对ADC触摸屏控制寄存器进行操作

S3C2410_ADCTSC_YM_SEN这些宏都定义在regs-adc.h中*/

#define WAIT4INT(x)(((x)<<8)| S3C2410_ADCTSC_YM_SEN |

S3C2410_ADCTSC_YP_SEN | \

S3C2410_ADCTSC_XP_SEN | S3C2410_ADCTSC_XY_PST(3)) static int __init ts_init(void)

{

int ret;

/*从平台时钟队列中获取ADC的时钟,这里为什么要取得这个时钟,因为ADC的转换频率跟时钟有关。

系统的一些时钟定义在arch/arm/plat-s3c24xx/s3c2410-clock.c中*/

adc_clk = clk_get(NULL,"adc");

if(!adc_clk)

{

/*错误处理*/

printk(KERN_ERR "falied to find adc clock source\n");

return-ENOENT;

}

/*时钟获取后要使能后才可以使用,clk_enable定义在arch/arm/plat-s3c/clock.c 中*/

clk_enable(adc_clk);

/*将ADC的IO端口占用的这段IO空间映射到内存的虚拟地址,ioremap定义在io.h 中。

注意:IO空间要映射后才能使用,以后对虚拟地址的操作就是对IO空间的操作, S3C2410_PA_ADC是ADC控制器的基地址,定义在mach-s3c2410/include/mach/map.h 中,0x20是虚拟地址长度大小*/

adc_base = ioremap(S3C2410_PA_ADC, 0x20);

if(adc_base ==NULL)

{

/*错误处理*/

printk(KERN_ERR "failed to remap register block\n");

ret =-EINVAL;

goto err_noclk;

}

/*初始化ADC控制寄存器和ADC触摸屏控制寄存器*/

adc_initialize();

/*申请ADC中断,AD转换完成后触发。这里使用共享中断IRQF_SHARED是因为该中断号在ADC驱动中也使用了,

最后一个参数1是随便给的一个值,因为如果不给值设为NULL的话,中断就申请不成功*/

ret = request_irq(IRQ_ADC, adc_irq, IRQF_SHARED | IRQF_SAMPLE_RANDOM, DEVICE_NAME, 1);

if(ret)

{

printk(KERN_ERR "IRQ%d error %d\n", IRQ_ADC, ret);

ret =-EINVAL;

goto err_nomap;

}

/*申请触摸屏中断,对触摸屏按下或提笔时触发*/

ret = request_irq(IRQ_TC, tc_irq, IRQF_SAMPLE_RANDOM, DEVICE_NAME, 1);

if(ret)

{

printk(KERN_ERR "IRQ%d error %d\n", IRQ_TC, ret);

ret =-EINVAL;

goto err_noirq;

}

/*给输入设备申请空间,input_allocate_device定义在input.h中*/

ts_dev = input_allocate_device();

/*下面初始化输入设备,即给输入设备结构体input_dev的成员设置值。

evbit字段用于描述支持的事件,这里支持同步事件、按键事件、绝对坐标事件, BIT宏实际就是对1进行位操作,定义在linux/bitops.h中*/

ts_dev->evbit[0]= BIT(EV_SYN)| BIT(EV_KEY)| BIT(EV_ABS);

/*keybit字段用于描述按键的类型,在input.h中定义了很多,这里用BTN_TOUCH 类型来表示触摸屏的点击*/

ts_dev->keybit[BITS_TO_LONGS(BTN_TOUCH)]= BIT(BTN_TOUCH);

/*对于触摸屏来说,使用的是绝对坐标系统。这里设置该坐标系统中X和Y坐标的最小值和最大值(0-1023范围)

ABS_X和ABS_Y就表示X坐标和Y坐标,ABS_PRESSURE就表示触摸屏是按下还是抬起状态*/

input_set_abs_params(ts_dev, ABS_X, 0, 0x3FF, 0, 0);

input_set_abs_params(ts_dev, ABS_Y, 0, 0x3FF, 0, 0);

input_set_abs_params(ts_dev, ABS_PRESSURE, 0, 1, 0, 0);

/*以下是设置触摸屏输入设备的身份信息,直接在这里写死。

这些信息可以在驱动挂载后在/proc/bus/input/devices中查看到*/

ts_dev->name = DEVICE_NAME;/*设备名称*/

ts_dev->id.bustype = BUS_RS232;/*总线类型*/

ts_dev->id.vendor = 0xDEAD;/*经销商ID号*/

ts_dev->id.product = 0xBEEF;/*产品ID号*/

ts_dev->id.version = 0x0101;/*版本ID号*/

/*好了,一些都准备就绪,现在就把ts_dev触摸屏设备注册到输入子系统中*/

input_register_device(ts_dev);

return 0;

/*下面是错误跳转处理*/

err_noclk:

clk_disable(adc_clk);

clk_put(adc_clk);

err_nomap:

iounmap(adc_base);

err_noirq:

free_irq(IRQ_ADC, 1);

return ret;

}

/*初始化ADC控制寄存器和ADC触摸屏控制寄存器*/

static void adc_initialize(void)

{

/*计算结果为(二进制):111111111000000,再根据数据手册得知

此处是将AD转换预定标器值设为255、AD转换预定标器使能有效*/

writel(S3C2410_ADCCON_PRSCEN | S3C2410_ADCCON_PRSCVL(0xFF), adc_base + S3C2410_ADCCON);

/*对ADC开始延时寄存器进行设置,延时值为0xffff*/

writel(0xffff, adc_base + S3C2410_ADCDLY);

/*WAIT4INT宏计算结果为(二进制):11010011,再根据数据手册得知

此处是将ADC触摸屏控制寄存器设置成等待中断模式*/ writel(WAIT4INT(0), adc_base + S3C2410_ADCTSC); }

static void __exit ts_exit(void)

{

/*屏蔽和释放中断*/

disable_irq(IRQ_ADC);

disable_irq(IRQ_TC);

free_irq(IRQ_ADC, 1);

free_irq(IRQ_TC, 1);

/*释放虚拟地址映射空间*/

iounmap(adc_base);

/*屏蔽和销毁时钟*/

if(adc_clk)

{

clk_disable(adc_clk);

clk_put(adc_clk);

adc_clk =NULL;

}

/*将触摸屏设备从输入子系统中注销*/

input_unregister_device(ts_dev);

}

module_init(ts_init);

module_exit(ts_exit);

3、接下来要做的是,在两个中断服务程序中实现触摸屏状态和坐标的转换。先看代码,如下:/*定义一个外部的信号量ADC_LOCK,因为ADC_LOCK在ADC驱动程序中已申明

这样就能保证ADC资源在ADC驱动和触摸屏驱动中进行互斥访问*/

extern struct semaphore ADC_LOCK;

/*做为一个标签,只有对触摸屏操作后才对X和Y坐标进行转换*/

static int OwnADC = 0;

/*用于记录转换后的X坐标值和Y坐标值*/

static long xp;

static long yp;

/*用于计数对触摸屏压下或抬起时模拟输入转换的次数*/

static int count;

/*定义一个AUTOPST宏,将ADC触摸屏控制寄存器设置成自动转换模式*/

#define AUTOPST (S3C2410_ADCTSC_YM_SEN | S3C2410_ADCTSC_YP_SEN |

S3C2410_ADCTSC_XP_SEN | \

S3C2410_ADCTSC_AUTO_PST | S3C2410_ADCTSC_XY_PST(0))

/*触摸屏中断服务程序,对触摸屏按下或提笔时触发执行*/

static irqreturn_t tc_irq(int irq,void*dev_id)

{

/*用于记录这一次AD转换后的值*/

unsigned long data0;

unsigned long data1;

/*用于记录触摸屏操作状态是按下还是抬起*/

int updown;

/*ADC资源可以获取,即上锁*/

if(down_trylock(&ADC_LOCK)== 0)

{

/*标识对触摸屏进行了操作*/

OwnADC = 1;

/*读取这一次AD转换后的值,注意这次主要读的是状态*/

data0 = readl(adc_base + S3C2410_ADCDAT0);

data1 = readl(adc_base + S3C2410_ADCDAT1);

/*记录这一次对触摸屏是压下还是抬起,该状态保存在数据寄存器的第15位,所以与上S3C2410_ADCDAT0_UPDOWN*/

updown =(!(data0 & S3C2410_ADCDAT0_UPDOWN))&&(!(data1 &

S3C2410_ADCDAT0_UPDOWN));

/*判断触摸屏的操作状态*/

if(updown)

{

/*如果是按下状态,则调用touch_timer_fire函数来启动ADC转换,该函数定义后面再讲*/

touch_timer_fire(0);

}

else

{

/*如果是抬起状态,就结束了这一次的操作,所以就释放ADC资源的占有*/

OwnADC = 0;

up(&ADC_LOCK);

}

}

return IRQ_HANDLED;

}

static void touch_timer_fire(unsigned long data)

{

/*用于记录这一次AD转换后的值*/

unsigned long data0;

unsigned long data1;

/*用于记录触摸屏操作状态是按下还是抬起*/

int updown;

/*读取这一次AD转换后的值,注意这次主要读的是状态*/

data0 = readl(adc_base + S3C2410_ADCDAT0);

data1 = readl(adc_base + S3C2410_ADCDAT1);

/*记录这一次对触摸屏是压下还是抬起,该状态保存在数据寄存器的第15位,所以与上S3C2410_ADCDAT0_UPDOWN*/

updown =(!(data0 & S3C2410_ADCDAT0_UPDOWN))&&(!(data1 &

S3C2410_ADCDAT0_UPDOWN));

/*判断触摸屏的操作状态*/

if(updown)

{

/*如果状态是按下,并且ADC已经转换了就报告事件和数据*/

if(count!= 0)

{

long tmp;

tmp = xp;

xp = yp;

yp = tmp;

xp >>= 2;

yp >>= 2;

#ifdef CONFIG_TOUCHSCREEN_MY2440_DEBUG

/*触摸屏调试信息,编译内核时选上此项后,点击触摸屏会在终端上打印出坐标信息*/

struct timeval tv;

do_gettimeofday(&tv);

printk(KERN_DEBUG "T: %06d, X: %03ld, Y: %03ld\n",(int)https://www.doczj.com/doc/0e16898042.html,_usec, xp, yp);

#endif

/*报告X、Y的绝对坐标值*/

input_report_abs(ts_dev, ABS_X, xp);

input_report_abs(ts_dev, ABS_Y, yp);

/*报告触摸屏的状态,1表明触摸屏被按下*/

input_report_abs(ts_dev, ABS_PRESSURE, 1);

/*报告按键事件,键值为1(代表触摸屏对应的按键被按下)*/

input_report_key(ts_dev, BTN_TOUCH, 1);

/*等待接收方受到数据后回复确认,用于同步*/

input_sync(ts_dev);

}

/*如果状态是按下,并且ADC还没有开始转换就启动ADC进行转换*/

xp = 0;

yp = 0;

count= 0;

/*设置触摸屏的模式为自动转换模式*/

writel(S3C2410_ADCTSC_PULL_UP_DISABLE | AUTOPST, adc_base +

S3C2410_ADCTSC);

/*启动ADC转换*/

writel(readl(adc_base + S3C2410_ADCCON)| S3C2410_ADCCON_ENABLE_START, adc_base + S3C2410_ADCCON);

}

else

{

/*否则是抬起状态*/

count= 0;

/*报告按键事件,键值为0(代表触摸屏对应的按键被释放)*/

input_report_key(ts_dev, BTN_TOUCH, 0);

/*报告触摸屏的状态,0表明触摸屏没被按下*/

input_report_abs(ts_dev, ABS_PRESSURE, 0);

/*等待接收方受到数据后回复确认,用于同步*/

input_sync(ts_dev);

/*将触摸屏重新设置为等待中断状态*/

writel(WAIT4INT(0), adc_base + S3C2410_ADCTSC);

/*如果触摸屏抬起,就意味着这一次的操作结束,所以就释放ADC资源的占有*/

if(OwnADC)

{

OwnADC = 0;

up(&ADC_LOCK);

}

}

}

/*定义并初始化了一个定时器touch_timer,定时器服务程序为touch_timer_fire*/

static struct timer_list touch_timer = TIMER_INITIALIZER(touch_timer_fire, 0, 0);

/*ADC中断服务程序,AD转换完成后触发执行*/

static irqreturn_t adc_irq(int irq,void*dev_id)

{

/*用于记录这一次AD转换后的值*/

unsigned long data0;

unsigned long data1;

if(OwnADC)

{

/*读取这一次AD转换后的值,注意这次主要读的是坐标*/

data0 = readl(adc_base + S3C2410_ADCDAT0);

data1 = readl(adc_base + S3C2410_ADCDAT1);

/*记录这一次通过AD转换后的X坐标值和Y坐标值,根据数据手册可知,X和Y坐标转换数值

分别保存在数据寄存器0和1的第0-9位,所以这里与上

S3C2410_ADCDAT0_XPDATA_MASK就是取0-9位的值*/

xp += data0 & S3C2410_ADCDAT0_XPDATA_MASK;

yp += data1 & S3C2410_ADCDAT1_YPDATA_MASK;

/*计数这一次AD转换的次数*/

count++;

if(count<(1<<2))

{

/*如果转换的次数小于4,则重新启动ADC转换*/

writel(S3C2410_ADCTSC_PULL_UP_DISABLE | AUTOPST, adc_base +

S3C2410_ADCTSC);

writel(readl(adc_base + S3C2410_ADCCON)| S3C2410_ADCCON_ENABLE_START, adc_base + S3C2410_ADCCON);

}

else

{

/*否则,启动1个时间滴答的定时器,这是就会去执行定时器服务程序上报事件和数据*/

我们从整体上描述转换这个的过程:

(1)如果触摸屏感觉到触摸,则触发触摸屏中断即进入tc_irq,获取ADC_LOCK后判断触摸屏状态为按下,则调用touch_timer_fire启动ADC转换;

(2)当ADC转换启动后,触发ADC中断即进入adc_irq,如果这一次转换的次数小于4,则重新启动ADC进行转换,如果4次完毕后,启动1个时间滴答的定时器,停止ADC转换,也就是说在这个时间滴答内,ADC转换是停止的;

(3)这里为什么要在1个时间滴答到来之前停止ADC的转换呢?这是为了防止屏幕抖动。

(4)如果1个时间滴答到来则进入定时器服务程序touch_timer_fire,判断触摸屏仍然处于按下状态则上报事件和转换的数据,并重启ADC转换,重复第(2)步;

(5)如果触摸抬起了,则上报释放事件,并将触摸屏重新设置为等待中断状态。

四、移植和测试触摸屏驱动程序

移植和测试请看Linux-2.6.30.4在2440上的移植之触摸屏驱动

触摸屏驱动

二、前提知识 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:不触摸时,鼠标箭头始终停留在某一位置;触摸时,鼠标箭头在触摸点与原停留点的中点处。

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

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

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

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 -

触摸屏接口硬件编写驱动程序

尽管触摸屏正在迅速普及开来,但大多数开发人员以前从来没有开发过触摸屏产品。本文详细介绍了触摸屏产品的设计步骤,指导读者了解使触摸屏首次工作需要的软硬件细节。 触摸屏如今随处可见。工业控制系统、消费电子产品,甚至医疗设备上很多都装备了触摸屏输入装置。我们平时不经意间都会用到触摸屏。在ATM机上取款、签署包裹,办理登机手续或查找电话号码时都可能会用到触摸屏。 本文介绍了二种较新的CPU,它们都内建了对触摸屏输入的支持。本文将介绍如何编写软件驱动程序,从而能够使用这些微处理器配置、校准触摸屏以及对触摸屏输入持续响应。最终将提供可免费下载和使用的工作代码,作为读者进一步设计的基础。 触摸屏作为输入手段的优点和缺点 没有一种输入方式是十全十美的,对某些特定的应用和产品类型来说,触摸屏不是最好的输入手段。为了让读者清楚的了解触摸屏的特性,下面先概括使用触摸屏作为输入手段的优点和缺点。 首先是优点:触摸屏不可否认的具有酷的感觉,立刻就能使产品的使用变得更有乐趣。同时触摸屏也非常直观。当用户想要选择A选项时,他伸出手指碰一下A 选项就可以了。这还不够直观吗?连两岁的婴儿都知道怎样伸手去触摸他(或她)想要的东西。 最后要说的是,触摸屏作为输入装置和系统固定在了一起。如果用户忘记遥控器或鼠标放的位置,就会无法进行输入。而如果具有触摸屏的设备放在用户前面,用户马上就可以用触摸屏进行输入。 再说缺点,触摸屏可能会在不合适的场合下被错误的使用。这里我是指对安全性要求严格的设备,对于这些设备,如果没有适当的预防措施,使用触摸屏会非常危险。下面我将概括一些最明显的潜在的问题,如果读者想作更进一步的了解,可以参考更多的资料。 第一个问题是视差,即屏幕上看到的对象的位置与其在触摸面板上的实际有效位置之间的差异。图1说明了这个问题。我能想到的最佳例子是典型的“免下 车”ATM机。这种ATM机不会根据汽车的高度升高或降低自己的高度,因此如果你坐在较高的SUV或卡车里,那么你就会从抬高的位置俯视显示屏。为了保护昂贵的显示器件免受恶意破坏,ATM机都会在用户和显示屏之间放置几层强化玻璃。 触摸屏是不能这样保护的。如果真这样做的话,用户就无法进行触摸了。因此触摸屏放在表层上,而显示屏放在表层下的几层玻璃后面。这就造成了触摸层和显示层之间的物理隔离。如果用户以某个角度观看屏幕,就意味着用户按压触摸屏进行选择的位置会与用户接口软件预期的输入位置之间存在一定的距离偏差。

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。图形点阵液晶模块的点阵像素连续排列,行和列在拍布中均没有空隔,不仅可以显示字符,还可以显示连续完整的图像。图形点阵型液晶显示模块有三种类型可供选择:行列驱动型,行列驱动控制型及行列控制型。

我的触摸屏驱动源代码

我的触摸屏驱动源代码 /*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

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

/*触摸屏驱动程序及分析*/ #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)

嵌入式系统触摸屏驱动程序设计

ARM9嵌入式系统课程设计 --嵌入式系统触摸屏驱动程序设计 班级: 学号: 姓名: 指导老师: 课程设计时间:

目录 第一章引言 (1) 1.1 课程设计目的 (1) 1.2 课程设计任务与要求 (1) 第二章课程设计平台构建与流程 (2) 2.1 嵌入式系统开发平台构建 (2) 2.2 触摸屏课程设计流程 (2) 2.3 课程设计硬件结构与工作原理 (2) 2.3.1硬件结构概述 (2) 2.3.2触摸屏工作原理 (4) 3.1 Vivi源代码安装 (5) 3.2 Vivi源代码分析与移植 (5) 3.3 Vivi编译与下载 (6) 3.3.1 Vivi的编译 (6) 3.3.2 Vivi的下载 (6) 第四章 Linux内核移植与下载 (10) 4.1 Linux内核源代码安装 (10) 4.2 Linux内核源代码分析与移植 (10) 4.3 Linux内核编译与下载 (11) 4.3.1 Linux内核编译 (11) 4.3.2 Linux内核下载 (11) 第五章触摸屏功能模块程序设计与交叉编译 (13) 5.1 触摸屏模块功能 (13) 5.2 功能模块驱动程序设计 (13) 第六章根文件系统建立与文件系统下载 (17) 6.1 根文件系统分析 (17) 6.2 文件系统映像文件生成 (17) 6.3 文件系统下载 (18) 6.4 功能模块运行与调试 (20) 第七章课程设计总结与体会 (21) 参考文献 (22)

第一章引言 1.1 课程设计目的 在开发基于Linux的嵌入式系统前需要首先建立嵌入式系统的开发环境,并制定嵌入式系统上的Linux内核。本课程设计的主要目的是: (1)进一步了解嵌入式开发工具链的构造过程; (2)掌握开发主机与嵌入式系统通信的方法; (3)通过实际程序设计和调试,逐步掌握模块化程序设计方法和调试技术,提高阅读和修改程序的能力; (4)通过完成一个嵌入式linux系统开发的完整过程,使我们了解开发嵌入式linux应用系统的全过程,为今后学习打下基础,积累实际操作的经验。 1.2 课程设计任务与要求 (1)理解基于Linux的嵌入式系统交叉开发环境,对嵌入式系统的开发流程有详细了解; (2)掌握开发工具链的构建方法,能独立进行系统开发操作; (3)掌握Linux的常用命令,在linux系统下能熟练的使用这些常用命令; (4)熟悉linux内核的知识以及原理,掌握定制Linux内核的方法; (5)基于Linux操作系统,以及Emest III实验箱,利用触摸屏返回触点坐标值及动作信。坐标及动作的具体显示:触摸笔动作,触点X坐标值,触点Y坐标值。

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:

为标准触摸屏接口编写驱动程序

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

屏会非常危险。下面我将概括一些最明显的潜在的问题,如果读者想作更进一 步的了解,可以参考更多的资料。 第一个问题是视差,即屏幕上看到的对象的位置与其在触摸面板上的实际 有效位置之间的差异。图1说明了这个问题。我能想到的最佳例子是典型的"免下车"ATM机。这种ATM机不会根据汽车的高度升高或降低自己的高度,因此如 果你坐在较高的SUV或卡车里,那么你就会从抬高的位置俯视显示屏。为了保 护昂贵的显示器件免受恶意破坏,ATM机都会在用户和显示屏之间放置几层强 化玻璃。 触摸屏是不能这样保护的。如果真这样做的话,用户就无法进行触摸了。 因此触摸屏放在表层上,而显示屏放在表层下的几层玻璃后面。这就造成了触 摸层和显示层之间的物理隔离。如果用户以某个角度观看屏幕,就意味着用户 按压触摸屏进行选择的位置会与用户接口软件预期的输入位置之间存在一定的 距离偏差。人们能很快适应这种偏差。经过几次尝试和错误,使用者学习在触 摸屏的表面找到显示信息的映射位置,然后触摸到正确的位置。ATM设计师也 认识到这一点,他们会采用大面积的按键,并尽量使它们相互远离,因此有助 于防止错误按键的误触发。当然,不小心按下错误的ATM按键不会使你得癌症 或使你失明。但如果这样的失误发生在医疗控制设备上,并且系统设计师没有 在系统内置足够的安全预防措施,那么以上两种后果确实都有可能发生。 图1:视差(横截面图)。 通过缩短显示层和触摸层之间的物理距离可以尽量减少视差。在CRT或 LCD前面总会有玻璃存在。最好的方法是将对触摸敏感的电子元件嵌入到玻璃里,并且这层玻璃做得尽可能薄。这样就减少了触摸输入层和显示层之间的相 隔距离。像Palm这样的手持设备就可以采用这样的策略,因为它们不必太担心机械强度不够或者遭受恶意破坏。随着相隔距离的缩小(用户觉得真的触摸到了图形元件),精度会大大提高。 第二个明显的问题是,在用户触摸屏幕的过程中,触摸屏幕的物体(触控笔、手指)至少会遮挡屏幕上的一小部分面积,从而影响用户的观察。在工厂自动化应用中这种情况更容易发生,因为用户很可能使用手指或手套而非触控笔,即 使是使用触控笔,在屏幕上做选择动作也会不时遮挡住一部分你给用户展示的

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