基于ARM-contexA9蜂鸣器驱动开发-阿里云开发者社区

开发者社区> morixinguan> 正文

基于ARM-contexA9蜂鸣器驱动开发

简介:
+关注继续查看

上次,我们写了一个LED的驱动程序,这一节,我们只需稍微改动一下就可以实现蜂鸣器的驱动,让我们来看看吧。大笑

     还是跟之前一样,先找电路图,找到电路板上对应的引脚和相关联的寄存器。

     1、看电路图生气

     (1)蜂鸣器接口位于电路板的底板,看电路图可知道是高电平有效。


       (2)相对应的找到核心板的接口。由此可知,我们的蜂鸣器是GPD0_0


  接下来找数据手册,找到对应的寄存器,然后配置它就可以了。

  2、查数据手册,找到相关的寄存器,并配置生气

(1)找到GPD0CON,地址是0x114000A0,我们需要配置GPD0CON(0)为输出状态。也就是写0x1这个值到这个寄存器。

 

(2)找到GPD0DAT这个寄存器,用于配置蜂鸣器的高低电平,物理地址是0x114000A4,刚好与上一个差4个字节的偏移

我们只要对这个寄存器写1和写0,那么蜂鸣器就可以叫起来了,哈哈。是不是很简单?大笑


3、开始写驱动程序。

<span style="font-size:18px;">#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/io.h>
#include <asm/uaccess.h>
#include <asm/irq.h>
#include <asm/io.h>
#define DEV_NAME	"test-dev"
//定义蜂鸣器配置IO的地址 
#define GPD0CON  0x114000A0
volatile unsigned long *bell_config = NULL ; 
volatile unsigned long *bell_dat = NULL ; 
int bell_open(struct inode *inode, struct file *filp)
{
	printk("bell_open\n");
	//清寄存器 
	*bell_config &= ~(0xf);
	//设置io为输出 
	*bell_config |= (0x1);
	return 0;
}

int bell_close(struct inode *inode, struct file *filp)
{
	printk("bell_close\n");
	//关闭蜂鸣器 
	*bell_dat &= ~0x1 ;
	return 0;
}

long bell_ioctl(struct file *filp, unsigned int request, unsigned long arg)
{
	//控制蜂鸣器的状态 
	switch(request)
	{
		case 0:
			printk(KERN_EMERG"bell on\n");
			*bell_dat |= 0x1 ;
			break;

		case 1:
			printk(KERN_EMERG"bell off\n");
			*bell_dat &=~0x1 ;
			break;
	}
	return 0 ;
}

struct file_operations fops = {
	.owner = THIS_MODULE ,
	.open = bell_open,
	.release = bell_close,
	.unlocked_ioctl = bell_ioctl,
};

int major ;
int test_init(void)
{
	printk("bell_init\n");
	//注册设备 
	major = register_chrdev(major, DEV_NAME, &fops);
	//映射IO 
	bell_config = (volatile unsigned long *)ioremap(GPD0CON , 16);
	//加4个字节偏移到GP0DAT顺便映射该物理地址 
	bell_dat = bell_config + 1 ;	
	return 0;
}

void test_exit(void)
{
	printk("bell_exit\n");
	//解除注册 
	unregister_chrdev(major, DEV_NAME);
	//取消映射 
	iounmap(bell_config);
}

module_init(test_init);
module_exit(test_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Y.X.YANG");
MODULE_VERSION("2016.1.16");</span>
4、写测试程序
<span style="font-size:18px;">#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(int argc, char **argv)
{
	int fd;
	//打开设备 
	fd = open("/dev/test-dev",O_RDWR) ;
	if(-1 == fd)
	{
		printf("open fair!\n");
		return -1 ;
	}
	while(1){
		//打开蜂鸣器 
		ioctl(fd,1);
		sleep(1);
		//关闭蜂鸣器 
		ioctl(fd,0);
		sleep(1);
	}
	return 0;
}</span>
5、编写makefile
<span style="font-size:18px;">obj-m	+= bell.o

ROOTFS = /disk/A9/filesystem
KERNEL = /disk/A9/linux-3.5/
all:
	make -C $(KERNEL) M=`pwd` modules

clean:
	make -C $(KERNEL) M=`pwd` clean
	rm -rf my_bell

install:
	make -C $(KERNEL) M=`pwd` modules_install INSTALL_MOD_PATH=$(ROOTFS)

my_bell:
	arm-linux-gcc my_bell.c -o my_bell
</span>


6、编译

  

7、查看设备主设备号,这里就省略图了,我们得到主设备号是250  cat /proc/devices   

8、创建设备节点  mknod  /dev/test-dev  c   250  0

9、开始执行


由于蜂鸣器的现象没有实质的效果展示,只能通过终端打印,如有兴趣,自己去尝试,用其它板子也可以,就照着我这个方法写驱动,一定成功的!

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
NHibernate 3.2 使用 Conformist 进行 CodeFirst 开发
NHibernate 3.2 GA 正式版于 2011-07-30 发布,这一版本对 CodeFirst 的支持性更好了,因为它提供了 Conformist 取代之前第三方的 ConfOrm。   NHibernate 3.2 下载地址:http://sourceforge.net/projects/nhibernate/files/NHibernate/   下面将讲一下如何使用这一新成员进行数据库的基本操作。
875 0
《Lua游戏开发实践指南》一第1章 游戏开发入门
本节书摘来华章计算机《Lua游戏开发实践指南》一书中的第1章 ,(美)Paul SchuytemaMark Manyen 著 田剑译 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
876 0
IDEA 插件开发入门教程
IntelliJ IDEA 是目前最好用的 JAVA 开发 IDE,它本身的功能已经非常强大了,但是每个人的需求不一样,有些需求 IDEA 本身无法满足,于是我们就需要自己开发插件来解决。工欲善其事,必先利其器,想要提高开发效率,我们可以借助 IDEA 提供的插件功能来满足我们的需求。
6720 0
2012 ARM嵌入式开发应用研讨会杂谈
以前参加的ARM的研讨会,名称是技术研讨会,不知道为什么现在改名为嵌入式开发应用研讨会了。不过今年演讲的重点就是 ARM DS-5开发工具(还免费发放了一本《Linux/Android开发利器 ARM DS-5使用指南》书籍),也许这就是所谓的嵌入式开发应用名称的由来吧
634 0
+关注
morixinguan
ITGEGE在线教育嵌入式开发讲师。 CSDN博客专家、CSDN-Linux特邀编辑、CSDN博乐、CSDN学院讲师,目前从事嵌入式开发领域,从事与单片机,Linux,android相关的产品开发。
499
文章
1
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载