Subject: Newer multimedia keyboards and NetBSD
To: None <current-users@netbsd.org>
From: Martijn van Buul <pino@dohd.org>
List: current-users
Date: 02/03/2007 00:40:19
Hi
I posted something like this in netbsd-help@ a while ago, asking about
how to make NetBSD play nice with these keyboards, but didn't get any
response there, probably because my initial question ("How do I make these
work") can only be answered with "You can't, really".
So, I'm now trying to figure out what needs to be done to make these work.
In a nutshell, the problem is this:
Some newer keyboards no longer generate "normal" PS/2 scancodes for
multimedia (or extended) keys. Instead, these keys are mapped to a second
USB HID device. My own Microsoft Natural keyboard does this, and I'm told
that some Logitech ones behave the same. They're actually composite devices,
with one configuration binding to ukbd, and the rest to the generic
uhid driver:
uhidev0 at uhub3 port 3 configuration 1 interface 0
uhidev0: Microsoft NaturalM-BM-. Ergonomic Keyboard 4000, rev 2.00/1.73, addr 4, iclass 3/1
ukbd0 at uhidev0
wskbd1 at ukbd0 mux 1
wskbd1: connecting to wsdisplay0
uhidev1 at uhub3 port 3 configuration 1 interface 1
uhidev1: Microsoft NaturalM-BM-. Ergonomic Keyboard 4000, rev 2.00/1.73, addr 4, iclass 3/0
uhidev1: 1 report ids
uhid0 at uhidev1 reportid 1: input=7, output=0, feature=0
The net result is that, right now, these keyboards work as far as the
standard 104-key mapping is involved. However, *all* other keys have
now been moved to the generic uhid device, where they generate
events.
Microsoft thinks that they're DTRT, and even put out design guidelines
about this, if I'm to believe
http://www.microsoft.com/whdc/device/input/w2kbd.mspx#ESAAE
This makes me believe that this situation is probably not going to be
a one-off situation that will resolve itself, and that more of these
keyboards will be showing up in the near future.
As far as I know, the only way to deal with these events right now is
usbhidaction(1), which can execute programs when these events occur.
While this actually makes sense for some of these keys in some
situations (volume+/-, mute, although this is a matter of personal
preferences) it is not suitable for many others. Keys like "back", "
forward", "search", "web/home", "mail" and "calculator" come to mind:
desktop environments know how to handle these keys if only they would
get keyboard events for them, but right now they don't.
I want to stress that this is a regression from the previous situation,
where most of these keys would generate scancodes, even if these scancodes
were not particulary well-defined and often varied from manufacturer to
manufacturer. Nothing xmodmap couldn't fix, though.
I've been giving this some thought, and I can come up with four ways to
deal with this. I'll work these out below. This got a bit longer than I
planned it to be, I'm sorry if I'm rambling.
1. Implement a specific driver for these uhid devices
2. Make ukbd handle these additional uhid devices
3. Have usbhidaction deal with it by allowing it to generate wskbd events
4. The brilliant and blatantly obvious way
1) Implement a specific driver for these uhid devices, which could register
itself as a kind of wskbd device, attaching to the same mux as the
"QWERTY"-part of the keyboard.
Pro: - If it looks like a keyboard and it quacks like a keyboard...
- Linux does this. You'd assume they gave it some thought.
See
http://gentoo-wiki.com/HOWTO_Microsoft_Natural_Ergonomic_Keyboard_4000
http://ubuntuforums.org/showthread.php?t=229559
- Simple driver, in all probability
- It fits the design. Or at least, it doesn't stick out like
a sore thumb.
- Things would Just Work.
Con: - Some people may actually prefer using uhidaction for some
individual keys
- Done the Linux-way, which seems to be a little bit offhand,
this might result in dozens of drivers for individual
keyboards, which is hardly desirable.
- Preventing the above might be difficult, as device manufacturers
have a lot of freedom in their implementation. For example,
my keyboard has sane mappings in the "Consumer" table of the USB hid
usage table (See /usr/share/misc/usb_hid_usages, line 528 and
below), it also contains keys that are apperently Microsoft-
specific. These return as bits in a single uhid-register:
Consumer:Consumer_Control.Microsoft:0xff05
Either way, it would probably require a keymap of some sorts.
- Distinguishing between these multimedia-keyboard-uhid devices
and other generic uhid devices might be tricky; Microsoft Windows
obviously does it (It supported many of the extended keys without
installing any software; it only needed it for the Microsoft-
specific keys); I wouldn't be surprised if they merely recognise
it by the fact that it's a composite device with a regular
keyboard HID. I'm not sore it's going to be easy to teach
autoconf about this. Of course, there's always to option of
specifying specific product/vendor combo's, but I was hoping for
a generic approach.
2. Make ukbd handle these additional uhid devices. A bad idea, IMHO,
but I might be wrong.
Pro: - All of the above.
- It would resemble the PS/2 multimedia keyboard situation
- A single device, no confusing mux entries
Con: - All of the above, and then some
- It violates the device tree. Since to my best knowledge
NetBSD doesn't have a "possibly composite USB device"
abstraction layer, it would mean combining leaf nodes that
have grown apart considerably already. It just doesn't feel
right.
- Why change ukbd, when it's not broken?
3. Have usbhidaction deal with it by allowing it to generate wskbd events
Pro: - Existing functionality of usbhidaction can be reused, including
dealing with unknown USB HID usage table entries
- Considering that these keys are usually not pressed very often,
performance isn't that much of an issue
- It would allow individual keys to be treated the way they are
treated now
- Works for *all* uhid devices, not just these newfangled
keyboards
- Very flexible; easy to adapt to new devices
Con: - AFAIK, there is currently no way to introduce wskbd events
from userland at all, and such an interface would probably have
a very negative impact on security. It is opening the door to
dozens of new angles of attack.
4. The brilliant and blatantly obvious way that I'm just too blind too see
Pro: - It's brilliant and blatantly obvious.
Con: - It's been eluding me.
Any thoughts? Once again, I'm sorry for rambling.
Martijn
--
Martijn van Buul - pino@dohd.org