嵌入式课程设计.docx
- 文档编号:7696895
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:20
- 大小:652.91KB
嵌入式课程设计.docx
《嵌入式课程设计.docx》由会员分享,可在线阅读,更多相关《嵌入式课程设计.docx(20页珍藏版)》请在冰豆网上搜索。
嵌入式课程设计
1引言
使用S3C2410芯片设计的四线电阻式触摸屏在博创公司的UPNetARM2410S嵌入式开发平台上得到了很好的效果,屏幕显示无闪烁,画面切换速度快,触摸屏响应迅速。
设备驱动程序是Linux内核的重要组成部分,控制了操作系统和硬件设备之间的交互。
Linux的设备管理是和文件系统紧密结合的,各种设备都以文件的形式存放在/dev目录下,成为设备文件。
应用程序可以打开、关闭、读写这些设备文件,对设备的操作就像操作普通的数据文件一样简便。
为开发便利、提高效率,本设计采用可安装模块方式开发调试触摸屏驱动程序【1】。
本文介绍了基于三星S3C2410X微处理器,采用SPI接口与ADS7843控制器芯片完成模块的设计。
具体包括在嵌入式Linux操作系统中的软件驱动开发,采用内核定时器的下半部机制进行了硬件中断程序设计,采用16个时钟周期的坐标转换时序,实现触摸点数据采集的方法,给出了坐标采集的流程。
设计完成的驱动程序在博创公司教学实验设备UP-NETARM2410-S平台上运行效果良好【2】。
1.1课题背景
随着信息家电和通讯设备的普及,作为与用户交互的终端媒介,触摸屏在生活中得到广泛的应用。
如何在系统中集成触摸屏模块以及在嵌入式操作系统中实现其驱动程序,都成为嵌入式系统设计者需要考虑的问题【3】。
嵌入式系统触摸屏的应用越来广泛,诸如以PDA为标志的数码产品逐渐选用LCD触摸屏作为系统的输入设备.触摸屏分为电阻、电容、表面声波、红外线扫描和矢量压力传感等,其中用的最普遍的是四线或五线电阻触摸屏【4】。
然而在日常使用的触摸产品中,或多或少发现有些触摸屏对触摸动作响应不够灵敏,甚者会引起死机,是什么导致这些现象的产生?
换言之,有没有更好触摸控制方式?
围绕这个疑问,本设计在介绍四线电阻式触摸屏工作原理的基础上,详细阐述了嵌入式微处理器(S3C2410)与触摸屏模块之间的硬件接口与驱动实现,并利用S3C2410的等待中断模式和自动X/Y坐标转换模式,实现了X/Y坐标的确定,完成对触摸屏的控制【5】。
1.2课程目的
本课程设计基于Linux操作系统以及EmestIII实验箱,利用触摸屏能正确返回触点坐标值及动作信息,坐标及动作的具体显示包括:
触摸笔动作,触点X坐标值,触点Y坐标值。
1.3课程设计的内容
本次课程设计成功地设计了基于ARM的嵌入式触摸屏。
主要内容有:
(1)Linux系统的正确移植和使用;
(2)根文件系统的正确移植和使用;
(3)驱动程序的编译与装载;
(4)嵌入式系统下应用程序的交叉编译及下载与调试。
2触摸屏的工作原理
触摸屏系统是一种人机交互设备,其结构如图2.1,将触摸屏安装在LCD显示屏上,配以相应的控制电路对触摸屏和LCD进行控制,用户通过触摸操作就可以实现同触摸屏系统相连接的设备进行信息交互。
设计采用四线电阻式触摸屏,包含两层透平、均匀导电的ITO层,分别作为X电极和Y电极,它们之间由细微绝缘点隔开。
X电极和Y电极的正负端由导电条分别从两端引出,且X电极和Y电极导电条的位置相互垂直,引出端X-、X+、Y-、Y+共4条线【6】。
图2.1四线电阻式触摸屏结构图
当有物体接触触摸屏表面并施以一定的压力时,上层的ITO导电层发生形变与下层ITO发生接触,形成可等效为图2.2的分压电路。
图2.2电阻触屏分压电路图
控制器通过下述方法即可确定触摸点位置:
(1)在X+电极施加驱动电压,X-电极接地,Y+作为引出端测量得到接触点的电压,触点电压与驱动电压之比等于触点X坐标与屏宽度之比,得到X坐标。
(2)在Y+电极施加驱动电压,Y-电极接地,X+作为引出端测量得到接触点的电压,触点电压与驱动电压之比等于触点Y坐标与屏高度之比,得到Y坐标。
因此,计算触摸点的坐标首先需要对触摸屏的引脚电平进行切换控制,使其处于合适的状态。
然后通过ADC转换采集到的接触点电压值,进行相应的计算。
触摸屏接口工作模式有以下几种:
(1)普通转换模式
普通转换模式(AUTO_PST=0,XY_PST=0)是用作一般目的下的ADC转换。
这个模式可以通过设置ADCCON和ADCTSC来进行对AD转换的初始化;而后读取ADCDAT0(ADC数据寄存器0)的XPDATA域(普通ADC转换)的值来完成转换。
(2)分离的X/Y轴坐标转换模式:
X轴坐标转换和Y轴坐标转换。
X轴坐标转换(AUTO_PST=0且XY_PST=1)将X轴坐标转换数值写入到ADCDAT0寄存器的XPDATA域。
转换后,触摸屏接口将产生中断源(INT_ADC)到中断控制器。
Y轴坐标转换(AUTO_PST=0且XY_PST=2)将X轴坐标转换数值写入到ADCDAT1寄存器的YPDATA域。
转换后,触摸屏接口将产生中断源(INT_ADC)到中断控制器。
(3)自动(连续)X/Y轴坐标转换模式。
自动(连续)X/Y轴坐标转换模式(AUTO_PST=1且XY_PST=0)以下面的步骤工作:
触摸屏控制器将自动地切换X轴坐标和Y轴坐标并读取两个坐标轴方向上的坐标。
触摸屏控制器自动将测量得到的X轴数据写入到ADCDAT0寄存器的XPDATA域,然后将测量到的Y轴数据到ADCDAT1的YPDATA域。
自动(连续)转换之后,触摸屏控制器产生中断源(INT_ADC)到中断控制器。
(4)等待中断模式
当触摸屏控制器处于等待中断模式下时,它实际上是在等待触摸笔的点击。
在触摸笔点击到触摸屏上时,控制器产生中断信号(INC_TC)。
中断产生后,就可以通过设置适当的转换模式(分离的X/Y轴坐标转换模式或自动X/Y轴坐标转换模式)来读取X和Y的位置。
(5)静态(Standby)模式
当ADCCON寄存器的STDBM位被设为1时,Standby模式被激活。
在该模式下,A/D转换操作停止,ADCDAT0寄存器的XPDATA域和ADCDAT1寄存器的YPDATA(正常ADC)域保持着先前转换所得的值【7】。
3总体设计
3.1设计总体方案
3.1.1软件
(1)EmbestOnlineFlashProgrammerForARM:
EmbestFlash在线编程器,如图3.1所示。
(2)HYPERTERMINAL(超级终端):
传送vivi.nand如图3.2所示。
图3.1EmbestFlash在线编程器
图3.2传送vivi.nand
vivi>loadflashkernelx<回车>烧写更新内核,传送zImage文件;
等待传送内核文件,如图3.3所示。
图3.3等待传送内核文件
传送内核,如图3.4所示。
图3.4传送内核
vivi>loadflashrootj<回车>烧写更新文件系统;烧写新的文件系统loadflashrootj,如图3.5所示。
图3.5烧写新的文件系统loadflashrootj
(3)EmbestIDEProforARM:
应用于嵌入式软件开发的新一代集成开发环境,是一个高度集成的图形界面操作环境,包含编辑器、编译汇编链接器、调试器、工程管理、Flash编程等工具;支持的开发语言包括标准C和汇编语言。
(4)cygwin:
一个在windows平台上运行的unix模拟环境,它对于学习unix/linux操作环境,或者从unix到windows的应用程序移植,或者进行某些特殊的开发工作,尤其是使用gnu工具集在windows上进行嵌入式系统开发,把gcc,gdb,gas等开发工具进行了改进,能够生成并解释win32的目标文件【8】。
3.1.2硬件
S3C2410处理器是Samsung公司基于ARM公司的ARM920T处理器核,32位微控制器。
该处理器拥有:
独立的16KB指令Cache和16KB数据Cache,MMU,支持TFT的LCD控制器,NAND闪存控制器,3路UART,4路DMA,4路带PWM的Timer,I/O口,RTC,8路10位ADC,TouchScreen接口,IIC-BUS接口,IIS-BUS接口,2个USB主机,1个USB设备,SD主机和MMC接口,2路SPI。
S3C2410处理器最高可运行在203MHz【9】。
3.2设计所需工具
(1)软件:
EmbestOnlineFlashProgrammerForARM,HYPERTERMINAL(超级终端),EmbestIDEProforARM,cygwin
(2)硬件:
s3c2410开发板,Embest实验箱
3.3平台构建过程
3.3.1硬件平台搭建
硬件流程图如图3.6所示。
图3.6硬件流程图
(1)Vivi烧写过程
1)首先把SW104断开,FlashProgrammer的Program,在File选择Open打开要烧写的配置文件S3C2410&NandFLash_vivi.cfg,在FlashProgrammer的Program页中选择要烧写的文件vivi.bon&load.bin。
点击按钮Progarm开始烧写,直到烧写成功。
2)连接串口线到PC机COM1,运行光盘中提供的Windows超级终端HyperTerminal.ht把开发板重新加电,程序运行后,在超级终端上可以看到串口输出Wating,表示正在等待用户从超级终端下载文件。
这时,请点击超级终端菜单"传送"选择Xmodem方式下载vivi.nand文件,点击OK后等待下载烧写结束即可。
(2)内核zImage烧写
1)首先SW104设为短接(从NandFlash启动),并确定已经烧写vivi.nand,加电。
2)在vivi启动等待中,敲入空格键进入vivi界面环境,并输入以下命令:
vivi>loadflashkernelx<回车>烧写更新内核约1分钟即可烧写完毕。
3)点击超级终端菜单中的“传送”,选“发送文件”zImage”并选择xModem方式传送)烧写结束,重起实验板,观测超级终端窗口提示信息就可以启动linux内核。
(3)新文件系统的烧写
1)首先SW104设为短接(从NandFlash启动),确定已经成功烧写vivi.nand,加电运行可以看到vivi启动信息,输入空格进入命令状态。
2)双击运行Download.pjf(该文件在/tmp/edukit-2410/image/中)工程(将启动EmbestIDE环境),点击连接Remoteconnect,程序应该正在运行(命令按钮STOP为红色);在串口输入help,看看有没有反应,如果没反应,点击IDE按钮:
Reset->Start(F5);再输入help测试,直到有反应为止。
3)如果可以输出一些信息,再点击IDE中的Stop,配置Debug的Download地址为0x30000000,并点击IDE菜单Project选择Settings项,在Download页下拉Category到Download项,在DownloadFile选择root.cramfs文件,点击确定后,点击IDE菜单DEBUG选择Download下载文件系统映象(约1分钟),下载完毕后,点击Start(F5)。
然后在超级终端里输入:
loadflashrootj(烧写更新文件系统,约1分钟即可烧写完毕)。
注意:
只能在“vivi的烧写”操作完成后,才可以按以上方法正确烧写root映象到NandFlash。
重起实验板,观测超级终端窗口提示信息,引导整个系统启动到linux行命令输入状态【10】。
3.3.2根文件系统的制作
(1)根文件系统
根文件系统是Linux系统的核心部分,包含系统使用的软件和库,以及所有用来为用户提供支持架构和用户使用的应用软件,并作为储存数据读写结果的区域。
在Linux系统启动时,首先完成内核安装及环境初始化,最后会寻找一个文件系统作为根文件系统被加载。
Linux系统中使用“/”来唯一表示根文件系统的安装路径。
嵌入式系统中通常可以悬着的根文件系统有:
Romfs、CRAMFS、RAMFS、JFFS2、EXT2等,甚至还可以使用NFS作为根文件系统。
(2)cramfs文件系统
Cramfs是Linux创始人Linuxtorvalds开发的一个适用于嵌入式系统的小文件系统。
Cramfs是一个只读文件系统,采用zlib压缩,压缩比一般可以达到1:
2,但仍可以做到高效的随机读取。
Linux系统中,通常把需要修改的目录压缩存放,并在系统引导的时候再将压缩文件解开。
因为cramfs不会影响系统读取文件的速度,而且是一个高度压缩的文件系统,因此非常广泛应用于嵌入式系统中。
(3)cygwin简介
Cygwin是一个在windows平台上运行的unix/Linux模拟环境,是cygnussolutions公司开发的自由软件。
Cygwin中,“/”表示根目录,即cygwin的安装目录。
我们常用的set_env_linux.sh中定义的目录有:
SOURCEDIR:
/tmp/edukit-2410存储了vivi、linux、fs等源代码和例程
WORKDIR:
/usr/local/src/edukit-2410工作区。
一般情况下都要把已经规划好的目录结构转换成一个映象文件,即使用命令工具mkcramfs(cygwin下为mkcramfs.exe),把相应的cramfs目录树压缩为单一的映象文件。
其命令格式为:
mkcramfs[-h][-eedition][-ifile][-nname]dirnameoutfile
可以使用我们提供的mkcramfs.exe在cygwin下编译生成文件系统映象文件root.cramfs,再固化到开发系统FLASH上运行。
(4)常用的Linux行命令
1)cd改变当前目录(文件夹)。
例如下,
cd/返回到根目录
cd..退回到上级目录
cd/tmp/edukit-2410/进入/tmp/edukit-2410/文件夹
2)ls列出当前目录中的内容。
Ls简单格式列表
ls–l使用详细格式列表。
3)pwd显示当前所在的目录。
(5)tar工具命令
tar程序用于储存或展开tar存档文件。
命令格式:
tar[-参数][文件名][路径]
-x:
extract|--get从存档展开文件;
-v:
--verbose详细显示处理的文件;
-j:
--有bz2属性的必须包含;
-f:
--file[HOSTNAME:
]F指定存档或设备(缺省为/dev/rmt0)。
(6)解压原文件系统(命令+解压目录的存放)。
1)先将root.cramfs.tar.bz2文件放在C:
\cygwin目录中;
2)解压文件系统
运行cygwin,执行以下命令解压安装:
$>source/tmp/edukit-2410/set_env_linux.shLinux编译环境变量设置
$>cd/
$>tar-xvjfroot.cramfs.tar.bz2
$>ls
…root…
root文件夹中就是我们想要的cramfs文件系统
3)如果在根目录中产生root文件夹,解压成功;
4)在root目录中新建xx文件夹,用于存放应用程序
进入该目录后执行以下命令编译链接测试程序:
$>cdroot
$>mkdirxx
(7)编译应用程序ts.c(命令+生成文件格式+存放位置)
将编写好的ts.c程序放在C:
\cygwin目录中。
进入该目录后执行以下命令编译链接测试程序:
$>cd/
$>arm-linux-gcc-otsts.c(也可以编写Makefile来编译)
生成文件:
ts如图3.7所示。
图3.7生成文件
将ts文件放入root下的xx文件夹中。
(8)新文件系统的制作
把刚才编译输出的ts文件拷贝到文件系统所在的工作目录root目录下,执行以下命令生成新的文件系统映象:
$>cd/
$>mkcramfsrootroot.new
刚刚编译生成的文件系统映象root.new中已经包含测试程序即生成文件【11】。
解压文件系统,如图3.8所示。
图3.8解压文件系统
解压成功如下,如图3.9所示。
图3.9解压成功
在root目录中新建xx文件夹,用于存放应用程序,如图3.10所示。
图3.10在root目录中新建xx文件夹
将编写好的ts.c程序放在C:
\cygwin目录中,如图3.11所示。
图3.11将编写好的ts.c程序放在C:
\cygwin目录中
生成文件:
ts如下图所示3.12所示。
图3.12生成文件
新文件系统的制作,如图3.13所示。
图3.13新文件系统的制作
生成文件,如图3.14所示。
图3.14生成文件
4详细设计
4.1接口电路设计
微处理器采用基于ARM920T内核的RISC处理器S3C2410,主频203MHz,适用于低成本、低功耗和高性能手持设备和一般应用的单片微处理器解决方案。
其适合做触摸屏系统MCU的原因是该处理器内置了LCD控制器,并且集成了一个带有触摸屏接口的8通道10位AD转换器。
该ADC能以500KB/s的采样速率将外部的模拟信号转换为10位分辨率的数字量。
因此,ADC能与触摸屏控制器协同工作。
选用通道7和通道5连接触摸屏的模拟信号输入,其中,通道7(图4.1中A[7])作为触摸屏接口的X坐标输入,通道5(图4.1中A[5])作为触摸屏接口的Y坐标输入。
图4.1触摸屏接口电路原理图
S3C2410提供了nYPON、YMON、nXPON和XMON信号直接作为触摸屏的控制信号,通过其控制外部晶体管的打开与关闭实现触摸屏的引脚状态的切换,根据触摸屏工作原理,触摸屏引脚的状态应满足如下要求,见表4-1。
表4-1触摸屏引脚控制状态
X+
X-
Y+
Y-
X坐标
外部电压
接地
AIN[5]
高阻
Y坐标
AIN[7]
高阻
外部电压
接地
在电路的具体实现中,4个MOS管用2个FDC6321实现。
并增加阻容式低通滤波电路滤除坐标信号噪声(见图4.2)。
这里的滤波很重要,如果传递给S3C2410模拟输入接口的信号中干扰过大,不利于后续的软件处理。
图4.2触摸屏接口电路
4.2系统软件设计
4.2.1程序流程图
程序流程图如图4.3所示。
图4.3程序流程图
4.2.2分析驱动
触摸屏驱动在/kernel/drivers/char/s3c2410-ts.c文件中。
4.2.3触摸屏设备驱动中数据结构
(1)触摸屏的file_operations
staticstructfile_operationss3c2410_fops={
owner:
THIS_MODULE,
open:
s3c2410_ts_open,
read:
s3c2410_ts_read,
release:
s3c2410_ts_release,
#ifdefUSE_ASYNC
fasync:
s3c2410_ts_fasync,//异步通知
#endif
poll:
s3c2410_ts_poll,//轮询
};
(2)触摸屏设备结构体的成员与按键设备结构体的成员类似,也包含一个缓冲区,同时包括自旋锁、等待队列和fasync_struct指针。
typedefstruct{
unsignedintpenStatus;/*PEN_UP,PEN_DOWN,PEN_SAMPLE*/
TS_RETbuf[MAX_TS_BUF];/*protectagainstoverrun(环形缓冲区)*/
unsignedinthead,tail;/*headandtailforqueuedevents(环形缓冲区的头尾)*/
wait_queue_head_twq;//*等待队列数据结构
spinlock_tlock;//*自旋锁
#ifdefUSE_ASYNC
structfasync_struct*aq;
#endif
#ifdefCONFIG_PM
structpm_dev*pm_dev;//友善之臂专有的,我后面的代码删除了这段
#endif
}TS_DEV;
(3)触摸屏结构体中包含的TS_RET值的类型定义,包含X、Y坐标和状态(PEN_DOWN、PEN_UP)等信息,这个信息会在用户读取触摸信息时复制到用户空间。
typedefstruct{
unsignedshortpressure;//*压力,这里可定义为笔按下,笔抬起,笔拖曳
unsignedshortx;//*横坐标的采样值
unsignedshorty;//*纵坐标的采样值
unsignedshortpad;//*填充位
}TS_RET;
(4)在触摸屏设备驱动中,将实现open()、release()、read()、fasync()和poll()函数,因此,其文件操作结构体定义。
触摸屏驱动文件操作结构体:
staticstructfile_operationss3c2410_fops={}
4.2.4触摸屏驱动模块加载和卸载函数
(1)在触摸屏设备驱动的模块加载函数中,要完成申请设备号、添加cdev、申请中断、设置触摸屏控制引脚(YPON、YMON、XPON、XMON)等多项工作,
触摸屏设备驱动的模块加载函数:
staticint__inits3c2410_ts_init(void)
触摸屏设备驱动模块卸载函数:
staticvoid__exits3c2410_ts_exit(void)
(2)可知触摸屏驱动中会产生两类中断,一类是触点中断(INT-TC),一类是X/Y位置转换中断(INT-ADC)。
在前一类中断发生后,若之前处于PEN_UP状态,则应该启动X/Y位置转换。
另外,将抬起中断也放在INT-TC处理程序中,它会调用tsEvent()完成等待队列和信号的释放。
触摸屏设备驱动的触点/抬起中断处理程序:
staticvoids3c2410_isr_tc(intirq,void*dev_id,structpt_regs*reg)
当X/Y位置转换中断发生后,应读取X、Y的坐标值,填入缓冲区,触摸屏设备驱动X/Y位置转换中断处理程序:
staticvoids3c2410_isr_adc(intirq,void*dev_id,structpt_regs*reg)
触摸屏设备驱动中获得X、Y坐标:
staticinlinevoids3c2410_get_XY(void)
(3)tsEvent最终为tsEvent_raw(),这个函数很关键,当处于PEN_DOWN状态时调用该函数,它会完成缓冲区的填充、等待队列的唤醒以及异步通知信号的释放;否则(处于PEN_UP状态),将缓冲区头清0,也唤醒等待队列并释放信号,
触摸屏设备驱动的tsEvent_
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)