嵌入式论文关于触摸屏设计

时间:2019-05-12 00:48:33下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《嵌入式论文关于触摸屏设计》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《嵌入式论文关于触摸屏设计》。

第一篇:嵌入式论文关于触摸屏设计

嵌入式实验课程设计

目 基于嵌入式的触摸屏控制实验

电子工程系

信息工程

20092309022

杨 金 磊

指导教师

董立军

二O一二 年 六 月 八 日

目 录

1.要求.............................................................2 1.1设计目的......................................................1 1.2 设计意义......................................................2 1.3 设计内容......................................................2 1.4 主要任务......................................................2 2.正文.............................................................3 2.1触摸屏工作原理(触摸屏接口工作模式)..........................3 2.2、设计总体方案.................................................4 2.3、设计所需工具.................................................5 2.4、平台构建过程.................................................5

2.4.1、硬件平台搭建.............................................5 2.4.2根文件系统的制作...........................................7(1)根文件系统.................................................7 3.程序............................................................11 3.1.程序流程图:.................................................11 3.2.分析驱动.....................................................11 3.2.1、触摸屏设备驱动中数据结构................................11 3.2.2、触摸屏驱动模块加载和卸载函数............................13 3.2.3、触摸屏设备驱动的读函数..................................15 3.2.4、触摸屏设备驱动的轮询与异步通知..........................15 3.2.5源程序触摸屏驱动代码:....................................16 3.2.6、实验结果显示:..........................................27 4.心得............................................................28 4.1 课程设计心得体会:...........................................28 5.参考文献........................................................28

5.1【参考文献】..................................错误!未定义书签。

第一章 要求

1.1 设计目的

(1)基于WINDOWS操作系统,以及实验箱,利用触摸屏返回触点坐标值及动作信息。

(2)坐标及动作的具体显示:触摸笔动作,触点X坐标值,触点Y坐标值。

1.2 设计意义

(1)熟悉嵌入式系统开发平台

(2)掌握ARM嵌入式操作系统下的各个指令的使用方法(3)了解触摸屏的原理

1.3 设计内容

(1)系统的正确移植和使用(2)根文件系统的正确移植和使用(3)驱动程序的编译与装载

(4)嵌入式系统下应用程序的交叉编译及下载与调试

1.4 主要任务

(1)熟悉实验的流程(2)理解驱动程序源代码

(3)调用驱动程序的某些函数,编译与调试应用程序

第二章 正文

2.1触摸屏工作原理(触摸屏接口工作模式)

(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)域保持着先前转换所得的值。

2.2、设计总体方案

2.2.1 软件

(1)Embest Online Flash Programmer For ARM: Embest Flash在线编程器(2)HYPER TERMINAL(超级终端):传送vivi.nand;

传送vivi.nand

vivi> load flash kernel x <回车> 烧写更新内核,传送zImage文件;等待传送内核:

vivi>load flash root j <回车> 烧写更新文件系统;烧写新的文件系统 load flash root j

(3)EmbestIDE Pro for ARM: 应用于嵌入式软件开发的新一代集成开发环境,是一个高度集成的图形界面操作环境,包含编辑器、编译汇编链接器、调试器、工程管理、Flash 编程等工具;支持的开发语言包括标准C和汇编语言。(4)cygwin: 4

一个在windows平台上运行的unix模拟环境,它对于学习unix/linux操作环境,或者从unix到windows的应用程序移植,或者进行某些特殊的开发工作,尤其是使用gnu工具集在windows上进行嵌入式系统开发,把gcc,gdb,gas等开发工具进行了改进,能够生成并解释win32的目标文件。2.2.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,Touch Screen接口,IIC-BUS 接口,IIS-BUS 接口,2个USB主机,1个USB设备,SD主机和MMC接口,2路SPI。S3C2410处理器最高可运行在203MHz。

2.3、设计所需工具

2.3.1 软件: Embest Online Flash Programmer For ARM,HYPER TERMINAL(超级终端),EmbestIDE Pro for ARM,cygwin 2.3.2 硬件:s3c2410开发板,Embest实验箱

2.4、平台构建过程

2.4.1、硬件平台搭建

硬件流程图:

(1)Vivi烧写过程

1)首先把SW104断开,Flash Programmer的Program,在File选择Open打开要烧写的配置文件S3C2410&NandFLash_vivi.cfg,在Flash Programmer的Program页中选择要烧写的文件vivi.bon&load.bin。点击按钮 Progarm 开始烧写,直到烧写成功

2)连接串口线到 PC 机 COM1,运行光盘中提供的 Windows 超级终端Hyper Terminal.ht 把开发板重新加电,程序运行后,在超级终端上可以看到串口输出Wating,表示正在等待用户从超级终端下载文件。这时,请点击超级终端菜单“传送”选择 Xmodem 方式下载 vivi.nand 文件,点击 OK 后等待下载烧写结束即可。(2)内核zImage烧写

1)首先SW104设为短接(从Nand Flash启动),并确定已经烧写vivi.nand,加电。)在vivi启动等待中,敲入空格键进入vivi界面环境,并输入以下命令:vivi> load flash kernel x <回车> 烧写更新内核约1分钟即可烧写完毕)点击超级终端菜单中的“传送”,选“发送文件”zImage” 并选择xModem方式传送)烧写结束,重起实验板,观测超级终端窗口提示信息就可以启动linux内核,(3)新文件系统的烧写

1)首先SW104设为短接(从Nand Flash启动),确定已经成功烧写vivi.nand,加电运行可以看到vivi启动信息,输入空格进入命令状态;

2)双击运行Download.pjf(该文件在/tmp/edukit-2410/image/中)工程(将启动Embest IDE环境),点击连接Remote connect,程序应该正在运行(命令按钮STOP为红色);在串口输入help,看看有没有反应,如果没反应,点击IDE 按钮:Reset->Start(F5);再输入help测试,直到有反应为止;

3)如果可以输出一些信息,再点击IDE中的Stop,配置Debug的Download地 6

址为0x30000000,并点击IDE菜单Project选择Settings项,在Download页下拉Category到Download项,在Download File选择root.cramfs文件,点击确定后:

点击IDE菜单DEBUG选择Download下载文件系统映象 下载完毕后,点击Start(F5)然后在超级终端里输入: load flash root j(烧写更新文件系统)

注意:只能在“vivi的烧写”操作完成后,才可以按以上方法正确烧写root映象到Nand Flash。

重起实验板,观测超级终端窗口提示信息,引导整个系统启动到linux行命令输入状态。

2.4.2根文件系统的制作(1)根文件系统

根文件系统是Linux系统的核心部分,包含系统使用的软件和库,以及所有用来为用户提供支持架构和用户使用的应用软件,并作为储存数据读写结果的区域。在Linux系统启动时,首先完成内核安装及环境初始化,最后会寻找一个文件系统作为根文件系统被加载。Linux系统中使用“/”来唯一表示根文件系统的安装路径。嵌入式系统中通常可以悬着的根文件系统有:Romfs、CRAMFS、RAMFS、JFFS2、EXT2等,甚至还可以使用NFS作为根文件系统。

(2)cramfs文件系统

Cramfs是Linux创始人Linux torvalds开发的一个适用于嵌入式系统的小文件系统。Cramfs是一个只读文件系统,采用zlib压缩,压缩比一般可以达到1:2,但仍可以做到高效的随机读取。Linux系统中,通常把需要修改的目录压缩存放,并在系统引导的时候再将压缩文件解开。因为cramfs不会影响系统读取文件的速度,而且是一个高度压缩的文件系统,因此非常广泛应用于嵌入式系统中。

(3)cygwin简介

Cygwin是一个在windows平台上运行的unix/Linux模拟环境,是cygnus solutions公司开发的自由软件。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] [-e edition] [-i file] [-n name] dirname outfile 可以使用我们提供的 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.sh Linux编译环境变量设置 $> cd /

$> tar-xvjf root.cramfs.tar.bz2 $> ls „ root „

root文件夹中就是我们想要的cramfs文件系统 3)如果在根目录中产生root文件夹,解压成功 4)在root目录中新建xx文件夹,用于存放应用程序

进入该目录后执行以下命令编译链接测试程序: $> cd root $>mkdir xx

(7)编译应用程序 ts.c(命令+生成文件格式+存放位置): 将编写好的ts.c程序放在C:cygwin目录中 进入该目录后执行以下命令编译链接测试程序: $> cd / $> arm-linux-gcc-o ts ts.c(也可以编写Makefile来编译)

生成文件: ts 如下图所示

将ts文件放入root 下的xx文件夹中

(8)新文件系统的制作: 把刚才编译输出的ts文件拷贝到文件系统所在的工作目录root目录下,执行以下命令生成新的文件系统映象:

$> cd /

$> mkcramfs root root.new

刚刚编译生成的文件系统映象 root.new 中已经包含测试程序即生成文件。解压文件系统在root目录中新建xx文件夹,用于存放应用 将编写好的ts.c程序放在C:cygwin目录中 生成文件: ts 如下图所示

新文件系统的制作

生成文件:

第三章 程序

3.1.程序流程图:

3.2.分析驱动

触摸屏驱动在/kernel/drivers/char/s3c2410-ts.c 文件中。

3.2.1、触摸屏设备驱动中数据结构

(1)触摸屏的file_operations static struct file_operations s3c2410_fops={ owner: THIS_MODULE, open: s3c2410_ts_open, read: s3c2410_ts_read,release: s3c2410_ts_release, #ifdef USE_ASYNC fasync: s3c2410_ts_fasync,//异步通知

#endif poll: s3c2410_ts_poll,//轮询 };(2)触摸屏设备结构体的成员与按键设备结构体的成员类似,也包含一个缓冲区,同时包括自旋锁、等待队列和fasync_struct指针 typedef struct { unsigned int penStatus;/* PEN_UP, PEN_DOWN, PEN_SAMPLE */ TS_RET buf[MAX_TS_BUF];/* protect against overrun(环形缓冲区)*/ unsigned int head, tail;/* head and tail for queued events(环形缓冲区的头尾)*/ wait_queue_head_t wq;//* 等待队列数据结构 spinlock_t lock;//* 自旋锁

#ifdef USE_ASYNC struct fasync_struct *aq;#endif #ifdef CONFIG_PM struct pm_dev *pm_dev;//友善之臂专有的,我后面的代码删除了这段 #endif } TS_DEV;

(3)触摸屏结构体中包含的TS_RET值的类型定义,包含X、Y坐标和状态(PEN_DOWN、PEN_UP)等信息,这个信息会在用户读取触摸信息时复制到用户空 间

typedef struct { 12

unsigned short pressure;//* 压力,这里可定义为笔按下,笔抬起,笔拖曳

unsigned short x;//* 横坐标的采样值 unsigned short y;//* 纵坐标的采样值 unsigned short pad;//* 填充位 } TS_RET;

(4)在触摸屏设备驱动中,将实现open()、release()、read()、fasync()和poll()函数,因此,其文件操作结构体定义

触摸屏驱动文件操作结构体:static struct file_operations s3c2410fops={} _3.2.2、触摸屏驱动模块加载和卸载函数

(1)在触摸屏设备驱动的模块加载函数中,要完成申请设备号、添加cdev、申请中断、设置触摸屏控制引脚(YPON、YMON、XPON、XMON)等多项工作 触摸屏设备驱动的模块加载函数

static int __init s3c2410_ts_init(void)触摸屏设备驱动模块卸载函数

static void __exit s3c2410_ts_exit(void)(2)可知触摸屏驱动中会产生两类中断,一类是触点中断(INT-TC),一类是X/Y位置转换中断(INT-ADC)。在前一类中断发生后,若之前处于PEN_UP状态,则应该启动X/Y位置转换。另外,将抬起中断也放在INT-TC处理程序中,它会调用tsEvent()完成等待队列和信号的释放 触摸屏设备驱动的触点/抬起中断处理程序

static void s3c2410_isr_tc(int irq, void *dev_id, struct pt_regs *reg)

当X/Y位置转换中断发生后,应读取X、Y的坐标值,填入缓冲区 触摸屏设备驱动X/Y位置转换中断处理程序

static void s3c2410_isr_adc(int irq, void *dev_id, struct pt_regs *reg)触摸屏设备驱动中获得X、Y坐标

static inline void s3c2410_get_XY(void)(3)tsEvent最终为tsEvent_raw(),这个函数很关键,当处于PEN_DOWN状态时调用该函数,它会完成缓冲区的填充、等待队列的唤醒以及异步通知信号的释放;否则(处于PEN_UP状态),将缓冲区头清0,也唤醒等待队列并释放信号

触摸屏设备驱动的tsEvent_raw()函数 static void tsEvent_raw(void)(4)在包含了对拖动轨迹支持的情况下,定时器会被启用,周期为10ms,在每次定时器处理函数被引发时,调用start_ts_adc()开始X/Y位置转换过程

触摸屏设备驱动的定时器处理函数

static void tstimerhandler(unsigned long data)(5)在触摸屏设备驱动的打开函数中,应初始化缓冲区、penStatus和定期器、等待队列及tsEvent时间处理函数指针 触摸屏设备驱动的打开函数

static int s3c2410tsopen(struct inode *inode, struct file *filp)

_

_

_

_ 14

(6)触摸屏设备驱动的释放函数非常简单,删除为用于拖动轨迹所使用的定时器即可

触摸屏设备驱动的释放函数

static int s3c2410tsrelease(struct inode *inode, struct file *filp)

_

_3.2.3、触摸屏设备驱动的读函数

触摸屏设备驱动的读函数实现缓冲区中信息向用户空间的复制,当缓冲区有内容时,直接复制;否则,如果用户阻塞访问触摸屏,则进程在等待队列上睡眠,否则,立即返回-EAGAIN 触摸屏设备驱动的读函数

static ssize_t s3c2410_ts_read(struct file *filp, char *buffer, sizet count, lofft *ppos)_

_3.2.4、触摸屏设备驱动的轮询与异步通知

在触摸屏设备驱动中,通过s3c2410_ts_poll()函数实现了轮询接口,这个函数的实现非常简单。它将等待队列添加到poll_table,当缓冲区有数据时,返回资源可读取标志,否则返回0 触摸屏设备驱动的poll()函数

static unsigned int s3c2410_ts_poll(struct file *filp, struct polltablestruct *wait)而为了实现触摸屏设备驱动对应用程序的异步通知,设备驱动中要实现s3c2410_ts_fasync()函数 触摸屏设备驱动的fasync()函数 __

static int s3c2410_ts_fasync(int fd, struct file *filp, int mode)3.2.5源程序触摸屏代码:

/* * s3c2410-ts.c * * touchScreen driver for SAMSUNG S3C2410 * * Author: Janghoon Lyu * Date : $Date: 2002/06/04 07:11:00 $ * * $Revision: 1.1.2.6 $ * * Based on pt036001b-ts.c * * This file is subject to the terms and conditions of the GNU General Public * License.See the file COPYING in the main directory of this archive * for more details.* * History: * * 2002-05-27: Janghoon Lyu *PM.* */

#include #include #include #include

#include #include #include #include #include #include #include

#include

#ifdef CONFIG_PM #include #endif

/* debug macros */ #undef DEBUG #ifdef DEBUG #define DPRINTK(x...)printk(“s3c2410-ts: ” ##x)#else #define DPRINTK(x...)#endif

#define PEN_UP 0

#define PEN_DOWN 1 #define PEN_FLEETING 2 #define MAX_TS_BUF 16 /* how many do we want to buffer */

#undef USE_ASYNC 1 #define DEVICE_NAME “s3c2410-ts” #define TSRAW_MINOR 1

typedef struct { unsigned int penStatus;/* PEN_UP, PEN_DOWN, PEN_SAMPLE */ TS_RET buf[MAX_TS_BUF];/* protect against overrun */ unsigned int head, tail;/* head and tail for queued events */ wait_queue_head_t wq;spinlock_t lock;#ifdef USE_ASYNC struct fasync_struct *aq;#endif #ifdef CONFIG_PM struct pm_dev *pm_dev;#endif } TS_DEV;

static TS_DEV tsdev;

#define BUF_HEAD(tsdev.buf[tsdev.head])#define BUF_TAIL(tsdev.buf[tsdev.tail])#define INCBUF(x,mod)((++(x))&((mod)-1))

static int tsMajor = 0;

static void(*tsEvent)(void);

#define HOOK_FOR_DRAG #ifdef HOOK_FOR_DRAG #define TS_TIMER_DELAY(HZ/100)/* 10 ms */ static struct timer_list ts_timer;#endif

#define wait_down_int(){ ADCTSC = DOWN_INT | XP_PULL_UP_EN |

XP_AIN | XM_HIZ | YP_AIN | YM_GND |

XP_PST(WAIT_INT_MODE);} #define wait_up_int(){ ADCTSC = UP_INT | XP_PULL_UP_EN | XP_AIN | XM_HIZ |

YP_AIN | YM_GND | XP_PST(WAIT_INT_MODE);} #define mode_x_axis(){ ADCTSC = XP_EXTVLT | XM_GND | YP_AIN | YM_HIZ |

XP_PULL_UP_DIS | XP_PST(X_AXIS_MODE);} #define mode_x_axis_n(){ ADCTSC = XP_EXTVLT | XM_GND | YP_AIN | YM_HIZ |

XP_PULL_UP_DIS | XP_PST(NOP_MODE);} #define mode_y_axis(){ ADCTSC = XP_AIN | XM_HIZ | YP_EXTVLT | YM_GND |

XP_PULL_UP_DIS | XP_PST(Y_AXIS_MODE);} #define start_adc_x(){ ADCCON = PRESCALE_EN | PRSCVL(49)|

ADC_INPUT(ADC_IN5)| ADC_START_BY_RD_EN |

ADC_NORMAL_MODE;

ADCDAT0;} #define start_adc_y(){ ADCCON = PRESCALE_EN | PRSCVL(49)|

ADC_INPUT(ADC_IN7)| ADC_START_BY_RD_EN |

ADC_NORMAL_MODE;

ADCDAT1;} #define disable_ts_adc(){ ADCCON &= ~(ADCCON_READ_START);}

static int adc_state = 0;static int x, y;/* touch screen coorinates */

static void tsEvent_raw(void){ if(tsdev.penStatus == PEN_DOWN){

BUF_HEAD.x = x;

BUF_HEAD.y = y;

BUF_HEAD.pressure = PEN_DOWN;

#ifdef HOOK_FOR_DRAG

ts_timer.expires = jiffies + TS_TIMER_DELAY;

add_timer(&ts_timer);#endif } else { #ifdef HOOK_FOR_DRAG

del_timer(&ts_timer);#endif

BUF_HEAD.x = 0;

BUF_HEAD.y = 0;

BUF_HEAD.pressure = PEN_UP;}

tsdev.head = INCBUF(tsdev.head, MAX_TS_BUF);wake_up_interruptible(&(tsdev.wq));

#ifdef USE_ASYNC if(tsdev.aq)

kill_fasync(&(tsdev.aq), SIGIO, POLL_IN);#endif

#ifdef CONFIG_PM pm_access(tsdev.pm_dev);#endif }

static int tsRead(TS_RET * ts_ret){ spin_lock_irq(&(tsdev.lock));ts_ret->x = BUF_TAIL.x;ts_ret->y = BUF_TAIL.y;ts_ret->pressure = BUF_TAIL.pressure;tsdev.tail = INCBUF(tsdev.tail, MAX_TS_BUF);spin_unlock_irq(&(tsdev.lock));

return sizeof(TS_RET);}

static ssize_t s3c2410_ts_read(struct file *filp, char *buffer, size_t count, loff_t *ppos){ TS_RET ts_ret;

retry: if(tsdev.head!= tsdev.tail){

int count;

count = tsRead(&ts_ret);

if(count)copy_to_user(buffer,(char *)&ts_ret, count);

return count;} else {

if(filp->f_flags & O_NONBLOCK)

return-EAGAIN;

interruptible_sleep_on(&(tsdev.wq));

if(signal_pending(current))

return-ERESTARTSYS;

goto retry;}

return sizeof(TS_RET);}

#ifdef USE_ASYNC static int s3c2410_ts_fasync(int fd, struct file *filp, int mode){ return fasync_helper(fd, filp, mode, &(tsdev.aq));} #endif

static unsigned int s3c2410_ts_poll(struct file *filp, struct poll_table_struct *wait){ poll_wait(filp, &(tsdev.wq), wait);return(tsdev.head == tsdev.tail)? 0 :(POLLIN | POLLRDNORM);}

static inline void start_ts_adc(void){ adc_state = 0;mode_x_axis();start_adc_x();}

static inline void s3c2410_get_XY(void){ if(adc_state == 0){

adc_state = 1;

disable_ts_adc();

y =(ADCDAT0 & 0x3ff);

mode_y_axis();

start_adc_y();} else if(adc_state == 1){

adc_state = 0;

disable_ts_adc();

x =(ADCDAT1 & 0x3ff);

tsdev.penStatus = PEN_DOWN;

DPRINTK(“PEN DOWN: x: %08d, y: %08dn”, x, y);

wait_up_int();

tsEvent();} }

static void s3c2410_isr_adc(int irq, void *dev_id, struct pt_regs *reg){ #if 0 DPRINTK(“Occured Touch Screen Interruptn”);DPRINTK(“SUBSRCPND = 0x%08lxn”, SUBSRCPND);#endif spin_lock_irq(&(tsdev.lock));if(tsdev.penStatus == PEN_UP)s3c2410_get_XY();#ifdef HOOK_FOR_DRAG else s3c2410_get_XY();#endif spin_unlock_irq(&(tsdev.lock));}

static void s3c2410_isr_tc(int irq, void *dev_id, struct pt_regs *reg){ #if 0 DPRINTK(“Occured Touch Screen Interruptn”);DPRINTK(“SUBSRCPND = 0x%08lxn”, SUBSRCPND);#endif spin_lock_irq(&(tsdev.lock));if(tsdev.penStatus == PEN_UP){ start_ts_adc();} else { tsdev.penStatus = PEN_UP;DPRINTK(“PEN UP: x: %08d, y: %08dn”, x, y);wait_down_int();tsEvent();

} spin_unlock_irq(&(tsdev.lock));}

#ifdef HOOK_FOR_DRAG static void ts_timer_handler(unsigned long data){ spin_lock_irq(&(tsdev.lock));if(tsdev.penStatus == PEN_DOWN){

start_ts_adc();} spin_unlock_irq(&(tsdev.lock));} #endif

static int s3c2410_ts_open(struct inode *inode, struct file *filp){ 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;}

static int s3c2410_ts_release(struct inode *inode, struct file *filp){ #ifdef HOOK_FOR_DRAG del_timer(&ts_timer);#endif MOD_DEC_USE_COUNT;return 0;}

static struct file_operations s3c2410_fops = { owner: THIS_MODULE, open: s3c2410_ts_open, read: s3c2410_ts_read,release: s3c2410_ts_release,#ifdef USE_ASYNC fasync: s3c2410_ts_fasync, #endif poll: s3c2410_ts_poll, };

void tsEvent_dummy(void){} #ifdef CONFIG_PM static int s3c2410_ts_pm_callback(struct pm_dev *pm_dev, pm_request_t req,void *data){ switch(req){

case PM_SUSPEND:

tsEvent = tsEvent_dummy;

break;

case PM_RESUME:

tsEvent = tsEvent_raw;

wait_down_int();

break;} return 0;} #endif

#ifdef CONFIG_DEVFS_FS static devfs_handle_t devfs_ts_dir, devfs_tsraw;#endif static int __init s3c2410_ts_init(void){ int ret;

tsEvent = tsEvent_dummy;

ret = register_chrdev(0, DEVICE_NAME, &s3c2410_fops);if(ret < 0){ printk(DEVICE_NAME “ can't get major numbern”);return ret;} tsMajor = ret;

/* set gpio to XP, YM, YP and YM */ #if 0 set_GPIO_mode(GPIO106_nYPON_MD);

set_GPIO_mode(GPIO105_YMON_MD);set_GPIO_mode(GPIO104_nXPON_MD);set_GPIO_mode(GPIO103_XMON_MD);

GPUP(GPIO106_nYPON)|= GPIO_bit(GPIO106_nYPON);GPUP(GPIO105_YMON)&= GPIO_bit(GPIO105_YMON);GPUP(GPIO104_nXPON)|= GPIO_bit(GPIO104_nXPON);GPUP(GPIO103_XMON)&= GPIO_bit(GPIO103_XMON);#else set_gpio_ctrl(GPIO_YPON);set_gpio_ctrl(GPIO_YMON);set_gpio_ctrl(GPIO_XPON);set_gpio_ctrl(GPIO_XMON);#endif

/* Enable touch interrupt */ ret = request_irq(IRQ_ADC_DONE, s3c2410_isr_adc, SA_INTERRUPT,DEVICE_NAME, s3c2410_isr_adc);if(ret)goto adc_failed;ret = request_irq(IRQ_TC, s3c2410_isr_tc, SA_INTERRUPT,DEVICE_NAME, s3c2410_isr_tc);if(ret)goto tc_failed;

/* Wait for touch screen interrupts */ wait_down_int();

#ifdef CONFIG_DEVFS_FS devfs_ts_dir = devfs_mk_dir(NULL, “touchscreen”, NULL);devfs_tsraw = devfs_register(devfs_ts_dir, “0raw”, DEVFS_FL_DEFAULT,tsMajor, TSRAW_MINOR, S_IFCHR | S_IRUSR | S_IWUSR,&s3c2410_fops, NULL);#endif

#ifdef CONFIG_PM #if 0 tsdev.pm_dev = pm_register(PM_GP_DEV, PM_USER_INPUT,s3c2410_ts_pm_callback);#endif tsdev.pm_dev = pm_register(PM_DEBUG_DEV, PM_USER_INPUT,s3c2410_ts_pm_callback);#endif printk(DEVICE_NAME “ initializedn”);

return 0;tc_failed: free_irq(IRQ_ADC_DONE, s3c2410_isr_adc);adc_failed: return ret;}

static void __exit s3c2410_ts_exit(void){ #ifdef CONFIG_DEVFS_FS

devfs_unregister(devfs_tsraw);devfs_unregister(devfs_ts_dir);#endif unregister_chrdev(tsMajor, DEVICE_NAME);#ifdef CONFIG_PM pm_unregister(tsdev.pm_dev);#endif free_irq(IRQ_ADC_DONE, s3c2410_isr_adc);free_irq(IRQ_TC, s3c2410_isr_tc);}

module_init(s3c2410_ts_init);module_exit(s3c2410_ts_exit);触摸屏应用程序

#include #include #include /* 文件操作 */

#define PEN_UP 0 /* 触摸笔抬笔,即触摸屏不被压下 */ #define PEN_DOWN 1 /* 触摸笔下笔,即触摸屏被压下 */ #define PEN_FLEETING 2 /* 触摸笔拖动 */

typedef struct { unsigned short pressure;/* 触摸笔动作 */ unsigned short x;

/* 触点x座标值 */ unsigned short y;

/* 触点y座标值 */ unsigned short pad;}TS_RET;

int main(){ int fd,ret,i;

unsigned char suba;TS_RET tsret;

fd = open(“/dev/touchscreen/0raw”, O_RDWR);/* 打开设备 */ if(fd ==-1){ printf(“nCan't open I2C device!n”);exit(-1);}

while(1){

ret = read(fd,(char *)&tsret, sizeof(TS_RET));

if(ret!= sizeof(TS_RET))

{

printf(“read touch screen error!”);

close(fd);

exit(-1);

}

else

{

printf(“pressure is: %dn”, tsret.pressure);

printf(“x is: %dn”, tsret.x);

printf(“y is: %dn”, tsret.y);

} }

close(fd);return 0;} 3.3.应用程序的调试

使用s3c2410_ts.c触摸屏驱动编写应用程序,读取触摸屏的触点坐标值及动作信息(触点x坐标值,y坐标及是否有压力值press),并在串口中断打印出来

对触摸屏设别的操作有打开设备,关闭设备,读操作等。编写应用程序读取触摸屏的触点坐标值及动作信息时,只需利用触摸屏驱动程序便可实现,先打开触摸屏设备,然后调用读函数即可。

其中,触摸笔动作取值如下: #define PEN_UP 0 #define PEN_DOWN

/* 触摸笔抬笔,即触摸屏不被压下 */ /* 触摸笔下笔,即触摸屏被压下 */

#define PEN_FLEETING 2 结构体定义如下: typedef struct { unsigned short pressure;unsigned short x;unsigned short y;unsigned short pad;}TS_RET 打开应用程序:

/* 触摸笔拖动 */

/* 触摸笔动作 */ /* 触点x座标值 */ /* 触点y座标值 */

3.2.6、实验结果显示:

第四部分 感想

第四章 心得

4.1 课程设计心得体会:

经过个人的努力和老师以及同学们的帮助和指导,我顺利的完成了本次《嵌入式系统原理》课程设计。本次课程设计为我提供了一个理论与实践相结合的机会,既锻炼了我的动手能力,又加深理解了在课堂所学习的理论知识。通过本次课程设计,将课本上的理论知识和实际应用有机结合起来,培养了我又动脑,又动手,独立思考分析问题的能力,提高了我运用所学知识解决实际问题的综合素质。通过本次课程设计我明白了只有不断的努力,不断的学习,才能在将来遇到的问题中能够游刃有余,才能够不会捉襟见肘。

参考文献 程昌南,方强等.《ARM Linux入门与实践 》【M】.北京:北京航空航天大学出版社,2008.10 2 张晓林等.《嵌入式系统设计与实践》【M】.北京:北京航空航天大学出版社,2006.1 3 李俊等.《嵌入式Linux设备驱动开发详解》【M】.北京:北京人民邮电出版社,2008.3 4 黄智伟,邓月明,王彦.《ARM9嵌入式系统设计基础教程》.北京:北京航空航天大学出版社,2008.8

第二篇:嵌入式课程设计之触摸屏程序设计

嵌入式课程设计

设计题目:触摸屏驱动程序设计 班级: 学号: 姓名: 指导老师:

设计时间:2010年12月25日--12月28日

目录

第一部分 要求................................................................................................................................1 1.1设计目的.................................................................................................................................1 1.2 设计意义................................................................................................................................1 1.3 设计内容................................................................................................................................1 1.4 主要任务................................................................................................................................1 第二部分 正文................................................................................................................................2 2.1触摸屏工作原理(触摸屏接口工作模式).........................................................................2 2.2、设计总体方案......................................................................................................................3 2.3、设计所需工具......................................................................................................................6 2.4、平台构建过程......................................................................................................................6 2.4.1、硬件平台搭建...............................................................................................................6 2.4.2根文件系统的制作..........................................................................................................8(1)根文件系统.....................................................................................................................8 第三章 程序..................................................................................................................................13 3.1.程序流程图:.......................................................................................................................13 3.2.分析驱动...............................................................................................................................13 3.2.1、触摸屏设备驱动中数据结构.....................................................................................13 3.2.2、触摸屏驱动模块加载和卸载函数.............................................................................15 3.2.3、触摸屏设备驱动的读函数.........................................................................................17 3.2.4、触摸屏设备驱动的轮询与异步通知.........................................................................17 3.2.5源程序触摸屏驱动代码:............................................................................................18 3.2.6、实验结果显示:.........................................................................................................29 第四部分 心得..............................................................................................................................30 4.1 课程设计心得体会:..........................................................................................................30 第五部分 参考文献......................................................................................................................32 5.1【参考文献】........................................................................................................................32

第一部分 要求

1.1 设计目的

1.基于Linux操作系统,以及Emest III实验箱,利用触摸屏返回触点坐标值及动作信息。

2.坐标及动作的具体显示:触摸笔动作,触点X坐标值,触点Y坐标值。

1.2 设计意义

1.熟悉嵌入式系统开发平台

2.掌握ARM嵌入式Linux操作系统下的各个指令的使用方法 3.了解触摸屏的原理

1.3 设计内容

1.Linux系统的正确移植和使用 2.根文件系统的正确移植和使用 3.驱动程序的编译与装载

4.嵌入式系统下应用程序的交叉编译及下载与调试

1.4 主要任务

1.熟悉实验的流程

2.vivi,linux内核的烧写

3.cramfs文件系统(烧写前需编译)的烧写 4.理解驱动程序源代码

5.调用驱动程序的某些函数,编译与调试应用程序

第二部分 正文

2.1触摸屏工作原理(触摸屏接口工作模式)

(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)。中断产生 2

后,就可以通过设置适当的转换模式(分离的X/Y轴坐标转换模式或自动X/Y轴坐标转换模式)来读取X和Y的位置。(5)静态(Standby)模式

当ADCCON寄存器的STDBM位被设为1时,Standby模式被激活。在该模式下,A/D转换操作停止,ADCDAT0寄存器的XPDATA域和ADCDAT1寄存器的YPDATA(正常ADC)域保持着先前转换所得的值。

2.2、设计总体方案

1、软件

(1)Embest Online Flash Programmer For ARM: Embest Flash在线编程器(2)HYPER TERMINAL(超级终端):传送vivi.nand;

传送vivi.nand

vivi> load flash kernel x <回车> 烧写更新内核,传送zImage文件;等待传送内核文件

传送内核:

vivi>load flash root j <回车> 烧写更新文件系统;烧写新的文件系统 load flash root j

(3)EmbestIDE Pro for ARM: 应用于嵌入式软件开发的新一代集成开发环境,是一个高度集成的图形界面操作环境,包含编辑器、编译汇编链接器、调试器、工程管理、Flash 编程等工具;支持的开发语言包括标准C和汇编语言。(4)cygwin: 一个在windows平台上运行的unix模拟环境,它对于学习unix/linux操作环境,或者从unix到windows的应用程序移植,或者进行某些特殊的开发工作,尤其是使用gnu工具集在windows上进行嵌 5

入式系统开发,把gcc,gdb,gas等开发工具进行了改进,能够生成并解释win32的目标文件。

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,Touch Screen接口,IIC-BUS 接口,IIS-BUS 接口,2个USB主机,1个USB设备,SD主机和MMC接口,2路SPI。S3C2410处理器最高可运行在203MHz。

2.3、设计所需工具

1.软件: Embest Online Flash Programmer For ARM,HYPER TERMINAL(超级终端),EmbestIDE Pro for ARM,cygwin 1.硬件:s3c2410开发板,Embest实验箱

2.4、平台构建过程

2.4.1、硬件平台搭建

硬件流程图:

(1)Vivi烧写过程

1)首先把SW104断开,Flash Programmer的Program,在File选择Open打开要烧写的配置文件S3C2410&NandFLash_vivi.cfg,在Flash Programmer的Program页中选择要烧写的文件vivi.bon&load.bin。点击按钮 Progarm 开始烧写,直到烧写成功

2)连接串口线到 PC 机 COM1,运行光盘中提供的 Windows 超级终端Hyper Terminal.ht 把开发板重新加电,程序运行后,在超级终端上可以看到串口输出Wating,表示正在等待用户从超级终端下载文件。这时,请点击超级终端菜单“传送”选择 Xmodem 方式下载 vivi.nand 文件,点击 OK 后等待下载烧写结束即可。(2)内核zImage烧写

1)首先SW104设为短接(从Nand Flash启动),并确定已经烧写vivi.nand,加电。)在vivi启动等待中,敲入空格键进入vivi界面环境,并输入以下命令:vivi> load flash kernel x <回车> 烧写更新内核约1分钟即可烧写完毕 3)点击超级终端菜单中的“传送”,选“发送文件”zImage” 并选择xModem方式传送)烧写结束,重起实验板,观测超级终端窗口提示信息就可以启动linux内核,(3)新文件系统的烧写

1)首先SW104设为短接(从Nand Flash启动),确定已经成功烧写vivi.nand,加电运行可以看到vivi启动信息,输入空格进入命令状态;

2)双击运行Download.pjf(该文件在/tmp/edukit-2410/image/中)工程(将启动Embest IDE环境),点击连接Remote connect,程序应该正在运行(命令按钮STOP为红色);在串口输入help,看看有没有反应,如果没反应,点击IDE 按钮:Reset->Start(F5);再输入help测试,直到有反应为止;

3)如果可以输出一些信息,再点击IDE中的Stop,配置Debug的Download地址为0x30000000,并点击IDE菜单Project选择Settings项,在Download页下拉Category到Download项,在Download File选择root.cramfs文件,点击确定后:

点击IDE菜单DEBUG选择Download下载文件系统映象约1分钟

下载完毕后,点击Start(F5)然后在超级终端里输入: load flash root j(烧写更新文件系统)约1分钟即可烧写完毕

注意:只能在“vivi的烧写”操作完成后,才可以按以上方法正确烧写root映象到Nand Flash。

重起实验板,观测超级终端窗口提示信息,引导整个系统启动到linux行命令输入状态。

2.4.2根文件系统的制作(1)根文件系统

根文件系统是Linux系统的核心部分,包含系统使用的软件和库,以及所有用来为用户提供支持架构和用户使用的应用软件,并作为储存数据读写结果的区域。在Linux系统启动时,首先完成内核安装及环境初始化,最后会寻找一个文件系统作为根文件系统被加载。Linux系统中使用“/”来唯一表示根文件系统的安装路径。嵌入式系统中通常可以悬着的根文件系统有:Romfs、CRAMFS、RAMFS、JFFS2、EXT2等,甚至还可以使用NFS作为根文件系统。

(2)cramfs文件系统

Cramfs是Linux创始人Linux torvalds开发的一个适用于嵌入式系统的小文件系统。Cramfs是一个只读文件系统,采用zlib压缩,压缩比一般可以达到1:2,但仍可以做到高效的随机读取。Linux系统中,通常把需要修改的目录压缩存放,并在系统引导的时候再将压缩文件解开。因为cramfs不会影响系统读取文件的速度,而且是一个高度压缩的文件系统,因此非常广泛应用于嵌入式系统中。

(3)cygwin简介

Cygwin是一个在windows平台上运行的unix/Linux模拟环境,是cygnus solutions公司开发的自由软件。Cygwin中,“/”表示根目录,即cygwin的安 8

装目录。我们常用的set_env_linux.sh中定义的目录有:

SOURCEDIR:/tmp/edukit-2410存储了vivi、linux、fs等源代码和例程 WORKDIR:/usr/local/src/edukit-2410工作区。

一般情况下都要把已经规划好的目录结构转换成一个映象文件,即使用命令工具 mkcramfs(cygwin下为 mkcramfs.exe),把相应的 cramfs 目录树压缩为单一的映象文件。其命令格式为:

mkcramfs [-h] [-e edition] [-i file] [-n name] dirname outfile 可以使用我们提供的 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.sh Linux编译环境变量设置 $> cd /

$> tar-xvjf root.cramfs.tar.bz2 $> ls „ root „

root文件夹中就是我们想要的cramfs文件系统 3)如果在根目录中产生root文件夹,解压成功 4)在root目录中新建xx文件夹,用于存放应用程序

进入该目录后执行以下命令编译链接测试程序: $> cd root $>mkdir xx

(7)编译应用程序 ts.c(命令+生成文件格式+存放位置): 将编写好的ts.c程序放在C:cygwin目录中 进入该目录后执行以下命令编译链接测试程序: $> cd / $> arm-linux-gcc-o ts ts.c(也可以编写Makefile来编译)

生成文件: ts 如下图所示

将ts文件放入root 下的xx文件夹中

(8)新文件系统的制作: 把刚才编译输出的ts文件拷贝到文件系统所在的工作目录root目录下,执行以下命令生成新的文件系统映象: $> cd /

$> mkcramfs root root.new

刚刚编译生成的文件系统映象 root.new 中已经包含测试程序即生成文件。解压文件系统

解压成功如下

在root目录中新建xx文件夹,用于存放应用程序

将编写好的ts.c程序放在C:cygwin目录中

生成文件: ts 如下图所示

新文件系统的制作

生成文件:

第三章 程序

3.1.程序流程图:

3.2.分析驱动

触摸屏驱动在/kernel/drivers/char/s3c2410-ts.c 文件中。

3.2.1、触摸屏设备驱动中数据结构

(1)触摸屏的file_operations static struct file_operations s3c2410_fops={ owner: THIS_MODULE, open: s3c2410_ts_open, read: s3c2410_ts_read,release: s3c2410_ts_release, #ifdef USE_ASYNC fasync: s3c2410_ts_fasync,//异步通知

#endif poll: s3c2410_ts_poll,//轮询 };(2)触摸屏设备结构体的成员与按键设备结构体的成员类似,也包含一个缓冲区,同时包括自旋锁、等待队列和fasync_struct指针 typedef struct { unsigned int penStatus;/* PEN_UP, PEN_DOWN, PEN_SAMPLE */ TS_RET buf[MAX_TS_BUF];/* protect against overrun(环形缓冲区)*/ unsigned int head, tail;/* head and tail for queued events(环形缓冲区的头尾)*/ wait_queue_head_t wq;//* 等待队列数据结构 spinlock_t lock;//* 自旋锁

#ifdef USE_ASYNC struct fasync_struct *aq;#endif #ifdef CONFIG_PM struct pm_dev *pm_dev;//友善之臂专有的,我后面的代码删除了这段 #endif } TS_DEV;

(3)触摸屏结构体中包含的TS_RET值的类型定义,包含X、Y坐标和状态(PEN_DOWN、PEN_UP)等信息,这个信息会在用户读取触摸信息时复制到用户空 间

typedef struct { 14

unsigned short pressure;//* 压力,这里可定义为笔按下,笔抬起,笔拖曳

unsigned short x;//* 横坐标的采样值 unsigned short y;//* 纵坐标的采样值 unsigned short pad;//* 填充位 } TS_RET;

(4)在触摸屏设备驱动中,将实现open()、release()、read()、fasync()和poll()函数,因此,其文件操作结构体定义

触摸屏驱动文件操作结构体:static struct file_operations s3c2410_fops={} 3.2.2、触摸屏驱动模块加载和卸载函数

(1)在触摸屏设备驱动的模块加载函数中,要完成申请设备号、添加cdev、申请中断、设置触摸屏控制引脚(YPON、YMON、XPON、XMON)等多项工作 触摸屏设备驱动的模块加载函数

static int __init s3c2410_ts_init(void)触摸屏设备驱动模块卸载函数

static void __exit s3c2410_ts_exit(void)(2)可知触摸屏驱动中会产生两类中断,一类是触点中断(INT-TC),一类是X/Y位置转换中断(INT-ADC)。在前一类中断发生后,若之前处于PEN_UP状态,则应该启动X/Y位置转换。另外,将抬起中断也放在INT-TC处理程序中,它会调用tsEvent()完成等待队列和信号的释放 触摸屏设备驱动的触点/抬起中断处理程序

static void s3c2410_isr_tc(int irq, void *dev_id, struct pt_regs *reg)

当X/Y位置转换中断发生后,应读取X、Y的坐标值,填入缓冲区 触摸屏设备驱动X/Y位置转换中断处理程序

static void s3c2410_isr_adc(int irq, void *dev_id, struct pt_regs *reg)触摸屏设备驱动中获得X、Y坐标

static inline void s3c2410_get_XY(void)(3)tsEvent最终为tsEvent_raw(),这个函数很关键,当处于PEN_DOWN状态时调用该函数,它会完成缓冲区的填充、等待队列的唤醒以及异步通知信号的释放;否则(处于PEN_UP状态),将缓冲区头清0,也唤醒等待队列并释放信号

触摸屏设备驱动的tsEvent_raw()函数 static void tsEvent_raw(void)(4)在包含了对拖动轨迹支持的情况下,定时器会被启用,周期为10ms,在每次定时器处理函数被引发时,调用start_ts_adc()开始X/Y位置转换过程

触摸屏设备驱动的定时器处理函数

static void ts_timer_handler(unsigned long data)(5)在触摸屏设备驱动的打开函数中,应初始化缓冲区、penStatus和定期器、等待队列及tsEvent时间处理函数指针 触摸屏设备驱动的打开函数

static int s3c2410_ts_open(struct inode *inode, struct file *filp)16

(6)触摸屏设备驱动的释放函数非常简单,删除为用于拖动轨迹所使用的定时器即可

触摸屏设备驱动的释放函数

static int s3c2410_ts_release(struct inode *inode, struct file *filp)3.2.3、触摸屏设备驱动的读函数

触摸屏设备驱动的读函数实现缓冲区中信息向用户空间的复制,当缓冲区有内容时,直接复制;否则,如果用户阻塞访问触摸屏,则进程在等待队列上睡眠,否则,立即返回-EAGAIN 触摸屏设备驱动的读函数

static ssize_t s3c2410_ts_read(struct file *filp, char *buffer, size_t count, loff_t *ppos)3.2.4、触摸屏设备驱动的轮询与异步通知

在触摸屏设备驱动中,通过s3c2410_ts_poll()函数实现了轮询接口,这个函数的实现非常简单。它将等待队列添加到poll_table,当缓冲区有数据时,返回资源可读取标志,否则返回0 触摸屏设备驱动的poll()函数

static unsigned int s3c2410_ts_poll(struct file *filp, struct poll_table_struct *wait)而为了实现触摸屏设备驱动对应用程序的异步通知,设备驱动中要实现s3c2410_ts_fasync()函数 触摸屏设备驱动的fasync()函数

static int s3c2410_ts_fasync(int fd, struct file *filp, int mode)3.2.5源程序触摸屏驱动代码:

/* * s3c2410-ts.c * * touchScreen driver for SAMSUNG S3C2410 * * Author: Janghoon Lyu * Date : $Date: 2002/06/04 07:11:00 $ * * $Revision: 1.1.2.6 $ * * Based on pt036001b-ts.c * * This file is subject to the terms and conditions of the GNU General Public * License.See the file COPYING in the main directory of this archive * for more details.* * History: * * 2002-05-27: Janghoon Lyu *PM 内靛啊 甸绢啊 乐变 窍瘤父 抛胶飘 登瘤 臼疽澜.* */

#include #include #include #include

#include #include #include #include #include #include #include

#include

#ifdef CONFIG_PM #include #endif

/* debug macros */ #undef DEBUG #ifdef DEBUG #define DPRINTK(x...)printk(“s3c2410-ts: ” ##x)#else #define DPRINTK(x...)#endif

#define PEN_UP 0

#define PEN_DOWN 1 #define PEN_FLEETING 2 #define MAX_TS_BUF 16 /* how many do we want to buffer */

#undef USE_ASYNC 1 #define DEVICE_NAME “s3c2410-ts” #define TSRAW_MINOR 1

typedef struct { unsigned int penStatus;/* PEN_UP, PEN_DOWN, PEN_SAMPLE */ TS_RET buf[MAX_TS_BUF];/* protect against overrun */ unsigned int head, tail;/* head and tail for queued events */ wait_queue_head_t wq;spinlock_t lock;#ifdef USE_ASYNC struct fasync_struct *aq;#endif #ifdef CONFIG_PM struct pm_dev *pm_dev;#endif } TS_DEV;

static TS_DEV tsdev;

#define BUF_HEAD(tsdev.buf[tsdev.head])#define BUF_TAIL(tsdev.buf[tsdev.tail])#define INCBUF(x,mod)((++(x))&((mod)-1))

static int tsMajor = 0;

static void(*tsEvent)(void);

#define HOOK_FOR_DRAG #ifdef HOOK_FOR_DRAG #define TS_TIMER_DELAY(HZ/100)/* 10 ms */ static struct timer_list ts_timer;#endif

#define wait_down_int(){ ADCTSC = DOWN_INT | XP_PULL_UP_EN |

XP_AIN | XM_HIZ | YP_AIN | YM_GND |

XP_PST(WAIT_INT_MODE);} #define wait_up_int(){ ADCTSC = UP_INT | XP_PULL_UP_EN | XP_AIN | XM_HIZ |

YP_AIN | YM_GND | XP_PST(WAIT_INT_MODE);} #define mode_x_axis(){ ADCTSC = XP_EXTVLT | XM_GND | YP_AIN | YM_HIZ |

XP_PULL_UP_DIS | XP_PST(X_AXIS_MODE);} #define mode_x_axis_n(){ ADCTSC = XP_EXTVLT | XM_GND | YP_AIN | YM_HIZ |

XP_PULL_UP_DIS | XP_PST(NOP_MODE);} #define mode_y_axis(){ ADCTSC = XP_AIN | XM_HIZ | YP_EXTVLT | YM_GND |

XP_PULL_UP_DIS | XP_PST(Y_AXIS_MODE);} #define start_adc_x(){ ADCCON = PRESCALE_EN | PRSCVL(49)|

ADC_INPUT(ADC_IN5)| ADC_START_BY_RD_EN |

ADC_NORMAL_MODE;

ADCDAT0;} #define start_adc_y(){ ADCCON = PRESCALE_EN | PRSCVL(49)|

ADC_INPUT(ADC_IN7)| ADC_START_BY_RD_EN |

ADC_NORMAL_MODE;

ADCDAT1;} #define disable_ts_adc(){ ADCCON &= ~(ADCCON_READ_START);}

static int adc_state = 0;static int x, y;/* touch screen coorinates */

static void tsEvent_raw(void){ if(tsdev.penStatus == PEN_DOWN){

BUF_HEAD.x = x;

BUF_HEAD.y = y;

BUF_HEAD.pressure = PEN_DOWN;

#ifdef HOOK_FOR_DRAG

ts_timer.expires = jiffies + TS_TIMER_DELAY;

add_timer(&ts_timer);#endif } else { #ifdef HOOK_FOR_DRAG

del_timer(&ts_timer);#endif

BUF_HEAD.x = 0;

BUF_HEAD.y = 0;

BUF_HEAD.pressure = PEN_UP;}

tsdev.head = INCBUF(tsdev.head, MAX_TS_BUF);wake_up_interruptible(&(tsdev.wq));

#ifdef USE_ASYNC if(tsdev.aq)

kill_fasync(&(tsdev.aq), SIGIO, POLL_IN);#endif

#ifdef CONFIG_PM pm_access(tsdev.pm_dev);#endif }

static int tsRead(TS_RET * ts_ret){ spin_lock_irq(&(tsdev.lock));ts_ret->x = BUF_TAIL.x;ts_ret->y = BUF_TAIL.y;ts_ret->pressure = BUF_TAIL.pressure;tsdev.tail = INCBUF(tsdev.tail, MAX_TS_BUF);spin_unlock_irq(&(tsdev.lock));

return sizeof(TS_RET);}

static ssize_t s3c2410_ts_read(struct file *filp, char *buffer, size_t count, loff_t *ppos){ TS_RET ts_ret;

retry: if(tsdev.head!= tsdev.tail){

int count;

count = tsRead(&ts_ret);

if(count)copy_to_user(buffer,(char *)&ts_ret, count);

return count;} else {

if(filp->f_flags & O_NONBLOCK)

return-EAGAIN;

interruptible_sleep_on(&(tsdev.wq));

if(signal_pending(current))

return-ERESTARTSYS;

goto retry;}

return sizeof(TS_RET);}

#ifdef USE_ASYNC static int s3c2410_ts_fasync(int fd, struct file *filp, int mode){ return fasync_helper(fd, filp, mode, &(tsdev.aq));} #endif

static unsigned int s3c2410_ts_poll(struct file *filp, struct poll_table_struct *wait){ poll_wait(filp, &(tsdev.wq), wait);return(tsdev.head == tsdev.tail)? 0 :(POLLIN | POLLRDNORM);}

static inline void start_ts_adc(void){ adc_state = 0;mode_x_axis();start_adc_x();}

static inline void s3c2410_get_XY(void){ if(adc_state == 0){

adc_state = 1;

disable_ts_adc();

y =(ADCDAT0 & 0x3ff);

mode_y_axis();

start_adc_y();} else if(adc_state == 1){

adc_state = 0;

disable_ts_adc();

x =(ADCDAT1 & 0x3ff);

tsdev.penStatus = PEN_DOWN;

DPRINTK(“PEN DOWN: x: %08d, y: %08dn”, x, y);

wait_up_int();

tsEvent();} }

static void s3c2410_isr_adc(int irq, void *dev_id, struct pt_regs *reg){ #if 0 DPRINTK(“Occured Touch Screen Interruptn”);DPRINTK(“SUBSRCPND = 0x%08lxn”, SUBSRCPND);#endif spin_lock_irq(&(tsdev.lock));if(tsdev.penStatus == PEN_UP)s3c2410_get_XY();#ifdef HOOK_FOR_DRAG else s3c2410_get_XY();#endif spin_unlock_irq(&(tsdev.lock));}

static void s3c2410_isr_tc(int irq, void *dev_id, struct pt_regs *reg){ #if 0 DPRINTK(“Occured Touch Screen Interruptn”);DPRINTK(“SUBSRCPND = 0x%08lxn”, SUBSRCPND);#endif spin_lock_irq(&(tsdev.lock));if(tsdev.penStatus == PEN_UP){ start_ts_adc();} else { tsdev.penStatus = PEN_UP;DPRINTK(“PEN UP: x: %08d, y: %08dn”, x, y);wait_down_int();tsEvent();

} spin_unlock_irq(&(tsdev.lock));}

#ifdef HOOK_FOR_DRAG static void ts_timer_handler(unsigned long data){ spin_lock_irq(&(tsdev.lock));if(tsdev.penStatus == PEN_DOWN){

start_ts_adc();} spin_unlock_irq(&(tsdev.lock));} #endif

static int s3c2410_ts_open(struct inode *inode, struct file *filp){ 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;}

static int s3c2410_ts_release(struct inode *inode, struct file *filp){ #ifdef HOOK_FOR_DRAG del_timer(&ts_timer);#endif MOD_DEC_USE_COUNT;return 0;}

static struct file_operations s3c2410_fops = { owner: THIS_MODULE, open: s3c2410_ts_open, read: s3c2410_ts_read,release: s3c2410_ts_release,#ifdef USE_ASYNC fasync: s3c2410_ts_fasync, #endif poll: s3c2410_ts_poll, };

void tsEvent_dummy(void){} #ifdef CONFIG_PM static int s3c2410_ts_pm_callback(struct pm_dev *pm_dev, pm_request_t req,void *data){ switch(req){

case PM_SUSPEND:

tsEvent = tsEvent_dummy;

break;

case PM_RESUME:

tsEvent = tsEvent_raw;

wait_down_int();

break;} return 0;} #endif

#ifdef CONFIG_DEVFS_FS static devfs_handle_t devfs_ts_dir, devfs_tsraw;#endif static int __init s3c2410_ts_init(void){ int ret;

tsEvent = tsEvent_dummy;

ret = register_chrdev(0, DEVICE_NAME, &s3c2410_fops);if(ret < 0){ printk(DEVICE_NAME “ can't get major numbern”);return ret;} tsMajor = ret;

/* set gpio to XP, YM, YP and YM */ #if 0 set_GPIO_mode(GPIO106_nYPON_MD);

set_GPIO_mode(GPIO105_YMON_MD);set_GPIO_mode(GPIO104_nXPON_MD);set_GPIO_mode(GPIO103_XMON_MD);

GPUP(GPIO106_nYPON)|= GPIO_bit(GPIO106_nYPON);GPUP(GPIO105_YMON)&= GPIO_bit(GPIO105_YMON);GPUP(GPIO104_nXPON)|= GPIO_bit(GPIO104_nXPON);GPUP(GPIO103_XMON)&= GPIO_bit(GPIO103_XMON);#else set_gpio_ctrl(GPIO_YPON);set_gpio_ctrl(GPIO_YMON);set_gpio_ctrl(GPIO_XPON);set_gpio_ctrl(GPIO_XMON);#endif

/* Enable touch interrupt */ ret = request_irq(IRQ_ADC_DONE, s3c2410_isr_adc, SA_INTERRUPT,DEVICE_NAME, s3c2410_isr_adc);if(ret)goto adc_failed;ret = request_irq(IRQ_TC, s3c2410_isr_tc, SA_INTERRUPT,DEVICE_NAME, s3c2410_isr_tc);if(ret)goto tc_failed;

/* Wait for touch screen interrupts */ wait_down_int();

#ifdef CONFIG_DEVFS_FS devfs_ts_dir = devfs_mk_dir(NULL, “touchscreen”, NULL);devfs_tsraw = devfs_register(devfs_ts_dir, “0raw”, DEVFS_FL_DEFAULT,tsMajor, TSRAW_MINOR, S_IFCHR | S_IRUSR | S_IWUSR,&s3c2410_fops, NULL);#endif

#ifdef CONFIG_PM #if 0 tsdev.pm_dev = pm_register(PM_GP_DEV, PM_USER_INPUT,s3c2410_ts_pm_callback);#endif tsdev.pm_dev = pm_register(PM_DEBUG_DEV, PM_USER_INPUT,s3c2410_ts_pm_callback);#endif printk(DEVICE_NAME “ initializedn”);

return 0;tc_failed: free_irq(IRQ_ADC_DONE, s3c2410_isr_adc);adc_failed: return ret;}

static void __exit s3c2410_ts_exit(void){ #ifdef CONFIG_DEVFS_FS

devfs_unregister(devfs_tsraw);devfs_unregister(devfs_ts_dir);#endif unregister_chrdev(tsMajor, DEVICE_NAME);#ifdef CONFIG_PM pm_unregister(tsdev.pm_dev);#endif free_irq(IRQ_ADC_DONE, s3c2410_isr_adc);free_irq(IRQ_TC, s3c2410_isr_tc);}

module_init(s3c2410_ts_init);module_exit(s3c2410_ts_exit);触摸屏应用程序

#include #include #include /* 文件操作 */

#define PEN_UP 0 /* 触摸笔抬笔,即触摸屏不被压下 */ #define PEN_DOWN 1 /* 触摸笔下笔,即触摸屏被压下 */ #define PEN_FLEETING 2 /* 触摸笔拖动 */

typedef struct { unsigned short pressure;/* 触摸笔动作 */ unsigned short x;

/* 触点x座标值 */ unsigned short y;

/* 触点y座标值 */ unsigned short pad;}TS_RET;

int main(){ int fd,ret,i;

unsigned char suba;TS_RET tsret;

fd = open(“/dev/touchscreen/0raw”, O_RDWR);/* 打开设备 */ if(fd ==-1){ printf(“nCan't open I2C device!n”);exit(-1);}

while(1){

ret = read(fd,(char *)&tsret, sizeof(TS_RET));

if(ret!= sizeof(TS_RET))

{

printf(“read touch screen error!”);

close(fd);

exit(-1);

}

else

{

printf(“pressure is: %dn”, tsret.pressure);

printf(“x is: %dn”, tsret.x);

printf(“y is: %dn”, tsret.y);

} }

close(fd);return 0;} 3.3.应用程序的调试

使用s3c2410_ts.c触摸屏驱动编写应用程序,读取触摸屏的触点坐标值及动作信息(触点x坐标值,y坐标及是否有压力值press),并在串口中断打印出来

对触摸屏设别的操作有打开设备,关闭设备,读操作等。编写应用程序读取触摸屏的触点坐标值及动作信息时,只需利用触摸屏驱动程序便可实现,先打开触摸屏设备,然后调用读函数即可。

其中,触摸笔动作取值如下: #define PEN_UP 0 #define PEN_DOWN

/* 触摸笔抬笔,即触摸屏不被压下 */ /* 触摸笔下笔,即触摸屏被压下 */

#define PEN_FLEETING 2 结构体定义如下: typedef struct { unsigned short pressure;unsigned short x;unsigned short y;unsigned short pad;}TS_RET 打开应用程序:

/* 触摸笔拖动 */

/* 触摸笔动作 */ /* 触点x座标值 */ /* 触点y座标值 */

3.2.6、实验结果显示:

第四部分 感想

第四部分 心得

4.1 课程设计心得体会:

为期几天的课程设计结束了,再次期间我积极亲自实验,用的目标板是s3c2410核心子板,用JTAG仿真器,用Cygwin模拟软件来学习触摸板的设计。我学会了很多,学会了很多。

首先我扪主要了解整个设计过程,以及实验环境的建立,这次用的是交叉编译环境,通过这次课设我更清楚搭建嵌入式系统的开发平台,我们用的目标板是s3c2410核心子板,用JTAG仿真器,用Cygwin模拟软件,课设的这几天我学会了熟练的使用Cygwin软件,掌握了一些常用的命令,加上研究生学长给我们的指导,知道了如何学习,如何思考,知道了运linux操作系统开发嵌入式与wince操作系统开发嵌入式的区别。

其次是学会vivi,内核,根文件系统的编译与移植(烧写),通过这个过程我熟悉了怎么把软件固化到硬件上,知道了软件怎么控制硬件,这个步骤很重要,要烧写不成功,目标板系统就运行不起来,实验就失败了,这个过程我们练习了好多变呢,大家都很累哦!

再次我们就开始写我们的应用程序,通过以上步骤实验系统搭建好了,只要调试好应用程序,然后再运行成功就行了,为此我又把课本上讲得触摸屏原理那章认真看了,又看了实验指导书,查资料,上网搜索,终于编出应用程序,经过不断的调试才编译成功,这个过程太辛苦了,加上实验板不太好,真是对我们的挑战,不过看到运行的 30

结果,大家都很高兴,也很有成就感啊!还看懂了一些s3c2410的驱动程序的源代码,了解了s3c2410一些控制器的使用,以及s3c2410A的一些接口原理与应用。

我明白了只有不断的努力,不断的学习,才能在将来遇到的问题中能够游刃有余,才能够不会捉襟见肘。

第五部分 参考文献

5.1【参考文献】 程昌南,方强等.《ARM Linux入门与实践 》【M】.北京:北京航空航天大学出版社,2008.10 2 张晓林等.《嵌入式系统设计与实践》【M】.北京:北京航空航天大学出版社,2006.1 3 李俊等.《嵌入式Linux设备驱动开发详解》【M】.北京:北京人民邮电出版社,2008.3 4 黄智伟,邓月明,王彦.《ARM9嵌入式系统设计基础教程》.北京:北京航空航天大学出版社,2008.8 5 [美]Wayne Wolf.嵌入式计算系统设计原理.孙玉芳, 梁彬 罗保国 等译.北京: 机械工业出版社, 2002 李剑, 赵鹏程, 汤建彬.32位ARM嵌入式处理器的调试技术.电子技术应用, 2003,(3)钟汉如, 王创生.嵌入式Linux的中断处理与实时调度的实现机制.计算机工程, 2002, 28(10)Arnold Berger.嵌入式系统设计.吕骏 译.北京: 电子工业出版社, 2002

第三篇:嵌入式论文

信息工程学院

课程设计报告书

专 业: 电子信息科学与技术 班 级: 0312412 学 号: 031241217 学生姓名: 肖文洲 指导教师: 刘三军

计算机专业嵌入式系统课程的研究与实践

【摘 要】随着电子技术的发展,嵌入式技术成为当今信息技术发展的主流技术。嵌入式技术作为高校计算机专业的一个新方向已被许多学校采用。本文通过对嵌入式技术的分析,提出了嵌入式系统课程体系建设的基本方法,包括专业培养计划、嵌入式系统教学实践平台建设以及嵌入式系统教学模式与教学方法创新等。【关键词】嵌入式技术;研究与实践;计算机专业

随着电子技术和信息技术的快速发展及嵌入式硬件技术与软件技术的不断成熟,嵌入式系统的应用越来越广泛,如智能家电、手机、汽车电子、网络通信及电子娱乐产品等,随之而来的是社会对嵌入式产品开发人才的需求也越来越多。因此,许多高校都开设了嵌入式系统开发方面的系列课程。由于嵌入式系统课程涉及的知识面宽、实践性强,对实验教学的要求较高,包括实验教师、硬件配置、实验项目的设置等。因此,作为对新技术研究和探索最活跃的群体,高等院校如何接受嵌入式技术带来的挑战,尽快开设嵌入式系统的相关理论与实验课程,并逐渐形成较规范的教学体系已成为一个重要的研究课题。

一、嵌入式系统教学的特点

设置嵌入式系统课程的目的是让未来的软硬件开发人员了解和掌握必要的嵌入式系统设计方法的概念、方法和工具。同时由于嵌入式系统对其他学科领域的渗透,其他相关专业的学生也有学习该课程的需求与必要。如其他电子、自动化专业都可开设相应的选修课程,在某种程度上可以提升毕业学生的竞争力、就业率。嵌入式系统课程的教学内容应包括嵌入式系统体系结构、硬件构架、软件编程及外围设备接口和驱动等,注重培养学生的设计能力和软件开发能力;尽量反映该领域近年来最新的理论与技术,使学生了解学科的最新发展。嵌入式系统课程的特点是涉及知识面广、综合性强、实践性强,并且学科发展快,因而学习难度大,难以形成一个简单明确的知识体系。同时该课程讲授难度很大,它要求教师不仅具备一般的计算机系统的软硬件知识,而且需要真正从事过嵌入式系统的开发实践,才能对嵌入式系统中的实时性等抽象概念和系统调试过程有感性认识。嵌入式系统教学主要有以下三个特点:(1)基础性。嵌入式系统技术涉及多个专业,如计算机工程、软件工程、工业自动控制、机电工程、精密仪器和电子工程等,嵌入式技术与各个专业相互渗透融合,将逐渐形成新的学科研究方向,因此,嵌入式系统可作为上述各专业的基础平台课,以强化专业基础知识。(2)综合性。嵌入式系统是软件和硬件设计的完美结合。它涉及电子信息、计算机、自动控制等诸多专业相关课程的内容,如语言、微机原理、单片机设计和操作系统等课程,有很强的综合性,因此,可以有效地对学生进行综合能力的培养。(3)实践性。嵌入式系统是理论与实践结合密切的课程。实验是嵌入式系统课程的重要组成部分,缺乏实验的嵌入式系统课程学习是纸上谈兵,因此,学生必须通过大量的实验和实践环节,来加深对嵌入式系统理论知识的理解。

二、适合计算机专业的嵌入式系统课程体系

嵌入式系统涉及电子、计算机、自动控制等诸多专业知识,专业性强,包括了操作系统、微机原理、编程语言程序设计、计算机网络和接口设计等内容,是软件、硬件的完美结合。因此,嵌入式系统的设计原理与技术不是一门课程所能讲授的,需要建立一个课程体系。

嵌入式系统本身就是计算机系统。从广义上讲,目前计算机科学与技术专业的课程体系中所设置的许多专业基础课,比如数字逻辑、C/C++程序设计、计算机网络等,对嵌入式系统设计的学习者来说同样重要。在此,只从狭义的角度探讨嵌入式系统的课程体系设置。

由于嵌入式系统涉及的知识面广、应用层面广,所以应针对嵌入式系统设计与应用的不同层面的需求,设置不同层面的课程体系。从狭义上划分,嵌入式系统课程体系可以有以下三个不同的层面: 第一层面:针对将来只是应用嵌入式系统硬件、软件平台来进行二次开发的学生而言,应侧重培养其基于某个嵌入式系统平台上(包括硬件平台和软件平台)进行应用系统设计和开发的能力。因此,针对这一层面的学生应开设以下几门主要课程: 《嵌入式实时操作系统》:选取一个具体的操作系统比如uCLinux为例,讲授嵌入式操作系统的原理及应用,重点介绍如何进行任务划分、如何编写I/ O驱动程序等。《嵌入式系统设计》:重点介绍嵌入式系统设计步骤、方法,重点介绍嵌入式应用软件的开发技术,以及嵌入式系统的测试技术及软件优化技术。《嵌入式网络技术》:重点介绍基于嵌入式环境下的网络通信技术及应用,比如I2C总线技术、USB接口技术、嵌入式Web技术等,掌握相关的通信技术及接口编程。

第二层面:针对将来从事嵌入式系统平台设计及合作开发的学生而言,除需要学习上述三门课程外,还必须开设《嵌入式系统结构》课程。该课程重点介绍某个具有代表性的嵌入式CPU(如ARM系列)的系统结构、汇编指令系统、中断管理机制、常用外围接口,使学生掌握嵌入式平台设计的基础知识。前提是学生具备数字逻辑方面的相关基础知识。对于与第一个层面相同的课程,其授课中重点也不完全一样。比如,《嵌入式操作系统》课程可以嵌入式Linux为主,重点介绍进程调度、进程间通信、内存管理和I/O驱动机制等,使学生具备进行操作系统的裁剪、移植的基本能力。

第三层面:针对将来从事SOC(systemonChip)系统设计及开发的学生而言。主要课程有数字逻辑设计与应用、电子电路原理与PCB技术、EDA技术(FPGA设计及应用)、嵌入式系统结构、嵌入式操作系统等,偏重于底层的设计。

通过以上分析可以看出,第一层至第三层分别是嵌入式系统中由软到硬、由高层至底层的三个不同应用层次,对应不同的知识结构需求。第一层偏软,对底层的系统结构及接口等要求较低,是在当前比较容易实现的一个培养方向。在计算机本科专业中,软件方向比较适合开展第一个层面的嵌入式系统教学,应用方向比较适合开展第二个层面的嵌入式系统的教学。根据以上分析,可以提出在计算机本科专业开设嵌入式系统方向需要参照的课程体 系:(1)专业基础课:嵌入式系统概论、嵌入式系统原理与接口技术。(2)专业必修课:嵌入式操作系统、嵌入式系统应用设计。

(3)专业选修课:嵌入式网络技术、嵌入式系统测试技术、嵌入式工程应用(即行业领域,如移动通信技术与应用、数字家庭网关技术等)、分布式嵌入式系统原理与设计等。

作为课程体系的一部分,实践教学是嵌入式系统教学的关键。实践教学设置的总体指导思想是:以培养创新动手能力为核心,建立“系统的多级课程实践”的实验体系,包含课程基础实验、课程设计、综合项目设计;同时,以“项目为中心”设计多层次的集中实践题目,各层次的题目难度不等,以适合不同层次的学生[4]。

(1)每门课保证至少30%以上的上机或实验学时,完成基础实验项目。(2)至少有两门课的课程设计(约两周),如ARM汇编程序设计、操作系统移植实验、LCD/触摸屏等接口实验等等。(3)至少完成一个综合课程设计(课余时间+综合实训时间共约40学时),类似于一个简单的工程项目,有设计、编程调试、性能测试等完整的步骤如手机游戏、校园导航、电子词典、嵌入式WEB服务器等。

(4)校企合作,建立实习基地,联合完成项目设计。

三、嵌入式系统课程体系在计算机专业的实践

我们在分析了企业对嵌入式人才需求的基础上,提出了“在计算机本科专业培养嵌入式系统人才”的具体实施方案,并在2007级、2008级本科生中进行了实践。

该课程定位为实验研究型。目标是通过嵌入式实验平台学习构建一个嵌入式系统的一般方法,熟悉一些常用的微处理器、存储器、外设接口并学习软硬件设计方法。掌握嵌入式操作系统,定制内核,编译下载调试,编写驱动程序和应用程序等,最后要求实现或部分实现一个具体嵌入式应用的解决方案,并在硬件平台上实现出来。

课程的主要内容包括:(1)典型嵌入式系统的基本配置、硬/软件综合设计方法和流程、应用范例。(2)硬件环境微处理器、存储器、I/O 口、外设接口和驱动、电源转换和管理、总线、硬件调试。(3)嵌入式操作系统、操作系统内核、Linux 和uCLinux、任务和任务调度、实时 OS、 GUI、API、文件系统等。(4)嵌入式网络通过和计算机网络结合, 开发基于网络接的应用。(5)软件开发过程、交叉编译、链接调试、下载、板级支持包。(6)驱动程序、设备驱动机制、按键和触摸屏驱动、网口驱动、红外、USB 驱动。

实验是嵌入式系统教学的一个比较重要的环节,实验大纲的制定是保证课程教学大纲目标实现的一个重要环节,制定出符合学生实际的实验大纲对计算机科学与技术专业培养目标的实现至关重要。按难易程度的不同,实验内容分为两个层次:基本实验与综合应用实验。基本实验目的是让学生了解嵌入式软件和硬件的一般开发环境与流程,进行基本的嵌入式程序开发。综合应用实验目的是让学生综合运用前面所学到的知识,按照指定的题目,自行设计开发嵌入式应用程序。基本实验包括嵌入式软件开发基础实验、人机接口实验、通信与音频接口实验、简单驱动程序实验和嵌入式操作系统移植实验等。对于综合应用实验,给出多个题目,选择其一,学生也可以自选题目。设备选 择 了 北 京 博 创 公 司 所 开 发 的PXA270教学实验平台,由于 PXA270 性能好,实验开发板的外围设备又很丰富,使得实验选题更加灵活。

课程设计及毕业设计中对所学知识的运用与提高在理论学习结束后,学生对嵌入式系统开发的各个环节有了较深入的理解与掌握。我们的方法是在课程设计和毕业设计中深化学习。课程设计中,结合实验用开发平台,选择了如MP3模拟控制系统等在实际中真正是嵌入式大行其道的应用领域。在毕业设计中,我们布置了诸如“嵌入式智能控制器”,“嵌入式音频控制器”,“内核裁减”设计等工作,这些设计要求学生从软硬件协同设计到软硬件的测试方法等有深刻的掌握。还有组织学生参加大学生嵌入式设计竞赛等教学活动。

四、结束语

随着嵌入式应用的迅猛发展,企业对嵌入式人才需求的缺口越来越大,越来越多的高校开始加强嵌入式系统的教学和科研,培养更多的适应社会需求嵌入式系统人才。本文所设置的针对计算机本科专业的嵌入式系统课程体系,融合了企业的需求和计算机专业的特点,符合实际应用。针对两年实践中存在的问题,在以后的教学中将不断完善。

参考文献:

[1]田泽.嵌入式系统开发与应用教程[M].北京:北京航空航天大学出版社,2005.[2]符意德.嵌入式系统教学及实验内容的探讨[J].军工高

[3]贾志平.嵌入式系统原理与接口技术[M].北京:清华大学出版社,2004.[4]柳翔.嵌入式软件工程人才培养的探索与实践[J].计算机教育,2005,5.

第四篇:嵌入式课程论文

研究生课程论文

论文题目: 无线传感网络中的定位算法综述

学 院: 信息科学技术学院 专 业: 仪器仪表工程

班 级: 81430 学 号: 8143035 学生姓名:

沈天颖

二○一五 年 一 月 十 日

无线传感器网络(WSN)是一个多学科的研究领域,具有很广泛的应用前景,其中,WSN的定位是非常重要的研究方向。本课程论主要对WSN定位研究进行了归纳和总结。将每种定位算法按照需不需要测距分为两大类,而且在具体算法中讨论了其以下几个特征,包括:需要/不需要锚节点、集中式/分布式、固定/移动等。

质心定位算法

DV-Hop算法

MDS-MAP算法

分簇算法

改进的无线传感器网络节点定位算法

第五篇:嵌入式论文总结

嵌入式论文总结

所谓嵌入式系统(Embedded Systems).实际上是“嵌入式计算机系统”的简称,它是相对于通用计算机系统而言的。在有些系统里也有计算机,但是计算机是作为某个专用系统中的一个部件而存在的。像这样“嵌入”到更大、专用的系统中的计算机系统,称之为“嵌入式计算机”、“嵌入式计算机系统”或“嵌入式系统”。

在日常生活中,早已存在许多嵌入式系统的应用,如天天必用的移动电话、带在手腕上的电子表、烹调用的微波炉、办公室里的打印机、汽车里的供油喷射控制系统和防抱死刹车系统(ABS).以及现在流行的个人数字助理(PDA)、数码相机、数码摄像机等等,它们内部都有一个中央处理器CPU。

嵌入式系统无处不在,从家庭中的洗衣机、电冰箱、小汽车,到办公室中的远程会议系统等,都属于可以使用嵌入式技术进行开发和改造的产品。嵌入式系统本身是一个相对模糊的定义,一个手持的MP3和一个P(:104的微型工业控制计算机都可以认为是嵌入式系统。根据英国电气工程师协会(IEE)的定义:嵌入式系统是用来控制或监视机器、装置或工厂等大规模系统的设备。可以看出此定义是扶应用上考虑的,嵌入式系统是软件和硬件的综合体,还可以涵盖机电等附属装置。国内对嵌入式系统的一般定义是:以应用为中心.以计算机技术为基础,软硬件可裁剪,从而能够适应实际应用中对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。

嵌入式系统在应用数量上远远超过了各种通用计算机。一台通用计算机的外部设备中就包含了5~10个嵌入式微处理器,键盘、硬盘、显示器、Modem、网卡、声卡、打印机、扫描仪、数码相机、集线器等均是由嵌入式处理器进行控制的。在制造工业、过程控制、通信、仪器、仪表、汽车、船舶、航空、航天、军事装备、消费类产品等方面,嵌入式系统都有用武之地。在大型嵌入式应用系统中,为了使嵌入式开发更方便、快捷,需要具备一种稳定、安全的软件模块集合,用来管理存储器分配、中断处理、任务间通信和定时器响应,以及提供多任务处理等,这样的软件模块集合就是嵌入式操作系统。嵌入式操作系统的引入大大扩展了嵌入式系的功能,方便了应用软件的设计,但同时也占用了嵌入式系统的宝贵资源。一般在比较大型或多任务的应用场合.才考虑使用嵌入式操作系统。

早期的嵌入式系统几乎都用于控制,或多或少都有些实时要求,所以从前“嵌入式操作系统”实际上是“实时操作系统”的代名词。近年来,由于手持式计算机和掌上电脑等设备的出现,也有了许多不带实时要求的嵌入式系统。另一方面,由于C:PU速度的提高,一些原先被认为是“实时”的反应速度现在已经很普遍了,以前需要在“实时操作系统”上才能实现的应用,现在己不难在常规的操作系统上实现。在这样的背景下,“嵌入式操作系统”和“实时操作系统”就成了不同的概念和名词

嵌入式系统是应用于特定环境下、面对专业领域的应用系统,不同于通用计算机系统的多样化和适用性。它与通用计算机系统相比具有以下特点:

(l)嵌入式系统通常是面向特定应用的,一般都有实时要求。嵌入式处理器大多工作在为特定用户群所设计的系统中,通常具有功耗低、体积小、集成度高、成本低等特点,从而使嵌入式系统的设计趋于小型化、专业化,同时移动能力大大增强,与网络的耦合也越来越紧密。

(2)嵌入式系统是将先进的计算机技术、半导体工艺、电子技术和通信网络技术与各领域的具体应用相结合的产物。这一特点决定了它必然是一个技术密集、资金密集、高度分散、不断创新的知识集成系统。

(3)嵌入式系统与具体应用有机地结合在一起,其升级换代也与具体产品同步进行。因此,嵌入式系统产品一旦进入市场,一般具有较长的生命周期。

(4)嵌入式系统的硬件和软件都必须高效率地设计,在保证稳定、安全、可靠的基础上,量体裁衣,去除冗余,力争在同样的硅片面积上实现更高的性能。这样,才能最大限度地降低应用成本。在县体应用中,对处理器的选择决定了产品的市场竞争力。(5)嵌入式系统常常还有减小功耗的要求。这一方面是为了省电,因为嵌入式系统往往以电池供电;另一方面是要减少发热量,因为嵌入式系统中常常没有风扇等排热手段。

(6)可靠性与稳定性对于嵌入式系统有着特别重要的意义,所以即使逻辑上的系统结构相同,在物理组成上也会有所不同。由于对所用元器件(包括接插件、电源等等)的质量和可靠性要求都比较高,所以元器件的平均无故障时间MTBF-(Mean Time Between F-ailure)成为关键性的参数。此外,环境温度也是需要重点考虑的参数。

嵌入式系统以应用为中心,强调体积和功能的可裁剪性,是以完成控制、监视等功能为目标的专用系统。在嵌入式应用系统中.执行任务的软硬件都嵌入在实际的设备环境中,通过专门的I/()接口和外界交换信息。它们执行的任务程序一般不由用户编制。

嵌入式系统主要用于各种信号处理与控制,目前己在国防、国民经济及社会生活各领域普遍应用操作系统OS(Operation Systems)是一组计算机程序的集合,用来有效地控制和管理计算机的硬件和软件资源,即合理地对资源进行调度,并为用户提供方便的应用接口。它为应用ARM9嵌入式系统设支持软件提供运行环境,即为程序开发者提供功能强、使用方便的开发环境。

从资源管理的角度,操作系统主要包含如下功能。1.处理器管理

对处理器进行分配,并对其运行进行有效的控制和管理。在多任务环境下,合理分配由任务共享的处理器,使CPU能满足各程序运行的需要,提高处理器的利用率,并能在恰当的时候收回分配给某任务的处理器。处理器的分配和运行都是以进程为基本单位进行的,因此对处理器的管理可以归结为对进程的管理,包括进程控制、进程同步、进程通信、作业调度和进程调度等。2.存储器管理

存储器管理的主要任务,是为多道程序的运行提供良好的环境,包括内存分配、内存保护、地址映射、内存扩充等。例如,为每道程序分配必要的内存空间,使它们各得其所,且不致因互相重叠而丢失信息;不因某道程序出现异常情况而破坏其他程序的运行;方便用户使用存储器;提高存储器的利用率;能从逻辑上来扩充内存等。3.设备管理

完成用户提出的设备请求,为用户分配l/()设备;提高C.PU和l/()的利用率;提高l/()速度.方便用户使用l/()设备。设备管理包括缓冲管理、设备分配、设备处理、形成虚拟逻辑设备等。4.文件管理

在计算机中,大量的程序和毅据是以文件的形式存放的。文件管理的主要任务就是对系统文件和用户文件进行管理,方便用户的使用,保证文件的安全性。文件管理包括对文件存储空间的管理、目录管理、文件的读/写管理以及文件的共享与保护等。

5.用户接口

用户与操作系统的接口是用户能方便地使用操作系统的关键所在。用户通常只需以命令形式和系统调用即程序接口形式与系统打交道。使用图形用户接口(GUI).可以将文字、图形和图像集成在一起,用非常容易识别的图标将系统的各种功能、应用程序和文件直观地表示出来,用户可以通过鼠标来获取操作系统的服务。

随着l_inux的迅速发展,嵌入式Linux现在已经有许多版本,包括强实时的嵌入式Linux(如新墨西哥工学院的RT-I_inux和堪萨斯大学的KURT-I_inux)和一般的嵌入式Linux(如riClinux和Pocket I。lnux等)。其中.RT-Iinux通过把通常的Iinux任务优先级设为最低,而所有的实时任务的优先级都高于它,以达到既兼容通常的I。Inux任务又保证强实时性能的目的。另一种常用的嵌入式Linux是riClinux.它是针对没有MMU的处理器而设计的。它不能使用处理器的虚拟内存管理技术,对内存的访问是直接的,所有程序中访问的地址都是实际的物理地址。它专为嵌入式系统做了许多小型化的工作。

嵌入式系统与通用计算机在以下几个方面有比较明显的差别: 1.人机交互界面

嵌入式系统和通用计算机之间的最大区别就在于人机交互界面。嵌入式系统可能根本就不存在键盘、显示器等设备,它所完成的事情也可能只是监视网络情况或者传感器的变化情况,并按照事先规定好的过程及时完成相应的处理任务。2.有限的功能

嵌入式系统的功能在设计时已经定制好,在开发完成投入使用之后就不再变化。系统将反复执行这些预定好的任务,而不像通用计算机那样可以随时运行新任务。虽然嵌入式操作系统可以添加新的任务,删除旧的任务,但这样的变化对嵌入式系统而言是关键性变化,有可能会对整个系统行为产生影响。3.时间关键性和稳定性

嵌入式系统可能要求实时响应,具有严格的时序性。同时,嵌入式系统还要求有非常可靠的稳定性。其工作环境可能非常恶劣,如高温、高压、低温、潮湿等,这就要求在设计时考虑目标系统的工作环境,合理选择硬件和保护措施。软件稳定也是一个重要特征。软件系统需要经过反复测试,达到预先规定的要求才能真正投入使用。

嵌入式软件的开发与传统软件的开发有许多共同点,它继承了许多传统软件的开发习惯。由于嵌入式软件运行于特定昀目标应用环境,而该目标环境只针对特定的应用领域,所以嵌入式软件的功能比较专一,只完成预期要完成的功能。出于对系统成本方面的考虑,应用系统的C:PU、存储器、通信资源都恰到好处。嵌入式软件的开发具有其自身的特点:

在Iinux的发展历程中.Unix和Minix扮演着十分重要的角色。1990年,芬兰人Unus 'ror-valds在赫尔辛基大学接触到Unix;但是当时上机学习要排队等候很长时间,所以I。inus购买了自己的PC机,希望安装一个类似的操作系统。由于Unix的内核代码不容易得到,所以他安装了Minix。Minix是一个基于微内核技术的类似于Unix的操作系统,是Andrew Tanebaum教授利用业余时间开发的用于教学的操作系统。当时.Minix并不是完全免费的,而且Andrew Tane-baum教授不允许别人为Minix再加入其他东西,目的是为了教学的简明扼要。

下载嵌入式论文关于触摸屏设计word格式文档
下载嵌入式论文关于触摸屏设计.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    嵌入式系统设计论文解读(五篇)

    嵌入式系统设计论文 专业:电子信息工程(信号处理)班级:姓名:指导教师: 评分: 年月 日 【摘要】 当今信息时代,嵌入式系统的应用无处不在,而ARM嵌入式系统应用市场份额约占75%。从嵌......

    linux串口触摸屏设计总结

    Linux serial touch 设计总结 概述:最近在做嵌入式linux下串口触摸屏设计,遇到一些问题,经过查找资料和请教同事,总算把问题解决了,事后有把linux相关的内核代码仔细看了一遍,为了......

    嵌入式浏览器论文(合集五篇)

    嵌入式浏览器 摘要:近几年,嵌入式市场迅速崛起,随着网络技术的迅猛发展,浏览器成为了很多嵌入式系统必不可少的一部分。许多公司都投入到了嵌入式浏览器的研究和开发中。本......

    基于触摸屏的丝网印刷技术的设计应用

    基于MCGS触摸屏的丝网印刷控制系统 李文铅,刘鹤 摘要:本课题研究主要是在原有的半自动丝网印刷机的手动控制的基础上,应用PLC控制技术、变频控制技术、人机交互技术等设计出以......

    嵌入式系统设计中UML的应用论文(大全)

    摘要:随着计算机技术的发展,嵌入式系统被广泛应用到社会生产中。嵌入式计算机系统与普通的个人计算机系统存在很大区别,它具有节约成本、可靠性高等优势,主要被用于工厂生产设备......

    嵌入式系统设计报告

    嵌入式系统设计实验报告 班 级:学 号:姓 名:成 绩:指导教师: 20090612 2009112107 侯金钟 武俊鹏、刘书勇 1. 实验一 1.1 实验名称 嵌入式系统硬件开发环境 1.2 实验目的 1.熟......

    《嵌入式系统设计》教学大纲

    《嵌入式系统设计》课程教学大纲 嵌入式系统设计 (Design of Embedded Systems ) 一、课程教学目的和基本要求 教学目的: 嵌入式系统技术已被广泛地应用于工业控制系统、信息......

    《嵌入式系统设计》教案

    嵌入式系统设计教案 课程总学时: 32 讲课学时: 24 实验学时: 8 授 课 人: 杨词慧 南昌航空大学信息工程学院 目录 1 嵌入式系统概述 ...............................................