智能家居报警器控制驱动程序:
1. 本驱动使用platform模型进行设计,分为Alarm_Beeper_device和Alarm_Beeper_driver两个文件
2. 注册杂项设备(misc),主设备号固定是10(misc),从设备号由系统自动分配,加载成功后使用lsmod可以看到:
2. 注册杂项设备(misc),主设备号固定是10(misc),从设备号由系统自动分配,加载成功后使用lsmod可以看到:
Alarm_Beeper_device
Alarm_Beeper_driver
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!!! //定时器初始化成功
[ 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的办法对命令进行加密
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) //恢复蜂鸣器默认频率
注意:这里仅仅是对蜂鸣器的频率进行操作,对蜂鸣器鸣响的持续时间控制在用户程序完成。
#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