当前位置:  技术问答>linux和unix

关于input子系统的问题

    来源: 互联网  发布时间:2017-01-19

    本文导语:  我写了一个字符驱动,在字符驱动中注册了一个input_dev,在write函数中向input子系统提交鼠标坐标,加载好驱动后,我在外部调用驱动的write函数,鼠标没移动,这是为什么? 我的linux版本是ubuntu 3.0.0-13-generic 下面的...

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

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include

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"Readn");
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"Writen");
//up(&virtual_input_devp->io_lock);
return size;
}
static int virtual_input_dev_open(struct inode *inodno,struct file *filno)
{
printk(KERN_ALERT"OPEN DEVICEn");
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(resultname="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 devicen");
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 loadn");
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设备上报数据。跟鼠标没有关系吧。
网上有键盘控制鼠标的驱动程序,你可以看一下吧。

|
再说,鼠标本来就是个只读设备,怎么会让你来控制呢?

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间javax.imageio类imagereader的类成员方法: input定义及介绍
  • jquery中$(#form :input)与$(#form input)的区别
  • java命名空间javax.swing.text.html类html.tag的类成员方法: input定义及介绍
  • When use read user's input from standard input device ,i want show it as '*' .How can i do ?
  • java命名空间java.awt.event类keyevent的类成员方法: vk_code_input定义及介绍
  • 我的目的是,能实现点增加按钮,使得逐行(以行为单位)动态的增加窗体<input type=text ><input type=radio><input type=checkbox>三个
  • java命名空间javax.swing类joptionpane的类成员方法: wants_input_property定义及介绍
  • 启用iptables防火墙,要求INPUT方向允许任意主机访问ICMP、TCP的21、22、80、139、445端口,INPUT其他默认禁止访问。
  • java命名空间javax.swing类joptionpane的类成员方法: input_value_property定义及介绍
  • Linux input 驱动
  • java命名空间java.awt类font的类成员方法: dialog_input定义及介绍
  • jQuery设置input type值示例
  • java命名空间javax.print.attribute.standard类printerstatereason的类成员方法: input_tray_missing定义及介绍
  • how to input chinese?
  • java命名空间java.awt类awtevent的类成员方法: input_method_event_mask定义及介绍
  • jquery form 隐藏的input 选择
  • java命名空间javax.imageio.spi类imagereaderspi的类成员方法: standard_input_type定义及介绍
  • 【帮忙啊!!!】iptables output input
  • java命名空间java.awt.event类inputmethodevent的类成员方法: input_method_first定义及介绍
  • jquery检测input checked 控件是否被选中的方法
  • java命名空间java.awt.color类icc_profile的类成员方法: class_input定义及介绍
  • php获取表单中多个同名input元素的值


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3