使用Linux虚拟鼠标驱动程序

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

请参阅: 虚拟鼠标驱动程序和用户空间应用程序代码,并逐步了解如何使用此驱动程序。

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

2.)接下来我检查了dmesg输出结果,

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

3.) sysfs节点是在初始化期间正确创build的(在/sys/devices/platform/vms/coordinates

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

$ cat / proc / bus / input / devices
I:总线= 0000供应商= 0000产品= 0000版本= 0000
N:Name =“”
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观察生成的坐标。

没有任何反应。 为什么? 另外在这里作者提到应该停止gdm ,使用/etc/init.d/gdm stop ,但是当停止gdm时,我得到“没有这样的服务”

这里是我build立和运行虚拟鼠标的完整脚本:

 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收到的结果,但我通过你的程序收到它回声9> / sys / devices / platform / virmouse / vmevent

得到:

时间1368284298.207654types2代码0值9

时间1368284298.207657types2代码1值19

时间1368284298.207662types0代码0值0

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


也许这将有助于:在Xorg.0.log我看到以下内容:

(21.022)(II)未指定input驱动程序/标识符(忽略)

(II)config / udev:添加input设备(/ dev / input / event5)

(II)没有指定input驱动器/标识符(忽略)

(II)config / udev:添加input设备(/ dev / input / event5)

(II)没有指定input驱动程序/标识符(忽略)

Solutions Collecting From Web of "使用Linux虚拟鼠标驱动程序"

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

 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上为我工作

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