触摸屏接口硬件编写驱动程序
- 格式:doc
- 大小:134.00 KB
- 文档页数:10
触摸屏驱动程序设计一.设计目的1,巩固学习嵌入式软件方面的基本知识,进一步熟悉基本概念。
2,熟练常用控件,文件,图形等方面的操作了解基本的流程。
3,运用所用学的嵌入式知识,编写出较为实用的小软件,增进对一些实际问题的软,硬件知识的掌握。
4,培养查阅资料,独立思考问题的能力。
二、要求:编写从A/D转换器的通道x获取模拟数据,并将转换后的数字量以波形的形式在LCD上显示的程序。
三. 实验步骤:四.基本思路及关键问题的解决方法;基本思路:1. 按照步骤程序设计原理说明,使用”CodeWarrior for ARM Developer Suite”软件编写程序并进行编译,建立一个新的文件单击【File】菜单中的【New File】选项,然后出现下面的对话框,输入文件名(加上后缀“.c”),单击保存按钮,在编译过程中如果出现错误,修改程序直到没有错误为止,编译过程中出现警告一般可以不必考虑,但特殊时也要通过修改程序消除警告。
程序编写完成后,将程序所在文件保存到2440test.mcp中,如图所示:2.用开发板测试程序代码:(1)首先设置开发板的拨动开关S2 为Nor Flash 启动,连接好附带的USB 线和电源(可以不必连接串口线)。
(2)设置超级终端(3)开机进入BIOS 模式,此时开发板上的绿色LED1 会呈现闪烁状态,其启动界面,如下图:输入”d”(4)安装USB 下载驱动(5)点击DNW 程序的“USB Port” “Transmit”,选择这个2440test.mcp文件,接着点“打开”,这样就开始下载了五、流程图及电路原理图1.绘制所需的流程图:ADS7843与S3C2410的硬件连接如图1所示,图1 触摸屏输入系统示意图触摸屏驱动程序设计触摸屏驱动程序中重要数据结构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, };本设计中触摸屏控制器ADS7843的中断输出通过外部中断5接在中断控制器上,当触摸屏上有触摸事件发生时,会引发中断号为IRQ_EINT5的中断服务程序s3c2410_isr_tc()。
触摸屏ADS7843驱动程序设计//===================================================================== // ADS7843 驱动程序(串行)//硬件连接: DCLK ——P0^0;// CS ——P0^1;// DIN ——P0^2;// BUSY ——P0^3// DOUT ——P0^4// PENIRQ——P3^2;// VDD--逻辑电源(+5V)// VSS--GND(0V)//ADS7843.c//writer:谷雨2008年7月23日于EDA实验室//=====================================================================#i nclude //STC单片机头文件#i nclude#define uint unsigned int#define uchar unsigned charsbit DCLK = P0^0; //时钟信号,下降沿有效sbit CS = P0^1; //片选信号,低电平有效sbit DIN = P0^2; //串行数据输入sbit BUSY = P0^3; //忙信号sbit DOUT = P0^4; //串行数据输出sbit PENIRQ = P3^2; //键盘中断请求信号,低电平(负边沿)有效void Tranfer(char Data);uint average(uint a[8]);//===================================================================== ===============//函数名称:void delay(uint us)//函数功能:延时子函数//入口参数:us 延时时间//出口参数:无//===================================================================== ===============void delay(uint us){while(us--);}//===================================================================== ===============//函数名称:void ADS7843_start(void)//函数功能:ADS7843启动//入口参数:无//出口参数:无//===================================================================== ===============void ADS7843_start(void){DCLK=0;CS=1;DIN=1;DCLK=1;CS=0;}//===================================================================== ===============//函数名称:void ADS7843_wr(uchar dat)//函数功能:写ADS7843//入口参数:dat 写入的数据//出口参数:无//===================================================================== ===============void ADS7843_wr(uchar dat){uchar count;DCLK=0;for(count=0;count<8;count++){dat<<=1;DIN=CY;DCLK=0;_nop_();_nop_();_nop_();DCLK=1;_nop_();_nop_();_nop_();}}//===================================================================== ===============//函数名称:uint ADS7843_rd(void)//函数功能:读ADS7843//入口参数:无//出口参数:读回的坐标值//===================================================================== ===============uint ADS7843_rd(void){uchar count=0;uint dat=0;for(count=0;count<12;count++){dat<<=1;DCLK=1; _nop_();_nop_();_nop_(); //下降沿有效DCLK=0; _nop_();_nop_();_nop_();if(DOUT)dat++;}return(dat);}//===================================================================== ===============//函数名称:void intr0_int()//函数功能:外中断0中断服务函数//入口参数:无//出口参数:无//===================================================================== ===============void intr0_int() interrupt 0 using 2{uint X=0,Y=0,a[4],i,avex,avey,x[8],y[8];IE=0; //关中断delay(100); //中断后延时以消除抖动,使得采样数据更准确if(!PENIRQ){for(i=0;i<8;i++) //进行8次数据采集{ADS7843_start();delay(2);ADS7843_wr(0x90);//送控制字10010000 即用差分方式读X坐标delay(2);DCLK=1;_nop_();_nop_();_nop_();_nop_();DCLK=0;_nop_();_nop_();_nop_();_nop_();X=ADS7843_rd(); //读X轴坐标x[i]=X;ADS7843_wr(0xD0); //送控制字11010000 即用差分方式读Y坐标DCLK=1;_nop_();_nop_();_nop_();_nop_();DCLK=0;_nop_();_nop_();_nop_();_nop_();Y=ADS7843_rd(); //读Y轴坐标y[i]=Y;CS=1;}avex=average(x); //X坐标数据处理a[0]=avex/1000; //发上位机观察结果a[1]=(avex-a[0]*1000)/100;a[2]=(avex-a[0]*1000-a[1]*100)/10;a[3]=avex%10;Tranfer(a[0]+48);Tranfer(a[1]+48);Tranfer(a[2]+48);Tranfer(a[3]+48);avey=average(y); //Y坐标数据处理a[0]=avey/1000; //发上位机观察结果a[1]=(avey-a[0]*1000)/100;a[2]=(avey-a[0]*1000-a[1]*100)/10;a[3]=avey%10;Tranfer(a[0]+48);Tranfer(a[1]+48);Tranfer(a[2]+48);Tranfer(a[3]+48);for(i=0;i<10;i++) //延时,在程序中根据具体情况改动delay(10000);}IE=0x81; //开中断}//===================================================================== ===============//函数名称:void init_serial()//函数功能:初始化串口//入口参数:无//出口参数:无//===================================================================== ===============void init_serial(){TMOD=0x22; //定时器T1使用工作方式2TH1=250; //设置初值TL1=250;TR1=1; //开始计时PCON=0x80; //SMOD=1;SCON=0x50; //工作方式1,波特率9600bit/s,允许接收TI=1;}//===================================================================== ===============//函数名称:void Tranfer(char Data)//函数功能:发送数据程序//入口参数:Data 要发送的数据//出口参数:无//===================================================================== ===============void Tranfer(char Data){while(TI==0);SBUF=Data;TI=0;}//===================================================================== ===============//函数名称:int main()//函数功能:主函数//入口参数:无//出口参数:无//===================================================================== ===============int main(){// uint b[4];TCON=0x01; //设置外部中断0下降沿触发EX0=1; //开外中断0EA=1; //开总中断init_serial();while(1);}//===================================================================== ===============//函数名称:uint average(uint a[8])//函数功能:数据处理程序,采集8次的数据,去掉最大值,去掉最小值,然后求平均//入口参数:数组首地址//出口参数:平均值//===================================================================== ===============uint average(uint a[8]){uint max,min,i,ave=0,sum=0;max=a[0];min=a[0];for(i=0;i<8;i++){if(maxif(min>a[i])min=a[i];sum+=a[i];}ave=(sum-min-max)/6;return ave;}。
单片机中的触摸屏接口技术原理与实现触摸屏接口技术是现代电子设备中广泛应用的一项重要技术。
在单片机系统中,触摸屏接口技术可以实现用户对设备的交互操作,提升用户体验。
本文将介绍触摸屏接口技术的原理和实现方法。
触摸屏接口技术的原理触摸屏接口技术的原理是基于电容或电阻效应实现的。
常见的触摸屏包括电容式触摸屏和电阻式触摸屏。
电容式触摸屏是利用触摸屏面板上存在的感应电容实现的。
当手指或触控笔接触触摸屏面板时,触摸屏上的感应电容会发生变化。
通过测量感应电容的变化,可以确定触摸位置。
电容式触摸屏的优点是灵敏度高、触感好,适合多点触控操作。
其缺点是对温度和湿度敏感。
电阻式触摸屏是利用触摸屏面板上存在的两层导电薄膜之间的接触实现的。
当手指或触控笔按压触摸屏面板时,两层导电薄膜之间发生接触,形成电路闭合。
通过测量电路参数的变化,可以确定触摸位置。
电阻式触摸屏的优点是适应性强,可以用手指、触控笔等多种方式进行触控。
其缺点是灵敏度相对较低,多点触控能力较差。
触摸屏接口技术的实现在单片机系统中,触摸屏接口技术的实现首先需要通过硬件电路与触摸屏进行连接。
常见的连接方式有串行接口和并行接口。
串行接口是通过少量的引脚实现与触摸屏的通信。
通常采用的协议是SPI(串行外设接口)或I2C(串行总线接口)。
使用串行接口可以减少引脚数量,适用于引脚资源有限的单片机系统。
但由于数据传输速度较慢,对系统性能要求较高。
并行接口是通过多个引脚实现与触摸屏的通信。
通常采用的协议是8080或6800并行总线接口。
使用并行接口可以实现高速数据传输,适用于对数据传输速度要求较高的应用场景。
但由于引脚数量较多,对系统引脚资源有一定要求。
在接口电路中,需要实现触摸屏的电源供应、数据传输和指令控制等功能。
具体实现方式根据触摸屏的设计和单片机系统的需求而定。
触摸屏接口技术的驱动程序通常由单片机系统开发人员编写。
驱动程序主要包括触摸屏芯片的初始化配置、数据传输和触摸事件处理等功能。
威纶EasyBuilder pro触摸屏编程与操作模块三硬件设定与工程的建立任务一硬件设定【学习目标】1、熟练完成HMI的IO端口设置、DIP设置、系统工具列与系统设定等相关操作。
【相关知识】一、I/O 端口HMI支持的通讯接口,依不同机种而有差异,详细规格请参阅各机型的规格表。
(一)、SD 卡插槽:SD 卡提供工程文件上传及下载,包括配方数据、事件记录与资料取记录,亦可备份或记录历史资料。
(二)、串行接口:连接PLC 或其他设备,接口规格为:RS-232 / RS-485 2W/RS-485 4W / CAN Bus。
(三)、以太网接口:提供工程文件上传及下载,包括配方数据、事件记录与资料取样记录。
亦可连接具网络通讯功能的设备,如PLC、PC 等。
(四)、USB Host:支持各种USB 接口的设备,如鼠标键盘、U盘、打印机、条码机等。
(五)、USB Client:提供工程文件上传及下载,包括配方数据、事件记录与资料取样记录。
当首次操作HMI前,必须在HMI上完成以下各项系统设定,设定完成后即可使用EasyBuilder Pro工程软件开发工程文件。
二、DIP设置每台HMI背后都有一组复位按钮及指拨开关,做不同模式切换时,将可触发对应功能。
若遗失HMI的系统设定密码时,可以藉由调整指拨开关将HMI恢复成出厂设置。
详细设定步骤如下:(一)、将DIP Switch 1 切至ON,其余指拨开关保持为OFF,然后重新启动HMI。
此时HMI 将进入触控校正模式。
(二)、在HMI会出现“+”光标。
使用触控笔或者手指点选“+”光标的中心点【持续按住2秒钟左右】进行五点校正。
所有十字皆被准确触控之后,“+”光标会消失。
校准参数会保留在系统里。
(三)、完成校正动作后,系统会询问用户是否将HMI的系统设定密码恢复为出厂设定,选择[Yes]。
(四)、再次确认用户是否要将HMI的系统设定密码恢复为出厂设置。
当输入[yes] 按下[OK]后,HMI内所有的工程文件及历史资料将全部被清除。
51单片机程序触摸屏芯片ADS7843驱动#include "reg51.h"#include "intrins.h"sbit DCLK=P1^6;sbit CS=P2^2;sbit DIN=P2^3;sbit DOUT=P2^4;sbit BUSY=P2^5;delay(unsigned char i--){while(i--);}void start() //SPI开始{DCLK=0;CS=1;DIN=1;DCLK=1;CS=0;}WriteCharTo7843(unsigned char num) //SPI写数据{unsigned char count=0;DCLK=0;for(count=0;count<8;count++){num<<=1;DIN=CY;DCLK=0; _nop_();_nop_();_nop_(); //上升沿有效DCLK=1; _nop_();_nop_();_nop_();}}ReadFromCharFrom7843() //SPI 读数据{unsigned char count=0;unsigned int Num=0;for(count=0;count<12;count++){Num<<=1;DCLK=1; _nop_();_nop_();_nop_(); //下降沿有效DCLK=0; _nop_();_nop_();_nop_();if(DOUT) Num++;}return(Num);}void ZhongDuan() interrupt 0 //外部中断0 用来接受键盘发来的数据{unsigned int X=0,Y=0;delay(10000); //中断后延时以消除抖动,使得采样数据更准确start(); //启动SPI// while(BUSY); //如果BUSY信号不好使可以删除不用delay(2);WriteCharTo7843(0x90); //送控制字 10010000 即用差分方式读X坐标详细请见有关资料// while(BUSY); //如果BUSY信号不好使可以删除不用delay(2);DCLK=1; _nop_();_nop_();_nop_();_nop_();DCLK=0; _nop_();_nop_();_nop_();_nop_();X=ReadFromCharFrom7843(); //读X轴坐标WriteCharTo7843(0xD0); //送控制字 11010000 即用差分方式读Y坐标详细请见有关资料DCLK=1; _nop_();_nop_();_nop_();_nop_();DCLK=0; _nop_();_nop_();_nop_();_nop_();Y=ReadFromCharFrom7843(); //读Y轴坐标CS=1;}main(){TMOD=0x11; // 记数器0 计数器1 都以 16 位记数TCON=0x00;IE=0x83; //1000 0001 EA=1中断允许,IP=0x01;while(1);//等待触摸中断}。
教程触摸屏程序制作步骤教程前言随着科技的发展,越来越多的设备开始采用触摸屏界面,因此学习如何制作触摸屏程序成为了必备技能之一。
本教程将介绍触摸屏程序制作的基本步骤,帮助初学者快速入门。
所需材料•开发板(例如Raspberry Pi)•触摸屏•USB 电源线•HDMI 线(可选)•计算机步骤1. 连接触摸屏首先,将触摸屏插入开发板,并用 USB 电源线连接电源和开发板。
如果需要,则连接 HDMI 线。
连接后,打开开发板电源和触摸屏。
2. 安装操作系统接下来,需要在开发板上安装操作系统。
根据开发板的型号和制造商的不同,操作系统的安装过程也略有不同。
请参考您的设备说明或在线教程,了解操作系统的安装方法。
3. 安装触摸屏驱动安装好操作系统后,需要安装触摸屏驱动程序。
一般来说,设备制造商会提供相应的驱动程序和说明文档。
请按照文档中的指示安装驱动程序。
4. 编写代码现在,您可以开始编写触摸屏程序了。
编写代码前,请确保您已经安装了正确的编程环境和开发库,并已经熟悉相应的编程语言。
具体编写方法因编程语言不同而有所不同,但一般来说,您需要编写以下代码:1.初始化触摸屏2.监听触摸事件3.处理触摸事件5. 测试程序编写完成后,请测试您的程序,确保它能够正确地运行并响应触摸事件。
可以使用调试工具来帮助您查找问题并进行调试。
6. 调优程序最后,您可以进一步优化您的代码,以提高程序性能和稳定性。
您可以使用性能分析工具来帮助您找到并优化瓶颈。
本教程简要介绍了触摸屏程序制作的基本步骤,希望能够帮助初学者快速入门。
当然,触摸屏程序的制作是一个非常复杂的过程,需要不断实践和学习。
祝您在学习和实践中取得好成果!。
基于DragonBoard 410c开发板的触摸屏驱动编写前言:让大家初步了解对高通MSM8916平台的输入子系统的实现,给大家提供Dragon Board 410c平台开发输入系统设备的思路。
(如:按键设备、触摸屏、轨迹球等)在高通MSM8916平台中,具有触摸屏、轨迹球和简单按键功能,这些功能是由Android 系统内中的驱动程序实现的,并且需要用户空间的内容来协助实现。
一、触摸屏驱动编写高通MSM8916平台的触摸屏驱动程序的实现文件是drivers/input/touchscreen/synapTIcs_i2c_rmi4.c,此文件的核心是函数synapTIcs_ts_probe(),在该函数中需要进行触摸屏工作模式的初始化,对作为输出设备的触摸屏驱动在Linux平台下的设备名注册,同事初始化触摸时间触发时引起的中断操作。
此函数的实现代码如下:staTIc int synapTIcs_rmi4_probe(struct i2c_client *client,const struct i2c_device_id *dev_id){int retval = 0;unsigned char ii;unsigned char attr_count;struct synaptics_rmi4_f1a_handle *f1a;struct synaptics_rmi4_fn *fhandler;struct synaptics_rmi4_fn *next_fhandler;struct synaptics_rmi4_data *rmi4_data;struct synaptics_rmi4_device_info *rmi;struct synaptics_rmi4_platform_data *platform_data =client-dev.platform_data;struct dentry *temp;if (!i2c_check_functionality(client-adapter,I2C_FUNC_SMBUS_BYTE_DATA)){dev_err(client-dev,%s: SMBus byte data not supported\n,__func__);return -EIO;}if (client-dev.of_node) {platform_data = devm_kzalloc(client-dev,sizeof(*platform_data),GFP_KERNEL);if (!platform_data) {dev_err(client-dev, Failed to allocate memory\n);return -ENOMEM;}retval = synaptics_rmi4_parse_dt(client-dev, platform_data);if (retval)return retval;} else {platform_data = client-dev.platform_data;}if (!platform_data) {dev_err(client-dev,%s: No platform data found\n,__func__);return -EINV AL;}rmi4_data = kzalloc(sizeof(*rmi4_data) * 2, GFP_KERNEL);if (!rmi4_data) {dev_err(client-dev,%s: Failed to alloc mem for rmi4_data\n,__func__);return -ENOMEM;}rmi = (rmi4_data-rmi4_mod_info);rmi4_data-input_dev = input_allocate_device();//创建设备if (rmi4_data-input_dev == NULL) {dev_err(client-dev,%s: Failed to allocate input。
为标准触摸屏接口编写驱动程序尽管触摸屏正在迅速普及开来,但大多数开发人员以前从来没有开发过触摸屏产品。
本文详细介绍了触摸屏产品的设计步骤,指导读者了解使触摸屏首次工作需要的软硬件细节。
触摸屏如今随处可见。
工业控制系统、消费电子产品,甚至医疗设备上很多都装备了触摸屏输入装置。
我们平时不经意间都会用到触摸屏。
在ATM机上取款、签署包裹,办理登机手续或查找电话号码时都可能会用到触摸屏。
本文介绍了二种较新的CPU,它们都内建了对触摸屏输入的支持。
本文将介绍如何编写软件驱动程序,从而能够使用这些微处理器配置、校准触摸屏以及对触摸屏输入持续响应。
最终将提供可免费下载和使用的工作代码,作为读者进一步设计的基础。
触摸屏作为输入手段的优点和缺点没有一种输入方式是十全十美的,对某些特定的应用和产品类型来说,触摸屏不是最好的输入手段。
为了让读者清楚的了解触摸屏的特性,下面先概括使用触摸屏作为输入手段的优点和缺点。
首先是优点:触摸屏不可否认的具有酷的感觉,立刻就能使产品的使用变得更有乐趣。
同时触摸屏也非常直观。
当用户想要选择A选项时,他伸出手指碰一下A选项就可以了。
这还不够直观吗?连两岁的婴儿都知道怎样伸手去触摸他(或她)想要的东西。
最后要说的是,触摸屏作为输入装置和系统固定在了一起。
如果用户忘记遥控器或鼠标放的位置,就会无法进行输入。
而如果具有触摸屏的设备放在用户前面,用户马上就可以用触摸屏进行输入。
再说缺点,触摸屏可能会在不合适的场合下被错误的使用。
这里我是指对安全性要求严格的设备,对于这些设备,如果没有适当的预防措施,使用触摸屏会非常危险。
下面我将概括一些最明显的潜在的问题,如果读者想作更进一步的了解,可以参考更多的资料。
第一个问题是视差,即屏幕上看到的对象的位置与其在触摸面板上的实际有效位置之间的差异。
图1说明了这个问题。
我能想到的最佳例子是典型的"免下车"ATM机。
这种ATM机不会根据汽车的高度升高或降低自己的高度,因此如果你坐在较高的SUV或卡车里,那么你就会从抬高的位置俯视显示屏。
linux触摸屏驱动编写早在诺基亚⼿机还⽐较流⾏的时候,那时候触摸屏⽤的还不多。
但是随着触摸屏⼿机、即智能⼿机的流⾏,触摸屏基本成了⼿机的标配。
所以,今天可以看看触摸屏驱动在linux上是如何进⾏的。
1、驱动⽬录drivers/input2、看看这个⽬录的Makefile如何设计obj-$(CONFIG_INPUT) += input-core.oinput-core-y := input.o input-compat.o input-mt.o ff-core.oobj-$(CONFIG_INPUT_TOUCHSCREEN) += touchscreen/3、除了input-core.o这个⽂件外,只需要看touchscreen⽬录就可以了config TOUCHSCREEN_S3C2410tristate "Samsung S3C2410/generic touchscreen input driver"depends on ARCH_S3C24XX || SAMSUNG_DEV_TSdepends on S3C_ADChelpSay Y here if you have the s3c2410 touchscreen.If unsure, say N.To compile this driver as a module, choose M here: themodule will be called s3c2410_ts.4、看懂了Kconfig之后,再阅读Makefile,注意S3C_ADC宏可以参考arch/arm/plat-samsung/adc.cobj-$(CONFIG_TOUCHSCREEN_S3C2410) += s3c2410_ts.o5、继续阅读s3c2410_ts.c⽂件static const struct platform_device_id s3cts_driver_ids[] = {{ "s3c2410-ts", 0 },{ "s3c2440-ts", 0 },{ "s3c64xx-ts", FEAT_PEN_IRQ },{ }};MODULE_DEVICE_TABLE(platform, s3cts_driver_ids);static struct platform_driver s3c_ts_driver = {.driver = {.name = "samsung-ts",#ifdef CONFIG_PM.pm = &s3c_ts_pmops,#endif},.id_table = s3cts_driver_ids,.probe = s3c2410ts_probe,.remove = s3c2410ts_remove,};module_platform_driver(s3c_ts_driver);6、根据probe函数,看看有什么需要注意的内容ts.client = s3c_adc_register(pdev, s3c24xx_ts_select,s3c24xx_ts_conversion, 1);if (IS_ERR(ts.client)) {dev_err(dev, "failed to register adc client\n");ret = PTR_ERR(ts.client);goto err_iomap;}7、接着,查看是否有中断函数被注册ret = request_irq(ts.irq_tc, stylus_irq, 0,"s3c2410_ts_pen", ts.input);8、最后很明显,触摸屏驱动本质上还是由TOUCHSCREEN_S3C2410和S3C_ADC两个macro⼀起完成的。
基于S3C2440的触摸屏驱动程序实现强新建1,田 泽1,2,刘天时1(1.西安石油大学计算机学院,陕西西安710065;2.西北大学信息科学与技术学院,陕西西安710068)摘 要:触摸屏作为人机界面的输入设备被广泛的应用于消费电子、工业控制等诸多领域。
目前流行的嵌入式AR M 处理器S3C2440是一款典型的嵌入式S oC 芯片,它提供了触摸屏控制器接口,方便了嵌入式软、硬件开发。
简要介绍了S3C2440处理器,同时分析了触摸屏的硬件架构、硬件工作原理及与及其工作框图,在此基础上给出了触摸屏与S3C2440的硬件连接电路图。
介绍了S3C2440下触摸屏的W inCE 驱动构架,并指出相关注册表的修改技术。
在S3C2440的嵌入式W inCE 开发平台上,该驱动程序运行良好。
关键词:S3C2440;触摸屏;驱动中图分类号:TP18 文献标识码:A 文章编号:1671Ο654X (2007)04Ο0085Ο03引言触摸屏具有坚固耐用、反应速度快、节省空间、易于交流等许多优点[1],作为一种新的电脑输入设备,是目前最简单方便而且又适用于中国多媒体信息查询国情的输入设备。
利用这种技术,我们只要用手指就能实现对主机操作,使人机交互更为直截了当,极大方便了那些不懂电脑操作的用户。
触摸屏在我国的应用范围非常广阔:公共信息的查询,如电信局、税务局、银行、电力等部门的业务查询;城市街头的信息查询;此外还可广泛应用于领导办公、工业控制、军事指挥、电子游戏、点歌点菜、多媒体教学、房地产预售等[2]。
随着城市向信息化方向发展和电脑网络在日常生活中的渗透,信息查询都会更多以触摸屏形式。
1 硬件架构本文基于S3C2440,实现了W inCE 下触摸屏驱动程序。
除对S3C2440处理器的一些特点做了简单介绍外,从触摸屏的硬件结构、工作机理等进行了全面分析。
1.1 S3C2440处理器简介S3C2440是16 32位精简指令集微处理器,是为应用于小型掌上设备和高性价比,低功耗,高性能的嵌入式系统应用而提供的微控制。
实验四触摸屏驱动程序设计一、实验目的以一个简单字符设备驱动程序为原型,剖析其基本结构。
进行部分改写之后并编译实现其相应功能。
了解在UP-NETARM2410-S 平台上实现触摸屏Linux 驱动程序的基本原理。
了解Linux 驱动开发的基本过程。
二、触摸屏的工作原理1.硬件设计SPI接口是Motorola推出的一种同步串行接口,采用全双工、四线通信系统,S3C2410X是三星推出的自带触摸屏">触摸屏接口的ARM920T内核芯片,ADS7843为Burr-Brown生产的一款性能优异的触摸屏">触摸屏控制器。
ADS7843与S3C2410的硬件连接如图1所示,鉴于ADS7843差分工作模式的优点,在硬件电路中将其配置为差分模式。
图1触摸屏输入系统示意图2.嵌入式Linux系统下的驱动程序设备驱动程序是Linux内核的重要组成部分,控制了操作系统和硬件设备之间的交互。
Linux的设备管理是和文件系统紧密结合的,各种设备都以文件的形式存放在/dev目录下,成为设备文件。
应用程序可以打开、关闭、读写这些设备文件,对设备的操作就像操作普通的数据文件一样简便。
为开发便利、提高效率,本设计采用可安装模块方式开发调试触摸屏驱动程序。
设备驱动在加载时首先需要调用入口函数init_module(),该函数完成设备驱动的初始化工作。
其中最重要的工作就是向内核注册该设备,对于字符设备调用register_chrdev()完成注册,对于块设备需要调用register_blkdev()完成注册。
但是,应用程序却还不能“看见”它,因而还不能通过系统调用它。
要使应用程序能“看见”这个模块或者它所驱动的设备,就要在文件系统中为其创建一个代表它的节点。
通过系统调用mknod()创建代表此项设备的文件节点——设备入口点,就可使一项设备在系统中可见,成为应用程序可以访问的设备。
另外,设备驱动在卸载时需要回收相应的资源,令设备的相应寄存器值复位并从系统中注销该设备。
触摸屏驱动编写1. 触摸屏驱动编写触摸屏接⼝:i2c触摸屏芯⽚型号:ft5x06触摸屏连接的i2c总线:i2c1触摸屏在i2c总线上的器件地址:0x38触摸屏设备的外部中断线:GPX1_6 (irq = IRQ_EINT(14))参考⽂档:ft5x06芯⽚⼿册:FT5x06.pdfft5x06芯⽚地址分布:AN_CTPM_Standard_eng5x06——new.pdf查看AN_CTPM_Standard_eng5x06——new.pdf⼿册可得,ft5x06芯⽚内部地址空间分布情况如下:0x02 :低四位存放触摸点个数0x03 :低四位存放第⼀个触摸点x坐标的8 ~ 11位0x04 :所有位存放第⼀个触摸点x坐标的0 ~ 7位0x05 :低四位存放第⼀个触摸点y坐标的8 ~ 11位0x06 :所有位存放第⼀个触摸点y坐标的0 ~ 7位0x07 :所有位存放第⼀个触摸点的压⼒⼤⼩例:获取触摸点个数及第⼀个触摸点x, y轴的坐标值。
int ctp = *0x02 & 0x0f;int x = ((*0x03 & 0x0f) << 8) | *0x04;int y = ((*0x05 & 0x0f) << 8) | *0x06;补充:内核裁剪,裁剪掉内核中的触摸屏驱动操作步骤:1)跳转的内核源码⽬录下命令:cd /work/linux-3.5/2)重新配置内核命令:make cleanmake distcleancp tiny4412_linux_defconfig .configmake menuconfig裁剪两个选项:System Type--> Support TrustZone-enabled Trusted Execution Environment 【裁剪掉】Device Drivers--> Input device support--> Touchscreens 【裁剪掉】保存退出!3)重新编译内核命令:make -j84)编译完成,⽣成新的zImage。
工业触摸屏通讯驱动程序原理工业触摸屏通讯驱动程序原理如下:一、概述工业触摸屏通讯驱动程序是确保工业触摸屏与主机系统之间有效通信的关键组件。
该驱动程序负责管理硬件连接、通讯协议、数据传输、错误检测与纠正、实时性处理以及人机交互界面等方面,以确保系统稳定、高效地运行。
二、硬件连接工业触摸屏与主机系统之间的硬件连接通常包括电缆、接口和连接器等组件。
这些硬件组件需满足高可靠性、耐用性和抗干扰能力的要求,以确保数据传输的稳定性和准确性。
此外,硬件连接方式还需适应不同的工业环境,如高温、潮湿、振动等恶劣条件。
三、通讯协议通讯协议是工业触摸屏通讯驱动程序的核心部分,规定了数据交换的标准和规则。
常见的通讯协议包括串行通讯协议(如RS-232、RS-485)和以太网通讯协议等。
这些协议定义了数据传输的格式、速率、同步方式、校验方式等内容,以确保主机系统与工业触摸屏之间数据传输的可靠性和兼容性。
四、数据传输数据传输是工业触摸屏通讯驱动程序的重要功能之一。
它负责将主机系统的控制指令和显示内容传输到工业触摸屏,同时将触摸屏的输入信号传输到主机系统。
为了提高数据传输的效率和稳定性,驱动程序通常采用高效的数据压缩、校验和重传等技术。
此外,数据传输还需满足实时性的要求,以确保用户与工业触摸屏之间的交互体验。
五、错误检测与纠正错误检测与纠正技术是工业触摸屏通讯驱动程序的关键组成部分,用于确保数据传输的准确性和可靠性。
当数据在传输过程中发生错误时,驱动程序需能够检测并纠正错误,防止因数据错误导致系统运行异常。
常见的错误检测与纠正技术包括奇偶校验、CRC校验等。
六、实时性处理实时性处理是工业触摸屏通讯驱动程序的另一重要特性。
它要求驱动程序能够快速响应主机系统和触摸屏之间的交互操作,确保系统运行的流畅性和响应速度。
实时性处理的关键在于优化算法和数据处理流程,以提高系统的整体性能和用户体验。
七、人机交互界面人机交互界面是工业触摸屏的核心功能之一,也是工业触摸屏通讯驱动程序的重要组成部分。
实验12 触摸屏驱动一、实验目的1.了解CE下本地设备驱动程序的加载过程2.掌握WinCE下本地设备驱动程序的设计方法3.实现本地设备驱动程序的接口函数二、实验环境1.软件:PB5.0,UltraEdit文本编辑器2.硬件:PC,2410实验平台三、实验内容1.分析触摸屏驱动程序2.将现有的触摸屏驱动程序添加进2410的BSP5.0包3.修改代码,以适用于其他尺寸屏幕的驱动4.在PB中调试驱动程序代码四、预备知识1.熟悉各种配置文件:.reg、.bib、.def、sources、makefile等2.熟悉PB的使用3.掌握驱动程序的基本知识五、实验原理1. 硬件采样原理(三星自带ADC控制器/触摸屏控制器)触摸屏一般由4层薄膜组成,其中最主要的就是X层和Y层的薄膜。
在点击触摸屏时,X层和Y层会在点击处连接,由此形成了测量通路。
如图1所示:图1:触摸屏原理当测量X方向电压时(即触摸中断产生时),触摸屏控制器(同时产生触摸中断)控制内部测量电路的切换,在X层形成从X+到X-方向的均匀电势场,而Y层无外加电压。
X层在点击处形成电阻分压状态,并与下面的Y层连接形成通路。
此时,就可以通过测量Y+或Y-管脚,得到点击处的X方向的电压。
反之,可以测量到Y轴方向的电压。
于是,形成了坐标点(X,Y)。
2410自带ADC控制器和触摸控制器,A/D通道直接与触摸屏相连。
如图2所示:图2:2410触摸采样原理触摸控制器切换测量电路,并产生中断;ADC控制器进行采样通道选择。
2.驱动分层触摸屏驱动程序属于本地设备驱动程序,经过编译生成一个DLL库,并由GWES 加载。
在WinCE系统中,触摸屏驱动也是一种分层驱动,上层是模型设备驱动程序MDD,下层是依赖平台的驱动程序PDD。
如图3所示:图3:驱动分层当系统访问硬件时,首先通过使用DDI函数与驱动程序交互,然后在驱动程序3.驱动程序的整体框图触摸屏驱动的整体框图如图4所示:图4:驱动流程整体框图触摸驱动被加载后,GWES首先执行相关的初始化操作,然后创建一个线程,用来判断采集的点是校准点还是普通的触摸点。
触摸屏驱动程序设计一、需求说明1.巩固和强化学生的嵌入式系统的基本概念和开发流程,掌握基本知识和基本技能。
2.掌握硬件开发平台、开发资源和软件开发环境,尤其是裸机嵌入式系统开发方法。
掌握汇编和C语言混合编程技巧,熟悉系统启动引导过程,能够成功移植嵌入式系统引导程序。
培养和训练学生综合利用所学基本知识和基本技能进行小型裸机程序开发的技能。
3.明确思路和任务,查询相关书籍、资料,重点分析S3C2440的触摸屏接口工作原理和相关寄存器。
编写触摸屏初始化函数,确定XY位置转换模式。
编写触摸屏中断初始化函数,中断服务函数。
编写屏幕校准函数。
确定坐标计算公式。
编写触点数据采集函数。
编写主函数,进入调试。
实现触摸屏坐标点x、y的正确读取。
二、功能描述通过对AD转换器的配置——触摸屏自动测试x/y位置模式,选择进入到触摸屏驱动函数。
在进行触摸屏测试时,先进入函数内判断是否启动A/D 转换,如果不是的话就跳出此函数,如果是的话进行下面的判断,看A/D 转换是否结束,如果是,跳出函数,如果不是运行程序,并输出x、y的值。
再回到触摸屏驱动函数,测试结束,清屏。
三、系统设计及实现一.系统设计1. 对触摸屏相关寄存器进行初始化,确定XY位置转换模式;2. 对中断初始化,设计中断服务函数;3. 通过校正函数和坐标计算公式,得出坐标。
二.流程图对ADC相关寄存器,中断进行设置中断服务函数在主函数中直接调用Test_Touchpanel函数最终测试结果,每碰触一下触摸屏,就在终端中显示一对XP,YP值四、实训心得两周时间转瞬即逝,在这两周里,我们潜心研究,以MINI2440开发板为实验硬件平台,采用ADS集成开发环境,是我们在课程内容基础上,加强对嵌入式系统的理解和裸机应用的设计。
在此过程中,需要我们分析嵌入式CPU引导程序的功能和引导过程,学会裸机驱动程序的开发以及简单应用程序的设计。
从而深化我们的专业基本技能,加强我们的动手能力。
/*********************************************************************** ILI9325 TFT彩屏驱动程序*********************************************************************** 文件名: ILI9325.c* 描述:* 公司: 爱晶电子* 作者日期注释*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * 王伟民2010/3/20 原始文件********************************************************************/#include "stc.h"//#include <stdio.h>#include "ILI9325.h"#include "delay.h"//=============================================================//TFT初始化//功能:该函数用于初始化TFT彩屏模块。
//入口参数: 无//出口参数: 无void ILI9325_initial(void){TFT_CS=1;delayms(5);TFT_RST=0;delayms(5);TFT_RST=1;delayms(50);//可以适当调整延时,保障稳定显示write_cmd_data(0x0001,0x0100); //源扫描设置SS=0, 输出的移动方向是从S1到S720 //(源扫描设置SS=1, 输出的移动方向是从S720到S1)//SM=0,逐行扫描(SM=1,隔行扫描)write_cmd_data(0x0002,0x0700); //B/C=1、EOR=1:行倒置(B/C=0:帧/场倒置)write_cmd_data(0x0003,0x1030); //AM=0,地址在水平方向自动加1//I/D[1:0] = 11:水平垂直方向均增加//BGR=1:采用BGR格式//TRI=0、DFM=*:8位机、两次数据传送write_cmd_data(0x0004,0x0000); //比例缩放设置:不缩放//显示控制write_cmd_data(0x0008,0x0207); //设置后边沿和前沿write_cmd_data(0x0009,0x0000);//设置非显示区时间间隔ISC[3:0] write_cmd_data(0x000A,0x0000); //帧标记功能write_cmd_data(0x000C,0x0000);//RGB显示接口控制1write_cmd_data(0x000D,0x0000);//帧标记位置write_cmd_data(0x000F,0x0000);//RGB显示接口控制2//电源配置write_cmd_data(0x0010,0x0000);write_cmd_data(0x0011,0x0007);write_cmd_data(0x0012,0x0000);write_cmd_data(0x0013,0x0000);//vghwrite_cmd_data(0x0010,0x1290);write_cmd_data(0x0011,0x0227);//delayms(100);//vregioutwrite_cmd_data(0x0012,0x001d); //0x001b//delayms(100);//vom amplitudewrite_cmd_data(0x0013,0x1500);//delayms(100);//vom Hwrite_cmd_data(0x0029,0x0018);write_cmd_data(0x002B,0x000D);//伽马校正write_cmd_data(0x0030,0x0004);write_cmd_data(0x0031,0x0307);write_cmd_data(0x0032,0x0002);//0006write_cmd_data(0x0035,0x0206);write_cmd_data(0x0036,0x0408);write_cmd_data(0x0037,0x0507);write_cmd_data(0x0038,0x0204);//0200write_cmd_data(0x0039,0x0707);write_cmd_data(0x003C,0x0405);//0504write_cmd_data(0x003D,0x0F02);//窗口设置write_cmd_data(0x0050,0x0000);//水平起始位置write_cmd_data(0x0051,0x00EF);//水平终止位置write_cmd_data(0x0052,0x0000);//垂直起始位置write_cmd_data(0x0053,0x013F);//垂直终止位置write_cmd_data(0x0060,0xA700);//门扫描设置,GS=1:从G320扫描到G1,320线write_cmd_data(0x0061,0x0001);write_cmd_data(0x006A,0x0000);//write_cmd_data(0x0080,0x0000);write_cmd_data(0x0081,0x0000);write_cmd_data(0x0082,0x0000);write_cmd_data(0x0083,0x0000);write_cmd_data(0x0084,0x0000);write_cmd_data(0x0085,0x0000);//write_cmd_data(0x0090,0x0010);write_cmd_data(0x0092,0x0600);write_cmd_data(0x0093,0x0003);write_cmd_data(0x0095,0x0110);write_cmd_data(0x0097,0x0000);write_cmd_data(0x0098,0x0000);write_cmd_data(0x0007,0x0133);//write_cmd_data(0x0022);}//=============================================================//写命令//功能:写一个命令到TFT控制器。
1、i2c_add_driver将驱动注册到总线上。
2、调用probe函数分配touch_dev结构,ts_init_touch初始化触摸屏设备。
初始化在gpio_request分配io口,初始化workINIT_WORK(&touch_dev->work, zinitix_touch_work),初始化input_dev 并注册inputrequest_irq申请中断对于input初始化:input_mt_init_slots(ts->input_dev, ts->max_touch_num);b类触摸事件需要set_bit(EV_SYN, touch_dev->input_dev->evbit);设置事件响应set_bit(EV_KEY, touch_dev->input_dev->evbit);设置按键响应set_bit(BTN_TOUCH, touch_dev->input_dev->keybit);一次触摸结束响应(后面调用input_report_key(touch_dev->input_dev, BTN_TOUCH, 0);每次报点都要调用。
0表示触摸结束)set_bit(EV_ABS, touch_dev->input_dev->evbit);绝对值事件响应触摸屏调试注意事项:1 、io口配置引脚定义。
(引脚序号是否跟主板一样)2、input初始化,事件设置,参数设置3、多点触摸协议有a类,b类之分。
A类在每次报点后加input_mt_sync(touch_dev->input_dev);B类需要在probe中input_mt_init_slots(ts->input_dev,ts->max_touch_num);再在每次报点前input_mt_slot(ts->input_dev, index);触摸屏驱动编写参考:1、打印信息参考:#ifdef DEBUG#define DBG(fmt ...) printk(KERNINFO fmt)#else#define DBT(fmt ...)#endif#ifdef DEBUGERR#define DEBUGERR(fmt ...) printk(KERNERR fmt) #else##define DEBUGERR(fmt ...)#endif2、互换参考:#ifdef SWAP_XY#define swap_xy(x,y) do{typeof(x) z=x; x=y;y=z;}while(0);#endifX, y 置换注意:input_device中也要置换Input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0, X_MAX, 0, 0)Input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0, Y_MAX, 0, 0)3、io初始化参考:IO初始化不正确将无法产生中断,#define TOUCH_RST_PIN RK29_PIN6_PC3#define TOUCH_INT_PIN RK29_PIN0_PA2Int ft5306_init_io(void){//用io前首先要申请io,其次注意io设置的延时。
触摸屏驱动程序的设计和实现嵌入式设备触摸屏按其技术原理可分为五类:矢量压力传感式、电阻式、电容式、红外线式和表面声波式。
其中电阻式触摸屏在嵌入式系统中用的较多,电阻式触摸屏可分为四线、五线、七线等几种。
一般来说,WinCE 触摸屏驱动的设计和实现有以下几个步骤:(1)配置和初始化触摸屏触摸屏驱动在初始化过程会调用TouchPanelEnable 函数,该函数调用的DDSI 函数为DdsiTouchPanelEnable 和DdsiTouchPanelDisable。
这两个DDSI 接口函数是驱动实现的关键所在,分别用于打开和关闭触摸屏硬件。
但是为了降低功耗,这两个函数其实可以不真正操作硬件,而只是实现软件上的控制。
同时,在初始化时还需要进行这几个配置和初始化:一是创建事件hTouchPanelEvent 和hCalibrationSampleAvailable,前者是在正常状态下当有触摸笔按下或者按下后需要定时采集数据时被触发;而后者是在校准状态下当有校准数据输入时被触发。
二是检查初始化所需的中断gIntrTouch(触摸屏中断)和gIntrTouchChanged(定时器中断),并将这两个中断关联到事件hTouchPanelEvent。
三是创建一个ISR 线程TouchPanelpISR,用于等待和处理触摸屏事件hTouchPanelEvent,它也是整个驱动程序中唯一的事件源。
(2)校准触摸屏基准参数完成前面繁琐的工作后,驱动程序的各种功能就都已经准备就绪了,现在就可以实际操作触摸屏幕了。
但一般来说,电阻式触摸屏需要校准,也就是说在驱动启动过程中MDD 层要调用相应的DDSI 函数来读取注册表中的校正数据校正触摸屏。
理想情况下,校准程序只要在嵌入式设备初次加电测试过程中运行一次就可以了,参考值会被存储在非易失性存储器中,以免让用户在以后。
尽管触摸屏正在迅速普及开来,但大多数开发人员以前从来没有开发过触摸屏产品。
本文详细介绍了触摸屏产品的设计步骤,指导读者了解使触摸屏首次工作需要的软硬件细节。
触摸屏如今随处可见。
工业控制系统、消费电子产品,甚至医疗设备上很多都装备了触摸屏输入装置。
我们平时不经意间都会用到触摸屏。
在ATM机上取款、签署包裹,办理登机手续或查找电话号码时都可能会用到触摸屏。
本文介绍了二种较新的CPU,它们都内建了对触摸屏输入的支持。
本文将介绍如何编写软件驱动程序,从而能够使用这些微处理器配置、校准触摸屏以及对触摸屏输入持续响应。
最终将提供可免费下载和使用的工作代码,作为读者进一步设计的基础。
触摸屏作为输入手段的优点和缺点没有一种输入方式是十全十美的,对某些特定的应用和产品类型来说,触摸屏不是最好的输入手段。
为了让读者清楚的了解触摸屏的特性,下面先概括使用触摸屏作为输入手段的优点和缺点。
首先是优点:触摸屏不可否认的具有酷的感觉,立刻就能使产品的使用变得更有乐趣。
同时触摸屏也非常直观。
当用户想要选择A选项时,他伸出手指碰一下A 选项就可以了。
这还不够直观吗?连两岁的婴儿都知道怎样伸手去触摸他(或她)想要的东西。
最后要说的是,触摸屏作为输入装置和系统固定在了一起。
如果用户忘记遥控器或鼠标放的位置,就会无法进行输入。
而如果具有触摸屏的设备放在用户前面,用户马上就可以用触摸屏进行输入。
再说缺点,触摸屏可能会在不合适的场合下被错误的使用。
这里我是指对安全性要求严格的设备,对于这些设备,如果没有适当的预防措施,使用触摸屏会非常危险。
下面我将概括一些最明显的潜在的问题,如果读者想作更进一步的了解,可以参考更多的资料。
第一个问题是视差,即屏幕上看到的对象的位置与其在触摸面板上的实际有效位置之间的差异。
图1说明了这个问题。
我能想到的最佳例子是典型的“免下车”ATM机。
这种ATM机不会根据汽车的高度升高或降低自己的高度,因此如果你坐在较高的SUV或卡车里,那么你就会从抬高的位置俯视显示屏。
为了保护昂贵的显示器件免受恶意破坏,ATM机都会在用户和显示屏之间放置几层强化玻璃。
触摸屏是不能这样保护的。
如果真这样做的话,用户就无法进行触摸了。
因此触摸屏放在表层上,而显示屏放在表层下的几层玻璃后面。
这就造成了触摸层和显示层之间的物理隔离。
如果用户以某个角度观看屏幕,就意味着用户按压触摸屏进行选择的位置会与用户接口软件预期的输入位置之间存在一定的距离偏差。
人们能很快适应这种偏差。
经过几次尝试和错误,使用者学习在触摸屏的表面找到显示信息的映射位置,然后触摸到正确的位置。
ATM设计师也认识到这一点,他们会采用大面积的按键,并尽量使它们相互远离,因此有助于防止错误按键的误触发。
当图1:视差(横截面图)。
然,不小心按下错误的ATM按键不会使你得癌症或使你失明。
但如果这样的失误发生在医疗控制设备上,并且系统设计师没有在系统内置足够的安全预防措施,那么以上两种后果确实都有可能发生。
通过缩短显示层和触摸层之间的物理距离可以尽量减少视差。
在CRT或LCD前面总会有玻璃存在。
最好的方法是将对触摸敏感的电子元件嵌入到玻璃里,并且这层玻璃做得尽可能薄。
这样就减少了触摸输入层和显示层之间的相隔距离。
像Palm这样的手持设备就可以采用这样的策略,因为它们不必太担心机械强度不够或者遭受恶意破坏。
随着相隔距离的缩小(用户觉得真的触摸到了图形元件),精度会大大提高。
第二个明显的问题是,在用户触摸屏幕的过程中,触摸屏幕的物体(触控笔、手指)至少会遮挡屏幕上的一小部分面积,从而影响用户的观察。
在工厂自动化应用中这种情况更容易发生,因为用户很可能使用手指或手套而非触控笔,即使是使用触控笔,在屏幕上做选择动作也会不时遮挡住一部分你给用户展示的信息。
例如,想象一下你想展示一个滑动控制条给用户调节数值(如速度或音量),并且你将用户选择的数值以数字形式显示在滑动控制条的左边。
这样做一般工作情况会很好,但当左撇子用户操作你的系统时,只有移开他的手指他才能看到所选的值。
因此你必须在你的用户界面设计中考虑这类因素。
触摸屏硬件原理简介我们在开始编写触摸屏驱动程序之前,必须对硬件的工作原理有个基本的了解。
许多不同的触摸技术会把屏幕某个位置的压力或接触转换成有意义的数字坐标。
典型的触摸技术包括电阻触摸屏、声表面波触摸屏、红外线触摸屏和电容触摸屏。
如果想详细了解这些技术,你可以登录或网站。
这里侧重介绍电阻触摸屏。
电阻触摸屏非常普及,你会发现许多评估板和开发套件中都集成了电阻触摸屏。
电阻触摸屏普及的主要原因是价格便宜,而且在电气上可以直接接入用户的系统中。
之所以叫电阻触摸屏,是因为它们本质上就是电阻分压器。
它们由两个电阻薄层组成,这两个薄层被非常薄的绝缘层隔开,绝缘层通常以塑料微粒子的形式存在。
当你触摸屏幕时,会使两个电阻薄层变形到足以使它们之间发生电气连接。
然后由软件通过检测分压器上产生的电压计算出两层的短接位置,并最终确定触摸位置。
电阻触摸屏分为几种类型,比如"四线","五线"和"八线"。
线越多,精度就越高,温度漂移也越少,但基本的操作是一样的。
在最简单的四线设计中,有一层称为"X轴"的电阻层,上面加有一定的电压,另一个称为"Y轴"的电阻层作为接受层测量对应X轴位置的电压值。
这一过程再反过来执行一遍,即Y轴层加电,X 轴层用于电压检测。
图2是电阻触摸屏的简单等效电路。
注意必须获取二个完全独立的读数,即X轴位置和Y轴位置数据。
这些数据在四线或五线电阻触摸屏中是无法同时读取的。
软件必须先读一个轴,然后再读另外一个轴。
读取的顺序则无关紧要。
将电阻触摸屏产生的电压转换成数字需要用到模数转换器(ADC)。
直到不久前这个ADC几乎一直是主CPU的外围器件。
Burr Brown NS7843或NS7846就是这种ADC控制器。
该器件为12位的模数转换器,其内嵌的逻辑电路通过交替给一个薄层加电,再从另外一层转换来控制触摸屏。
虽然可以使用诸如GPIO之类的信号线来完成薄层加电的切换,但该器件能够分担许多任务,还能提供产生触摸或笔压中断的方式。
最近有几家CPU制造商开始在主CPU中集成ADC模块和专用的触摸屏控制电路。
在消费类设备、远程信息通信或一些面向其它市场的产品中,LCD显示屏和触摸屏非常普遍,当想把CPU用于这类产品中时,在CPU中集成ADC和触摸屏控制电路的做法会非常有意义。
基于两种CPU的参考板本文设计两种集成了触摸屏控制功能的CPU的参考板。
这二种CPU都基于ARM 处理器架构。
第一块板是飞思卡尔的MX9823ADS评估板,采用了飞思卡尔的MC9328MX1处理器。
该评估板可以直接从飞思卡尔的分销商处定购。
评估套件包括QVGA(240x320)彩色LCD和触摸屏。
第二块板采用了夏普LH79524 ARM处理器。
这块夏普的参考板以及集成的显示和触摸套件都可以从LogicPD公司处定购。
有几种可更换的显示套件供选择,分辨率范围从QVGA到800x600像素不等。
本文中不提供每个驱动程序的详细代码,而是介绍驱动程序的设计和流程,并重点介绍其中的重要部分。
读者可以从ftp:///pub/2005/07maxwell 下载每个驱动程序的全部源代码。
总的来看,软件提供的功能完成以下这些步骤:1. 配置控制器硬件2. 判断屏幕是否被触摸3. 获得稳定的、去抖动的位置测量数据4. 校准触摸屏5. 将触摸状态和位置变化信息发送给更高层的图形软件下面开始详细介绍每个步骤。
硬件配置触摸驱动程序要做的第一件事是配置硬件。
对这些集成控制器来说,这意味着通过向映射到存储器的寄存器中写入数据将控制器配置成某个确定状态。
这一过程是由每个驱动程序中的TouchConfigureHardware()函数完成的。
为了配置硬件,需要事先做好某些决定。
例如,驱动程序应该使用中断驱动吗?为了获得能够响应并且精确的触摸位置信息需要什么样的转换速率?让我们看看做出这些决定的具体过程吧。
关于触摸驱动程序是否应该使用中断驱动,事实上在范例的驱动程序中用的就是中断驱动方式。
坦率地讲,我之所以这样做是因为使用中断很有趣。
千万不要由这个例子推断出采用中断永远是最好或最正确的设计方式,也不要听信别人说不采用中断驱动方式的触摸驱动程序就是"错误的"。
之所以这样说只是因为"轮询"对嵌入式系统程序员来说似乎变成了贬义词。
我曾经问过一位客户,他的输入设备采用的是轮询还是中断服务方式。
回答是"这是嵌入式系统,我们不做任何轮询"。
我当时感觉问这个问题时我就像一个傻瓜,但进一步探讨后发现查询其实也是一种合理且值得考虑的方式。
如果使用的是RTOS ,并且所有任务经常为了等待某类外部事件而被中断,处理器经常处于空闲的循环状态,没有什么有意义的事做。
这种情况下使用空闲任务查询触摸屏上的输入也许是更好的设计方式。
根据你的总体系统需求,查询也可能是一个值得考虑的合理的设计方式。
配置中断的方法因具体操作系统而异。
读者会发现对于每一个支持的RTOS 都有被(#ifdef)限定的代码段。
在所有情况下驱动程序实际会使用二种不同的中断: 1 当屏幕被初次触摸时唤醒主机的中断,称为PEN_DOWN 中断图2:触摸屏电路简单等效电路。
2 当完成一组模数数据转换时的第二种中断信号后文会详细介绍这些中断和它们产生的过程。
接下来的问题是我们希望以多快的速度从ADC接收采样输入读数。
采样速度会影响我们需要如何配置时钟来驱动触摸屏和ADC。
我们希望时钟有足够快的速度来提供可响应的输入和实现精确的跟踪,但也不要太快,以至于影响转换精度,或让系统消耗超过所需的功率。
根据我的经验,触摸屏至少需要以20Hz或50ms间隔的速度向更高层软件提供位置更新数据,只要高层软件跟得上,速度越快越好,我们不太担心功耗问题。
如果触摸输入响应比这慢得多,那么在用户的触摸输入和显示屏上可观察到的响应之间会出现明显和烦人的迟滞现象。
20Hz的更新速度听起来并不是太有挑战性,但提供20Hz的更新速度实际上要求采样速度接近200Hz,具体数值取决于我们在确定输入稳定之前准备采用多少读数。
为了去抖动和对触摸输入位置值进行平均,我们需要进行过采样。
电阻触摸屏,特别是便宜的那种,一般会有很大的噪声和抖动。
在向更高层软件发送位置更新数据之前,驱动程序需要多次采样每个轴上的输入。
我们提供的驱动程序默认情况下将以最少200Hz(5ms)的采样速率配置各自处理器上的ADC时钟。
这样就能让驱动程序对输入原始数据进行充分的去抖动和过滤,并仍能向高层用户接口软件提供20Hz的实际位置更新速率。