aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJiri Kosina <jkosina@suse.cz>2007-06-18 07:30:11 -0400
committerJiri Kosina <jkosina@suse.cz>2007-07-09 08:13:33 -0400
commit92d9e6e607eb7f8f1d2a43935f45cf300cf6fdf8 (patch)
tree52a583569ad4262ea354941e604f464770ee7756
parent5fce620c0c7caa9e8d9588e8dcc66c52c456851a (diff)
HID: support for Petalynx Maxter remote control
Petalynx Maxter remote control [1] 0x18b1/0x0037 emits 0xfa and 0xfc from consumer page (reserved in HUT 1.12) for back and more keys. It also emits a few usages from LOGIVENDOR page, which need adding. Also, this device has broken report descriptor - the reported maximum is too low - it doesn't contain the range for 'back' and 'more' keys, so we need to bump it up before the report descriptor is being parsed. Besides all this, it also requires NOGET quirk. This patch does so. [1] http://www.elmak.pl/index.php?option=com_phpshop&page=shop.browse&category_id=14&ext=opis&lang=en Signed-off-by: Jiri Kosina <jkosina@suse.cz>
-rw-r--r--drivers/hid/hid-input.c17
-rw-r--r--drivers/hid/usbhid/hid-core.c18
-rw-r--r--drivers/hid/usbhid/hid-quirks.c5
-rw-r--r--include/linux/hid.h1
4 files changed, 39 insertions, 2 deletions
diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c
index 6cb884638fda..1b8b33341408 100644
--- a/drivers/hid/hid-input.c
+++ b/drivers/hid/hid-input.c
@@ -566,6 +566,11 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
566 case 0x0e5: map_key_clear(KEY_BASSBOOST); break; 566 case 0x0e5: map_key_clear(KEY_BASSBOOST); break;
567 case 0x0e9: map_key_clear(KEY_VOLUMEUP); break; 567 case 0x0e9: map_key_clear(KEY_VOLUMEUP); break;
568 case 0x0ea: map_key_clear(KEY_VOLUMEDOWN); break; 568 case 0x0ea: map_key_clear(KEY_VOLUMEDOWN); break;
569
570 /* reserved in HUT 1.12. Reported on Petalynx remote */
571 case 0x0f6: map_key_clear(KEY_NEXT); break;
572 case 0x0fa: map_key_clear(KEY_BACK); break;
573
569 case 0x183: map_key_clear(KEY_CONFIG); break; 574 case 0x183: map_key_clear(KEY_CONFIG); break;
570 case 0x184: map_key_clear(KEY_WORDPROCESSOR); break; 575 case 0x184: map_key_clear(KEY_WORDPROCESSOR); break;
571 case 0x185: map_key_clear(KEY_EDITOR); break; 576 case 0x185: map_key_clear(KEY_EDITOR); break;
@@ -727,10 +732,10 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
727 } 732 }
728 break; 733 break;
729 734
730 case HID_UP_LOGIVENDOR: /* Reported on Logitech Ultra X Media Remote */ 735 case HID_UP_LOGIVENDOR:
731
732 set_bit(EV_REP, input->evbit); 736 set_bit(EV_REP, input->evbit);
733 switch(usage->hid & HID_USAGE) { 737 switch(usage->hid & HID_USAGE) {
738 /* Reported on Logitech Ultra X Media Remote */
734 case 0x004: map_key_clear(KEY_AGAIN); break; 739 case 0x004: map_key_clear(KEY_AGAIN); break;
735 case 0x00d: map_key_clear(KEY_HOME); break; 740 case 0x00d: map_key_clear(KEY_HOME); break;
736 case 0x024: map_key_clear(KEY_SHUFFLE); break; 741 case 0x024: map_key_clear(KEY_SHUFFLE); break;
@@ -748,6 +753,14 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
748 case 0x04d: map_key_clear(KEY_SUBTITLE); break; 753 case 0x04d: map_key_clear(KEY_SUBTITLE); break;
749 case 0x051: map_key_clear(KEY_RED); break; 754 case 0x051: map_key_clear(KEY_RED); break;
750 case 0x052: map_key_clear(KEY_CLOSE); break; 755 case 0x052: map_key_clear(KEY_CLOSE); break;
756
757 /* Reported on Petalynx Maxter remote */
758 case 0x05a: map_key_clear(KEY_TEXT); break;
759 case 0x05b: map_key_clear(KEY_RED); break;
760 case 0x05c: map_key_clear(KEY_GREEN); break;
761 case 0x05d: map_key_clear(KEY_YELLOW); break;
762 case 0x05e: map_key_clear(KEY_BLUE); break;
763
751 default: goto ignore; 764 default: goto ignore;
752 } 765 }
753 break; 766 break;
diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c
index 093abb5c9879..ef7b881aab3a 100644
--- a/drivers/hid/usbhid/hid-core.c
+++ b/drivers/hid/usbhid/hid-core.c
@@ -688,6 +688,21 @@ static void hid_fixup_logitech_descriptor(unsigned char *rdesc, int rsize)
688 } 688 }
689} 689}
690 690
691/* Petalynx Maxter Remote has maximum for consumer page set too low */
692static void hid_fixup_petalynx_descriptor(unsigned char *rdesc, int rsize)
693{
694 if (rsize >= 60 && rdesc[39] == 0x2a
695 && rdesc[40] == 0xf5
696 && rdesc[41] == 0x00
697 && rdesc[59] == 0x26
698 && rdesc[60] == 0xf9
699 && rdesc[61] == 0x00) {
700 info("Fixing up Petalynx Maxter Remote report descriptor");
701 rdesc[60] = 0xfa;
702 rdesc[40] = 0xfa;
703 }
704}
705
691/* 706/*
692 * Some USB barcode readers from cypress have usage min and usage max in 707 * Some USB barcode readers from cypress have usage min and usage max in
693 * the wrong order 708 * the wrong order
@@ -781,6 +796,9 @@ static struct hid_device *usb_hid_configure(struct usb_interface *intf)
781 if (quirks & HID_QUIRK_SWAPPED_MIN_MAX) 796 if (quirks & HID_QUIRK_SWAPPED_MIN_MAX)
782 hid_fixup_cypress_descriptor(rdesc, rsize); 797 hid_fixup_cypress_descriptor(rdesc, rsize);
783 798
799 if (quirks & HID_QUIRK_PETALYNX_DESCRIPTOR)
800 hid_fixup_petalynx_descriptor(rdesc, rsize);
801
784#ifdef CONFIG_HID_DEBUG 802#ifdef CONFIG_HID_DEBUG
785 printk(KERN_DEBUG __FILE__ ": report descriptor (size %u, read %d) = ", rsize, n); 803 printk(KERN_DEBUG __FILE__ ": report descriptor (size %u, read %d) = ", rsize, n);
786 for (n = 0; n < rsize; n++) 804 for (n = 0; n < rsize; n++)
diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c
index a320c24ea6e8..ad8a4ac8e43c 100644
--- a/drivers/hid/usbhid/hid-quirks.c
+++ b/drivers/hid/usbhid/hid-quirks.c
@@ -226,6 +226,9 @@
226#define USB_VENDOR_ID_PANTHERLORD 0x0810 226#define USB_VENDOR_ID_PANTHERLORD 0x0810
227#define USB_DEVICE_ID_PANTHERLORD_TWIN_USB_JOYSTICK 0x0001 227#define USB_DEVICE_ID_PANTHERLORD_TWIN_USB_JOYSTICK 0x0001
228 228
229#define USB_VENDOR_ID_PETALYNX 0x18b1
230#define USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE 0x0037
231
229#define USB_VENDOR_ID_PLAYDOTCOM 0x0b43 232#define USB_VENDOR_ID_PLAYDOTCOM 0x0b43
230#define USB_DEVICE_ID_PLAYDOTCOM_EMS_USBII 0x0003 233#define USB_DEVICE_ID_PLAYDOTCOM_EMS_USBII 0x0003
231 234
@@ -426,6 +429,8 @@ static const struct hid_blacklist {
426 { USB_VENDOR_ID_PANTHERLORD, USB_DEVICE_ID_PANTHERLORD_TWIN_USB_JOYSTICK, HID_QUIRK_MULTI_INPUT | HID_QUIRK_SKIP_OUTPUT_REPORTS }, 429 { USB_VENDOR_ID_PANTHERLORD, USB_DEVICE_ID_PANTHERLORD_TWIN_USB_JOYSTICK, HID_QUIRK_MULTI_INPUT | HID_QUIRK_SKIP_OUTPUT_REPORTS },
427 { USB_VENDOR_ID_PLAYDOTCOM, USB_DEVICE_ID_PLAYDOTCOM_EMS_USBII, HID_QUIRK_MULTI_INPUT }, 430 { USB_VENDOR_ID_PLAYDOTCOM, USB_DEVICE_ID_PLAYDOTCOM_EMS_USBII, HID_QUIRK_MULTI_INPUT },
428 431
432 { USB_VENDOR_ID_PETALYNX, USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE, HID_QUIRK_PETALYNX_DESCRIPTOR | HID_QUIRK_NOGET },
433
429 { USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER, HID_QUIRK_SONY_PS3_CONTROLLER }, 434 { USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER, HID_QUIRK_SONY_PS3_CONTROLLER },
430 435
431 { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_UC100KM, HID_QUIRK_NOGET }, 436 { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_UC100KM, HID_QUIRK_NOGET },
diff --git a/include/linux/hid.h b/include/linux/hid.h
index 6e45d1056e1b..e41067951dd9 100644
--- a/include/linux/hid.h
+++ b/include/linux/hid.h
@@ -277,6 +277,7 @@ struct hid_item {
277#define HID_QUIRK_RESET_LEDS 0x00400000 277#define HID_QUIRK_RESET_LEDS 0x00400000
278#define HID_QUIRK_SWAPPED_MIN_MAX 0x00800000 278#define HID_QUIRK_SWAPPED_MIN_MAX 0x00800000
279#define HID_QUIRK_HIDINPUT 0x01000000 279#define HID_QUIRK_HIDINPUT 0x01000000
280#define HID_QUIRK_PETALYNX_DESCRIPTOR 0x02000000
280 281
281/* 282/*
282 * This is the global environment of the parser. This information is 283 * This is the global environment of the parser. This information is