diff --git a/firesensor.c b/firesensor.c new file mode 100644 index 0000000000000000000000000000000000000000..3e22bdb0f1d3a2b7de399c7276f1a42e411d263e --- /dev/null +++ b/firesensor.c @@ -0,0 +1,109 @@ +#include <linux/init.h> +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/fs.h> +#include <linux/uaccess.h> +#include <linux/slab.h> +#include <linux/delay.h> +#include <linux/gpio.h> + +#include <asm/mach/map.h> +#include <asm/io.h> +#include <asm/uaccess.h> + +#define FIRE_GPIO 22 //GPIO 22 +#define FIRE_MAJOR_NUMBER 503 +#define FIRE_DEV_NAME "fire_ioctl" + +//GPIO 18 +#define GPIO_BASE_ADDR 0x3F200000 +#define GPFSEL2 0x08 +#define GPSET0 0x1C +#define GPCLR0 0x28 + +#define IOCTL_MAGIC_NUMBER 'f' +#define IOCTL_CMD_FIRE_ON _IO(IOCTL_MAGIC_NUMBER, 0) +#define IOCTL_CMD_FIRE_OFF _IO(IOCTL_MAGIC_NUMBER, 1) + +#define HIGH 1 +#define LOW 0 + +static void __iomem *gpio_base; +volatile unsigned int *gpsel2; +volatile unsigned int *gpset1; +volatile unsigned int *gpclr1; + +int fire_open(struct inode *inode, struct file *flip) { + + printk(KERN_ALERT "fire driver open!!\n"); + + gpio_base = ioremap(GPIO_BASE_ADDR, 0x60); + gpsel2 = (volatile unsigned int *)(gpio_base + GPFSEL2); + gpset1 = (volatile unsigned int *)(gpio_base + GPSET0); + gpclr1 = (volatile unsigned int *)(gpio_base + GPCLR0); + + gpio_request(FIRE_GPIO, "FIRE_GPIO"); + //set direction in + *gpsel2 |= (0 << 6); + + return 0; +} + +int fire_release(struct inode *inode, struct file *filp) { + printk(KERN_ALERT "fire driver closed!!\n"); + iounmap((void *)gpio_base); + return 0; +} + +long fire_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) +{ + + switch (cmd) { + case IOCTL_CMD_FIRE_ON: + printk(KERN_ALERT "fire detecting start!!\n"); + while (1) { + int i = gpio_get_value(FIRE_GPIO); + if (i == HIGH) { + return HIGH; + } + else + return LOW; + } + ssleep(3); + + case IOCTL_CMD_FIRE_OFF: + printk(KERN_ALERT "FIRE off!!\n"); + *gpsel2 |= (1 << 6); + break; + } + return 0; +} + +static struct file_operations fire_fops = { + .owner = THIS_MODULE, + .open = fire_open, + .release = fire_release, + .unlocked_ioctl = fire_ioctl +}; + +int __init fire_init(void) { + if (register_chrdev(FIRE_MAJOR_NUMBER, FIRE_DEV_NAME, &fire_fops) < 0) + printk(KERN_ALERT "fire driver initialization fail\n"); + else + printk(KERN_ALERT "fire driver initailization success\n"); + + return 0; +} + +void __exit fire_exit(void) { + unregister_chrdev(FIRE_MAJOR_NUMBER, FIRE_DEV_NAME); + printk(KERN_ALERT "FIRE driver exit done\n"); +} + +module_init(fire_init); +module_exit(fire_exit); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("sang"); +MODULE_DESCRIPTION("des"); +