diff --git a/packages/linux/patches/linux-3.2.13-057.01-media-ati_remote-allow-specifying-a-default-keymap-s.patch b/packages/linux/patches/linux-3.2.13-057.01-media-ati_remote-allow-specifying-a-default-keymap-s.patch new file mode 100644 index 0000000000..cae11c80b1 --- /dev/null +++ b/packages/linux/patches/linux-3.2.13-057.01-media-ati_remote-allow-specifying-a-default-keymap-s.patch @@ -0,0 +1,84 @@ +From 90732af5fa8dc91982c8a3381247567906986b4c Mon Sep 17 00:00:00 2001 +From: Anssi Hannula +Date: Sun, 1 Apr 2012 20:26:45 +0300 +Subject: [PATCH 1/2] [media] ati_remote: allow specifying a default keymap + selector function + +Currently the ati_remote default keymap is selected directly based on +the USB device id. + +Add support for instead specifying a function returning the default +keymap, allowing more complex selection logic to be added when needed. + +This will be used for Medion X10 remotes in a following commit. + +Signed-off-by: Anssi Hannula +--- + drivers/media/rc/ati_remote.c | 36 ++++++++++++++++++++++++++---------- + 1 file changed, 26 insertions(+), 10 deletions(-) + +diff --git a/drivers/media/rc/ati_remote.c b/drivers/media/rc/ati_remote.c +index baf907b..7a35f7a 100644 +--- a/drivers/media/rc/ati_remote.c ++++ b/drivers/media/rc/ati_remote.c +@@ -151,13 +151,23 @@ MODULE_PARM_DESC(mouse, "Enable mouse device, default = yes"); + #undef err + #define err(format, arg...) printk(KERN_ERR format , ## arg) + ++struct ati_receiver_type { ++ /* either default_keymap or get_default_keymap should be set */ ++ const char *default_keymap; ++ const char *(*get_default_keymap)(struct usb_interface *interface); ++}; ++ ++static const struct ati_receiver_type type_ati = { .default_keymap = RC_MAP_ATI_X10 }; ++static const struct ati_receiver_type type_medion = { .default_keymap = RC_MAP_MEDION_X10 }; ++static const struct ati_receiver_type type_firefly = { .default_keymap = RC_MAP_SNAPSTREAM_FIREFLY }; ++ + static struct usb_device_id ati_remote_table[] = { +- { USB_DEVICE(ATI_REMOTE_VENDOR_ID, LOLA_REMOTE_PRODUCT_ID), .driver_info = (unsigned long)RC_MAP_ATI_X10 }, +- { USB_DEVICE(ATI_REMOTE_VENDOR_ID, LOLA2_REMOTE_PRODUCT_ID), .driver_info = (unsigned long)RC_MAP_ATI_X10 }, +- { USB_DEVICE(ATI_REMOTE_VENDOR_ID, ATI_REMOTE_PRODUCT_ID), .driver_info = (unsigned long)RC_MAP_ATI_X10 }, +- { USB_DEVICE(ATI_REMOTE_VENDOR_ID, NVIDIA_REMOTE_PRODUCT_ID), .driver_info = (unsigned long)RC_MAP_ATI_X10 }, +- { USB_DEVICE(ATI_REMOTE_VENDOR_ID, MEDION_REMOTE_PRODUCT_ID), .driver_info = (unsigned long)RC_MAP_MEDION_X10 }, +- { USB_DEVICE(ATI_REMOTE_VENDOR_ID, FIREFLY_REMOTE_PRODUCT_ID), .driver_info = (unsigned long)RC_MAP_SNAPSTREAM_FIREFLY }, ++ { USB_DEVICE(ATI_REMOTE_VENDOR_ID, LOLA_REMOTE_PRODUCT_ID), .driver_info = (unsigned long)&type_ati }, ++ { USB_DEVICE(ATI_REMOTE_VENDOR_ID, LOLA2_REMOTE_PRODUCT_ID), .driver_info = (unsigned long)&type_ati }, ++ { USB_DEVICE(ATI_REMOTE_VENDOR_ID, ATI_REMOTE_PRODUCT_ID), .driver_info = (unsigned long)&type_ati }, ++ { USB_DEVICE(ATI_REMOTE_VENDOR_ID, NVIDIA_REMOTE_PRODUCT_ID), .driver_info = (unsigned long)&type_ati }, ++ { USB_DEVICE(ATI_REMOTE_VENDOR_ID, MEDION_REMOTE_PRODUCT_ID), .driver_info = (unsigned long)&type_medion }, ++ { USB_DEVICE(ATI_REMOTE_VENDOR_ID, FIREFLY_REMOTE_PRODUCT_ID), .driver_info = (unsigned long)&type_firefly }, + {} /* Terminating entry */ + }; + +@@ -766,6 +776,7 @@ static int ati_remote_probe(struct usb_interface *interface, const struct usb_de + struct usb_device *udev = interface_to_usbdev(interface); + struct usb_host_interface *iface_host = interface->cur_altsetting; + struct usb_endpoint_descriptor *endpoint_in, *endpoint_out; ++ struct ati_receiver_type *type = (struct ati_receiver_type *)id->driver_info; + struct ati_remote *ati_remote; + struct input_dev *input_dev; + struct rc_dev *rc_dev; +@@ -827,10 +838,15 @@ static int ati_remote_probe(struct usb_interface *interface, const struct usb_de + snprintf(ati_remote->mouse_name, sizeof(ati_remote->mouse_name), + "%s mouse", ati_remote->rc_name); + +- if (id->driver_info) +- rc_dev->map_name = (const char *)id->driver_info; +- else +- rc_dev->map_name = RC_MAP_ATI_X10; ++ rc_dev->map_name = RC_MAP_ATI_X10; /* default map */ ++ ++ /* set default keymap according to receiver model */ ++ if (type) { ++ if (type->default_keymap) ++ rc_dev->map_name = type->default_keymap; ++ else if (type->get_default_keymap) ++ rc_dev->map_name = type->get_default_keymap(interface); ++ } + + ati_remote_rc_init(ati_remote); + mutex_init(&ati_remote->open_mutex); +-- +1.7.9.3 + diff --git a/packages/linux/patches/linux-3.2.13-057.02-media-ati_remote-add-support-for-Medion-X10-Digitain.patch b/packages/linux/patches/linux-3.2.13-057.02-media-ati_remote-add-support-for-Medion-X10-Digitain.patch new file mode 100644 index 0000000000..05166901b7 --- /dev/null +++ b/packages/linux/patches/linux-3.2.13-057.02-media-ati_remote-add-support-for-Medion-X10-Digitain.patch @@ -0,0 +1,328 @@ +From 52d570e9e2d4e7e5637e6f8343fb9643fc6edb8b Mon Sep 17 00:00:00 2001 +From: Anssi Hannula +Date: Sun, 1 Apr 2012 20:36:07 +0300 +Subject: [PATCH 2/2] [media] ati_remote: add support for Medion X10 + Digitainer remote +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Add support for another Medion X10 remote. This was apparently +originally used with the Medion Digitainer box, but is now sold +separately without any Digitainer labeling. + +A peculiarity of this remote is a scrollwheel in place of up/down +buttons. Each direction is mapped to 8 different scancodes, each +corresponding to 1..8 notches, allowing multiple notches to the same +direction to be transmitted in a single scancode. The driver transforms +the multi-notch scancodes to multiple events of the single-notch +scancode. +(0x70..0x77 = 1..8 notches down, 0x78..0x7f = 1..8 notches up) + +Since the scrollwheel scancodes are the same that are used for mouse on +some other X10 (ati_remote) remotes, the driver will now check whether +the active keymap has a keycode defined for the single-notch scancode +when a mouse/scrollwheel scancode (0x70..0x7f) is received. If set, +scrollwheel is assumed, otherwise mouse is assumed. + +This remote ships with a different receiver than the already supported +Medion X10 remote, but they share the same USB ID. The only difference +in the USB descriptors is that the Digitainer receiver has the Remote +Wakeup bit set in bmAttributes of the Configuration Descriptor. +Therefore that is used to select the default keymap. + +Thanks to Stephan Raue from OpenELEC (www.openelec.tv) for providing me +both a Medion X10 Digitainer remote+receiver and an already supported +Medion X10 remote+receiver. Thanks to Martin Beyß for providing some +useful information about the remote (including the "Digitainer" name). + +Signed-off-by: Anssi Hannula +--- + drivers/media/rc/ati_remote.c | 90 ++++++++++----- + drivers/media/rc/keymaps/Makefile | 1 + + .../media/rc/keymaps/rc-medion-x10-digitainer.c | 115 ++++++++++++++++++++ + include/media/rc-map.h | 1 + + 4 files changed, 179 insertions(+), 28 deletions(-) + create mode 100644 drivers/media/rc/keymaps/rc-medion-x10-digitainer.c + +diff --git a/drivers/media/rc/ati_remote.c b/drivers/media/rc/ati_remote.c +index 7a35f7a..26fa043 100644 +--- a/drivers/media/rc/ati_remote.c ++++ b/drivers/media/rc/ati_remote.c +@@ -1,7 +1,7 @@ + /* + * USB ATI Remote support + * +- * Copyright (c) 2011 Anssi Hannula ++ * Copyright (c) 2011, 2012 Anssi Hannula + * Version 2.2.0 Copyright (c) 2004 Torrey Hoffman + * Version 2.1.1 Copyright (c) 2002 Vladimir Dergachev + * +@@ -157,8 +157,20 @@ struct ati_receiver_type { + const char *(*get_default_keymap)(struct usb_interface *interface); + }; + ++static const char *get_medion_keymap(struct usb_interface *interface) ++{ ++ struct usb_device *udev = interface_to_usbdev(interface); ++ ++ /* The receiver shipped with the "Digitainer" variant helpfully has ++ * a single additional bit set in its descriptor. */ ++ if (udev->actconfig->desc.bmAttributes & USB_CONFIG_ATT_WAKEUP) ++ return RC_MAP_MEDION_X10_DIGITAINER; ++ ++ return RC_MAP_MEDION_X10; ++} ++ + static const struct ati_receiver_type type_ati = { .default_keymap = RC_MAP_ATI_X10 }; +-static const struct ati_receiver_type type_medion = { .default_keymap = RC_MAP_MEDION_X10 }; ++static const struct ati_receiver_type type_medion = { .get_default_keymap = get_medion_keymap }; + static const struct ati_receiver_type type_firefly = { .default_keymap = RC_MAP_SNAPSTREAM_FIREFLY }; + + static struct usb_device_id ati_remote_table[] = { +@@ -455,6 +467,7 @@ static void ati_remote_input_report(struct urb *urb) + int acc; + int remote_num; + unsigned char scancode; ++ u32 wheel_keycode = KEY_RESERVED; + int i; + + /* +@@ -494,26 +507,33 @@ static void ati_remote_input_report(struct urb *urb) + */ + scancode = data[2] & 0x7f; + +- /* Look up event code index in the mouse translation table. */ +- for (i = 0; ati_remote_tbl[i].kind != KIND_END; i++) { +- if (scancode == ati_remote_tbl[i].data) { +- index = i; +- break; ++ dbginfo(&ati_remote->interface->dev, ++ "channel 0x%02x; key data %02x, scancode %02x\n", ++ remote_num, data[2], scancode); ++ ++ if (scancode >= 0x70) { ++ /* ++ * This is either a mouse or scrollwheel event, depending on ++ * the remote/keymap. ++ * Get the keycode assigned to scancode 0x78/0x70. If it is ++ * set, assume this is a scrollwheel up/down event. ++ */ ++ wheel_keycode = rc_g_keycode_from_table(ati_remote->rdev, ++ scancode & 0x78); ++ ++ if (wheel_keycode == KEY_RESERVED) { ++ /* scrollwheel was not mapped, assume mouse */ ++ ++ /* Look up event code index in the mouse translation table. */ ++ for (i = 0; ati_remote_tbl[i].kind != KIND_END; i++) { ++ if (scancode == ati_remote_tbl[i].data) { ++ index = i; ++ break; ++ } ++ } + } + } + +- if (index >= 0) { +- dbginfo(&ati_remote->interface->dev, +- "channel 0x%02x; mouse data %02x; index %d; keycode %d\n", +- remote_num, data[2], index, ati_remote_tbl[index].code); +- if (!dev) +- return; /* no mouse device */ +- } else +- dbginfo(&ati_remote->interface->dev, +- "channel 0x%02x; key data %02x, scancode %02x\n", +- remote_num, data[2], scancode); +- +- + if (index >= 0 && ati_remote_tbl[index].kind == KIND_LITERAL) { + input_event(dev, ati_remote_tbl[index].type, + ati_remote_tbl[index].code, +@@ -552,15 +572,29 @@ static void ati_remote_input_report(struct urb *urb) + + if (index < 0) { + /* Not a mouse event, hand it to rc-core. */ +- +- /* +- * We don't use the rc-core repeat handling yet as +- * it would cause ghost repeats which would be a +- * regression for this driver. +- */ +- rc_keydown_notimeout(ati_remote->rdev, scancode, +- data[2]); +- rc_keyup(ati_remote->rdev); ++ int count = 1; ++ ++ if (wheel_keycode != KEY_RESERVED) { ++ /* ++ * This is a scrollwheel event, send the ++ * scroll up (0x78) / down (0x70) scancode ++ * repeatedly as many times as indicated by ++ * rest of the scancode. ++ */ ++ count = (scancode & 0x07) + 1; ++ scancode &= 0x78; ++ } ++ ++ while (count--) { ++ /* ++ * We don't use the rc-core repeat handling yet as ++ * it would cause ghost repeats which would be a ++ * regression for this driver. ++ */ ++ rc_keydown_notimeout(ati_remote->rdev, scancode, ++ data[2]); ++ rc_keyup(ati_remote->rdev); ++ } + return; + } + +diff --git a/drivers/media/rc/keymaps/Makefile b/drivers/media/rc/keymaps/Makefile +index 36e4d5e..c1d977c 100644 +--- a/drivers/media/rc/keymaps/Makefile ++++ b/drivers/media/rc/keymaps/Makefile +@@ -49,6 +49,7 @@ obj-$(CONFIG_RC_MAP) += rc-adstech-dvb-t-pci.o \ + rc-lme2510.o \ + rc-manli.o \ + rc-medion-x10.o \ ++ rc-medion-x10-digitainer.o \ + rc-msi-digivox-ii.o \ + rc-msi-digivox-iii.o \ + rc-msi-tvanywhere.o \ +diff --git a/drivers/media/rc/keymaps/rc-medion-x10-digitainer.c b/drivers/media/rc/keymaps/rc-medion-x10-digitainer.c +new file mode 100644 +index 0000000..0a5ce84 +--- /dev/null ++++ b/drivers/media/rc/keymaps/rc-medion-x10-digitainer.c +@@ -0,0 +1,115 @@ ++/* ++ * Medion X10 RF remote keytable (Digitainer variant) ++ * ++ * Copyright (C) 2012 Anssi Hannula ++ * ++ * This keymap is for a variant that has a distinctive scrollwheel instead of ++ * up/down buttons (tested with P/N 40009936 / 20018268), reportedly ++ * originally shipped with Medion Digitainer but now sold separately simply as ++ * an "X10" remote. ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with this program; if not, write to the Free Software Foundation, Inc., ++ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ++ */ ++ ++#include ++#include ++ ++static struct rc_map_table medion_x10_digitainer[] = { ++ { 0x02, KEY_POWER }, ++ ++ { 0x2c, KEY_TV }, ++ { 0x2d, KEY_VIDEO }, ++ { 0x04, KEY_DVD }, /* CD/DVD */ ++ { 0x16, KEY_TEXT }, /* "teletext" icon, i.e. a screen with lines */ ++ { 0x06, KEY_AUDIO }, ++ { 0x2e, KEY_RADIO }, ++ { 0x31, KEY_EPG }, /* a screen with an open book */ ++ { 0x05, KEY_IMAGES }, /* Photo */ ++ { 0x2f, KEY_INFO }, ++ ++ { 0x78, KEY_UP }, /* scrollwheel up 1 notch */ ++ /* 0x79..0x7f: 2-8 notches, driver repeats 0x78 entry */ ++ ++ { 0x70, KEY_DOWN }, /* scrollwheel down 1 notch */ ++ /* 0x71..0x77: 2-8 notches, driver repeats 0x70 entry */ ++ ++ { 0x19, KEY_MENU }, ++ { 0x1d, KEY_LEFT }, ++ { 0x1e, KEY_OK }, /* scrollwheel press */ ++ { 0x1f, KEY_RIGHT }, ++ { 0x20, KEY_BACK }, ++ ++ { 0x09, KEY_VOLUMEUP }, ++ { 0x08, KEY_VOLUMEDOWN }, ++ { 0x00, KEY_MUTE }, ++ ++ { 0x1b, KEY_SELECT }, /* also has "U" rotated 90 degrees CCW */ ++ ++ { 0x0b, KEY_CHANNELUP }, ++ { 0x0c, KEY_CHANNELDOWN }, ++ { 0x1c, KEY_LAST }, ++ ++ { 0x32, KEY_RED }, /* also Audio */ ++ { 0x33, KEY_GREEN }, /* also Subtitle */ ++ { 0x34, KEY_YELLOW }, /* also Angle */ ++ { 0x35, KEY_BLUE }, /* also Title */ ++ ++ { 0x28, KEY_STOP }, ++ { 0x29, KEY_PAUSE }, ++ { 0x25, KEY_PLAY }, ++ { 0x21, KEY_PREVIOUS }, ++ { 0x18, KEY_CAMERA }, ++ { 0x23, KEY_NEXT }, ++ { 0x24, KEY_REWIND }, ++ { 0x27, KEY_RECORD }, ++ { 0x26, KEY_FORWARD }, ++ ++ { 0x0d, KEY_1 }, ++ { 0x0e, KEY_2 }, ++ { 0x0f, KEY_3 }, ++ { 0x10, KEY_4 }, ++ { 0x11, KEY_5 }, ++ { 0x12, KEY_6 }, ++ { 0x13, KEY_7 }, ++ { 0x14, KEY_8 }, ++ { 0x15, KEY_9 }, ++ { 0x17, KEY_0 }, ++}; ++ ++static struct rc_map_list medion_x10_digitainer_map = { ++ .map = { ++ .scan = medion_x10_digitainer, ++ .size = ARRAY_SIZE(medion_x10_digitainer), ++ .rc_type = RC_TYPE_OTHER, ++ .name = RC_MAP_MEDION_X10_DIGITAINER, ++ } ++}; ++ ++static int __init init_rc_map_medion_x10_digitainer(void) ++{ ++ return rc_map_register(&medion_x10_digitainer_map); ++} ++ ++static void __exit exit_rc_map_medion_x10_digitainer(void) ++{ ++ rc_map_unregister(&medion_x10_digitainer_map); ++} ++ ++module_init(init_rc_map_medion_x10_digitainer) ++module_exit(exit_rc_map_medion_x10_digitainer) ++ ++MODULE_DESCRIPTION("Medion X10 RF remote keytable (Digitainer variant)"); ++MODULE_AUTHOR("Anssi Hannula "); ++MODULE_LICENSE("GPL"); +diff --git a/include/media/rc-map.h b/include/media/rc-map.h +index f688bde..902d29d 100644 +--- a/include/media/rc-map.h ++++ b/include/media/rc-map.h +@@ -110,6 +110,7 @@ void rc_map_init(void); + #define RC_MAP_LME2510 "rc-lme2510" + #define RC_MAP_MANLI "rc-manli" + #define RC_MAP_MEDION_X10 "rc-medion-x10" ++#define RC_MAP_MEDION_X10_DIGITAINER "rc-medion-x10-digitainer" + #define RC_MAP_MSI_DIGIVOX_II "rc-msi-digivox-ii" + #define RC_MAP_MSI_DIGIVOX_III "rc-msi-digivox-iii" + #define RC_MAP_MSI_TVANYWHERE_PLUS "rc-msi-tvanywhere-plus" +-- +1.7.9.3 + diff --git a/packages/sysutils/remote/eventlircd/evmap/03_0bc7_0006.evmap b/packages/sysutils/remote/eventlircd/evmap/03_0bc7_0006.evmap index 609980333a..3470fdadd4 100644 --- a/packages/sysutils/remote/eventlircd/evmap/03_0bc7_0006.evmap +++ b/packages/sysutils/remote/eventlircd/evmap/03_0bc7_0006.evmap @@ -11,15 +11,11 @@ KEY_7 = KEY_NUMERIC_7 # 7 KEY_8 = KEY_NUMERIC_8 # 8 KEY_9 = KEY_NUMERIC_9 # 9 - KEY_N = KEY_NUMERIC_STAR # * - KEY_O = KEY_NUMERIC_POUND # # - KEY_VOLUMEUP = KEY_VOLUMEDOWN # Volume Up # reverted with Volume Down - KEY_VOLUMEDOWN = KEY_VOLUMEUP # Volume Down # reverted with Volume Up - KEY_A = KEY_MUTE # Mute + KEY_VOLUMEUP = KEY_VOLUMEUP # Volume Up + KEY_VOLUMEDOWN = KEY_VOLUMEDOWN # Volume Down + KEY_MUTE = KEY_MUTE # Mute - KEY_PAGEUP = KEY_CHANNELUP # Channel Up - KEY_PAGEDOWN = KEY_CHANNELDOWN # Channel Down KEY_CHANNELUP = KEY_CHANNELUP # Channel Up KEY_CHANNELDOWN = KEY_CHANNELDOWN # Channel Down @@ -36,23 +32,26 @@ KEY_FORWARD = KEY_FORWARD # Forward KEY_REWIND = KEY_REWIND # Reverse - KEY_F = KEY_NEXT # Next track - KEY_E = KEY_PREVIOUS # Pre-track + KEY_NEXT = KEY_NEXT # Next track + KEY_PREVIOUS = KEY_PREVIOUS # Pre-track + KEY_LAST = KEY_LAST # Last - KEY_INFO = KEY_VIDEO # My Videos + KEY_VIDEO = KEY_VIDEO # My Videos KEY_DVD = KEY_DVD # DVD Menu - KEY_BOOKMARKS = KEY_AUDIO # My Music - KEY_KPENTER = KEY_CAMERA # My Pictures - KEY_SCREENLOCK = KEY_TUNER # My TV + KEY_AUDIO = KEY_AUDIO # My Music + KEY_IMAGES = KEY_CAMERA # My Pictures + KEY_CAMERA = KEY_CAMERA # Camera + KEY_TV = KEY_TUNER # My TV + KEY_RADIO = KEY_RADIO # My Radio + KEY_TEXT = KEY_TEXT # Text + KEY_EPG = KEY_EPG # EPG - KEY_END = KEY_INFO # Info - KEY_HOME = KEY_PROG1 # Start Key - KEY_D = KEY_PROG1 # Start Key (World) - -# KEY_MENU = KEY_EXIT # Back + KEY_MENU = KEY_MENU # Menu + KEY_SELECT = KEY_PROG1 # Start Key/Select Key + KEY_INFO = KEY_INFO # Info KEY_BACK = KEY_EXIT # Back - KEY_FRONT = KEY_EXIT # Back - KEY_END = KEY_DELETE # Button "RC" -# keys left: -# Rec TV = KEY_KPENTER # Record TV (push 3-5 times) \ No newline at end of file + KEY_RED = KEY_LANGUAGE # Red/Audio + KEY_GREEN = KEY_SUBTITLE # Green/Subtitle + KEY_YELLOW = KEY_ZOOM # Yellow/Angle + KEY_BLUE = KEY_INFO # Blue/Title