蜂鸣器驱动程序设计_第1页
蜂鸣器驱动程序设计_第2页
蜂鸣器驱动程序设计_第3页
蜂鸣器驱动程序设计_第4页
蜂鸣器驱动程序设计_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、蜂鸣器驱动课程设计专 业: xxxxxxxxxxxxxx 班 级: xxxxxxxxx 学 号: xxxxxxxxx 姓 名: xxxx 设计题目: 蜂鸣器驱动程序设计 2016年12月 目录一.任务21.目标22.环境23.需求:2二总体设计21.处理流程22.模块介绍33.模块接口设计34.各个模块设计3三.PWM蜂鸣器字符设备驱动31.模块设计31. 模块介绍32. 模块结构图42.接口设计41. 数据结构设计42. 驱动程序接口43.函数设计41.初始化函数5 2. 字符设备打开函数6 3. 字符设备关闭函数7 4. 模块卸载函数.85. 文件操作接口函数8四. PWM蜂鸣器字符设备驱

2、动测试81. 调用系统函数ioctl实现对蜂鸣器的控制85 tiny210开发板调试.96 综合设计总结与思考.101. 任务1.目标:编写按键蜂鸣器驱动程序函数与测试文件,实现上位机与tiny210-SDK开发板的连接,利用函数实现对蜂鸣器通过按键来启动与关闭。2.环境:软件环境:windows 7 系统和VMware Workstation 软件硬件环境:tiny210 开发板 , 内核部分 Linux-3.0.8 , 交叉编译版本 arm-linux-gcc-4.5.1-v6-vfp1Linux系统介绍: Linux是一种自由开发源码的类Unix操作系统,存在这许多不同的Linux版本,

3、但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。 Linux是一个领先的操作系统,世界上运算最快的10台超级计算机运行的都是Linux操作系统。严格来说,Linux这个词本身只表示Linux内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU工程各种工具和数据库的操作系统。Linux得名于天才程序员林纳斯·托瓦兹。 tiny210开发板中模块介绍:PWM蜂鸣器模块PWM(脉冲宽度调制)简单的讲是一种变频技术之一,是靠改变脉冲宽度来控制输出电压,通过改变周期

4、来控制其输出频率。来看看我们实际生活中的例子,我们的电风扇为什么扭一下按扭,风扇的转速就会发生变化;调一下收音机的声音按钮,声音的大小就会发生变化。这些都是PWM的应用,都是通过PWM输出的频率信号进行控制的。蜂鸣器的种类和工作原理蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。   压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。有的压电式蜂鸣器外壳上还装有发光二极管。多谐振荡器由晶体管或集成电路构成。当接通电源后(1.515V直流工作电压),多谐振荡器起振,输出1.52.5kHZ的音频信号,阻抗匹配器推动压电蜂鸣片发声。  

5、; 电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场。振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。   有源蜂鸣器和无源蜂鸣器的区别:这个“源”字是不是指电源,而是指震荡源,即有源蜂鸣器内有振荡源而无源蜂鸣器内部没有振荡源。有振荡源的通电就可以发声,没有振荡源的需要脉冲信号驱动才能发声。3. 需求:要实现PC与tiny210开发板的通信,要求在PC机上的VMware Workstation 软件的Red Hat Enterprise Linux环境下编写程序,包含蜂鸣器驱动程序和测试

6、文件。利用交叉编译器arm-linux-gcc-4.5.1-v6-vfp1生成目标文件,最后讲目标文件下载到开发板,并且驱动蜂鸣器根据按键的不同完成启动或者停止的操作。2 总体设计1. 处理流程:2. 模块介绍:按键模块:通过按键来操作蜂鸣器的启动与停止。蜂鸣器模块:通过加载蜂鸣器驱动模块到内核,驱动蜂鸣器。按键模块:A. 正确驱动主设备号和次设备号B. 实现字符设备驱动程序C. 实现file-operation结构D. 实现初始化函数,注册字符设备E. 实现卸载函数,释放字符设备F. 创建文件节点按键模块:G. 正确驱动住设备号和次设备号H. 实现字符设备驱动程序I. 实现file-oper

7、ation结构J. 实现初始化函数,注册字符设备K. 实现卸载函数,释放字符设备L. 创建文件节点模块设计:(1)beep.c#include<linux/init.h>#include<linux/module.h>#include<linux/fs.h>#include<linux/cdev.h>#include<linux/types.h>#include<asm/io.h>#include<asm/uaccess.h>static int beep_major=0;static dev_t beep_d

8、evno;static struct cdev beep_cdev;static int *pload=NULL;#define BEEPNUM 3static int str_len(char *str)int count=0;while(*str!='0')count+;str+;return count;ssize_t beep_read (struct file *fp, char _user *buff, size_t count, loff_t *fps)char string20="HELLO,EVERYONEn"int retur=0;pri

9、ntk("%sn",_FUNCTION_);retur=copy_to_user(buff,string,str_len(string)+1);return retur;ssize_t beep_write (struct file *fp, const char _user *buff, size_t count, loff_t *fps)char string100;int retur=0;printk("%s",_FUNCTION_);retur=copy_from_user(string,buff,count);printk("kern

10、al-> %sn",string);return retur;int beep_open(struct inode *nodep,struct file *fp)unsigned int value=0;printk("%sn",_FUNCTION_);pload=ioremap(0XE02000A0,16);/convert register physical address to virtual addressvalue=ioread32(pload);value&=0x1<<3;value&=0x1<<2;val

11、ue&=0x1<<1;value|=0x1<<0;iowrite32(value,pload);return 0;int beep_release(struct inode *nodep,struct file *fp)printk("%sn",_FUNCTION_);return 0;void beep_start(void)unsigned int value=0;value=ioread32(pload+1);/read data registervalue|=0x1<<0;iowrite32(value,pload+1);

12、void beep_stop(void)unsigned int value=0;value=ioread32(pload+1);/read data registervalue&=0x1<<0;iowrite32(value,pload+1);long beep_unlocked_ioctl(struct file *fp,unsigned int cmd,unsigned long param)printk("%sn",_FUNCTION_);switch(cmd)case 0:/beep stopbeep_stop();break;case 1:/

13、beep startbeep_start();break;return 0;static struct file_operations beep_ops=.open=beep_open,.release=beep_release,.read=beep_read,.write=beep_write,.unlocked_ioctl=beep_unlocked_ioctl;static void alloc_beep_dev_num(void) if(beep_major>0) beep_devno=MKDEV(beep_major,0); register_chrdev_region(bee

14、p_devno,BEEPNUM,"beep"); else alloc_chrdev_region(&beep_devno,0,BEEPNUM,"beep"); beep_major=MAJOR(beep_devno); printk("beep_major = %dn",beep_major);static void initial_cdev(void) cdev_init(&beep_cdev,&beep_ops); beep_cdev.owner=THIS_MODULE; beep_cdev.ops=&a

15、mp;beep_ops; beep_cdev.dev=beep_devno; beep_cdev.count=BEEPNUM; cdev_add(&beep_cdev,beep_devno,BEEPNUM);/register a cdev variable to linux kernelstatic int _init beep_init(void) printk("%sn",_FUNCTION_); alloc_beep_dev_num();/get device number initial_cdev();/initial and register cdev

16、variable return 0;static void _exit beep_exit(void) printk("%sn",_FUNCTION_);unregister_chrdev_region(beep_devno,BEEPNUM);cdev_del(&beep_cdev); return ;module_init(beep_init);module_exit(beep_exit);3. PWM蜂鸣器字符设备驱动1.蜂鸣器模块介绍及结构图开发板上蜂鸣器原理图分析由原理图可以得知,蜂鸣器是通过GPD0 IO口使用PWM信号驱动工作的,而GPD0口是一个复用的

17、IO口,要使用它得先把他设置成TOUT0 PWM输出模式。GPD0参数要让蜂鸣器发声,需要两大要素:将蜂鸣器接到正确的端口并且设置为输出口,将端口设置为高电平要使蜂鸣器发声,就是要让GPD0作为输出端,同时该端口要设为高电平。也就是说GPD0设置为01为输出,让GPDDAT的最后一位设置为1则该端口就置成了高电平。2模块代码分析:2.1打开设备模块 int beep_open(struct inode *nodep,struct file *fp)unsigned int value=0;printk("%sn",_FUNCTION_);pload=ioremap(0XE0

18、2000A0,16);/convert register physical address to virtual addressvalue=ioread32(pload);value&=0x1<<3;value&=0x1<<2;value&=0x1<<1;value|=0x1<<0;iowrite32(value,pload);return 0;此函数实现了怎么去打开设备,在设备文件上的第一个操作,并不要求驱动程序一定要实现这个方法。如果该项为NULL,设备的打开操作永远成功。Open方法是驱动程序用来为以后的操作完成初始

19、化准备工作的。在大部分驱动程序中,open完成如下工作:初始化设备,标明次设备号。2.2关闭设备模块int beep_release(struct inode * fnode,struct file *fs) printk("%sn",_FUNCTION_); return 0;当设备文件被关闭时调用这个操作。与open相仿,release也可以没有,此处关闭函数为beep_release。Release方法的作用正好与open相反,它应该:关闭设备。本驱动程序要进行读和写。ssize_t beep_read (struct file *fp, char _user *bu

20、ff, size_t count, loff_t *fps)char string20="HELLO,EVERYONEn"int retur=0;printk("%sn",_FUNCTION_);retur=copy_to_user(buff,string,str_len(string)+1);return retur;ssize_t beep_write (struct file *fp, const char _user *buff, size_t count, loff_t *fps)char string100;int retur=0;print

21、k("%s",_FUNCTION_);retur=copy_from_user(string,buff,count);printk("kernal-> %sn",string);return retur;2.3 开启蜂鸣器void beep_start(void)unsigned int value=0;value=ioread32(pload+1);/read data registervalue|=0x1<<0;iowrite32(value,pload+1);2.4 关闭蜂鸣器void beep_stop(void)unsigne

22、d int value=0;value=ioread32(pload+1);/read data registervalue&=0x1<<0;iowrite32(value,pload+1);恢复GPD0口为IO口输出功能,由原理图可知直接给低电平可让蜂鸣器停止工作。2.5 ioctl控制模块long beep_unlocked_ioctl(struct file *fp,unsigned int cmd,unsigned long param)printk("%sn",_FUNCTION_);switch(cmd)case 0:/beep stopbe

23、ep_stop();break;case 1:/beep startbeep_start();break;return 0;应用程序向设备发送命令,设备接受到命令并进行解析,并做相应的设置并启动设备工作或停止工作。如果输入的参数大于0,就让蜂鸣器开始工作,不同的参数,蜂鸣器的频率也不一样。2.6 重要数据结构模块在Linux字符设备驱动程序设计中,有3种非常重要的数据结构:Struct fileStruct inodeStruct file_operations Struct File代表一个打开的文件。系统中每个打开的文件在内核空间都有一个关联的 struct file。它由内核在打开文件时

24、创建, 在文件关闭后释放。重要成员:loff_t * fp/*文件读写位置*/struct file_operations *fp Struct Inode用来记录文件的物理上的信息。因此, 它和代表打开文件的file结构是不同的。一个文件可以对应多个file结构, 但只有一个inode 结构。 重要成员:dev_t:设备号 struct file_operations一个函数指针的集合,定义能在设备上进行的操作。结构中的成员指向驱动中的函数, 这些函数实现一个特别的操作, 对于不支持的操作保留为NULL。static struct file_operations beep_ops= .ope

25、n = beep_open, .release =beep_release, .read = beep_read, .write = beep_write, .unlocked_ioctl =beep_unlocked_ioctl,2.7 在linux 内核中,字符设备使用 struct cdev 来描述。字符设备的注册可分为如下3个步骤:分配cdev初始化cdev添加cdevStruct cdev的分配可使用cdev_alloc函数来完成。Struct cdev的初始化使用cdev_init函数来完成。struct cdev的注册使用cdev_add函数来完成。2.8 设备注销模块stati

26、c void _exit beep_exit(void) printk("%sn",_FUNCTION_);unregister_chrdev_region(beep_devno,BEEPNUM);cdev_del(&beep_cdev); return ;此函数实现该混杂设备的注销。4. 蜂鸣器驱动测试模块和截图1、模块代码:#include<stdio.h>#include<fcntl.h>#include<stdlib.h>#include<string.h>int main(void) int fp=0;int

27、 i=0;fp=open("/dev/beep",O_RDWR,0x777);if(fp<=0)printf("fail in opening beep device filen");return 0;while(i<5)ioctl(fp,1,0);sleep(1);ioctl(fp,0,0);sleep(1);i+; close(fp); return 0; 测试程序解析:该测试程序先执行打开设备文件,往设备中写入命令和参数来实现对蜂鸣器的控制。蜂鸣器的开启与关闭间隔及蜂鸣器的频率取决于往设备里写的命令与参数。运行结果及截图beep_open蜂鸣器开始工作,beep_release蜂鸣器停止工作五

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论