蜂鸣器驱动程序设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
printk("%s\n",__FUNCTION__);
unregister_chrdev_region(beep_devno,BEEPNUM);
cdev_del(&beep_cdev);
return ;
}
module_init(beep_init);
module_exit(beep_exit);
return 0;
}
void beep_start(void)
{
unsigned int value=0;
value=ioread32(pload+1);//read data register
value|=0x1<<0;
iowrite32(value,pload+1);
}
void beep_stop(void)
要使蜂鸣器发声,就是要让GPD0作为输出端,同时该端口要设为高电平。也就是说GPD0设置为01为输出,让GPDDAT的最后一位设置为1则该端口就置成了高电平。
2模块代码分析:
2.1打开设备模块
int beep_open(struct inode *nodep,struct file *fp)
{
unsigned int value=0;
①PWM蜂鸣器模块
PWM(脉冲宽度调制)简单的讲是一种变频技术之一,是靠改变脉冲宽度来控制输出电压,通过改变周期来控制其输出频率。来看看我们实际生活中的例子,我们的电风扇为什么扭一下按扭,风扇的转速就会发生变化;调一下收音机的声音按钮,声音的大小就会发生变化。这些都是PWM的应用,都是通过PWM输出的频率信号进行控制的。
蜂鸣器驱动
课程设计
专业:xxxxxxxxxxxxxx
班级:xxxxxxxxx
学号:xxxxxxxxx
姓名:xxxx
设计题目:蜂鸣器驱动程序设计
2016年12月
5.tiny210开发板调试..............................................................................................................9
#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_devno;
static struct cdev beep_cdev;
{
printk("%s\n",__FUNCTION__);
switch(cmd)
{
case 0://beep stop
beep_stop();
break;
case 1://beep start
beep_start();
break;
}
return 0;
}
static struct file_operations beep_ops=
printk("%s\n",__FUNCTION__);
pload=ioremap(0XE02000A0,16);//convert register physical address to virtual address
value=ioread32(pload);
value&=~0x1<<3;
value&=~0x1<<2;
{
char string[100];
int retur=0;
printk("%s",__FUNCTION__);
retur=copy_from_user(string,buff,count);
printk("kernal----> %s\n",string);
return retur;
}
int beep_open(struct inode *nodep,struct file *fp)
电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场。振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。
有源蜂鸣器和无源蜂鸣器的区别:这个“源”字是不是指电源,而是指震荡源,即有源蜂鸣器内有振荡源而无源蜂鸣器内部没有振荡源。有振荡源的通电就可以发声,没有振荡源的需要脉冲信号驱动才能发声。
3.
要实现PC与tiny210开发板的通信,要求在PC机上的VMware Workstation软件的Red Hat Enterprise Linux环境下编写程序,包含蜂鸣器驱动程序和测试文件。利用交叉编译器arm-linux-gcc-4.5.1-v6-vfp1生成目标文件,最后讲目标文件下载到开发板,并且驱动蜂鸣器根据按键的不同完成启动或者停止的操作。
value&=~0x1<<1;
value|=0x1<<0;
iowrite32(value,pload);
return 0;
}
此函数实现了怎么去打开设备,在设备文件上的第一个操作,并不要求驱动程序一定要实现这个方法。如果该项为NULL,设备的打开操作永远成功。
{
unsigned int value=0;
value=ioread32(pload+1);//read data register
value&=~0x1<<0;
iowrite32(value,pload+1);
}
long beep_unlocked_ioctl(struct file *fp,unsigned int cmd,unsigned long param)
3.
1.蜂鸣器模块介绍及结构图
开发板上蜂鸣器原理图分析
由原理图可以得知,蜂鸣器是通过GPD0 IO口使用PWM信号驱动工作的,而GPD0口是一个复用的IO口,要使用它得先把他设置成TOUT0 PWM输出模式。
GPD0
要让蜂鸣器发声,需要两大要素:①将蜂鸣器接到正确的端口并且设置为输出口,②将端口设置为高电平
{
beep_devno=MKDEV(beep_major,0);
register_chrdev_region(beep_devno,BEEPNUM,"beep");
}
else
{
alloc_chrdev_region(&beep_devno,0,BEEPNUM,"beep");
beep_major=MAJOR(beep_devno);
{
.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)
②蜂鸣器的种类和工作原理
蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。
压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。有的压电式蜂鸣器外壳上还装有发光二极管。多谐振荡器由晶体管或集成电路构成。当接通电源后(1.5~15V直流工作电压),多谐振荡器起振,输出1.5~2.5kHZ的音频信号,阻抗匹配器推动压电蜂鸣片发声。
}
printk("beep_major = %d\n",beep_major);
}
static void initial_cdev(void)
{
cdev_init(&beep_cdev,&beep_ops);
beep_cdev.owner=THIS_MODULE;
beep_cdev.ops=&beep_ops;
6.综合设计总结与思考.............................................................................................10
1.
1.目标:
编写按键蜂鸣器驱动程序函数与测试文件,实现上位机与tiny210-SDK开发板的连接,利用函数实现对蜂鸣器通过按键来启动与关闭。
{
printk("%s\n",__FUNCTION__);
alloc_beep_dev_num();//get device number
initial_cdev();//initial and register cdev variable
return 0;
}
static void __exit beep_exit(void)
2.
①软件环境:windows 7系统和VMware Workstation软件
②硬件环境:tiny210开发板,内核部分Linux-3.0.8,交叉编译版本arm-linux-gcc-4.5.1-v6-vfp1
Linux系统介绍:
Linux是一种自由开发源码的类Unix操作系统,存在这许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。
beep_cdev.dev=beep_devno;
beep_cdev.count=BEEPNUM;
cdev_add(&beep_cdev,beep_devno,BEEPNUM);//register a cdev variable to linux kernel
}
static int __init beep_init(void)
Linux是一个领先的操作系统,世界上运算最快的10台超级计算机运行的都是Linux操作系统。严格来说,Linux这个词本身只表示Linux内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU工程各种工具和数据库的操作系统。Linux得名于天才程序员林纳斯·托瓦兹。
tiny210开发板中模块介绍:
2.
1.
2.
①按键模块:通过按键来操作蜂鸣器的启动与停止。
②蜂鸣器模块:通过加载蜂鸣器驱动模块到内核,驱动蜂鸣器。
①按键模块:
A.正确驱动主设备号和次设备号
B.实现字符设备驱动程序
C.实现file-operatiຫໍສະໝຸດ Baidun结构
D.实现初始化函数,注册字符设备
E.实现卸载函数,释放字符设备
F.创建文件节点
②按键模块:
value&=~0x1<<3;
value&=~0x1<<2;
value&=~0x1<<1;
value|=0x1<<0;
iowrite32(value,pload);
return 0;
}
int beep_release(struct inode *nodep,struct file *fp)
{
printk("%s\n",__FUNCTION__);
static int *pload=NULL;
#define BEEPNUM 3
static 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 string[20]="HELLO,EVERYONE\n";
int retur=0;
printk("%s\n",__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)
{
unsigned int value=0;
printk("%s\n",__FUNCTION__);
pload=ioremap(0XE02000A0,16);//convert register physical address to virtual address
value=ioread32(pload);
G.正确驱动住设备号和次设备号
H.实现字符设备驱动程序
I.实现file-operation结构
J.实现初始化函数,注册字符设备
K.实现卸载函数,释放字符设备
L.创建文件节点
模块设计:
(1)beep.c
#include<linux/init.h>
#include<linux/module.h>
#include<linux/fs.h>
相关文档
最新文档