嵌入式ARM下的触摸屏驱动系统设计
- 格式:pdf
- 大小:243.71 KB
- 文档页数:4
基于ARM的触摸屏控制系统设计作者:周宇来源:《电子技术与软件工程》2018年第03期摘要自改革开放以来,我国的科学技术得到了快速的发展,在高科技技术发展如此之快的同时,高科技产物也在不断的出现,ARM微处理器就是一项现代化高科技产物,在计算机或手机上都得到了很广泛的应用,使计算机手机的系统性能得到很大程度的提升,而且现在对ARM微处理器的研究是国家的重点发展项目,但是就从我国现在的科学技术水平来看,我国相比于一些发达国家还存在很大的差距,在对ARM微处理器的研究上还存在一些问题,要想使我国的ARM微处理器能够有一个更好的开发,我们就需要对ARM微处理器进行不断的研究和探讨。
【关键词】ARM微处理器触摸屏控制系统设计分析ARM触摸屏就是以ARM微处理器为核心系统新发明的一种触摸屏,ARM触摸屏相比于传统的触摸屏来讲,操作更加简单直观,而且功耗非常的小,在功能上更加的使用,而且最大的特点就是取代了键盘鼠标,在实际运用中更加的方便,在二十一世纪,ARM触摸屏控制系统的应用越来越普遍,而且也是当今时代触摸屏的主流配置,更重要的是ARM触摸屏在我们的生活中也发挥着很大的作用,但是由于我国发展起步较晚,自行生产的ARM微处理器还存在功耗大,占用空间多等问题,这些问题严重制约我国ARM微处理器的发展,下面我们就对ARM的触摸屏控制系统进行全面的分析探讨。
1 ARM的触摸控制系统的总体框架ARM微处理器体积小,功耗低,成本低,高性能,在使用过程中支持十六位,三十二位双指令集,能很好的兼容八位或十六位器件,而且ARM微处理器的寻址方式非常简单,执行效率还很高,这一系列特点都能够很好应用于触摸控制系统,在这里我们以最为常见的彩色液晶屏为例,彩色液晶屏的ARM触摸屏控制系统的整体框架主要由五部分组成,分别是ARM 微处理器,液晶屏控制器,触摸屏控制器,彩色液晶屏以及触摸屏,彩色液晶屏作为人机交换的最直接的交互画面,通过内部的液晶控制屏和ARM微处理器相连接,触摸屏控制器通过模数转换对信息进行处理,将转换完成后的信息传递到ARM微处理器,ARM微处理器对这些信息进行处理,然后控制液晶显示器进行相应的画面更新动作,实现人机交换功能,在这里需要注意的是,微处理器的型号为LPC2290,触摸屏控制器选择FM7843,液晶屏控制器选择SID13503。
贵州大学实验报告学院:专业:班级:姓名学号实验组实验时间05.06 指导教师余佩嘉成绩实验项目名称触摸屏驱动实验实验目的1.了解触摸屏基本概念与原理。
2.理解触摸屏与 LCD 的密切配合。
3.编程实现对触摸屏的控制。
实验原理1.触摸屏原理触摸屏按其工作原理的不同分为表面声波屏、电容屏、电阻屏和红外屏几种。
常见的又数电阻触摸屏。
如图 3-20 所示,电阻触摸屏的屏体部分是一块与显示器表面非常配合的多层复合薄膜,由一层玻璃或有机玻璃作为基层,表面涂有一层透明的导电层,上面再盖有一层外表面硬化处理、光滑防刮的塑料层,它的内表面也涂有一层透明导电层,在两层导电层之间有许多细小(小于千分之一英寸)的透明隔离点把它们隔开绝缘。
如图 3-21 所示,当手指或笔触摸屏幕时(图 c),平常相互绝缘的两层导电层就在触摸点位置有了一个接触,因其中一面导电层(顶层)接通 X 轴方向的 5V 均匀电压场(图a),使得检测层(底层)的电压由零变为非零,控制器侦测到这个接通后,进行 A/D 转换,并将得到的电压值与 5V 相比即可得触摸点的 X 轴坐标为(原点在靠近接地点的那端): Xi=Lx*Vi / V(即分压原理)同理得出 Y 轴的坐标,这就是所有电阻触摸屏共同的最基本原理。
2.电阻触摸屏的有关技术电阻触摸屏的主要部分是一块与显示器表面非常配合的电阻薄膜屏,这是一种多层的复合薄膜,由一层玻璃或有机玻璃作为基层,表面涂有一层叫 ITO 的透明导电层,上面再盖有一层外表面硬化处理、光滑防刮的塑料层,它的内表面也涂有一层导电层(ITO 或镍金)。
电阻触摸屏的两层 ITO 工作面必须是完整的,在每个工作面的两条边线上各涂一条银胶,一端加 5V 电压,一端加 0V,就能在工作面的一个方向上形成均匀连续的平行电压分布。
在侦测到有触摸后,立刻 A/D 转换测量接触点的模拟量电压值,根据5V 电压下的等比例公式就能计算出触摸点在这个方向上的位置。
嵌入式ARM下的触摸屏驱动系统设计研究
文章首先介绍了触摸屏的实现原理,然后介绍了触摸屏芯片AD7873的特性,在此基础上设计了ad7873与i.MX27和触摸屏的连接PCB图,最后依照硬件连接图设计了嵌入式Linux下的驱动,并成功通过了tclib触摸屏专业测试软件的测试,在家庭智能网关系统的测试中也成功运行,实现了从硬件到软件的嵌入式下触摸屏的驱动系统设计。
1引言
随着计算机技术的发展和普及,触摸屏技术得到了越来越广泛应用,在各种手持设备中,如手机、MP4、掌上游戏机、掌上PDA等,由于其方便、舒适,使其完全摆脱了键盘和鼠标的束缚,使人机交互更为直截了当。
而在微软最新开发的windows7操作系统中,就有其值得骄傲并加以推广的多点触摸技术,并成为一大卖点。
可见,触摸屏技术引起了上到微软,下到普通老百姓的关注。
而在我们的日常生活中,无论你是在商场购物,还是在银行存取款,触摸式的自动服务器将能为你提供了方便快捷的服务。
这里通过对触摸屏原理的理解和分析,成功的设计出了CPU与触摸屏芯片之间的硬件连接,并依照硬件和驱
动设计的原理,设计出了基于嵌入式Linux和飞思卡尔i.MX27芯片以及
AD7873触摸屏芯片的驱动程序,并成功移植到内核中,实现了家庭控制器系
统的触摸技术。
2硬件系统的构成
2.1电阻式触摸屏原理。
电阻式触摸屏是一种传感器,它将矩形区域中触摸点(X,Y)的物理位置转
换为代表X坐标和Y坐标的电压。
当触摸屏表面受到的压力(如通过笔尖或
手指进行按压)足够大时,顶层与底层之间会产生接触。
所有的电阻式触摸屏。
基于ARM的LCD触摸屏系统设计策
随着嵌入式系统技术的飞速发展,工业设备产品也越来越现代化,普遍要求可视化操作。
LCD触摸屏低耗能.散热小,成本低,纤薄轻巧,外形尺寸小,安装容易。
使用LCD触摸屏作为工业设备的输入输出设备既能达到可视化的要求,方便现场操作,又能降低产品的成本。
而在产品的整体设计过程中,人机交互界面的设计往往占据着很大一部分工作,这样,不但极大地增加了产品的开发成本瓶且延长了产品的上市周期。
本文设计的基于
S3C44BOX的人机交互界面是一种可定制、简单易用、性能优良的通用型人机交互界面,能很好地解决上述问题。
1 系统结构
系统主要包括三个部分,分别为PC机、S3C4480X微处理器和LCD 触摸屏模块。
系统结构框图如图1所示。
一款基于ARM的LCD触摸屏系统设计引言工业设备产品越来越现代化与嵌入式系统技术的飞速发展是分不开的,并且目前的工业设备产品普遍都要求可视化操作。
LCD触摸屏优点众多:低耗能.散热小,成本低,纤薄轻巧,外形尺寸小,安装容易。
使用LCD触摸屏作为工业设备的输入输出设备既能达到可视化的要求,方便现场操作,又能降低产品的成本。
而在产品的整体设计过程中,人机交互界面的设计往往占据着很大一部分工作,这样,不但极大地增加了产品的开发成本瓶且延长了产品引言工业设备产品越来越现代化与嵌入式系统技术的飞速发展是分不开的,并且目前的工业设备产品普遍都要求可视化操作。
LCD触摸屏优点众多:低耗能.散热小,成本低,纤薄轻巧,外形尺寸小,安装容易。
使用LCD触摸屏作为工业设备的输入输出设备既能达到可视化的要求,方便现场操作,又能降低产品的成本。
而在产品的整体设计过程中,人机交互界面的设计往往占据着很大一部分工作,这样,不但极大地增加了产品的开发成本瓶且延长了产品的上市周期。
本文设计的基于S3C44BOX的人机交互界面很好地解决上述问题,该设计是一种可定制、简单易用、性能优良的通用型人机交互界面,非常便于操作。
1 系统结构LCD触摸屏系统主要包括三个部分,分别为PC机、S3C4480X微处理器和LCD触摸屏模块。
系统结构框图如图1所示。
图1 系统结构框图本系统为基于S3C44BOX的工业设备提供交互接口,通过该系统可以给工业设备提供一个可视化的人机界面。
来自PC机的定制好的界面信息存储在ARM的FLASH存储器内。
在应用当中,当微处理器接收到触摸屏按键信息时,对工业设备进行控制。
同时微处理器也对LCD进行界面的刷新,这样以完成人机交互。
2 系统硬件设计系统硬件电路原理如图2所示。
其中S3C4480X为CPU内核,320x240点阵LCD 触摸屏为主要的输入输出设备。
图2 系统硬件电路原理图2.1 LCD触摸屏模块OCMJ15x20D介绍本系统显示部分采用的是OCMJ15x20D (320x240点阵)D系列中文液晶湿示模块,其中OCMJ表示奥可拉中文集成模块。
带触摸屏的ARM开发板驱动基于AS3992芯片的RFM-x系列RFID读写模块凡夫RFM-x模块是高集成度的RFID读写模块,软件功能强大,有关EPC协议的电子标签的所有操作以及标签防碰撞算法都已封包在软件中了,用户应用层软件无需深入了解RFM-x模块与电子标签之间的具体通信协议,驱动模块的软件很简单,只要掌握几个基本指令,就能开发出应用层软件。
我设计的这个演示程序运行在STM32F107平台上,ARM主程序是一个图形菜单界面,其中有一个RFID图标。
点击“RFID”图标,进入RFID扫描界面,点击“开始”,开始扫描并显示标签。
点选其中一个标签号,反显,再次点击,可以进入写标签界面。
进入写标签界面,输入新标签号,点“确定”就OK了。
还有一个RFID设置的界面。
后附ARM开发板直接驱动RFM-x模块的相关程序和函数节选。
在STM32F107开发板上调试运行通过。
演示程序已经支持4.3’LCD触摸屏、8GMicroSD卡、EEPROM、2M的Flash SST25VF016B,支持两个串口、一个SPI,还有按键、LED,有实时时钟等,软件功能有文本浏览、图片浏览、画板,以及RFID读写。
需要完整程序的可以联系我,QQ:542968281。
============================================================ ========= 5.3.1 头文件/*COMMANDS */#define OUT_INVENTORY_ID 0x31#define IN_INVENTORY_ID 0x32#define OUT_SELECT_TAG_ID 0x33#define IN_SELECT_TAG_ID 0x34#define OUT_WRITE_TO_TAG_ID 0x35#define IN_WRITE_TO_TAG_ID 0x36#define OUT_READ_FROM_TAG_ID 0x37#define IN_READ_FROM_TAG_ID 0x38#define OUT_WRITE_REG_ID 0x1A#define IN_WRITE_REG_ID 0x1B#define OUT_READ_REG_ID 0x1C#define IN_READ_REG_ID 0x1D#define OUT_INVENTORY_IDSize 0x02#define IN_INVENTORY_IDSize 0x3f#define OUT_WRITE_TO_TAG_IDSize 0x3f#define IN_WRITE_TO_TAG_IDSize 0x03#define OUT_READ_FROM_TAG_IDSize 0x07 #define IN_READ_FROM_TAG_IDSize 0x3f #define OUT_WRITE_REG_IDSize 0x05#define IN_WRITE_REG_IDSize 0x02#define OUT_READ_REG_IDSize 0x02#define IN_READ_REG_IDSize 0x055.3.2 节选主程序中盘点标签的例程//发inventory Tag命令if((RFID_START&0xC0==0xC0{LED3=1;USART1_TX_BUF[0]=OUT_INVENTORY_ID;USART1_TX_BUF[1]=OUT_INVENTORY_IDSize+1;USART1_TX_BUF[2]=0x01;USART1_SEND(USART1_TX_BUF;USART1_RX_STA=0; //意外掉包时清零timer=0;RFID_START&=0x80; //清除循环计数bit[5:0],清bit6为usart1忙状态 } else{if((RFID_START&0xC0==0x80{timer++;if(timer>65534{RFID_START++; //意外掉包时循环计数bit[5:0],溢出进位到bit6,inventory可以再次发送timer=0;#ifdef debugprintf("\nRFID_START:%x\n",RFID_START;#endif}}}5.3.3 Select标签的函数//Select Tag//sel---Select Tag的Tag_Buffer[]指针void Select_tag(u8 sel{u8 i,j;u32 temp;USART1_TX_BUF[0]=OUT_SELECT_TAG_ID;USART1_TX_BUF[2]=0x0C;USART1_TX_BUF[1]=USART1_TX_BUF[2]+3;for(i=3;i>0;i--{temp=Tag_Buffer[3*sel-i];for(j=0;j<4;j++{//temp=temp>>j;//USART1_TX_BUF[3+j]&=0x00;USART1_TX_BUF[3+j+4*(3-i]=temp>>8*(3-j;#ifdef debugprintf("\nSelect Tag:%x\n",USART1_TX_BUF[3+j+4*(3-i]; #endif }}USART1_SEND(USART1_TX_BUF;}5.3.4 Write标签的函数//Write Tag//data---Write Tag的数据void Write_tag(u32 *data{u8 i,j;USART1_TX_BUF[0]=OUT_WRITE_TO_TAG_ID;USART1_TX_BUF[2]=0x01;//EPCUSART1_TX_BUF[3]=0x02;//EPC addressUSART1_TX_BUF[4]=0x00;//Pass WordUSART1_TX_BUF[5]=0x00;//Pass WordUSART1_TX_BUF[6]=0x00;//Pass WordUSART1_TX_BUF[7]=0x00;//Pass WordUSART1_TX_BUF[8]=0x06;//EPC Word lengthUSART1_TX_BUF[1]=2*USART1_TX_BUF[8]+9;//EPC Word length for(i=0;i<3;i++{for(j=0;j<4;j++{USART1_TX_BUF[9+j+4*i]=data[i]>>8*(3-j;#ifdef debugprintf("\nWrite Tag:%x\n",USART1_TX_BUF[9+j+4*i]; #endif}}USART1_SEND(USART1_TX_BUF;}5.3.5 调整模块的输出功率和灵敏度的函数void Save_RFID_Set(u8 PA_val,u8 Sensi_val{u8 len,temp=0;u8 data0,data1,data2;/*-----------保存功率设置-------------*///读Modulator Control Register[23:0]USART1_TX_BUF[0]=OUT_READ_REG_ID;USART1_TX_BUF[1]=OUT_READ_REG_IDSize+1;USART1_TX_BUF[2]=0x15; USART1_SEND(USART1_TX_BUF; while(!(USART1_RX_STA&0x8000{delay_ms(5;temp++;if (temp>20break;}if(USART1_RX_STA&0x8000{len=USART1_RX_STA&0x0FFF;len++; //得到此次接收到的数据长度#ifdef debugprintf("\nlen=%x\n",len;#endifif((len==6&&(USART1_RX_BUF[5]==0x00{data0=USART1_RX_BUF[2];data1=USART1_RX_BUF[3];data2=USART1_RX_BUF[4];}else{LCD_Fill(0,260,240,280,LGRAY;//填充灰色Show_Str(10,260,"获取功率失败!",16,0x01; //叠加模式,非自动换行 } USART1_RX_STA=0;}else{LCD_Fill(0,260,240,280,LGRAY;//填充灰色Show_Str(10,260,"获取功率超时!",16,0x01; //叠加模式,非自动换行}//改变功率data0 = (data0&0xE0|PA_table[27-PA_val];//写Modulator Control Register[23:0]USART1_TX_BUF[0]=OUT_WRITE_REG_ID;USART1_TX_BUF[1]=OUT_WRITE_REG_IDSize+1;USART1_TX_BUF[2]=0x15;USART1_TX_BUF[3]=data0;USART1_TX_BUF[4]=data1;USART1_TX_BUF[5]=data2;USART1_SEND(USART1_TX_BUF;while(!(USART1_RX_STA&0x8000{delay_ms(5;temp++;if (temp>20break;}if(USART1_RX_STA&0x8000{len=USART1_RX_STA&0x0FFF;len++; //得到此次接收到的数据长度#ifdef debugprintf("\nlen=%x\n",len;#endifif((len==3&&(USART1_RX_BUF[2]==0x00;else{LCD_Fill(0,260,240,280,LGRAY;//填充灰色Show_Str(10,260,"设置功率失败!",16,0x01; //叠加模式,非自动换行 } USART1_RX_STA=0;}else{LCD_Fill(0,260,240,280,LGRAY;//填充灰色Show_Str(10,260,"设置功率超时!",16,0x01; //叠加模式,非自动换行 } /*-----------保存灵敏度设置-------------*///读Register0x0A[7:0]data0 = Read_RFIDModule(0x0A;//改变灵敏度data0 = (data0&0x04|Sensitivity_table[Sensi_val][1];//写Register0x0A[7:0]Write_RFIDModule(0x0A,data0;//读Register0x05[7:0]data0 = Read_RFIDModule(0x05;//改变灵敏度data0 = (data0&0x7F|Sensitivity_table[Sensi_val][0];//写Register0x05[7:0]Write_RFIDModule(0x05,data0;/*-----------保存Q值设置-------------*/LCD_Fill(0,260,240,280,LGRAY;//填充灰色Show_Str(10,260,"初始化完成!",16,0x01; //叠加模式,非自动换行}5.3.6 读模块寄存器的函数u8 Read_RFIDModule(u8 addr{u8 len,temp=0;u8 data0;USART1_TX_BUF[0]=OUT_READ_REG_ID;USART1_TX_BUF[1]=OUT_READ_REG_IDSize+1;USART1_TX_BUF[2]=addr; USART1_SEND(USART1_TX_BUF;while(!(USART1_RX_STA&0x8000{delay_ms(5;temp++;if (temp>20break;} if(USART1_RX_STA&0x8000 { len=USART1_RX_STA&0x0FFF; len++; //得到此次接收到的数据长度 if((len==6&&(USART1_RX_BUF[5]==0x00{ data0=USART1_RX_BUF[2]; USART1_RX_STA=0; return data0; } else{LCD_Fill(0,260,240,280,LGRAY;Show_Str(10,260,"获取失败!",16,0x01;USART1_RX_STA=0;return 0xff;} //叠加模式,非自动换行 } else{LCD_Fill(0,260,240,280,LGRAY;Show_Str(10,260,"获取超时!",16,0x01;return 0xff;} //叠加模式,非自动换行 } 5.3.7 写模块寄存器的函数 void Write_RFIDModule(u8 addr,u8 data { u8 len,temp=0; USART1_TX_BUF[0]=OUT_WRITE_REG_ID;USART1_TX_BUF[1]=OUT_WRITE_REG_IDSize-1; USART1_TX_BUF[2]=addr; USART1_TX_BUF[3]=data; USART1_SEND(USART1_TX_BUF;while(!(USART1_RX_STA&0x8000 { delay_ms(5; temp++;if (temp>20break; } if(USART1_RX_STA&0x8000{ len=USART1_RX_STA&0x0FFF; len++; //得到此次接收到的数据长度if((len==3&&(USART1_RX_BUF[2]==0x00; else{LCD_Fill(0,260,240,280,LGRAY;Show_Str(10,260,"设置失败!",16,0x01;} // 叠加模式,非自动换行 USART1_RX_STA=0; } else{LCD_Fill(0,260,240,280,LGRAY;Show_Str(10,260,"设置超时!",16,0x01;} //叠加模式, 非自动换行 } 5.3.8 串口接收中断服务函数 //串口 1 中断服务程序 u8USART1_RX_BUF[3060]; //接收状态 //bit15,接收完成标志 //bit14,接收到 0x0d//bit11~0,接收到的有效字节数目,最多 3060,0xBF4 u16 USART1_RX_STA=0; //接收状态标记 //接收缓冲,最大 3060 个字节. void USART1_IRQHandler(void { u8 res; if(USART1->SR&(1<<5//接收到数据 { res=USART1->DR;USART1_RX_BUF[USART1_RX_STA&0x0FFF]=res; switch(USART1_RX_BUF[0] {case IN_CHECK_ON_LINE_ID: //返回两字节包处理if((USART1_RX_STA&0x0FFF==1 { //USART1_RX_STA|=0x8000;; 接收完成标志USART1_RX_STA=0; return; } break; case IN_FIRM_HARDW_ID: caseIN_READ_REG_ID: case IN_WRITE_REG_ID: case IN_SELECT_TAG_ID: caseIN_WRITE_TO_TAG_ID: //返回变长字节包处理 //返回六字节包处理 //返回三字节包处理 //返回三字节包处理 //返回四字节包处理 //收到两字节命令,if((USART1_RX_STA&0x0FFF>1{ if((USART1_RX_STA&0x0FFF==(USART1_RX_BUF[1]-1 //接收完成{ USART1_RX_STA|=0x8000; return; } } break; case IN_INVENTORY_ID: //返回变长字节包或四字节包处理 //接收完成标志 if((USART1_RX_STA&0x0FFF>16{ if((USART1_RX_STA&0x0FFF==(USART1_RX_BUF[1]*USA RT1_RX_BUF[2]-1//接收完成 { USART1_RX_STA|=0x8000; return; } }if((USART1_RX_STA&0x0FFF==0x03 && (USART1_RX_BUF[2]==0{ USART1_RX_STA|=0x8000; 无标签,接收完成标志 return; //收到 4 字节命令, //接收完成标志} break; default: USART1_RX_STA=0; return; } USART1_RX_STA++;if((USART1_RX_STA&0x0FFF>3059USART1_RX_STA|=0x8000;//接收数据错误,重新开始接收 }return; } 需要完整程序的可以联系我,QQ:542968281。
嵌入式系统触摸屏设计(需要仔细品读)触摸屏工作原理与结构触摸屏附着在显示器的表面,根据触摸点在显示屏上对应坐标点的显示内容或图形符号,进行相应的操作。
触摸屏按其工作原理可分为矢量压力传感式、电阻式、电容式、红外线式和表面声波式5类。
在嵌入式系统中常用的是电阻式触摸屏。
电阻触摸屏结构如图5.6.1(c)所示,最上层是一层外表面经过硬化处理、光滑防刮的塑料层,内表面也涂有一层导电层(ITO或镍金);基层采用一层玻璃或薄膜,内表面涂有叫作ITO的透明导电层;在两层导电层之间有许多细小(小于千分之一英寸)的透明隔离点把它们隔开绝缘。
在每个工作面的两条边线上各涂一条银胶,称为该工作面的一对电极,一端加5V电压,一端加0V,在工作面的一个方向上形成均匀连续的平行电压分布。
当给X方向的电极对施加一确定的电压,而Y方向电极对不加电压时,在x平行电压场中,触点处的电压值可以在Y+(或Y—)电极上反映出来,通过测量Y+电极对地的电压大小,通过A/D转换,便可得知触点的X坐标值。
同理,当给Y 电极对施加电压,而X电极对不加电压时,通过测量X+电极的电压,通过A/D转换便可得知触点的Y坐标。
当手指或笔触摸屏幕时(如图5.6.1(c)所示),两个相互绝缘的导电层在触摸点处接触,因其中一面导电层(顶层)接通X轴方向的5V均匀电压场(如图5.6.1(a)所示),使得检测层(底层)的电压由零变为非零,控制器检测到这个接通后,进行A/D转换,并将得到的电压值与5V相比,即可得触摸点的X轴坐标为(原点在靠近接地点的那端):同理也可以得出Y轴的坐标。
电阻式触摸屏有四线式和五线式两种。
四线式触摸屏的X工作面和Y工作面分别加在两个导电层上,共有4根引出线:X+、X-,Y +、Y-分别连到触摸屏的X电极对和Y电极对上。
四线电阻屏触摸寿命小于100万次。
五线式触摸屏是四线式触摸屏的改进型。
五线式触摸屏把X工作面和Y工作面都加在玻璃基层的导电涂层上,工作时采用分时加电,即让两个方向的电压场分时工作在同一工作面上,而外导电层则仅仅用来充当导体和电压测量电极。
实验四触摸屏驱动程序设计一、实验目的以一个简单字符设备驱动程序为原型,剖析其基本结构。
进行部分改写之后并编译实现其相应功能。
了解在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()创建代表此项设备的文件节点——设备入口点,就可使一项设备在系统中可见,成为应用程序可以访问的设备。
另外,设备驱动在卸载时需要回收相应的资源,令设备的相应寄存器值复位并从系统中注销该设备。
嵌入式触摸屏驱动开发设计【摘要】嵌入式系统设计中,使用触摸屏是重要的一环,在使用它之前要添加驱动程序才能使用,同时也要根据触摸屏的大小和种类进行修改对应的驱动,才能使触摸屏正确发挥功能。
【关键词】嵌入式触摸屏驱动当前,随着人们对多媒体信息查询的不断增加,人们逐渐越来越多地谈到触摸屏,因为它不仅适用于多媒体信息查询,而且具有坚固耐用、反应速度快、节省空间、易于交流等许多优点。
利用触摸屏技术,用户只要用手指轻轻地碰触显示屏上的图符或文字就能实现对主机操作,从而使人机交互更为直截了当,这种技术大大方便了那些不懂电脑操作的用户。
触摸屏作为一种新的电脑输入设备,它是目前简单、方便、自然的一种人机交互方式。
它的应用范围非常广阔,主要在公共信息的查询方面;如电信局、税务局、银行、电力等部门的业务查询;城市街头的信息查询;此外应用于领导办公、工业控制、军事指挥、电子游戏、点歌点菜、多媒体教学、房地产预售等。
预计将来,触摸屏还要走入家庭。
在嵌入式系统中,经常要使用到触摸屏,然而它不是一连接就能使用的器件,需要添加驱动程序,才能使触摸有效,下面是触摸屏驱动程序添加的过程。
首先找到源文件,然后按照下列步骤进行操作。
s3c2410_ts.hs3c2410_ts.ccp s3c2410_ts.h include/asm-arm/cp s3c2410_ts.c drivers/char/修改drivers/char/目录下的Kconfig,Makefile文件。
添加ts驱动选项:Makefile1043 +obj-$(CONFIG_S3C2410_TS) +=s3c2410ts.oKconfig在config S4C2410_RTC选项下添加:choiceprompt “s3c2410 touchscreen”default S3C2410_TSdepends on ARCH_S3C2410config S3C2410_TStristate “normal touchscreeen “config S3C2410_TS_ADStristate “touchscreen ads”endchoic修改arch/arm/mach-s3c2410下的四个文件:devs.hdevs.cmach-smdk2410.cs3c2410.c1.devs.h添加如下:extern struct platform_device s3c_device_ts;2.devs.c添加如下:#include………./* Touchscreen */static struct s3c2410_ts_mach_info s3c2410ts_info;void __init set_s3c2410ts_info(struct s3c2410_ts_mach_info *hard_s3c2410ts_info)memcpy(&s3c2410ts_info,hard_s3c2410ts_info,sizeof(structs3c2410_ts_mach_info));EXPORT_SYMBOL(set_s3c2410ts_info);struct platform_device s3c_device_ts = {.name = “s3c2410-ts”,.id = -1,.dev= {.platform_data = &s3c2410ts_info,}};EXPORT_SYMBOL(s3c_device_ts);/* USB Device (Gadget)*/3.mach-smdk2410.c添加如下:#include…….//ts flastatic struct s3c2410_ts_mach_info gec2410_ts __initdata = {.delay = 10000,.presc = 49,.oversampling_shift = 2,}static struct platform_device *smdk2410_devices[] __initdata = {&s3c_device_usb,&s3c_device_lcd,&s3c_device_wdt,&s3c_device_i2c,&s3c_device_iis,&s3c_device_nand,&s3c_device_ts, //add here};void __init smdk2410_map_io(void){s3c24xx_init_io(smdk2410_iodesc, ARRAY_SIZE(smdk2410_iodesc));s3c24xx_init_clocks(0);s3c24xx_init_uarts(smdk2410_uartcfgs, ARRAY_SIZE(smdk2410_uartcfgs));s3c24xx_set_board(&smdk2410_board);set_s3c2410fb_info(&smdk2410_lcd_platdata);set_s3c2410ts_info(&gec2410_ts);小结:本设计对嵌入式系统的触摸屏的驱动进行了开发,选取了典型的ARM 处理器S3C2410作为处理对象,驱动添加成功后,触摸屏的效果正常发挥,达到了目的。