我正在尝试根据Essential Linux设备驱动程序手册实现虚拟鼠标驱动程序.有一个用户空间应用程序,它生成坐标和内核模块.
请参阅:Virtual mouse driver and userspace application code以及有关如何使用此驱动程序的step by step.
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观察生成的坐标.
没有任何反应.为什么?
另外here作者提到应该停止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 /设备/平台/ 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)未指定输入驱动程序/标识符(忽略)
解决方法:
尝试替换输入设备驱动程序中的以下代码行
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上对我有用