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");
+