Thread (6 messages) 6 messages, 3 authors, 2009-09-15

Re: MX5000 support in hid-logitech

From: Corentin Chary <corentin.chary@gmail.com>
Date: 2009-09-15 13:52:11

On Tuesday 15 September 2009 14:44:28 Corentin Chary wrote:
On Tuesday 15 September 2009 13:03:53 Bastien Nocera wrote:
quoted
On Tue, 2009-09-15 at 12:40 +0200, Corentin Chary wrote:
quoted
Hi,
I'm trying to add support for MX5000 keyboard in hid-lg.c, and it's the
first time I'm playing with hid drivers.

I added the keys in lg_wireless_mapping()

        case 0x01b8: lg_map_key_clear(KEY_VIDEO);               break;
        case 0x01b7: lg_map_key_clear(KEY_AUDIO);               break;
        case 0x01bc: lg_map_key_clear(KEY_MESSENGER);           break;
        case 0x0183: lg_map_key_clear(KEY_MEDIA);               break;
        case 0x0230: lg_map_key_clear(KEY_ZOOMRESET);           break;
        case 0x022e: lg_map_key_clear(KEY_ZOOMOUT);             break;
        case 0x022d: lg_map_key_clear(KEY_ZOOMIN);              break;
        case 0x0184: lg_map_key_clear(KEY_WORDPROCESSOR);       break;
        case 0x0186: lg_map_key_clear(KEY_SPREADSHEET);         break;
        case 0x0188: lg_map_key_clear(KEY_PRESENTATION);        break;

And that line in static const struct hid_device_id lg_devices[]

        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, 0xc70a),
                .driver_data = LG_RDESC | LG_WIRELESS },

I also added a printk lg_event() to find usage->hid and check
if the device was correctly probed.

I use xev to detect keystrocks.

But Adding the code in lg_wireless_mapping() didn't change anything,
keys are not reported in xev.

I added a printk between case 0x01b8: and lg_map_key_clear(KEY_VIDEO);
to check if the branch was taken, and it is.

Did I do something wrong ?
Any suggestion ?
This won't be enough, check the archives for more details (around 10th
February this year)

You'll need to poke at the receiver using the same kind of code that
mx5000lib does. Your best bet is probably to start with Jiri's
recommendations and get debugging info from the kernel before going any
further.
It seems to work without poking the receiver.
As I said, these keys can be seen in lg_event().

So, I tried that code in lg_event() (with the previous code in
lg_wireless_mapping()):

 unsigned int key = 0;
 struct input_dev *input = field->hidinput->input;

 switch (usage->hid & HID_USAGE) {
  case 0x01b8: key = KEY_VIDEO;           break;
  case 0x01b7: key = KEY_AUDIO;           break;
  case 0x01bc: key = KEY_MESSENGER;       break;
  case 0x0183: key = KEY_MEDIA;           break;
  case 0x0230: key = KEY_ZOOMRESET;       break;
  case 0x022e: key = KEY_ZOOMOUT;         break;
  case 0x022d: key = KEY_ZOOMIN;          break;
  case 0x0184: key = KEY_WORDPROCESSOR;   break;
  case 0x0186: key = KEY_SPREADSHEET;     break;
  case 0x0188: key = KEY_PRESENTATION;    break;
  default: return 0;
 }
 printk(KERN_WARNING "%x %x %x\n", usage->hid, usage->type, value);
 if (key) {
  input_event(input, usage->type, key, value);
  return 1;
 }

And it worked (with showkey in a terminal, not with xev, maybe I need to
restart X for that ?).

But adding that code in lg_event() doesn't look right :/
In fact .. my first patch works with showkey, not with xev ...
I'll try to figure out why.

-- 
Corentin Chary
http://xf.iksaif.net
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help