收藏 分享(赏)

课程设计报告 驱动开发.doc

上传人:dzzj200808 文档编号:2727392 上传时间:2018-09-26 格式:DOC 页数:23 大小:154KB
下载 相关 举报
课程设计报告 驱动开发.doc_第1页
第1页 / 共23页
课程设计报告 驱动开发.doc_第2页
第2页 / 共23页
课程设计报告 驱动开发.doc_第3页
第3页 / 共23页
课程设计报告 驱动开发.doc_第4页
第4页 / 共23页
课程设计报告 驱动开发.doc_第5页
第5页 / 共23页
点击查看更多>>
资源描述

1、西安文理学院机械电子工程系课程设计任务书学生姓名 赵 凯 专业班级 08 级自动化(2)班 学 号 08103080227 指导教师 雷俊红 职 称 讲师 教研室 自动化 课 程 自动化专业课程设计 题目基于 ARM的通用 I/O接口驱动程序设计 任务与要求利用 ARM 实验箱上的资源设计一个 LED 灯驱动。设计要求:1)搭建交叉编译环境2)通过 NFS 网络文件系统建立共享目录3)LED 按照 1S 的时间间隔亮灭,实现闪烁的效果开始日期 2011.12.05 完成日期 2011.12.30 2011年 12 月 5 日摘要随着嵌入式在生活中的应用越来越广泛,可广泛应用于移动设备、网络设备

2、、工控设备、仪器仪表等。Linux 系统本身就是一个优秀的操作系统,再加上他的源代码是开放的,所以就把它作为嵌入式开发的核心原型系统。嵌入式 Linux 设备驱动是嵌入式系统中十分重要的组成部分,为了熟悉 Linux 操作系统的使用和 Linux 下的编程操作,也是更加为了了解 Linux 下驱动开发的大体流程,所以选择了 LED 灯的驱动程序开发作为课程设计题目。LED 灯的驱动程序开发大致包括了两大部分,分别是交叉编译环境的搭建和驱动程序、应用程序的编写。交叉编译工具使用 arm-linux-gcc-4.3.3,使用 NFS 网络文件系统构成共享目录完成程序的烧写。主要功能就是在已挂载 L

3、ED 驱动程序的情况下,用应用程序让 LED 间隔 1S 亮灭以验证驱动程序是否正常。关键词:Linux 操作系统;驱动程序开发;交叉编译;NFS; LED 灯西安文理学院设计报告1目录1 绪论1.1 课程设计目的 11.2 课程设计环境 11.3 课程设计总体要求12 方案设计2.1 系统硬件平台22.1.1 S3C2440 的 I/O 口介绍22.2 系统软件平台32.2.1 软件简介32.2.2 软件基本操作32.2.3 嵌入式驱动程序基础4 西安文理学院设计报告13 嵌入式系统开发环境的搭建3.1 建立交叉编译环境73.2 配置超级终端73.3 配置网络文件系统 NFS 服务84 嵌入

4、式设备驱动程序开发4.1 编写 LED 设备驱动程序94.2 编写 LED 用户应用程序104.3 运行程序104.3.1 编写 Makefile 文件104.3.2 烧写程序115 结论12致谢13西安文理学院设计报告1参考文献14附录 A 驱动源程序15附录 B 应用源程序18西安文理学院设计报告1第一章 绪论1.1 课程设计目的近几年,嵌入式系统产品在全世界各行业得到广泛应用。嵌入式系统产品的研制和应用已经成为我国信息化带动工业化,工业化促进信息化发展的新的国民经济增长点。在中国,嵌入式软件发展过程中,政府已经充分认识到它的重要作用,并在政策、资金等方面给予大力支持。2004 年国家发改

5、委、科技部、商务部联合颁布的当前优先发展的高技术产业化重点领域指南 ,把嵌入式软件产业作为国家发展的一个重要领域。中国嵌入式软件产业的发展面临着良好的发展环境和机遇,这包括政府的重视与扶植、信息产业与传统产业的融合,中国制造的良好基础,自由软件运动的兴起等等。基于上述情况,所以选择嵌入式驱动程序开发作为本次课程设计,而它也是嵌入式系统重要组成部分。本次课程设计主要是为了加强 Linux 系统下编程的知识点的整合和灵活运用,让我们更加熟悉 Linux 下的编程操作。重点在于熟悉 Linux 下设备驱动程序开发的流程,了解 Redhat9.0 操作系统的安装,交叉编译环境的搭建和配置、编译内核。1

6、.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

7、系统硬件平台在 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 接口。它具有使用灵活,可配置性好,硬件代价小等优点,在

8、嵌入式系统中广泛应用。(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) 端口控制寄存器说明端口配置寄存器(GPACONGPJCON)在 S3C2440 中,大部分的引

9、脚是复用的,所以必须对于每个引脚要求定义一个功能,端口配置寄存器定义了每个引脚的功能。西安文理学院设计报告3端口数据寄存器(GPADATGPJDAT)如果端口配置成输出端口,数据能够被写到端口数据寄存器的对应位,然后通过管脚输出;如果端口配置成输入端口,能从端口数据寄存器对应的位中读出管脚上的电平。端口上拉寄存器(GPBUPGPJUP)端口上拉寄存器控制着每个端口组的上拉寄存器的使能或禁止,当对应为 0,这个引脚上的上拉寄存器是允许的,当为 1 时,上拉寄存器是禁止的。12.2 系统软件平台软件平台使用 Linux 操作系统自带的 Vi 文本编辑器。2.2.1 软件简介Vi 是 Linux 系

10、统的第一个全屏幕交互式编辑程序,它从诞生至今一直得到广大用户的青睐,历经数十年仍然是人们只要使用的文本编辑工具,足见其生命力之强,而强大的生命力是其强大的功能带来的。Vi 有三种模式,分别是命令行模式、插入模式及低行模式。命令行模式:在该模式中可以通过上下移动光标进行“删除字符”或“整行删除”灯操作,也可以进行“复制” 、 “粘贴”等操作,但无法编辑文字。插入模式:只有在该模式下,用户才能进行文字编辑和输入,用户可按【Esc】键回到命令行模式。低行模式:在该模式下,光标位于屏幕的低行。用户可以进行文件保存或退出操作,也可以设置编辑环境。2.2.2 软件基本操作(1).进入 Vi,即在命令行下输

11、入 Vi 文件名。此时进入的是命令模式,光标位于屏幕的上方。(2).在命令行模式下输入 i 进入插入模式。可以看出,在屏幕底部显示有“插入”字样表示插入模式,在该模式下可以输入文字信息。(3).最后按“【Esc】 ”,则当前模式转入命令行模式,并在低行中输入“:wq ”进入低行模式。wq(存盘保存 ), q(退出 Vi),q!(强制退出)等。西安文理学院设计报告42.2.3 嵌入式驱动程序基础(1)设备驱动程序概述 设备文件嵌入式 Linux 的一个重要特点就是将所有的设备都当做文件进行处理,所以设备驱动程序也就是设备文件。设备文件分为三类:字符型设备文件、块设备文件或网络接口设备文件。字符设

12、备文件通常指不需要缓冲就能够直接读写的设备,它们以字节为单位进行读写。块设备文件通常指仅能以块为单位读写的设备,一般块的大小为 512 字节的整数倍。网络接口设备文件通常指网络设备访问的接口。 设备驱动程序和用户应用程序设备驱动程序可以理解为操作系统的一部分,它的作用就是让操作系统能正确识别和使用设备。对于不同的硬件设备,其对应的设备驱动程序也是不同的。设备驱动程序与用户应用程序是不同的,设备驱动程序是用户应用程序与硬件设备之间的一个中间软件层。设备驱动程序运行在内核空间,而用户应用程序则运行在用户空间。嵌入式操作系统通过系统调用和硬件中断来完成从用户空间到内核空间的控制转移。(2)设备驱动程

13、序的加载过程 设备号嵌入式 Linux 系统通过设备号来区分不同设备,设备号分为主设备(0255)和次设备。一般在/proc 目录下的 devices 文件中记录了系统中处于活动状态的设备的主设备号。 设备进入点对每个设备都要定义一个设备进入点,该设备进入点的名称称为设备名。使用 mknod 命令在文件系统中创建一个设备进入点。命令格式为:mknod /dev/设备名 type major minor type 为设备类型,c 为字符设备;b 为块设备。命令为:Mknod /dev/leds c 255 o 加载设备驱动程序加载设备驱动程序:西安文理学院设计报告5insmod 设备驱动程序名

14、.O 命令为:insmod leds.o查看当前加载了哪些设备驱动程序:lsmod l卸载设备驱动程序:rmmod 设备驱动程序名.O 设备驱动程序加载与卸载的工作过程在用户空间通过命令 insmod 向内核空间加载设备驱动程序模块,此时程序的入口点是初始化函数 init_module() ,在该函数中完成设备的注册。完成设备注册加载之后,系统将设备驱动加载到内核中,在用户空间的用户应用程序就可以通过调用驱动程序的功能接口函数对该设备进行操作。设备用完之后,可以再用户空间通过移除已加载的驱动设备命令 rmmod 将设备卸载,此时的入口点是cleanup_module 函数,在该函数中完成设备的

15、卸载。(3) 设备驱动程序的功能接口函数 设备驱动程序的注册与释放字符设备的注册函数为:devfs_register_chrdev(Demo_ID,”demo_drv”,Demo_ID 指设备驱动程序的主设备号demo_drv 指设备驱动程序的设备名Test_ctl_ops 指为驱动程序中所定义的结构体 struct file_operations字符设备的注册函数为:devfs_unregister_chrdev(Demo_ID,”demo_drv”); 设备的打开与关闭所需头文件为#includeOpen()函数是设备打开操作的接口Release()函数是释放设备的接口 设备的读写操作所需

16、头文件为#includeRead()和 write()函数完成字符设备的读写操作西安文理学院设计报告6 设备的控制操作所需头文件为#include接口函数 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 s3c241

17、0_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);作用:读取指定引脚的状态 返回

18、0 或 1,即是配置相应的 DAT 位 原型:unsigned int s3c2410_modify_misccr(unsigned int clear, unsigned int change);作用:设置混杂控制寄存器 原型:int s3c2410_gpio_getirq(unsigned int pin) ;作用:读取中断引脚的状态 GPF0GPF7、 GPG0-GPG7西安文理学院设计报告7第三章 嵌入式系统开发环境的搭建绝大多数的软件开发都是以本地编译方式进行的,即在本机上开发编译、本机上运行的方式。但是,由于开发板上没有足够的资源来运行开发工具和调试工具。因此嵌入式系统软件的开发通

19、常采用交叉编译的方式。所谓交叉编译,就是指在一个硬件平台上生成可以在另一个不同硬件平台上执行的代码。3.1 建立交叉编译环境将 arm-linux-gcc-4.3.3.tar.gz 拷贝到目录/opt 下,然后进入该目录,执行解压命令:#mv arm-linux-gcc-4.3.3.tar.gz /opt#cd /tmp#tar xvzf arm-linux-gcc-4.3.3.tar.gz C然后再运行如下命令:#gedit /root/.bashrc在打开的文件的末尾加上如下内容:export PATH=$PATH:/opt/usr/locla/arm/4.4.3/bin然后保存退出重新登

20、录 Redhat 系统,使以上设置生效,在命令行输入 arm-linux-gcc v,会出现 arm-linux-gcc 的版本号,这说明交叉编译环境已经安装成功。3.2 配置超级终端超级终端程序通常位于 windows 系统的“开始-程序-附件-通讯”中,选择运行该程序,一般会弹出提示窗口,询问你是否将 HyperTerminal 作为默认的 telnet 程序,此时选择“否” 。接下来弹出来的窗口,选择“取消” 。此时系统提示“您确定要取消吗?”,选择“是” ,接着点击提示窗口的“确定” ,进入下一步。超级终端会要求你为新的连接取个新的名字,我在配置的时候取的是“tty ”。当你命名完以后

21、,又会跳出一个对话框,选择开发板的串口,我选择的是串口 4.西安文理学院设计报告8最后一步,最重要的一步,数据流控制必须选择“无” ,另外板子的串口波特率设为 115200。当所有的参数都设置好后,超级终端就配置好了。23.3 配置网络文件系统 NFS 服务在配置 NFS 服务之前,先使用查看一下 Linux 系统在安装的时候是否已经安装了 NFS 服务,方法如下:输入命令 setup,然后在出现的蓝色窗口中选择 System services,进入后,如果看到选项前的中括号有“*”,表示已经被选中,如果没有,就表示没选中;现在选中 NFS 服务,去掉 iptables,然后保存退出。接下来运

22、行命令#gedit /etc/exports在打开的 NFS 服务的配置文件中添加以下内容:/home/share 192.168.1.230(rw,sync,no_root_squash)其中:/home/share 表示 NFS 共享目录,它可以作为开发板的根文件系统192.168.1.230 是开发板的 IP 地址,注意 IP 地址前有空格。 (这里的 IP 地址可以用*代替,表示所有的客户机都可以挂载次 目录)rw 表示挂载次目录的客户机多该目录有读写的权力sync:数据同步写入内存和硬盘,也可以使用 async,此时数据会先暂存于内存中,而不立即写入硬盘no_root_squash

23、表示允许挂载次目录的客户机有该主机的 root 身份然后保存退出。最后使用/etc/init.d/nfs stop 和 /etc/init.d/portmap stop 命令停止 NFS 服务和端口监听服务,再用/etc/init.d/nfs start 和 /etc/init.d/portmap start 命令重新启动 NFS 服务和端口监听服务使之配置生效。西安文理学院设计报告9第四章 嵌入式设备驱动程序开发4.2 编写 LED 设备驱动程序一个设备驱动程序模块的基本框架如下:#include /驱动程序所必需的包含文件open()read()write()struct file_ope

24、ration;int init_module(void) /驱动程序注册语句int cleanup_module(void) /释放设备资源语句module_init(init_module); /加载驱动的入口点module_exit(cleanup_module); /卸载设备驱动的入口点程序中部分语句解释:static unsigned long led_table = S3C2410_GPB5, /建立数组,为两个 LED 编号S3C2410_GPB6, / ;static int gt2440_leds_ioctl(struct inode *inode,struct file *f

25、ile,unsigned int 西安文理学院设计报告10cmd,unsigned long arg) /字符设备的通用控制函数, 改变 IO 口的功能 s3c2410_gpio_setpin(led_tablearg, 0);/设置相应的 IO 口为 0s3c2410_gpio_cfgpin(led_tablei,led_cfg_tablei);/配置相应管脚的功能s3c2410_gpio_setpin(led_tablei,0); /配置相应管脚的数据位 即高电平或低电平源程序见附录 A4.3 编写 LED 用户应用程序在用户应用程序中,其核心语句为:接口函数 iocal()的参数在 0,

26、1 之间交替取值,使得 GPIO 的输出电平高低变化,从而使发光二极管 LED 安装一定的时间间隔亮灭,实现闪烁的效果。程序中部分语句解释:当 LED_OFF 代表数值 0,LED_ON 代表数值 1 时Ioctl(fd,on,LED_OFF); /使得相应的管脚输出低电平 点亮 LED Sleep(1); /休眠 1SIoctl(fd,on,LED_ON); /使得相应的管脚输出高电平 熄灭 LEDSleep(1); /休眠 1S if (argc != 2| sscanf(argv1, “%d“, /任一版本的 GNU 公共许可static unsigned long led_table

27、= S3C2410_GPB5,S3C2410_GPB6,;/建立数组,为两个 LED 编号static unsigned int led_cfg_table =西安文理学院设计报告16S3C2410_GPB5_OUTP,S3C2410_GPB6_OUTP,;/分别定义每个 LED 的 IO 模式为基本的输出在“regs-gpio.h ”中static int gt2440_leds_ioctl(struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg)/字符设备的通用控制函数,改变 IO 口的功能if (a

28、rg 2)/arg 接受 LED 编号 return -EINVAL;/若大于 2 参数不合法switch(cmd) /输出 0 或 1case IOCTL_LED_ON: /相应口点亮,因 LED 的阴极接 IO 口所以输出 1 点亮s3c2410_gpio_setpin(led_tablearg, 0);/设置相应的 IO 口为 0return 0; /正常返回case IOCTL_LED_OFF: /相应口熄灭s3c2410_gpio_setpin(led_tablearg, 1);/设置相应的 IO 口为 0 return 0;default:return -EINVAL;/不为 0

29、或 1 时参数不合法static struct file_operations dev_fops = .owner = THIS_MODULE,/该成员指向本设备,计数用,别的程序也打开了本设备时不能卸载.ioctl = gt2440_leds_ioctl,/该成员执行设备特定命令的函数在此控制 IO 口的编号和状态西安文理学院设计报告17;/访问设备的结构体static struct miscdevice misc = .minor = MISC_DYNAMIC_MINOR, /动态分配 LED 设备的次设备号 .name = DEVICE_NAME, /name 是设备名,在上面已经定义了

30、 DEVICE_NAME.fops = /杂项设备的结构体static int _init dev_init(void)/led 设备加载函数int ret;int i;for(i=0;i#include #include #include #definr led_on 1#definr led_off 0 int main(int argc, char *argv)int on;int led_no;int fd;if (argc != 2| sscanf(argv1, “%d“, exit(1);fd = open(“/dev/leds0“, 0);if (fd 0) perror(“open device leds“);exit(1);else While(1)ioctl(fd, on, led_no); sleep(1);ioctl(fd, on, led_off); sleep(1);close(fd);return 0;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报