西安文理学院机械电子工程系课程设计任务书学生姓名张聪聪专业班级 09级自动化(1)班学号***********指导教师雷俊红职称讲师教研室自动化课程自动化专业课程设计题目基于ARM的通用I/O接口驱动程序设计任务与要求利用ARM实验箱上的资源设计一个LED灯驱动。
设计要求:1)搭建交叉编译环境2)通过NFS网络文件系统建立共享目录3)LED按照1S的时间间隔亮灭,实现闪烁的效果开始日期 2011.12.05 完成日期 2011.12.142011年 12 月 5 日基于ARM的通用I/O接口驱动程序设计摘要:目前,基于ARM技术的嵌入式系统几乎已经深入应用到各个领域,是当今32位嵌入式系统应用的主流。
ARM在工业控制领域的应用也受到越来越多的关注。
随着嵌入式在生活中的应用越来越广泛,可广泛应用于移动设备、网络设备、工控设备、仪器仪表等。
Linux 系统本身就是一个优秀的操作系统,再加上他的源代码是开放的,所以就把它作为嵌入式开发的核心原型系统。
嵌入式Linux设备驱动是嵌入式系统中十分重要的部分,我们选择了LED灯的驱动程序开发作为课程设计题目。
可以进一步熟悉Linux操作系统及Linux的编程,同时也了解Linux下驱动开发的大体流程。
本次课程设计的LED灯的驱动程序开发大致包括两个部分,他们是交叉编译环境的搭建和驱动程序、应用程序的编写。
交叉编译工具使用arm-linux-gcc-4.3.3,使用NFS网络文件系统构成共享目录完成程序的烧写。
主要功能就是在已挂载LED驱动程序的情况下,用应用程序让LED间隔1S亮灭以验证驱动程序是否正常。
关键词:ARM;Linux操作系统;驱动程序开发;交叉编译;NFS;LED灯目录第1章绪论1.1课程设计目的 (1)1.2 课程设计环境 (1)1.3 课程设计总体要求 (1)第2 章方案设计2.1 系统硬件平台 (1)2.1.1 S3C2440的I/O口介绍 (2)2.2 系统软件平台 (2)2.2.1 软件简介 (2)2.2.2 软件基本操作 (3)2.2.3 嵌入式驱动程序基础 (3)第3章嵌入式系统开发环境的搭建3.1 建立交叉编译环境 (5)3.2 配置超级终端 (5)3.3 配置网络文件系统NFS服务 (6)第4章嵌入式设备驱动程序开发4.1编写LED设备驱动程序 (6)4.2编写LED用户应用程序 (7)4.3 运行程序 (7)4.3.1 编写Makefile文件 (7)4.3.2 烧写程序 (8)第5章结论第6章致谢参考文献附录A附录B第1章绪论1.1 课程设计目的近几年,嵌入式系统产品在全世界各行业得到广泛应用。
嵌入式系统产品的研制和应用已经成为我国信息化带动工业化,工业化促进信息化发展的新的国民经济增长点。
在中国,嵌入式软件发展过程中,政府已经充分认识到它的重要作用,并在政策、资金等方面给予大力支持。
2004年国家发改委、科技部、商务部联合颁布的《当前优先发展的高技术产业化重点领域指南》,把嵌入式软件产业作为国家发展的一个重要领域。
中国嵌入式软件产业的发展面临着良好的发展环境和机遇,这包括政府的重视与扶植、信息产业与传统产业的融合,中国制造的良好基础,自由软件运动的兴起等等。
基于上述情况,所以选择嵌入式驱动程序开发作为本次课程设计,而它也是嵌入式系统重要组成部分。
本次课程设计主要是为了加强Linux系统下编程的知识点的整合和灵活运用,让我们更加熟悉Linux下的编程操作。
重点在于熟悉Linux下设备驱动程序开发的流程,了解Redhat9.0操作系统的安装,交叉编译环境的搭建和配置、编译内核。
1.2 课程设计环境硬件环境为PC机一台,GT2440开发板一套,CPU处理器采用三星S3C2440A 主频400MHZ,内存为64M SDRAM,存储为256M Nand Flash、2M Nor Flash,支持操作系统Linux 2.6.30版本;软件为Redhat9.0 Linux2.4.20版本操作系统,Vmware5.0虚拟机和Windows系统的超级终端1.3 课程设计总体要求完成虚拟机和Redhat9.0的安装,配置网络文件系统NFS,搭建交叉编译环境,完成LED灯的驱动程序和应用程序的开发。
第2章方案设计2.1系统硬件平台在GT2440开发板上,系统分别使用了GPB5 、GPB6来控制2个LED灯,要编写一个驱动程序及应用程序来控制GPB5 、GPB6的电平。
当我们接入的是高电平驱动的时候,LED 灯没有电流通过,所以LED灯不会点亮;而当我们接入低电平驱动的时候,LED灯导通有电流通过,所以LED灯被点亮,所以我们这里的LED灯是低电平驱动有效点亮。
LED灯的电路连接如图所示:图2.1 LED灯硬件电路图2.1.1 S3C2440的I/O介绍通用I/O接口是嵌入式系统中一种非常重要的I/O接口。
它具有使用灵活,可配置性好,硬件代价小等优点,在嵌入式系统中广泛应用。
(1) S3C2440包含了130个多功能输入/输出口引脚并且它们为如下显示的九个端口:端口A(GPA):25位输出端口端口B(GPB):11位输入/输出端口端口C(GPC):16位输入/输出端口端口D(GPD):16位输入/输出端口端口E(GPE):16位输入/输出端口端口F(GPF):8位输入/输出端口端口G(GPG):16位输入/输出端口端口H(GPH):9位输入/输出端口端口J (GPJ):13位输入/输出端口(2) 端口控制寄存器说明端口配置寄存器(GPACON~GPJCON)在S3C2440中,大部分的引脚是复用的,所以必须对于每个引脚要求定义一个功能,端口配置寄存器定义了每个引脚的功能。
端口数据寄存器(GPADAT~GPJDAT)如果端口配置成输出端口,数据能够被写到端口数据寄存器的对应位,然后通过管脚输出;如果端口配置成输入端口,能从端口数据寄存器对应的位中读出管脚上的电平。
端口上拉寄存器(GPBUP~GPJUP)端口上拉寄存器控制着每个端口组的上拉寄存器的使能或禁止,当对应为0,这个引脚上的上拉寄存器是允许的,当为1时,上拉寄存器是禁止的。
[1]2.2系统软件平台软件平台使用Linux操作系统自带的Vi文本编辑器。
2.2.1 软件简介Vi是Linux系统的第一个全屏幕交互式编辑程序,它从诞生至今一直得到广大用户的青睐,历经数十年仍然是人们只要使用的文本编辑工具,足见其生命力之强,而强大的生命力是其强大的功能带来的。
Vi有三种模式,分别是命令行模式、插入模式及低行模式。
命令行模式:在该模式中可以通过上下移动光标进行“删除字符”或“整行删除”灯操作,也可以进行“复制”、“粘贴”等操作,但无法编辑文字。
插入模式:只有在该模式下,用户才能进行文字编辑和输入,用户可按【Esc】键回到命令行模式。
低行模式:在该模式下,光标位于屏幕的低行。
用户可以进行文件保存或退出操作,也可以设置编辑环境。
2.2.2 软件基本操作(1).进入Vi,即在命令行下输入Vi 文件名。
此时进入的是命令模式,光标位于屏幕的上方。
(2).在命令行模式下输入i进入插入模式。
可以看出,在屏幕底部显示有“插入”字样表示插入模式,在该模式下可以输入文字信息。
(3).最后按“【Esc】”,则当前模式转入命令行模式,并在低行中输入“:wq”进入低行模式。
wq(存盘保存),q(退出Vi),q!(强制退出)等。
2.2.3 嵌入式驱动程序基础(1)设备驱动程序概述①设备文件嵌入式Linux的一个重要特点就是将所有的设备都当做文件进行处理,所以设备驱动程序也就是设备文件。
设备文件分为三类:字符型设备文件、块设备文件或网络接口设备文件。
字符设备文件通常指不需要缓冲就能够直接读写的设备,它们以字节为单位进行读写。
块设备文件通常指仅能以块为单位读写的设备,一般块的大小为512字节的整数倍。
网络接口设备文件通常指网络设备访问的接口。
②设备驱动程序和用户应用程序设备驱动程序可以理解为操作系统的一部分,它的作用就是让操作系统能正确识别和使用设备。
对于不同的硬件设备,其对应的设备驱动程序也是不同的。
设备驱动程序与用户应用程序是不同的,设备驱动程序是用户应用程序与硬件设备之间的一个中间软件层。
设备驱动程序运行在内核空间,而用户应用程序则运行在用户空间。
嵌入式操作系统通过系统调用和硬件中断来完成从用户空间到内核空间的控制转移。
(2)设备驱动程序的加载过程①设备号嵌入式Linux系统通过设备号来区分不同设备,设备号分为主设备(0~255)和次设备。
一般在/proc目录下的devices文件中记录了系统中处于活动状态的设备的主设备号。
②设备进入点对每个设备都要定义一个设备进入点,该设备进入点的名称称为设备名。
使用mknod命令在文件系统中创建一个设备进入点。
命令格式为:mknod /dev/设备名 type major minortype为设备类型,c为字符设备;b为块设备。
命令为:Mknod /dev/leds c 255 o③加载设备驱动程序加载设备驱动程序:insmod 设备驱动程序名.O命令为:insmod leds.o查看当前加载了哪些设备驱动程序:lsmod –l卸载设备驱动程序:rmmod 设备驱动程序名.O④设备驱动程序加载与卸载的工作过程在用户空间通过命令insmod向内核空间加载设备驱动程序模块,此时程序的入口点是初始化函数init_module(),在该函数中完成设备的注册。
完成设备注册加载之后,系统将设备驱动加载到内核中,在用户空间的用户应用程序就可以通过调用驱动程序的功能接口函数对该设备进行操作。
设备用完之后,可以再用户空间通过移除已加载的驱动设备命令rmmod将设备卸载,此时的入口点是cleanup_module函数,在该函数中完成设备的卸载。
(3) 设备驱动程序的功能接口函数①设备驱动程序的注册与释放字符设备的注册函数为:devfs_register_chrdev(Demo_ID,”demo_drv”,&Test_ctl_ops);Demo_ID指设备驱动程序的主设备号demo_drv指设备驱动程序的设备名Test_ctl_ops指为驱动程序中所定义的结构体struct file_operations字符设备的注册函数为:devfs_unregister_chrdev(Demo_ID,”demo_drv”);②设备的打开与关闭所需头文件为#include<Linux/kernel.h>Open()函数是设备打开操作的接口Release()函数是释放设备的接口③设备的读写操作所需头文件为#include<Linux/fs.h>Read()和write()函数完成字符设备的读写操作④设备的控制操作所需头文件为#include<Linux/fs.h>接口函数iocal()主要用于对设备进行读写之外的其他操作在用户空间,函数iocal()的定义为:int iocal(int fd,int cmd,···);(3) 内核驱动操作GPIO引脚API函数①原型:void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function);作用:配置GPIO口引脚功能,既是配置相应的CON位②原型:unsigned int s3c2410_gpio_getcfg(unsigned int pin);作用:根据引脚获得指定引脚配置的功能值③原型:void s3c2410_gpio_pullup(unsigned int pin, unsigned int to);作用:配置相应GPIO口的上拉电阻④原型:void s3c2410_gpio_setpin(unsigned int pin, unsigned int to);作用:给指定的引脚写入0或1,即是配置相应的DAT位⑤原型:unsigned int s3c2410_gpio_getpin(unsigned int pin);作用:读取指定引脚的状态返回 0或1,即是配置相应的DAT位⑥原型:unsigned int s3c2410_modify_misccr(unsigned int clear, unsigned int change);作用:设置混杂控制寄存器⑦原型:int s3c2410_gpio_getirq(unsigned int pin);作用:读取中断引脚的状态 GPF0~GPF7、GPG0-GPG7第3章嵌入式系统开发环境的搭建绝大多数的软件开发都是以本地编译方式进行的,即在本机上开发编译、本机上运行的方式。