/* * smoke.c - driver for Gpio Test * 8bits out, 4bits in * * Copyright (C) 2012 Loongson Corporation * * 2013-03-15 */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define GPIOECHO 4 static int smoke_open(struct inode *inode, struct file *file) { //printk(KERN_ALERT"#####################sensor open ok!!!\n"); gpio_request(GPIOECHO, "ECHO"); gpio_direction_input(GPIOECHO); return 0; } static int smoke_close(struct inode *inode, struct file *file) { gpio_free(GPIOECHO); //printk(KERN_ALERT"sensor close ok!!!\n"); return 0; } static ssize_t smoke_read(struct file *file, char __user *buf, size_t count, loff_t *ptr) { return 0; } static ssize_t smoke_write(struct file *file, const char __user *buf, size_t count, loff_t *ptr) { return 0; } static int get_data(void) { return gpio_get_value(GPIOECHO); } static long smoke_ioctl( struct file *file, unsigned int cmd, unsigned long arg) { int ret; // printk(KERN_ALERT"in ioctl func!"); switch(cmd){ case 0: { void __user *p = (void __user *)arg; ret = get_data(); copy_to_user(p, &ret, sizeof(ret)); } break; default: printk(KERN_ALERT"in ioctl default!\n"); } return 0; } static const struct file_operations smoke_ops = { .owner = THIS_MODULE, .open = smoke_open, .release = smoke_close, .read = smoke_read, .write = smoke_write, .unlocked_ioctl = smoke_ioctl }; static struct miscdevice smoke_miscdev = { MISC_DYNAMIC_MINOR, "smoke", &smoke_ops, }; static int __init smoke_init(void) { if (misc_register(&smoke_miscdev)) { printk(KERN_ALERT"###############: Couldn't register device 0, %d.\n", 255); return -EBUSY; } return 0; } static void __exit smoke_exit(void) { misc_deregister(&smoke_miscdev); } module_init(smoke_init); module_exit(smoke_exit); MODULE_LICENSE("GPL");