summaryrefslogtreecommitdiffstats
path: root/drivers/media/rc
diff options
context:
space:
mode:
authorSean Young2018-10-18 13:03:33 +0200
committerMauro Carvalho Chehab2018-11-22 19:28:24 +0100
commitcea1c41d6ba010559f9ccdcfc80ce185e7fab080 (patch)
tree564c6eba8b69c60feab31d978a5212143a0ccd23 /drivers/media/rc
parentmedia: rc: add driver for Xbox DVD Movie Playback Kit (diff)
downloadkernel-qcow2-linux-cea1c41d6ba010559f9ccdcfc80ce185e7fab080.tar.gz
kernel-qcow2-linux-cea1c41d6ba010559f9ccdcfc80ce185e7fab080.tar.xz
kernel-qcow2-linux-cea1c41d6ba010559f9ccdcfc80ce185e7fab080.zip
media: rc: XBox DVD Remote uses 12 bits scancodes
The xbox dvd remote sends 24 bits, the first 12 bits are repeated and inverted so only 12 bits are used. The upper 4 bits can be read at offset 3. Ensure we pass this to rc-core and update the keymap accordingly. Tested-by: Benjamin Valentin <benpicco@googlemail.com> Signed-off-by: Sean Young <sean@mess.org> Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
Diffstat (limited to 'drivers/media/rc')
-rw-r--r--drivers/media/rc/keymaps/rc-xbox-dvd.c58
-rw-r--r--drivers/media/rc/xbox_remote.c7
2 files changed, 33 insertions, 32 deletions
diff --git a/drivers/media/rc/keymaps/rc-xbox-dvd.c b/drivers/media/rc/keymaps/rc-xbox-dvd.c
index 61da6706715c..af387244636b 100644
--- a/drivers/media/rc/keymaps/rc-xbox-dvd.c
+++ b/drivers/media/rc/keymaps/rc-xbox-dvd.c
@@ -7,35 +7,35 @@
/* based on lircd.conf.xbox */
static struct rc_map_table xbox_dvd[] = {
- {0x0b, KEY_OK},
- {0xa6, KEY_UP},
- {0xa7, KEY_DOWN},
- {0xa8, KEY_RIGHT},
- {0xa9, KEY_LEFT},
- {0xc3, KEY_INFO},
-
- {0xc6, KEY_9},
- {0xc7, KEY_8},
- {0xc8, KEY_7},
- {0xc9, KEY_6},
- {0xca, KEY_5},
- {0xcb, KEY_4},
- {0xcc, KEY_3},
- {0xcd, KEY_2},
- {0xce, KEY_1},
- {0xcf, KEY_0},
-
- {0xd5, KEY_ANGLE},
- {0xd8, KEY_BACK},
- {0xdd, KEY_PREVIOUSSONG},
- {0xdf, KEY_NEXTSONG},
- {0xe0, KEY_STOP},
- {0xe2, KEY_REWIND},
- {0xe3, KEY_FASTFORWARD},
- {0xe5, KEY_TITLE},
- {0xe6, KEY_PAUSE},
- {0xea, KEY_PLAY},
- {0xf7, KEY_MENU},
+ {0xa0b, KEY_OK},
+ {0xaa6, KEY_UP},
+ {0xaa7, KEY_DOWN},
+ {0xaa8, KEY_RIGHT},
+ {0xaa9, KEY_LEFT},
+ {0xac3, KEY_INFO},
+
+ {0xac6, KEY_9},
+ {0xac7, KEY_8},
+ {0xac8, KEY_7},
+ {0xac9, KEY_6},
+ {0xaca, KEY_5},
+ {0xacb, KEY_4},
+ {0xacc, KEY_3},
+ {0xacd, KEY_2},
+ {0xace, KEY_1},
+ {0xacf, KEY_0},
+
+ {0xad5, KEY_ANGLE},
+ {0xad8, KEY_BACK},
+ {0xadd, KEY_PREVIOUSSONG},
+ {0xadf, KEY_NEXTSONG},
+ {0xae0, KEY_STOP},
+ {0xae2, KEY_REWIND},
+ {0xae3, KEY_FASTFORWARD},
+ {0xae5, KEY_TITLE},
+ {0xae6, KEY_PAUSE},
+ {0xaea, KEY_PLAY},
+ {0xaf7, KEY_MENU},
};
static struct rc_map_list xbox_dvd_map = {
diff --git a/drivers/media/rc/xbox_remote.c b/drivers/media/rc/xbox_remote.c
index 141ef9253018..f959cbb94744 100644
--- a/drivers/media/rc/xbox_remote.c
+++ b/drivers/media/rc/xbox_remote.c
@@ -55,7 +55,7 @@ struct xbox_remote {
struct usb_interface *interface;
struct urb *irq_urb;
- unsigned char inbuf[DATA_BUFSIZE];
+ unsigned char inbuf[DATA_BUFSIZE] __aligned(sizeof(u16));
char rc_name[NAME_BUFSIZE];
char rc_phys[NAME_BUFSIZE];
@@ -95,7 +95,7 @@ static void xbox_remote_input_report(struct urb *urb)
* data[0] = 0x00
* data[1] = length - always 0x06
* data[2] = the key code
- * data[3] = high part of key code? - always 0x0a
+ * data[3] = high part of key code
* data[4] = last_press_ms (low)
* data[5] = last_press_ms (high)
*/
@@ -107,7 +107,8 @@ static void xbox_remote_input_report(struct urb *urb)
return;
}
- rc_keydown(xbox_remote->rdev, RC_PROTO_UNKNOWN, data[2], 0);
+ rc_keydown(xbox_remote->rdev, RC_PROTO_UNKNOWN,
+ le16_to_cpup((__le16 *)(data + 2)), 0);
}
/*