合肥师范学院
嵌入式系统开发技术
课程设计
专业:计算机科学与技术(嵌入式)
班级:嵌入式应用技术
学号: 110441034 1110441047 1110441060 姓名:钱鹏鹏汪新妹郭航峰
设计题目:蜂鸣器驱动程序设计
2014年05月
1.绪论_______________________________________________________________ 3 1.1概要 _________________________________________________________________ 3
1.2设计内容 _____________________________________________________________ 4
2.开发环境的搭建_____________________________________________________ 4 2.1Redhat的安装 _________________________________________________________ 4 2.2安装arm-linux-gcc交叉编译器__________________________________________ 9
2.3安装及编译linux-2.6.29-mini2440-20090708内核_________________________ 9
3.字符设备驱动相关知识_______________________________________________ 9 3.1模块机制 _____________________________________________________________ 9 3.2字符设备开发基本步骤_________________________________________________ 10 3.3主设备号和次设备号___________________________________________________ 11
3.4实现字符驱动程序_____________________________________________________ 12
4.蜂鸣器原理________________________________________________________ 14 4.1蜂鸣器的种类和工作原理_______________________________________________ 14 4.2开发板上蜂鸣器原理图分析_____________________________________________ 15
4.3GPB0参数 ____________________________________________________________ 15
5.总体设计__________________________________________________________ 16 5.1设计思路 ____________________________________________________________ 16
5.2设计步骤 ____________________________________________________________ 16
6. 驱动及测试程序___________________________________________________ 17 6.1beep.c _______________________________________________________________ 17
6.2beep_tset.c __________________________________________________________ 21
7.运行结果及截图____________________________________________________ 22综合设计总结与思考__________________________________________________ 25
1.绪论
1.1概要
linux 驱动在本质上就是一种软件程序,上层软件可以在不用了解硬件特性的情况下,通过驱动提供的接口,和计算机硬件进行通信。
系统调用是内核和应用程序之间的接口,而驱动程序是内核和硬件之间的接口,也就是内核和硬件之间的桥梁。
它为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作。
linux 驱动程序是内核的一部分,管理着系统中的设备控制器和相应的设备。
它主要完成这么几个功能:对设备初始化和释放;传送数据到硬件和从硬件读取数据;检测和处理设备出现的错误。
一般来说,一个驱动可以管理一种类型的设备。
例如不同的 U 盘都属于 mass storage 设备,我们不需要为每一个 U 盘编写驱动,而只需要一个驱动就可以管理所有这些 mass storage 设备。
为方便我们加入各种驱动来支持不同的硬件,内核抽象出了很多层次结构,这些层次结构是 linux 设备驱动的上层。
它们抽象出各种的驱动接口,驱动只需要填写相应的回调函数,就能很容易把新的驱动添加到内核。
一般来说, linux 驱动可以分为三类,就是块设备驱动,字符设备驱动和网络设备驱动。
块设备的读写都有缓存来支持,并且块设备必须能够随机存取。
块设备驱动主要用于磁盘驱动器。
而字符设备的 I/O 操作没有通过缓存。
字符设备操作以字节为基础,但不是说一次只能执行一个字节操作。
例如对于字符设备我们可以通过 mmap 一次进行大量数据交换。
字符设备实现比较简单和灵活。
1.2设计内容
本次设计是简单的字符设备驱动设计,基于mini2440的蜂鸣器的驱动设计。
2.开发环境的搭建
2.1Redhat的安装
创建一个虚拟机:点击菜单栏File->New->Virtual machine。
点击下一步。
选择Typical选项。
选择Linux下的Red Hat Linux 填写虚拟机的命名和存储地址。
选择磁盘大小
2.2安装arm-linux-gcc交叉编译器
将 arm-linux-gcc-4.3.2.tgz复制到虚拟机的root目录下
解压文件:tar zxvf arm-linux-gcc-4.3.2.tgz
在bash_profile里添加路径:gedit ~/.bash_profiel
路径 /root/usr/local/arm/4.3.2/bin
source ~/.bash_profile 使更改生效
2.3安装及编译linux-2.6.29-mini2440-20090708内核
复制内核到root目录下
解压内核文件 tar zxvf linux-2.6.29-mini2440-20090708.tgz
使内核文件生效:cp config_mini2440_n35 .config
使用make命令完成编译
3.字符设备驱动相关知识
3.1模块机制
Linux提供了机制被称为模块(Module)的机制
提供了对许多模块支持, 包括但不限于, 设备驱动
每个模块由目标代码组成( 没有连接成一个完整可执行程序 ) insmod 将模块动态加载到正在运行内核
rmmod 程序移除模块
Linux内核模块的程序结构
static int __init beep_init(void)---模块初始化函数
通过alloc_chrdev_region来分配设备号beep_cdev来对设备进行各种操作。
比如在加载内核模块时,模块的加载函数会自动被内核执行,完成模块的相关初始化工作。