关于input子系统的问题
我写了一个字符驱动,在字符驱动中注册了一个input_dev,在write函数中向input子系统提交鼠标坐标,加载好驱动后,我在外部调用驱动的write函数,鼠标没移动,这是为什么?
我的linux版本是ubuntu 3.0.0-13-generic
下面的是我的驱动代码,高手帮我看看!
#include <linux/init.h>#include <linux/module.h>#include <linux/cdev.h>#include <linux/fs.h>#include <linux/device.h>#include <linux/spinlock.h>#include <linux/semaphore.h>#include <linux/input.h>#include<linux/slab.h>struct VirtualInputDevice{ struct cdev dev; dev_t devno; int count; spinlock_t count_lock; struct semaphore io_lock;};static struct VirtualInputDevice *virtual_input_devp;static struct class *dev_class;static struct input_dev *input_dev;static ssize_t virtual_input_dev_read(struct file *filp,char __user *user_buffer,size_t size,loff_t *ppos){ printk(KERN_ALERT"Read\n"); down_interruptible(&virtual_input_devp->io_lock); up(&virtual_input_devp->io_lock); return size;}static ssize_t virtual_input_dev_write(struct file *filp,const char __user *user_buffer,size_t size,loff_t *ppos){ //down_interruptible(&virtual_input_devp->io_lock); //input_report_key(input_dev,BTN_TOUCH,1); input_report_abs(input_dev,ABS_X,100); //input_report_abs(input_dev,ABS_Y,100); //input_report_abs(input_dev,REL_X,100); //input_report_abs(input_dev,REL_Y,100); //input_report_abs(input_dev,ABS_PRESSURE,0xff); input_sync(input_dev); printk(KERN_ALERT"Write\n"); //up(&virtual_input_devp->io_lock); return size;}static int virtual_input_dev_open(struct inode *inodno,struct file *filno){ printk(KERN_ALERT"OPEN DEVICE\n"); spin_lock(&virtual_input_devp->count_lock); virtual_input_devp->count++; spin_unlock(&virtual_input_devp->count_lock); return 0;}static int virtual_input_dev_release(struct inode *inodno,struct file *filno){ spin_lock(&virtual_input_devp->count_lock); virtual_input_devp->count--; spin_unlock(&virtual_input_devp->count_lock); return 0;}static const struct file_operations virtual_input_dev_fops={ .owner=THIS_MODULE, .read=virtual_input_dev_read, .write=virtual_input_dev_write, .open=virtual_input_dev_open, .release=virtual_input_dev_release,};static int __init virtual_input_dev_init(void){ int result; virtual_input_devp=kmalloc(sizeof(struct VirtualInputDevice),GFP_KERNEL); if(!virtual_input_devp) { result= -ENOMEM; return result; } result=alloc_chrdev_region(&virtual_input_devp->devno,0,1,"VirtualInputDevice"); if(result<0) { kfree(virtual_input_devp); return result; } input_dev=input_allocate_device(); if(!input_dev) { kfree(virtual_input_devp); result= -ENOMEM; return result; } input_dev->name="VirtualInputDevice"; input_dev->phys="xxmous/input1"; input_dev->id.bustype=BUS_HOST; set_bit(EV_ABS,input_dev->evbit); //set_bit(EV_REL,input_dev->evbit); //set_bit(EV_KEY,input_dev->evbit); //set_bit(REL_X,input_dev->relbit); set_bit(ABS_X,input_dev->absbit); //set_bit(ABS_Y,input_dev->absbit); //set_bit(ABS_PRESSURE,input_dev->absbit); //set_bit(BTN_TOUCH,input_dev>keybit); bitmap_fill(input_dev->relbit,ABS_MAX); result=input_register_device(input_dev); if(result) { printk(KERN_ALERT"error in register input device\n"); input_free_device(input_dev); kfree(virtual_input_devp); result= -ENOMEM; return result; } cdev_init(&virtual_input_devp->dev,&virtual_input_dev_fops); virtual_input_devp->dev.owner=THIS_MODULE; virtual_input_devp->dev.ops=&virtual_input_dev_fops; virtual_input_devp->count=0; spin_lock_init(&virtual_input_devp->count_lock); sema_init(&virtual_input_devp->io_lock,1); cdev_add(&virtual_input_devp->dev,virtual_input_devp->devno,1); dev_class=class_create(THIS_MODULE,"VirtualInputDeviceClass"); device_create(dev_class,NULL,virtual_input_devp->devno,NULL,"VirtualInputDevice%d",0); printk(KERN_ALERT"input device load\n"); return 0;}static void __exit virtual_input_dev_exit(void){ device_destroy(dev_class,virtual_input_devp->devno); class_destroy(dev_class); input_unregister_device(input_dev); input_free_device(input_dev); cdev_del(&virtual_input_devp->dev); unregister_chrdev_region(virtual_input_devp->devno,1); kfree(virtual_input_devp);}MODULE_LICENSE("GPL"); module_init(virtual_input_dev_init);module_exit(virtual_input_dev_exit);