How to remap or ignore certain mouse buttons? (was: Fun with
Logitech keyboard/mouse kombo (diNovo Edge)...)
Alexander Leidinger
Alexander at Leidinger.net
Thu May 8 08:56:32 UTC 2008
Quoting Alexander Leidinger <Alexander at Leidinger.net> (Wed, 7 May 2008 19:24:20 +0200):
> Hi,
>
> I bought a keyboard with an integrated touchpad from logitech. Just
> plugging in the BT-dongle gives an usb hub with ums and ukbd.
> Unfortunately the ums doesn't work. When I start moused with
> "-p /dev/ums0 -3 -f -d" I get no output when I press the buttons or
> touch the touchpad. Any hints how to debug this problem? usbhidctl
> doesn't print anything useful (but I don't know if it is ok to use it
> with /dev/ums0).
After a little bit of googling I found a description of the problem
with the diNovo Edge. Quoting from
http://www.mail-archive.com/linux-usb-users@lists.sourceforge.net/msg17777.html
---snip---
Mouse device shows multiple reports with the same usage, which makes
hid-input.c remap those instances of this usage to different events. As a
result, the actual GenericDesktop.X and .Y usages end up mapped to .Z and .RX
events, which prevents the mouse from working.
--- a/drivers/usb/input/hid-input.c 2006-12-11 11:32:53.000000000 -0800
+++ b/drivers/usb/input/hid-input.c 2006-12-26 17:18:46.000000000 -0800
@@ -583,8 +583,11 @@ static void hidinput_configure_usage(str
set_bit(usage->type, input->evbit);
- while (usage->code <= max && test_and_set_bit(usage->code, bit))
- usage->code = find_next_zero_bit(bit, max + 1, usage->code);
+ if(device->quirks & HID_QUIRK_NO_USAGE_UNIQUIFY)
+ set_bit(usage->code, bit);
+ else
+ while (usage->code <= max && test_and_set_bit(usage->code, bit))
+ usage->code = find_next_zero_bit(bit, max + 1,
---snip---
The git repository (as indexed by fxr.watson.org) shows a different
fix. In the linux hid-input.c they have this:
---snip---
409 case HID_UP_BUTTON:
410
411 code = ((usage->hid - 1) & 0xf);
412
413 switch (field->application) {
414 case HID_GD_MOUSE:
415 case HID_GD_POINTER: code += 0x110; break;
416 case HID_GD_JOYSTICK: code += 0x120; break;
417 case HID_GD_GAMEPAD: code += 0x130; break;
418 default:
419 switch (field->physical) {
420 case HID_GD_MOUSE:
421 case HID_GD_POINTER: code += 0x110; break;
422 case HID_GD_JOYSTICK: code += 0x120; break;
423 case HID_GD_GAMEPAD: code += 0x130; break;
424 default: code += 0x100;
425 }
426 }
427
428 /* Special handling for Logitech Cordless Desktop */
429 if (field->application != HID_GD_MOUSE) {
430 if (device->quirks & HID_QUIRK_LOGITECH_EXPANDED_KEYMAP) {
431 int hid = usage->hid & HID_USAGE;
432 if (hid < LOGITECH_EXPANDED_KEYMAP_SIZE && logitech_expanded_keymap[hid] != 0)
433 code = logitech_expanded_keymap[hid];
434 }
435 } else {
436 if (device->quirks & HID_QUIRK_LOGITECH_IGNORE_DOUBLED_WHEEL) {
437 int hid = usage->hid & HID_USAGE; 438 if (hid == 7 || hid == 8) 439 goto ignore; 440 }
441 }
442
443 map_key(code);
444 break;
---snip---
As we see there, they think the wheel is incorrectly doubled
(HID_QUIRK_LOGITECH_IGNORE_DOUBLED_WHEEL). I'm not really sure if the
wheel is realy doubled. The touchwheel on the keyboard is supposed to
have a mouse area in the inside, and on the upper and right edge, there
are areas which are supposed to be able to move the scrollbars in
windows (left<->right + up<->down). So I think there are maybe 2
wheels (in one physical one). I tried to use both parts of the
touchwheel, but nothing works, so for the moment I search for a way to
do the same what linux does. How can I do the same thing in FreeBSD
what Linux does? Later I would be interested to get the additional
parts working. Any hints how to do this are welcome.
Bye,
Alexander.
--
Leela: Hey, you know what might be a hoot?
Professor: No. Why would I know that?
http://www.Leidinger.net Alexander @ Leidinger.net: PGP ID = B0063FE7
http://www.FreeBSD.org netchild @ FreeBSD.org : PGP ID = 72077137
More information about the freebsd-usb
mailing list