[嵌入式Linux驱动]S5PV210的蜂鸣器Linux驱动

本文档介绍了S5PV210处理器中蜂鸣器的Linux驱动实现,包括使用platform模型设计的Alarm_Beeper_device和Alarm_Beeper_driver两部分,通过GPIO和定时器初始化蜂鸣器,并提供了打开、关闭、调整频率的ioctl命令。驱动注册后生成/dev/smarthome_alarm_beeper设备节点,通过用户程序进行控制。
摘要由CSDN通过智能技术生成
智能家居报警器控制驱动程序:
1. 本驱动使用platform模型进行设计,分为Alarm_Beeper_device和Alarm_Beeper_driver两个文件
2. 注册杂项设备(misc),主设备号固定是10(misc),从设备号由系统自动分配,加载成功后使用lsmod可以看到:
     Alarm_Beeper_device
     Alarm_Beeper_driver

3. 加载driver驱动模块之后自动对gpio进行初始化,初始化成功会输出:
[   22.179372] Alarm_Beeper_dirver_probe: gpio init finished!!!   //GPIO初始化成功
[   22.191932] Alarm_Beeper_dirver_probe: timer0 init finished!!!    //定时器初始化成功
 初始化完成后会默认将蜂鸣器关掉。

4. 本驱动注册成功后生成 /dev/smarthome_alarm_beeper 节点

5. 对 smarthome_alarm_beeper 设备节点的操作主要有:
   1)打开操作open
   2)关闭操作close
   3)发送命令ioctl:这里使用了_IO的办法对命令进行加密
 
 #define MAGIC_WORD 'w'
 #define ALARM_BEEPER_OFF               _IO(MAGIC_WORD,10)   //关闭蜂鸣器
 #define ALARM_BEEPER_ON                 _IO(MAGIC_WORD,11)   //打开蜂鸣器
 #define ALARM_BEEPER_SPEED_UP   _IO(MAGIC_WORD,12)   //提高蜂鸣器频率(大约提升1倍,最多提升7次)
 #define ALARM_BEEPER_SPEED_DOWN       _IO(MAGIC_WORD,13)   //降低蜂鸣器频率(大约降低1半,最多降低7次)
 #define ALARM_BEEPER_SPEED_DEFAULT  _IO(MAGIC_WORD,20)   //恢复蜂鸣器默认频率
 
 注意:这里仅仅是对蜂鸣器的频率进行操作,对蜂鸣器鸣响的持续时间控制在用户程序完成。


Alarm_Beeper_device.c
#include <linux/platform_device.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <asm/uaccess.h>

#define S5PV210_GPD_BASE	0xe02000a0			//read the s5pv210 datasheet!
#define S5PV210_TC_BASE	0xe2500000

#define GPD_SIZE 0x34
#define TC0_SIZE 0x14


void Alarm_Beeper_device_release(struct device * pdev);

static struct resource Alarm_Beeper_resource[]={

	[0] = {
		.start = S5PV210_GPD_BASE,
		.end   = S5PV210_GPD_BASE + GPD_SIZE,
		.name  = "GPD_BASE",
		.flags = IORESOURCE_MEM,
	},
	
	[1] = {
		.start = S5PV210_TC_BASE,
		.end   = S5PV210_TC_BASE + TC0_SIZE,
		.name  = "TC0_BASE",
		.flags = IORESOURCE_MEM,
	},	
};


struct platform_device Alarm_Beeper_device={
	.name = "Alarm_Beeper_drv",
	.id = -1,
	.dev={
		.release=Alarm_Beeper_device_release,
	},
	.num_resources = ARRAY_SIZE(Alarm_Beeper_resource),
	.resource = Alarm_Beeper_resource,
};


void Alarm_Beeper_device_release(struct device * pdev)
{
	printk("entering %s\n",__FUNCTION__);
}


static int __init Alarm_Beeper_device_init(void)
{
	printk("entering %s\n",__FUNCTION__);

	if(platform_device_register(&Alarm_Beeper_device)){
		printk("%s: platform_device_register failed! \n",__FUNCTION__);
		return -EBUSY;
	}

	return 0;
}


static void __exit Alarm_Beeper_device_exit(void)
{
	printk("entering %s\n",__FUNCTION__);

	platform_device_unregister(&Alarm_Beeper_device);
}


module_init(Alarm_Beeper_device_init);
module_exit(Alarm_Beeper_device_exit);

MODULE_AUTHOR("kinyanderson");
MODULE_DESCRIPTION("Alarm_Beeper_device,use for controlling the beeper");
MODULE_LICENSE("GPL");

Alarm_Beeper_driver.c

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值