Commit f5f2cc64 authored by Jarod Wilson's avatar Jarod Wilson Committed by Mauro Carvalho Chehab

[media] rc-core support for Microsoft IR keyboard/mouse

This is a custom IR protocol decoder, for the RC-6-ish protocol used by
the Microsoft Remote Keyboard, apparently developed internally at
Microsoft, and officially dubbed MCIR-2, per their March 2011 remote and
transceiver requirements and specifications document, which also touches
on this IR keyboard/mouse device.

Its a standard keyboard with embedded thumb stick mouse pointer and
mouse buttons, along with a number of media keys. The media keys are
standard RC-6, identical to the signals from the stock MCE remotes, and
will be handled as such. The keyboard and mouse signals will be decoded
and delivered to the system by an input device registered specifically
by this driver.

Successfully tested with multiple mceusb-driven transceivers, as well as
with fintek-cir and redrat3 hardware. Essentially, any raw IR hardware
with enough sampling resolution should be able to use this decoder,
nothing about it is at all receiver-hardware-specific.

This work is inspired by lirc_mod_mce:

The documentation there and code aided in understanding and decoding the
protocol, but the bulk of the code is actually borrowed more from the
existing in-kernel decoders than anything. I did recycle the keyboard
keycode table, a few defines, and some of the keyboard and mouse data
parsing bits from lirc_mod_mce though.

Special thanks to James Meyer for providing the hardware, and being
patient with me as I took forever to get around to writing this.

callback routine to ensure we don't get any stuck keys, and used
symbolic names for the keytable. Also cc'ing Florian this time, who I
believe is the original mod-mce author...

CC: Florian Demski <fdemski@users.sourceforge.net>
Signed-off-by: default avatarJarod Wilson <jarod@redhat.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent a062d04b
...@@ -87,6 +87,17 @@ config IR_RC5_SZ_DECODER ...@@ -87,6 +87,17 @@ config IR_RC5_SZ_DECODER
uses an IR protocol that is almost standard RC-5, but not quite, uses an IR protocol that is almost standard RC-5, but not quite,
as it uses an additional bit). as it uses an additional bit).
config IR_MCE_KBD_DECODER
tristate "Enable IR raw decoder for the MCE keyboard/mouse protocol"
depends on RC_CORE
select BITREVERSE
default y
---help---
Enable this option if you have a Microsoft Remote Keyboard for
Windows Media Center Edition, which you would like to use with
a raw IR receiver in your system.
config IR_LIRC_CODEC config IR_LIRC_CODEC
tristate "Enable IR to LIRC bridge" tristate "Enable IR to LIRC bridge"
depends on RC_CORE depends on RC_CORE
......
...@@ -10,6 +10,7 @@ obj-$(CONFIG_IR_RC6_DECODER) += ir-rc6-decoder.o ...@@ -10,6 +10,7 @@ obj-$(CONFIG_IR_RC6_DECODER) += ir-rc6-decoder.o
obj-$(CONFIG_IR_JVC_DECODER) += ir-jvc-decoder.o obj-$(CONFIG_IR_JVC_DECODER) += ir-jvc-decoder.o
obj-$(CONFIG_IR_SONY_DECODER) += ir-sony-decoder.o obj-$(CONFIG_IR_SONY_DECODER) += ir-sony-decoder.o
obj-$(CONFIG_IR_RC5_SZ_DECODER) += ir-rc5-sz-decoder.o obj-$(CONFIG_IR_RC5_SZ_DECODER) += ir-rc5-sz-decoder.o
obj-$(CONFIG_IR_MCE_KBD_DECODER) += ir-mce_kbd-decoder.o
obj-$(CONFIG_IR_LIRC_CODEC) += ir-lirc-codec.o obj-$(CONFIG_IR_LIRC_CODEC) += ir-lirc-codec.o
# stand-alone IR receivers/transmitters # stand-alone IR receivers/transmitters
......
This diff is collapsed.
...@@ -355,6 +355,7 @@ static void init_decoders(struct work_struct *work) ...@@ -355,6 +355,7 @@ static void init_decoders(struct work_struct *work)
load_rc6_decode(); load_rc6_decode();
load_jvc_decode(); load_jvc_decode();
load_sony_decode(); load_sony_decode();
load_mce_kbd_decode();
load_lirc_codec(); load_lirc_codec();
/* If needed, we may later add some init code. In this case, /* If needed, we may later add some init code. In this case,
......
...@@ -84,6 +84,17 @@ struct ir_raw_event_ctrl { ...@@ -84,6 +84,17 @@ struct ir_raw_event_ctrl {
unsigned count; unsigned count;
unsigned wanted_bits; unsigned wanted_bits;
} rc5_sz; } rc5_sz;
struct mce_kbd_dec {
struct input_dev *idev;
struct timer_list rx_timeout;
char name[64];
char phys[64];
int state;
u8 header;
u32 body;
unsigned count;
unsigned wanted_bits;
} mce_kbd;
struct lirc_codec { struct lirc_codec {
struct rc_dev *dev; struct rc_dev *dev;
struct lirc_driver *drv; struct lirc_driver *drv;
...@@ -182,6 +193,13 @@ void ir_raw_init(void); ...@@ -182,6 +193,13 @@ void ir_raw_init(void);
#define load_sony_decode() 0 #define load_sony_decode() 0
#endif #endif
/* from ir-mce_kbd-decoder.c */
#ifdef CONFIG_IR_MCE_KBD_DECODER_MODULE
#define load_mce_kbd_decode() request_module("ir-mce_kbd-decoder")
#else
#define load_mce_kbd_decode() 0
#endif
/* from ir-lirc-codec.c */ /* from ir-lirc-codec.c */
#ifdef CONFIG_IR_LIRC_CODEC_MODULE #ifdef CONFIG_IR_LIRC_CODEC_MODULE
#define load_lirc_codec() request_module("ir-lirc-codec") #define load_lirc_codec() request_module("ir-lirc-codec")
......
...@@ -735,6 +735,7 @@ static struct { ...@@ -735,6 +735,7 @@ static struct {
{ RC_TYPE_JVC, "jvc" }, { RC_TYPE_JVC, "jvc" },
{ RC_TYPE_SONY, "sony" }, { RC_TYPE_SONY, "sony" },
{ RC_TYPE_RC5_SZ, "rc-5-sz" }, { RC_TYPE_RC5_SZ, "rc-5-sz" },
{ RC_TYPE_MCE_KBD, "mce_kbd" },
{ RC_TYPE_LIRC, "lirc" }, { RC_TYPE_LIRC, "lirc" },
{ RC_TYPE_OTHER, "other" }, { RC_TYPE_OTHER, "other" },
}; };
......
...@@ -18,12 +18,13 @@ ...@@ -18,12 +18,13 @@
#define RC_TYPE_JVC (1 << 3) /* JVC protocol */ #define RC_TYPE_JVC (1 << 3) /* JVC protocol */
#define RC_TYPE_SONY (1 << 4) /* Sony12/15/20 protocol */ #define RC_TYPE_SONY (1 << 4) /* Sony12/15/20 protocol */
#define RC_TYPE_RC5_SZ (1 << 5) /* RC5 variant used by Streamzap */ #define RC_TYPE_RC5_SZ (1 << 5) /* RC5 variant used by Streamzap */
#define RC_TYPE_MCE_KBD (1 << 29) /* RC6-ish MCE keyboard/mouse */
#define RC_TYPE_LIRC (1 << 30) /* Pass raw IR to lirc userspace */ #define RC_TYPE_LIRC (1 << 30) /* Pass raw IR to lirc userspace */
#define RC_TYPE_OTHER (1u << 31) #define RC_TYPE_OTHER (1u << 31)
#define RC_TYPE_ALL (RC_TYPE_RC5 | RC_TYPE_NEC | RC_TYPE_RC6 | \ #define RC_TYPE_ALL (RC_TYPE_RC5 | RC_TYPE_NEC | RC_TYPE_RC6 | \
RC_TYPE_JVC | RC_TYPE_SONY | RC_TYPE_LIRC | \ RC_TYPE_JVC | RC_TYPE_SONY | RC_TYPE_LIRC | \
RC_TYPE_RC5_SZ | RC_TYPE_OTHER) RC_TYPE_RC5_SZ | RC_TYPE_MCE_KBD | RC_TYPE_OTHER)
struct rc_map_table { struct rc_map_table {
u32 scancode; u32 scancode;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment