当前位置:文档之家› 嵌入式触摸屏设备驱动程 序设计

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

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

课程设计

题目:触摸屏设备驱动程

序设计

班级:

姓名:

学号:

指导教师:

成绩:

电子与信息工程学院

信息与通信工程系

目录

引言 (2)

1 设备驱动程序简介 (2)

1.1设备驱动程序的结构 (2)

1.2设备驱动程序的功能 (3)

2 嵌入式系统开发平台构建 (3)

3 触摸屏设计流程 (4)

3.1触摸屏设计流程图 (4)

3.2触摸屏工作原理 (4)

4 触摸屏功能模块程序设计与交叉编译 (5)

4.1功能模块驱动程序设计 (5)

4.1.1 触摸屏设备驱动中数据结构 (5)

4.1.2 触摸屏驱动模块加载和卸载函数 (7)

4.1.3 触摸屏设备驱动的读函数 (7)

4.1.4 触摸屏设备驱动的轮询与异步通知 (8)

4.1.5 应用程序的调试 (8)

4.2触摸屏功能模块交叉编译 (8)

5 根文件系统建立与文件系统下载 (9)

5.1C RAMFS 根文件系统分析 (9)

5.2文件系统映像文件生成 (9)

5.3功能模块运行与调试 (10)

5.3.1 vivi的烧写 (10)

5.3.2 linux内核的烧写 (10)

5.3.3 cramfs文件系统的烧写 (11)

心得体会 (11)

引言

嵌入式Linux由于其可应用于多种硬件平台、内核高效稳定、源代码开放、软件丰富、网络通信和文件管理机制完善等优良特性,已经成为嵌入式操作系统的主力军,是整个嵌入式系统的重要组成部分。在嵌入式Linux系统中,由于内核的保护机制,用户一般不能直接访问硬件,而是要通过调用驱动程序来实现对硬件的控制。进行嵌入式系统的开发,很大的工作量是为各种设备编写驱动程序。设备驱动程序是Linux内核的重要组成部分,不同版本的内核,其主要区别也是体现在设备驱动程序的不同。

1 设备驱动程序简介

1.1 设备驱动程序的结构

1)Linux的设备驱动程序与外界的接口可以分成三部分:

a.驱动程序与操作系统内核的接口。

b.驱动程序与系统引导的接口。

c.驱动程序与设备的接口。

2)驱动程序的注册与注销:

向系统增加一个驱动程序意味着要赋予它一个主设备号,这可以通过在驱动程序的初始化过程中调用定义在fs/devices.c中的register_chrdev()函数或fs/block_dev.c中的register_blkdev()函数来完成。而在关闭字符设备或者块设备时,则要通过unregister_chrdev()或unregister_blkdev()函数从内核中注销设备,同时释放占用的主设备号。

3)设备的打开与释放:

a.打开设备是通过调用定义在include/linux/fs.h中的file_operations结构中的函数open()来完成。

b.释放设备是通过调用file_operations结构中的函数release()来完成。

4)设备的读写操作:

a.字符设备的读写操作相对比较简单,直接使用函数read()和write()就可以了。

b.块设备的话,则需要调用函数block_read()和block_write()来进行数据读写。

5)设备的控制操作:

通过设备驱动程序中的函数ioctl()来完成。

6)设备的轮询和中断处理:

a.设备执行某个命令时,如“将读取磁头移动到软盘的第42扇区上”,设备驱动可以从轮询方式和中断方式中选择一种以判断设备是否已经完成此命令。

b.不支持中断的硬件设备,读写时需要轮流查询设备状态。

1.2 设备驱动程序的功能

1)对设备的初始化和释放。

2)把数据从内核传送到硬件和从硬件读取数据到内核。

3)读取应用程序传送给设备文件的数据和回送应用程序请求的数据。这需要在用户空间,内核空间,总线以及外设之间传输数据。

4)检测和处理设备出现的错误。

2 嵌入式系统开发平台构建

开发嵌入式Linux系统,其实最方便的还是构建一个标准的Linux开发环境,大大地方便Linux开发中的编译调试等工作。同样地,EduKit2410的Linux开发也可以在标准Linux 环境下进行,比如选择Red Hat等优秀的系统。

3 触摸屏设计流程

3.1 触摸屏设计流程图

图3.1-1

3.2 触摸屏工作原理

1)普通转换模式

普通转换模式(AUTO_PST=0,XY_PST=0)是用作一般目的下的ADC转换。这个模式可以通过设置ADCCON和ADCTSC来进行对AD转换的初始化;而后读取ADCDAT0(ADC 数据寄存器0)的XPDATA域(普通ADC转换)的值来完成转换。

2)分离的X/Y轴坐标转换模式

X 轴坐标转换(AUTO_PST=0且XY_PST=1)将X轴坐标转换数值写入ADCDAT0寄存器的XPDATA域。转换后,触摸屏接口将产生中断源(INT_ADC)到中断控制器。

Y轴坐标转换(AUTO_PST=0且XY_PST=2)将Y轴坐标转换数值写入到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)域保持着先前转换所得的值。

4 触摸屏功能模块程序设计与交叉编译

4.1 功能模块驱动程序设计

4.1.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 {

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={ }。

4.1.2 触摸屏驱动模块加载和卸载函数

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

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坐标s3c2410_get_XY(void) 。

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

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)。

4.1.3 触摸屏设备驱动的读函数

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

4.1.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)。

4.1.5 应用程序的调试

使用s3c2410_ts.c 触摸屏驱动编写应用程序,读取触摸屏的触点坐标值及动作信息,并在串口中断打印出来对触摸屏设别的操作有打开设备,关闭设备,读操作等。编写应用程序读取触摸屏的触点坐标值及动作信息时,只需利用触摸屏驱动程序便可实现,先打开触摸屏设备,然后调用读函数即可。其中,触摸笔动作取值如下:

#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;

4.2 触摸屏功能模块交叉编译

将编写好的源文件程序放在cygwin目录中。交叉编译生成文件。

5 根文件系统建立与文件系统下载

5.1 Cramfs 根文件系统分析

一个完整的根文件系统通常包含以下几个目录:

/bin应用程序存放目录。

/sbin系统管理员服务程序,其中最重要的就是供内核初始化之后执行的/sbin/init进程。

/lib存放程序运行所需要的动态库。

/proc系统状态文件目录。

/dev驱动程序存放目录。

/etc系统配置文件及用户数据存放目录。

/mnt用于设备安装的目录,通常包含etc子目录和为块设备安装保留目录。

/usr用于存放用户程序和配置文件的目录,可以根据需要进行设置。

一般情况下都要把已经规划好的目录结构转换成一个映象文件,即使用命令工具mkcram,把相应的cramfs目录树压缩为单一的映象文件。其命令格式为:mkcramfs [-h] [-e edition] [-i file] [-n name] dirname outfile。

5.2 文件系统映像文件生成

1)构建cramfs文件系统:

将\image\中的root.cramfs.tar.bz2拷贝到$SOURCEDIR目录,运行cygwin,执行以下命令解压安装。….root…. root 文件夹中就是我们想要的cramfs文件系统。在root目录中新建xx文件夹,用于存放应用程序。

2)编译应用程序将编写好的源文件ts.c程序放在cygwin目录中。

3)拷贝测试程序到文件系统中,并编译生成文件系统映象。

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

5.3 功能模块运行与调试

5.3.1 vivi的烧写

1)首先把SW104短接(从Nand Flash启动),运行Embest online Flash Programmer for ARM(version 3.0 以上),点击菜单Settings选择Configure…项,配置当前使用的Embest JTAG仿真器型号为PowerICEARM9,并设置相应的参数。

2)点击菜单File选择Open打开烧写配置文件S3C2410&NandFLash_vivi.cfg,Flash Programmer的Program页中选择要烧写的文件:在vivi.bon&load.bin。

3)点击按钮Progarm开始烧写,直到烧写成功。

4)连接串口线到PC机COM1,运行光盘中提供的Windows 超级终端Hyper Terminal.ht。

5)把开发板重新加电,程序运行后,在超级终端上可以看到串口输出类似以下信息:

图 5.3.1-1

6)看到以上信息后,表示正在等待用户从超级终端下载文件。这时,请点击超级终端菜单"传送"选择Xmodem方式下载vivi.nand文件,点击OK后等待下载烧写结束即可。

5.3.2 linux内核的烧写

1)首先SW104设为短接(从Nand Flash启动)并确定已经烧写vivi.nand,加电。

2)在vivi启动等待中,敲入空格键进入vivi界面环境,并输入以下命令:vivi> load flash kernel x <回车> 烧写更新内核约4分钟即可烧写完毕。

3)点击超级终端菜单中的“传送”,选“发送文件”zImage,烧写结束,重起实验板,观测超级终端窗口提示信息就可以启动linux内核。

5.3.3 cramfs文件系统的烧写

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

2)双击运行Download.pjf工程文件,点击连接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.new文件,点击确定后:

(1) 点击IDE菜单DEBUG选择Download下载文件系统映象约1-2分钟;

(2) 下载完毕后,点击Start(F5);

(3) 然后在超级终端里输入:load flash root j。

心得体会

这次课程设计,加深对触摸屏设备程序设计原理和基本性质的理解。对嵌入式有了新的认识,掌握了设计和编程思想,为以后深入的学习奠定了基础。这次课程设计,我觉得最有意义的就是掌握了一定的软件设计能力。同时也让我意识到平时的课程文化的学习的一些疏忽,所以在以后的学习生活中,我要努力学习,培养自己独立思考的能力,要加强理论学习,全面的提高自己。

参考文献

[1]王田苗,魏洪兴嵌入式系统设计实例与开发,北京:清华大学出版社 2008

[2]李中奇,张冬波,罗文俊.嵌入式 Linux系统中触摸屏控制的研究与实现[J].工业控制计算机 2005

[3]张晓明,超声波触摸屏 PC 机接口驱动程序设计[J].计算机应用. 2004

字符设备驱动程序课程设计报告

中南大学 字符设备驱动程序 课程设计报告 姓名:王学彬 专业班级:信安1002班 学号:0909103108 课程:操作系统安全课程设计 指导老师:张士庚 一、课程设计目的 1.了解Linux字符设备驱动程序的结构; 2.掌握Linux字符设备驱动程序常用结构体和操作函数的使用方法; 3.初步掌握Linux字符设备驱动程序的编写方法及过程; 4.掌握Linux字符设备驱动程序的加载方法及测试方法。 二、课程设计内容 5.设计Windows XP或者Linux操作系统下的设备驱动程序; 6.掌握虚拟字符设备的设计方法和测试方法;

7.编写测试应用程序,测试对该设备的读写等操作。 三、需求分析 3.1驱动程序介绍 驱动程序负责将应用程序如读、写等操作正确无误的传递给相关的硬件,并使硬件能够做出正确反应的代码。驱动程序像一个黑盒子,它隐藏了硬件的工作细节,应用程序只需要通过一组标准化的接口实现对硬件的操作。 3.2 Linux设备驱动程序分类 Linux设备驱动程序在Linux的内核源代码中占有很大的比例,源代码的长度日益增加,主要是驱动程序的增加。虽然Linux内核的不断升级,但驱动程序的结构还是相对稳定。 Linux系统的设备分为字符设备(char device),块设备(block device)和网络设备(network device)三种。字符设备是指在存取时没有缓存的设备,而块设备的读写都有缓存来支持,并且块设备必须能够随机存取(random access)。典型的字符设备包括鼠标,键盘,串行口等。块设备主要包括硬盘软盘设备,CD-ROM等。 网络设备在Linux里做专门的处理。Linux的网络系统主要是基于BSD unix的socket 机制。在系统和驱动程序之间定义有专门的数据结构(sk_buff)进行数据传递。系统有支持对发送数据和接收数据的缓存,提供流量控制机制,提供对多协议的支持。 3.3驱动程序的结构 驱动程序的结构如图3.1所示,应用程序经过系统调用,进入核心层,内核要控制硬件需要通过驱动程序实现,驱动程序相当于内核与硬件之间的“系统调用”。

嵌入式点亮一个LED灯的程序

飞凌OK6410开发板(裸板)第一个点亮LED灯程序,主要的C程序,完整程序请下载附件。 #define rGPMCON (*(volatile unsigned *)(0x7F008820)) #define rGPMDAT (*(volatile unsigned *)(0x7F008824)) #define rGPMPUD (*(volatile unsigned *)(0x7F008828)) void msDelay(int time) { volatile unsigned int i,j; for(i = 0; i < 2000000; i++) for(j=0; j

1.设计要求 EM-STM3210E开发板上有一个LED灯D1,编写程序点亮该灯。 2.硬件电路连接 在开发板上,D1与STM32F103ZE芯片上的引脚PF6相连,如下图所示。 3.软件程序设计

根据任务要求,程序内容主要包括: 1、配置Reset and clock control (RCC)以使能GPIOF端口模块的时钟 2、配置GPIOF端口的PF6引脚(50MHz,推挽输出) 3、调用STM32标准固件库函数GPIO_WriteBit以令PF6引脚输出高电平,从而点亮LED灯D1。 整个工程用户只需要实现源代码文件:main.c,其他工程文件由MDK和STM32标准固件库提供。 main.c文件的内容如下: [cpp] /** ********************************************************** ******************** * @file main.c * @author Max Liao * @version * @date 02-Novenber-2012 * @brief Main program body ********************************************************** ******************** */ /* Includes ------------------------------------------------------------------*/ #include "stm32f10x.h" /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/

大作业设计报告书(嵌入式系统原理与开发)

大作业设计报告书 题目:嵌入式系统原理与开发 院(系):物联网工程学院 专业: 班级: 姓名: 指导老师: 设计时间: 10-11 学年 2 学期 20XX年5月

目录 1.目的和要求 (3) 2.题目内容 (3) 3.设计原理 (4) 4.设计步骤 (5) 4.1 交通指示灯设计 (5) 4.2 S3C44B0X I/O 控制寄存器 (6) 4.3 红绿灯过渡代码: (8) 4.4 电源电路设计 (10) 4.5 系统复位电路设计 (11) 4.6 系统时钟电路设计 (11) 4.7 JTAG 接口电路设计 (12) 4.8串口电路设计 (12) 5.引脚分类图 (13) 6.参考文献 (13)

1.目的和要求 ARM技术是目前嵌入式应用产业中应用十分广泛的先进技术,课程开设的目的在于使学生在了解嵌入式系统基础理论的前提下能够掌握ARM处理器的汇编语言和c语言的程序设计方法,掌握S3C44B0X芯片的基本硬件结构特点和接口设计方法,同时熟悉ARM开发环境,学习ARM的硬件设计和软件编程的基本方法,为今后从事相关的应用与研究打下基础。通过大作业要达到如下目的: 一、掌握ARM的开发工具使用和软件设计方法。 二、掌握ARM处理器S3C44B0X的原理和GPIO接口设计原理。 三、掌握C语言与的ARM汇编语言的混合编程方法; 四、培养学生选用参考,查阅手册及文献资料的能力。培养独立思考,深入研 究,分析问题、解决问题的能力。 五、通过课程设计,培养学生严肃认真的工作作风。 2.题目内容 题目:交通指示灯系统设计 功能描述: 1.用S3C44B0X的GPIO设计相关电路; 2.设计相关的软件并注释; 3.实现十字路口2组红、黄、绿交通灯交替显示。 编程提示: 1.交通灯可用发光二极管代替; 2.电路可部分参照实验电路; 3.时间控制可以使用软件循环编程解决。

广东海洋大学嵌入式系统课程设计

《嵌入式系统》设计报告学生姓名 Adao (学号) 所在学院数学与计算机学院 所在班级计科1141 指导教师 成绩

目录 1.课程设计目的 (2) 2.系统分析与设计 (2) 3.系统结构图 (2) 4.实现过程 (3) 5.实验效果 (5) 6.代码分析 (6) 7.系统测试出现的问题和解决的方案 (7) 8.系统优缺点 (7) 9.心得体会 (8) 参考文献 (8)

双按键控制流水灯系统开发 1.课程设计目的: 本次课程设计目的主要是对之前所学习的STM32的某个实验进行更深入的学习与了解,弄懂引脚,端口等相关的配置,对实验原理和具体实现有一定的理解,能做到自己通过原理图和使用库函数等把功能实现出来。我选择的是EXTI-外部中断实验并加以整合,具有一定实用功能的系统,可以对外提供服务。 2.系统分析与设计: 本课程设计所定义的系统主要功能为,通过两个按键KEY1(PA0)、KEY2(PC13)可以实现对流水灯进行同步控制,即一个开关控制产生的灯的状态可以被另一个开关去改变,按键控制需要对两个按键的端口,引脚等进行相关配置,并在两个引脚的中断服务程序中完成对流水灯状态同步控制的操作。本还想通过使用SysTick(系统滴答定时器)功能对流水灯进行精确定时,但由于时间比较匆促,最终没有实现。 3.系统结构图: 图3-1

4.实现过程: 1、GPIO的输入模式有上拉输入模式、下拉输入模式、浮空输入模式和模拟输入模式。GPIO 中的每个引脚可以通过配置端口配置寄存器来配置它的模式。每个引脚的模式由寄存器的4个位控制。 上拉/下拉输入模式:1000 浮空输入模式:0100 模拟输入模式:0000 2、STM32的所有GPIO都可以用作外部中断源的输入端。STM32的中断由中断控制器NVIC 处理。STM32的中断向量具有两个属性,一个为抢占属性,另一个为响应属性,其属性编号越小,表面它的优先级别越高。抢占属性会出现嵌套中断。 3、编写NVIC_Configuration()函数配置NVIC控制器的函数。 static void NVIC_Configuration(uint8_t IRQ) { NVIC_InitTypeDef NVIC_InitStructure; //将NVIC中断优先级分组设置为第1组 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); /* 配置中断源 */ NVIC_InitStructure.NVIC_IRQChannel = IRQ;//设置中断线 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//设置抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//设置响应优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); //对NVIC中断控制器进行初始化 } 4、调用GPIO_EXTILineConfig()函数把GPIOA、Pin0和GDIOC、PIN13设置为EXTI输入线。 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13); 5、填写EXTI的初始化结构体,然后调用EXTI_Init()把EXTI初始化结构体的参数写入寄存器。编写EXTI_PA0_Config()函数完成各种需要的初始化。 void EXTI_Pxy_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; /* config the extiline clock and AFIO clock */

字符设备驱动开发实验

字符设备驱动实验 实验步骤: 1、将设备驱动程序使用马克file文件编译 生成模块firstdev.ko 2、将模块加载到系统中insmod firstdev.ko 3、手动创建设备节点 mknod /dev/first c 122 0 4、使用gcc语句编译firsttest.c生成可执行 文件 5、运行可执行文件firsttest,返回驱动程序 中的打印输出语句。 查看设备号:cat /proc/devices 卸载驱动:rmmod firstdev 删除设备节点:rm /dev/first 显示printk语句,(打开一个新的终端)while true do sudo dmesg -c sleep 1 done

源码分析 设备驱动程序firstdev.c #include #include #include #include #include #include //#include static int first_dev_open(struct inode *inode, struct file *file) { //int i; printk("this is a test!\n"); return 0; }

static struct file_operations first_dev_fops ={ .owner = THIS_MODULE, .open = first_dev_open, }; static int __init first_dev_init(void) { int ret; ret = register_chrdev(122,"/dev/first",&first_dev_fo ps); printk("Hello Modules\n"); if(ret<0) { printk("can't register major number\n"); return ret; }

linux 触摸屏驱动程序设计

物理与电子工程学院 《嵌入式系统设计》 课程小论文 课题题目linux 触摸屏驱动程序设计系别物理与电子工程学院 年级08级 专业电子科学与技术 学号050208110 学生姓名储旭 日期2011-12-21

目录 第 1 章嵌入式 linux 触摸屏驱动程序设计........................................................................ - 2 - 1.1 课题设计的目的.......................................................................................................... - 2 - 1.2 课题设计要求.............................................................................................................. - 2 - 第二章课题设计平台构建与流程............................................................................................ - 2 - 2.1 嵌入式系统开发平台构建.......................................................................................... - 2 - 2.1.1 cygwin 开发环境............................................................................................ - 2 - 2.1.2 Linux 开发环境.............................................................................................. - 5 - 2.1.3 Embest IDE 开发环境.................................................................................... - 5 - 2.2 触摸屏设计流程.......................................................................................................... - 5 - 2.3 课题设计硬件结构与工作原理.................................................................................. - 6 - 2.3.1 硬件结构概述.................................................................................................. - 6 - 2.3.2 触摸屏工作原理.............................................................................................. - 8 - 第三章 Bootloader 移植与下载.............................................................................................. - 9 - 3.1 Vivi 源代码的安装.................................................................................................... - 9 - 3.2 Vivi 源代码分析...................................................................................................... - 10 - 3.3 Vivi 源代码的编译与下载...................................................................................... - 11 - 第四章 Linux 内核移植与下载.............................................................................................. - 12 - 4.1 Linux 内核源代码的安装........................................................................................ - 12 - 4.2 Linux 内核源代码分析与移植................................................................................ - 14 - 4.3 Linux 内核编译与下载............................................................................................ - 14 - 第五章触摸屏功能模块程序设计与交叉编译...................................................................... - 16 - 5.1 功能模块驱动程序设计............................................................................................ - 16 - 5.2 触摸屏功能模块交叉编译........................................................................................ - 20 - 第六章根文件系统建立与文件系统下载.............................................................................. - 20 - 6.1 Cramfs 根文件系统分析.......................................................................................... - 20 - 6.2 文件系统映像文件生成............................................................................................ - 21 - 6.3 功能模块运行与调试................................................................................................ - 22 - 第七章课题设计总结与体会.................................................................................................. - 26 - 参考文献:................................................................................................................................ - 27 -

嵌入式系统课程设计报告书

成绩学生课程实践能力考查 题目:温度按键设定、显示、报警系统设计 课程名称:嵌入式系统开发专业班级: 学生学号: 学生姓名: 考查地点: 考查时长: 4小时 所属院部: 指导教师: 2017 — 2018学年第 2 学期 金陵科技学院教务

2017-2018学年第2学期《嵌入式系统开发》实践能力考核 任课教师签名: 日期: 温度按键设定、显示、报警系统设计 要求: 1、读取DS18B20温度,在液晶上实时显示,并显示上、下限,初始值上限32,下限26。 2、通过按键可以设置环境温度的上限与下限, WK_UP键按下调节上限,再按下调节下限,再按下调节上限…… KEY1按下加1; KEY0按下减1, 根据上限与下限判断当前温度有没有超出范围。 3、当温度超过上限,LED1隔1秒亮一次。超过下限,LED2隔1秒亮一次。(也可自定义报警方式) 4、串口波特率一律用9600bps。 液晶显示的信息: STM32 test name: xxxxxxxxx Maximum is 32C,Minimum is 26 C The temperature is 29 C,now! (xxxxx就是自己的名字拼音) 目录: 第一章.系统要求 1、1设计要求

1、2设计方案 第二章.硬件设计 2、1开发板原理图 2、2 DS18B20模块 2、3按键模块 2、4 LCD显示模块 2、5 LED 模块 第三章.软件设计 3、1程序流程图 3、2程序部分代码 3、2、1主函数、main、c 3、2、2 LED 函数led、c 3、2、3温度代码 s18b20、c 3、2、4键盘代码key、c 第四章、实物效果图 第五章、课程总结 第一章.设计要求及方案 1、1设计要求 1、读取DS18B20温度,在液晶上实时显示,并显示上、下限,初始值上限32,下限26。 2、通过按键可以设置环境温度的上限与下限, WK_UP键按下调节上限,再按下调节下限,再按下调节上限…… KEY1按下加1; KEY0按下减1, 根据上限与下限判断当前温度有没有超出范围。

USB设备驱动程序设计

USB设备驱动程序设计 引言 USB 总线是1995 年微软、IBM 等公司推出的一种新型通信标准总线, 特点是速度快、价格低、独立供电、支持热插拔等,其版本从早期的1.0、1.1 已经发展到目前的2.0 版本,2.0 版本的最高数据传输速度达到480Mbit/s,能 满足包括视频在内的多种高速外部设备的数据传输要求,由于其众多的优点,USB 总线越来越多的被应用到计算机与外设的接口中,芯片厂家也提供了多种USB 接口芯片供设计者使用,为了开发出功能强大的USB 设备,设计者往往 需要自己开发USB 设备驱动程序,驱动程序开发一直是Windows 开发中较难 的一个方面,但是通过使用专门的驱动程序开发包能减小开发的难度,提高工 作效率,本文使用Compuware Numega 公司的DriverStudio3.2 开发包,开发了基于NXP 公司USB2.0 控制芯片ISP1581 的USB 设备驱动程序。 USB 设备驱动程序的模型 USB 设备驱动程序是一种典型的WDM(Windows Driver Model)驱动程序,其程序模型如图1 所示。用户应用程序工作在Windows 操作系统的用户模式层,它不能直接访问USB 设备,当需要访问时,通过调用操作系统的 API(Application programming interface)函数生成I/O 请求信息包(IRP),IRP 被传输到工作于内核模式层的设备驱动程序,并通过驱动程序完成与UBS 外设通 信。设备驱动程序包括两层:函数驱动程序层和总线驱动程序层,函数驱动程 序一方面通过IRP 及API 函数与应用程序通信,另一方面调用相应的总线驱动 程序,总线驱动程序完成和外设硬件通信。USB 总线驱动程序已经由操作系统 提供,驱动程序开发的重点是函数驱动程序。 USB 设备驱动程序的设计

一个简单的演示用的Linux字符设备驱动程序.

实现如下的功能: --字符设备驱动程序的结构及驱动程序需要实现的系统调用 --可以使用cat命令或者自编的readtest命令读出"设备"里的内容 --以8139网卡为例,演示了I/O端口和I/O内存的使用 本文中的大部分内容在Linux Device Driver这本书中都可以找到, 这本书是Linux驱动开发者的唯一圣经。 ================================================== ===== 先来看看整个驱动程序的入口,是char8139_init(这个函数 如果不指定MODULE_LICENSE("GPL", 在模块插入内核的 时候会出错,因为将非"GPL"的模块插入内核就沾污了内核的 "GPL"属性。 module_init(char8139_init; module_exit(char8139_exit; MODULE_LICENSE("GPL"; MODULE_AUTHOR("ypixunil"; MODULE_DESCRIPTION("Wierd char device driver for Realtek 8139 NIC"; 接着往下看char8139_init( static int __init char8139_init(void {

int result; PDBG("hello. init.\n"; /* register our char device */ result=register_chrdev(char8139_major, "char8139", &char8139_fops; if(result<0 { PDBG("Cannot allocate major device number!\n"; return result; } /* register_chrdev( will assign a major device number and return if it called * with "major" parameter set to 0 */ if(char8139_major == 0 char8139_major=result; /* allocate some kernel memory we need */ buffer=(unsigned char*(kmalloc(CHAR8139_BUFFER_SIZE, GFP_KERNEL; if(!buffer { PDBG("Cannot allocate memory!\n"; result= -ENOMEM;

嵌入式系统设计与应用课程设计报告

《嵌入式系统设计与应用》课程设计报告 专业: 班级: 姓名: 学号: 指导教师:

目录 一、设计目的 (3) 二、开发环境 (3) 三、设计任务及要求 (3) 四、实现过程 (3) 用户应用程序设计 (3) 服务器端程序 (3) 五、总结 (4)

一、设计目的 (1)、熟悉并掌握在Linux开发环境下C语言程序设计及编译方法、嵌入式系统;(2)、掌握嵌入式linux下基础网络编程:socket编程 (3)、独立编写客户机/服务器通信程序; 二、开发环境 (1) 编程环境:在Linux开发环境下设计及编译C语言程序。 (2) 硬件设备:PXA270开发板,PC机。 三、设计任务及要求 设计一套可远程调用求和函数并返回客户端的程序。 四、实现过程 用户应用程序设计 1.程序 int sum(); 2.程序 #include <> int sum(){ int i=1,sum=0; while(i<=100){ sum=sum+i; i++; } return sum; } 服务器端程序 /******************************* * 服务器端程序*

********************************/ #include #include #include <> #include <> #include <> #include <> #include <> #include #include “” main() { int sockfd,new_fd,numbytes; struct sockaddr_in my_addr; struct sockaddr_in their_addr; int sin_size,sum; char buff[100] ,temp[100]; sum=sum(); itoa(sum, temp, 10); ..\n"); ,100,0)==-1) { perror("send"); exit(1); } socket success! Sockfd=3; bind success; Listening... Hello!I am Client. (5)、在PC机上运行客户端程序 # ./ result:5050 五、总结 通过本次课程设计,让我熟悉并掌握在Linux开发环境下C语言程序设计及编译方法、嵌入式系统、明白了嵌套字的使用方法、嵌入式linux下基础网络编

linux字符设备驱动课程设计报告

一、课程设计目的 Linux 系统的开源性使其在嵌入式系统的开发中得到了越来越广泛的应用,但其本身并没有对种类繁多的硬件设备都提供现成的驱动程序,特别是由于工程应用中的灵活性,其驱动程序更是难以统一,这时就需开发一套适合于自己产品的设备驱动。对用户而言,设备驱动程序隐藏了设备的具体细节,对各种不同设备提供了一致的接口,一般来说是把设备映射为一个特殊的设备文件,用户程序可以像对其它文件一样对此设备文件进行操作。 通过这次课程设计可以了解linux的模块机制,懂得如何加载模块和卸载模块,进一步熟悉模块的相关操作。加深对驱动程序定义和设计的了解,了解linux驱动的编写过程,提高自己的动手能力。 二、课程设计内容与要求 字符设备驱动程序 1、设计目的:掌握设备驱动程序的编写、编译和装载、卸载方法,了解设备文件的创建,并知道如何编写测试程序测试自己的驱动程序是否能够正常工作 2、设计要求: 1) 编写一个简单的字符设备驱动程序,该字符设备包括打开、读、写、I\O控制与释放五个基本操作。 2) 编写一个测试程序,测试字符设备驱动程序的正确性。 3) 要求在实验报告中列出Linux内核的版本与内核模块加载过程。 三、系统分析与设计 1、系统分析 系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作。设备驱动程序是内核的一部分,它完成以下的功能: 1、对设备初始化和释放; 2、把数据从内核传送到硬件和从硬件读取数据; 3、读取应用程序传送给设备文件的数据和回送应用程序请求的数据; 4、检测和处理设备出现的错误。 字符设备提供给应用程序的是一个流控制接口,主要包括op e n、clo s e(或r ele as e)、r e ad、w r i t e、i o c t l、p o l l和m m a p等。在系统中添加一个字符设备驱动程序,实际上就是给上述操作添加对应的代码。对于字符设备和块设备,L i n u x内核对这些操作进行了统一的抽象,把它们定义在结构体fi le_operations中。 2、系统设计: 、模块设计:

嵌入式系统课程设计报告材料

嵌入式系统课程设计报告 课程名称:嵌入式系统课程设计 项目名称:基于ARM实现MP3音乐盒 专业:电子科学与技术

一、设计容 基本功能:预存四首歌曲,实现循环播放; 每个按键对应一首歌曲。 拓展功能:通过按键简单演奏音乐,类似钢琴; 实现两个模式的切换,切歌模式和音量加减模式。 二、设计思路 基础功能: 将音频数据存储在SD卡中,使用FATFS文件系统进行数据的读写,通过SPI2总线将数据传到核。核再将数据通过SPI1总线传送到音频解码模块VS1053,输入的数据(即比特流数据)被解码后送到DAC发出声音。 将音乐存储在SD卡,通过文件的地址来判别将要播放哪一首音乐,通过地址的递增和循环来实现音乐的自动循环播放。按键对曲目的控制,可通过键盘扫描函数,判断哪一个键被按下,使键盘扫描函数返回不同的返回值,实现对文件地址的控制。将此返回值设置为全局变量,可实现在音乐播放中曲目的切换。 另外,我们还利用解码模块实现对音量的控制,使用按键控制音量的提高或降低。使用SPI1总线将TFT显示屏连接到核,显示按键功能、当前曲目、当前模式等信息。 由于开发板只有5个按键,按键数量有限,需要对按键实现曲目切换和音量功能的复用。我们小组设置了两种模式,切歌模式和音量模式,并定义左键为模式切换键,实现不同模式的选择和按键的复用。 拓展功能: 基本思路是通过定时器中断来产生一定频率的50%空占比的脉宽调制波,用此脉宽调制波激励扬声器,从而使扬声器发出一定频率的声音。 所以只要将不同按键的中断子程序设置为对定时器进行不同数据的配置,即可实现不同按键与不同扬声器发生频率的对应。 然后使一个按键的按下与松开均进入中断,且分别实现开启(扬声器发声)与关闭(扬声器不发声)定时器的功能,从而使课题的附加功能表现地更自然。 三、硬件配置 基础功能: (1)SD卡:存储音频数据

一个简单字符设备驱动实例

如何编写Linux设备驱动程序 Linux是Unix操作系统的一种变种,在Linux下编写驱动程序的原理和思想完全类似于其他的Unix系统,但它dos或window环境下的驱动程序有很大的区别。在Linux环境下设计驱动程序,思想简洁,操作方便,功能也很强大,但是支持函数少,只能依赖kernel中的函数,有些常用的操作要自己来编写,而且调试也不方便。本文是在编写一块多媒体卡编制的驱动程序后的总结,获得了一些经验,愿与Linux fans共享,有不当之处,请予指正。 以下的一些文字主要来源于khg,johnsonm的Write linux device driver,Brennan's Guide to Inline Assembly,The Linux A-Z,还有清华BBS上的有关device driver的一些资料. 这些资料有的已经过时,有的还有一些错误,我依据自己的试验结果进行了修正. 一、Linux device driver 的概念 系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作。设备驱动程序是内核的一部分,它完成以下的功能: 1)对设备初始化和释放; 2)把数据从内核传送到硬件和从硬件读取数据; 3)读取应用程序传送给设备文件的数据和回送应用程序请求的数据; 4)检测和处理设备出现的错误。 在Linux操作系统下有两类主要的设备文件类型,一种是字符设备,另一种是块设备。字符设备和块设备的主要区别是:在对字符设备发出读/写请求时,实际的硬件I/O一般就紧接着发生了,块设备则不然,它利用一块系统内存作缓冲区,当用户进程对设备请求能满足用户的要求,就返回请求的数据,如果不能,就调用请求函数来进行实际的I/O操作。块设备是主要针对磁盘等慢速设备设计的,以免耗费过多的CPU时间来等待. 已经提到,用户进程是通过设备文件来与实际的硬件打交道。每个设备文件都都有其文件属性(c/b),表示是字符设备还是块设备。另外每个文件都有两个设备号,第一个是主设备号,标识驱动程序,第二个是从设备号,标识使用同一个设备驱动程序的不同的硬件设备,比如有两个软盘,就可以用从设备号来区分他们。设备文件的主设备号必须与设备驱动程序在登记时申请的主设备号一致,否则用户进程将无法访问到驱动程序. 最后必须提到的是,在用户进程调用驱动程序时,系统进入核心态,这时不再是抢先式调度。也就是说,系统必须在你的驱动程序的子函数返回后才能进行其他的工作。如果你的驱动程序陷入死循环,不幸的是你只有重新启动机器了,然后就是漫长的fsck。 二、实例剖析 我们来写一个最简单的字符设备驱动程序。虽然它什么也不做,但是通过它可以了解Linux的设备驱动程序的工作原理.把下面的C代码输入机器,你就会获得一个真正的设备

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

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

目录 第一章引言 (1) 1.1 课程设计目的 (1) 第二章课程设计平台构建与流程 (2) 2.1 嵌入式系统开发平台构建 (2) 2.1.1cygwin 开发环境 (2) 2.1.2 Linux 开发环境 (4) 2.1.3 Embest IDE 开发环境 (4) 2.2 课程设计流程 (4) 2.3 课程设计硬件结构与工作原理 (6) 第三章 Bootloader移植与下载 (9) 3.1 Vivi源代码安装 (9) 3.2 Vivi源代码分析与移植 (9) 3.3 Vivi编译与下载 (10) 第四章 Linux内核移植与下载 (11) 4.1 Linux内核源代码安装 (11) 4.2 Linux内核源代码分析与移植 (11) 4.3 Linux内核编译与下载 (12) 第五章触摸屏功能模块程序设计与交叉编译 (14) 5.1 触摸屏模块功能 (14) 5.2 功能模块驱动程序设计 (14) 5.3 功能模块交叉编译 (17) 第六章根文件系统建立与文件系统下载 (18) 6.1 根文件系统分析 (18) 6.2 文件系统映像文件生成 (18) 6.3 文件系统下载 (19) 6.4 功能模块运行与调试 (19) 第七章课程设计总结与体会 (25) 参考文献 (26)

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

LED驱动程序设计

LED驱动程序设计 分类:ARM系统进阶班(arm裸机程序)2012-08-24 13:23 1561人阅读评论(0) 收藏举报 首先声明,此文章是基于对国嵌视频教程中tiny6410有关视频教程的总结,为方便大家的复习。再次予以感谢,感谢国嵌各位老师为我们提供如此好的视频教程,为对于想要迈入嵌入式大门却迟迟找不到合适方法的学子们指引一条光明的方向。好了,接下来步入正题,此处将介绍tiny6410 LED驱动程序的设计。

2 下面来看看tiny6410关于LED 的原理图如图(1)所示:

图1 LED原理图 3 LED实例,代码如下所示:(代码摘自\光盘4\实验代码\3-3-1\src\main.c) main.c [cpp]view plaincopy 1./********************************************************** 2.*实验要求:用Tiny6410上的4个LED资源实现跑马灯程序。 3.*功能描述: Tiny6410用下面4个引脚连接了LED发光二极管,分别是 4.* GPK4--LED1 5.* GPK5--LED2 6.* GPK6--LED3 7.* GPK7--LED4 8.* 本程序将控制这四个管脚的输出电平,实现跑马灯的效果 9.*日期: 2011-3-10 10.*作者:国嵌 11.**********************************************************/ 12.#include "def.h" 13.#include "gpio.h" 14. 15.#define LED1_ON ~(1<<4) 16.#define LED2_ON ~(1<<5) 17.#define LED3_ON ~(1<<6) 18.#define LED4_ON ~(1<<7) 19. 20.#define LED1_OFF (1<<4)

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