首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

关于input子系统的有关问题

2012-09-23 
关于input子系统的问题我写了一个字符驱动,在字符驱动中注册了一个input_dev,在write函数中向input子系统

关于input子系统的问题
我写了一个字符驱动,在字符驱动中注册了一个input_dev,在write函数中向input子系统提交鼠标坐标,加载好驱动后,我在外部调用驱动的write函数,鼠标没移动,这是为什么?
我的linux版本是ubuntu 3.0.0-13-generic
下面的是我的驱动代码,高手帮我看看!

C/C++ code
#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); 



[解决办法]
cat 一下/dev/eventX,看看是否有数据
[解决办法]
有数据就正常了,input上报给上层的数据是结构体。你读取/dev/input/event3,应该就是write函数上报的值。
[解决办法]
你的程序只实现了这样的功能:一个字符设备,一个input设备,当向字符设备写数据时,会向input设备上报数据。跟鼠标没有关系吧。
网上有键盘控制鼠标的驱动程序,你可以看一下吧。
[解决办法]
再说,鼠标本来就是个只读设备,怎么会让你来控制呢?

热点排行