使用Linux虚拟鼠标驱动程序

时间:2013-05-10 12:27:09

标签: linux linux-kernel mouse mouseevent linux-device-driver

我正在尝试根据基本Linux设备驱动程序一书实现虚拟鼠标驱动程序。有一个用户空间应用程序,它可以生成坐标和内核模块。

请参阅:Virtual mouse driver and userspace application code以及有关如何使用此驱动程序的step by step

1。)我编译用户空间应用程序和驱动程序的代码。

2。)接下来,我检查了dmesg输出并拥有,

  

输入:未指定的设备为/ class / input / input32
  虚拟鼠标驱动程序已初始化

3。) sysfs 节点在初始化期间正确创建(在/sys/devices/platform/vms/coordinates中找到)

4.)我知道虚拟鼠标驱动程序( input32 )通过检查以下内容链接到 event5

  

$ cat / proc / bus / input / devices
  I:Bus = 0000 Vendor = 0000 Product = 0000 Version = 0000
  N:姓名=""
  P:Phys =
  S:Sysfs = / devices / virtual / input / input32
  U:Uniq =
  H:处理程序=事件5
  B:EV = 5
  B:REL = 3

5.)接下来我将 GPM 服务器连接到事件界面:gpm -m /dev/input/event5 -t evdev

6。)运行用户空间应用程序,为虚拟鼠标生成随机坐标,并使用od -x /dev/input/event5观察生成的坐标。

没有任何反应。为什么? 另外here作者提到gdm应该停止,使用 /etc/init.d/gdm stop ,但我得到"没有这样的服务&# 34; 停止gdm

以下是构建和运行虚拟鼠标的完整脚本:

make -C /usr/src/kernel/2.6.35.6-45.fc14.i686/ SUBDIRS=$PWD modules
gcc -o app_userspace app_userspace.c
insmod app.ko
gpm -m /dev/input-event5 -t evdev
./app_userspace

生成文件:

obj-m+=app.o

内核版本: 2.6.35.6


正如我之前说过的,我可以通过od收到结果,但是我通过你的程序收到了它 echo 9 19> / SYS /设备/平台/ virmouse / vmevent

给出:

时间1368284298.207654类型2代码0值9

时间1368284298.207657类型2代码1值19

时间1368284298.207662类型0代码0值0

现在问题是:X11有什么问题?我想强调,我在两个不同的发行版Ubuntu 11.04和Fedora 14下尝试了这个代码。


也许这会有所帮助:在Xorg.0.log中,我看到以下内容:

[21.022](II)未指定输入驱动程序/标识符(忽略)

[272.987](II)config / udev:添加输入设备(/ dev / input / event5)

[272.987](II)未指定输入驱动程序/标识符(忽略)

[666.521](II)config / udev:添加输入设备(/ dev / input / event5)

[666.521](II)未指定输入驱动程序/标识符(忽略)

2 个答案:

答案 0 :(得分:4)

尝试替换输入设备驱动程序中的以下代码行

set_bit(EV_REL, vms_input_dev->evbit);
set_bit(REL_X, vms_input_dev->relbit);
set_bit(REL_Y, vms_input_dev->relbit);

vms_input_dev->name = "Virtual Mouse";
vms_input_dev->phys = "vmd/input0"; // "vmd" is the driver's name
vms_input_dev->id.bustype = BUS_VIRTUAL;
vms_input_dev->id.vendor  = 0x0000;
vms_input_dev->id.product = 0x0000;
vms_input_dev->id.version = 0x0000;

vms_input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL);
vms_input_dev->keybit[BIT_WORD(BTN_MOUSE)] = BIT_MASK(BTN_LEFT) | BIT_MASK(BTN_RIGHT) | BIT_MASK(BTN_MIDDLE);
vms_input_dev->relbit[0] = BIT_MASK(REL_X) | BIT_MASK(REL_Y);
vms_input_dev->keybit[BIT_WORD(BTN_MOUSE)] |= BIT_MASK(BTN_SIDE) | BIT_MASK(BTN_EXTRA);
vms_input_dev->relbit[0] |= BIT_MASK(REL_WHEEL);

在ubuntu 12.04上它对我有用

答案 1 :(得分:2)

我花了很多时间来解决这个问题,我想帮助那些遇到这个问题的人。我认为一些外部 X11 功能干扰了我的模块工作。在禁用GDM 之后,它现在可以正常运行(运行级别3)。你可以在这里找到工作代码http://fred-zone.blogspot.ru/2010/01/mouse-linux-kernel-driver.html工作发行版ubuntu 11.04(禁用gdm)