我正在尝试根据基本Linux设备驱动程序一书实现虚拟鼠标驱动程序。有一个用户空间应用程序,它可以生成坐标和内核模块。
请参阅:Virtual mouse driver and userspace application code以及有关如何使用此驱动程序的step by step。
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:姓名=""
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
观察生成的坐标。
没有任何反应。为什么?
另外here作者提到gdm
应该停止,使用 /etc/init.d/gdm stop ,但我得到"没有这样的服务&# 34; 停止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 /设备/平台/ virmouse / vmevent
给出:
时间1368284298.207654类型2代码0值9
时间1368284298.207657类型2代码1值19
时间1368284298.207662类型0代码0值0
也许这会有所帮助:在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)未指定输入驱动程序/标识符(忽略)
答案 0 :(得分: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上它对我有用
答案 1 :(得分:2)
我花了很多时间来解决这个问题,我想帮助那些遇到这个问题的人。我认为一些外部 X11 功能干扰了我的模块工作。在禁用GDM 之后,它现在可以正常运行(运行级别3)。你可以在这里找到工作代码http://fred-zone.blogspot.ru/2010/01/mouse-linux-kernel-driver.html工作发行版ubuntu 11.04(禁用gdm)