Subject: Re: Newer multimedia keyboards and NetBSD
To: None <current-users@netbsd.org>
From: Martijn van Buul <pino@dohd.org>
List: current-users
Date: 02/04/2007 12:26:32
* Iain Hibbert:
> On Sat, 3 Feb 2007, Martijn van Buul wrote:
>
>> 	 - 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.
>
> No, this results in drivers for usage pages which is exactly what you
> want. its how the HID system is set up (Bluetooth HID is the same[*])

Well, I would still prefer some way of telling the driver what usage table
to use in some way from userland, instead of having individual drivers for
Microsoft keyboards, Logitech keyboards and a plethora of different keyboards
from Taiwanese manufacturers, when they really only differ in their usage
tables

>> 	 - 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.
>
> not sure if you've examined uhidev(4) yet?

Yes, I have, but maybe not good enough :) If I can somehow convince uhidev
to take *both* of the configurations, that'd be a start. Right now, I get
two uhidev busses for a single physical device. 

>> 2. Make ukbd handle these additional uhid devices. A bad idea, IMHO,
>>    but I might be wrong.

>>         - 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.
>
> NetBSD _does_ have this possibly composite USB device abstraction layer so
> far as I know..

Hm, I'll look further into this then, because I think it's needed for a
clean solution.

> each USB device provides a descriptor and handlers are assigned for each
> portion. USB-HID takes this a step further and provides another descriptor,
> then handlers are provided for each report.
>
> uhid(4) is used when there is no specific handler for a report..

I know. The problem is twofold:

1) These additional HIDs probably can't be caught by a class driver, without
   changing the behaviour of other generic HIDs. In other words, I don't 
   think it's possible to write a reliable _match() for it. The fact that
   uhidev* devices don't have a product/vendor-id locator means that you
   can't even do a lookup based on that at this point. You can do it
   in a kernel config file, but only by configuring a device to a specific
   uhidev device (which *can* be tied to an individual product/vendor). 
2) uhidev outputs two 'uhidev-busses', each containing a single report-id 
   right now. Iff I could convince uhidev to cheat and bind to *both* 
   usb configurations and output both reportid's on a single uhidev-bus,
   then I'd be set, because then the presence of a ukbd on the uhidev
   bus can be used. In fact, in that case it would also be possible to
   have ukbd respond to several report-ids instead of just one.

Thanks for your input; it's given me something to ponder about on a grey
sundayafternoon :)

-- 
Martijn van Buul - pino@dohd.org