使用Linux虚拟鼠标驱动程序

5
我正在尝试根据《Essential Linux device Drivers》书籍实现一个虚拟鼠标驱动程序。它包含一个用户空间应用程序,负责生成坐标以及一个内核模块。
请参阅:虚拟鼠标驱动程序和用户空间应用程序代码一步一步 使用此驱动程序。
1.)我编译了用户空间应用程序和驱动程序的代码。
2.) 接下来,我通过检查 dmesg 输出来确认,并得到以下信息,

input: Unspecified device as /class/input/input32
Virtual Mouse Driver Initialized

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: Name=""
P: Phys=
S: Sysfs=/devices/virtual/input/input32
U: Uniq=
H: Handlers=event5
B: EV=5
B: REL=3

5.) 接下来,我将GPM服务器附加到事件接口:gpm -m /dev/input/event5 -t evdev
6.) 运行用户空间应用程序以为虚拟鼠标生成随机坐标,并使用 od -x /dev/input/event5 观察生成的坐标。
但什么也没有发生。为什么呢? 此外,这里的作者提到应停止gdm,并使用/etc/init.d/gdm stop,但是当我尝试停止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

Makefile:

obj-m+=app.o

内核版本:2.6.35.6


如我之前所说,我可以通过od接收结果,但是我通过你的程序接收到了它echo 9 19 > /sys/devices/platform/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) 没有指定输入驱动程序/标识符(忽略)


我使用Ubuntu发行版而不是自定义内核,这个例子可以吗? - Alex Hoppus
现在的问题是:X11有什么问题吗?这个问题不适合在Stackoverflow上发问。 - artless noise
可能的原因在于虚拟机?(我使用VirtualBox) - Alex Hoppus
2个回答

4
我花费了大量时间解决这个问题,我希望能够帮助遇到同样问题的人。我认为一些外部 X11 特性干扰了我的模块工作。在禁用 GDM 后,它现在可以正常工作(运行级别 3)。您可以在这里找到工作代码 http://fred-zone.blogspot.ru/2010/01/mouse-linux-kernel-driver.html 工作发行版 Ubuntu 11.04 (GDM已禁用)。

我在Xubuntu 12.04中禁用了lightdm(它替换了gdm),但仍然遇到同样的问题。真的不知道该怎么办。 - lildigiman

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上运行良好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接