【问题标题】:Using Linux virtual mouse driver使用 Linux 虚拟鼠标驱动
【发布时间】:2013-05-05 03:18:54
【问题描述】:

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

请参阅:Virtual mouse driver and userspace application codestep by step,了解如何使用此驱动程序。

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

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

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

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

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

$ cat /proc/bus/input/devices
我:总线=0000 供应商=0000 产品=0000 版本=0000
N:名称=""
P:物理=
S: Sysfs=/devices/virtual/input/input32
U: 唯一=
H:处理程序=event5
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,但是在停止 @ 时我得到 "no such service" 987654330@.

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

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

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

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

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

【问题讨论】:

  • 我使用的是 ubuntu 发行版而不是自定义内核,这个例子可以吗?
  • 那么现在的问题是:X11 出了什么问题? 那么这个问题不适用于Stackoverflow
  • 可能是虚拟机的原因? (我使用 virtualbox)

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


【解决方案1】:

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

【讨论】:

  • 我在 Xubuntu 12.04 中禁用了 lightdm(它取代了 gdm),但仍然遇到同样的问题。真的不知道该怎么做。
【解决方案2】:

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

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 上对我有用

【讨论】:

    猜你喜欢
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多