当前位置: 技术问答>linux和unix
linux用驱动模拟一次鼠标的操作
来源: 互联网 发布时间:2017-03-01
本文导语: linux 2.6.11的内核版本,我现在随便连了一个设备,然用修改了usb-skeleton.c文件,生成了usb-skeleton.ko成功insmod,终端上可以看到设备的驱动安装成功显示我修改的驱动名,现在我想在skel_read_bulk_callback的函数内做一次对鼠标的...
linux 2.6.11的内核版本,我现在随便连了一个设备,然用修改了usb-skeleton.c文件,生成了usb-skeleton.ko成功insmod,终端上可以看到设备的驱动安装成功显示我修改的驱动名,现在我想在skel_read_bulk_callback的函数内做一次对鼠标的操作(比如点击右键),我是用usb_fill_bulk_urb批传输函数的,我在init里对一个input_dev作了初始化
amimouse_dev.evbit[0] = BIT(EV_KEY) | BIT(EV_REL);
amimouse_dev.keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE);
amimouse_dev.relbit[0] = BIT(REL_X) | BIT(REL_Y);
amimouse_dev.keybit[LONG(BTN_MOUSE)] |= BIT(BTN_SIDE) | BIT(BTN_EXTRA);
amimouse_dev.relbit[0] |= BIT(REL_WHEEL);
amimouse_dev.open = amimouse_open;
amimouse_dev.close = amimouse_close;
amimouse_dev.name = amimouse_name;
amimouse_dev.phys = amimouse_phys;
amimouse_dev.id.bustype = BUS_I8042;//BUS_ISA;/*BUS_AMIGA*/
amimouse_dev.id.vendor = 0x0002;
amimouse_dev.id.product = 0x0005;
amimouse_dev.id.version = 0x0000;
input_register_device(&amimouse_dev);
按我的理解input_register_device会注册一个input_dev到系统的list,然后应该会去匹配一个现有的input handler(一个鼠标设备的统一上层接口),我用cat /proc/bus/input/devices看到鼠标信息
I: Bus=0011 Vendor=0002 Product=0005 Version=0000
N: Name="ImPS/2 Generic Wheel Mouse"
P: Phys=isa0060/serio1/input0
H: Handlers=mouse1 event1
B: EV=7
B: KEY=70000 0 0 0 0 0 0 0 0
B: REL=103
在skel_read_bulk_callback函数里,当卸载驱动时候也运行到这里了
input_regs(&amimouse_dev, regs);
printk(KERN_ALERT "chenggong qiann");
//signed char data[0] = {0x02};
input_report_key(&amimouse_dev, BTN_LEFT, 0x00);
input_report_key(&amimouse_dev, BTN_RIGHT, 0x02);
input_report_key(&amimouse_dev, BTN_MIDDLE, 0x00);
input_report_key(&amimouse_dev, BTN_SIDE, 0x00);
input_report_key(&amimouse_dev, BTN_EXTRA, 0x00);
input_report_rel(&amimouse_dev, REL_X, 0xff);
input_report_rel(&amimouse_dev, REL_Y, 0x88);
input_report_rel(&amimouse_dev, REL_WHEEL, 0);
input_sync(&amimouse_dev);
上面的代码应该会触发一个鼠标右键点击和移动的操作,input core内匹配的过程应该是自动完成,可是怎么试鼠标都没反应,我估计是input_dev和handler没有匹配上,要怎么匹配呢,我用的是vmware虚拟机,初学linux,望高手指点
amimouse_dev.evbit[0] = BIT(EV_KEY) | BIT(EV_REL);
amimouse_dev.keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE);
amimouse_dev.relbit[0] = BIT(REL_X) | BIT(REL_Y);
amimouse_dev.keybit[LONG(BTN_MOUSE)] |= BIT(BTN_SIDE) | BIT(BTN_EXTRA);
amimouse_dev.relbit[0] |= BIT(REL_WHEEL);
amimouse_dev.open = amimouse_open;
amimouse_dev.close = amimouse_close;
amimouse_dev.name = amimouse_name;
amimouse_dev.phys = amimouse_phys;
amimouse_dev.id.bustype = BUS_I8042;//BUS_ISA;/*BUS_AMIGA*/
amimouse_dev.id.vendor = 0x0002;
amimouse_dev.id.product = 0x0005;
amimouse_dev.id.version = 0x0000;
input_register_device(&amimouse_dev);
按我的理解input_register_device会注册一个input_dev到系统的list,然后应该会去匹配一个现有的input handler(一个鼠标设备的统一上层接口),我用cat /proc/bus/input/devices看到鼠标信息
I: Bus=0011 Vendor=0002 Product=0005 Version=0000
N: Name="ImPS/2 Generic Wheel Mouse"
P: Phys=isa0060/serio1/input0
H: Handlers=mouse1 event1
B: EV=7
B: KEY=70000 0 0 0 0 0 0 0 0
B: REL=103
在skel_read_bulk_callback函数里,当卸载驱动时候也运行到这里了
input_regs(&amimouse_dev, regs);
printk(KERN_ALERT "chenggong qiann");
//signed char data[0] = {0x02};
input_report_key(&amimouse_dev, BTN_LEFT, 0x00);
input_report_key(&amimouse_dev, BTN_RIGHT, 0x02);
input_report_key(&amimouse_dev, BTN_MIDDLE, 0x00);
input_report_key(&amimouse_dev, BTN_SIDE, 0x00);
input_report_key(&amimouse_dev, BTN_EXTRA, 0x00);
input_report_rel(&amimouse_dev, REL_X, 0xff);
input_report_rel(&amimouse_dev, REL_Y, 0x88);
input_report_rel(&amimouse_dev, REL_WHEEL, 0);
input_sync(&amimouse_dev);
上面的代码应该会触发一个鼠标右键点击和移动的操作,input core内匹配的过程应该是自动完成,可是怎么试鼠标都没反应,我估计是input_dev和handler没有匹配上,要怎么匹配呢,我用的是vmware虚拟机,初学linux,望高手指点
|
没玩过鼠标 input 设备驱动,帮顶...
|
mouse0 mouse1 mouse2 mouse3
|
呖...我也不会