5

我正在尝试根据Essential Linux device Drivers book实现虚拟鼠标驱动程序。有一个用户空间应用程序,它生成坐标以及内核模块。

请参阅:虚拟鼠标驱动程序和用户空间应用程序代码以及如何使用此驱动程序的分步说明。

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: Name=""
P: Phys=
S: Sysfs=/devices/virtual/input/input32
U: Uniq=
H:处理程序=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

生成文件:

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)配置/udev:添加输入设备(/dev/input/event5)

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

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

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

4

2 回答 2

4

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

于 2013-05-16T18:05:02.697 回答
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 上对我有用

于 2013-06-25T13:29:17.290 回答