Commit b73bc16d authored by Sean Young's avatar Sean Young Committed by Mauro Carvalho Chehab
Browse files

[media] mce_kbd: add encoder



Split the protocol into two variants, one for keyboard and one for mouse
data.

Note that the mce_kbd protocol cannot be used on the igorplugusb, since
the IR is too long.

Signed-off-by: default avatarSean Young <sean@mess.org>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
parent e8f48188
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -205,7 +205,7 @@ static int igorplugusb_probe(struct usb_interface *intf,
	rc->allowed_protocols = RC_BIT_ALL_IR_DECODER & ~(RC_BIT_NEC |
			RC_BIT_NECX | RC_BIT_NEC32 | RC_BIT_RC6_6A_20 |
			RC_BIT_RC6_6A_24 | RC_BIT_RC6_6A_32 | RC_BIT_RC6_MCE |
			RC_BIT_SONY20 | RC_BIT_MCE_KBD | RC_BIT_SANYO);
			RC_BIT_SONY20 | RC_BIT_SANYO);

	rc->priv = ir;
	rc->driver_name = DRIVER_NAME;
+47 −2
Original line number Diff line number Diff line
@@ -23,7 +23,7 @@
 * - MCIR-2 29-bit IR signals used for mouse movement and buttons
 * - MCIR-2 32-bit IR signals used for standard keyboard keys
 *
 * The media keys on the keyboard send RC-6 signals that are inditinguishable
 * The media keys on the keyboard send RC-6 signals that are indistinguishable
 * from the keys of the same name on the stock MCE remote, and will be handled
 * by the standard RC-6 decoder, and be made available to the system via the
 * input device for the remote, rather than the keyboard/mouse one.
@@ -339,6 +339,7 @@ static int ir_mce_kbd_decode(struct rc_dev *dev, struct ir_raw_event ev)
		}

		data->state = STATE_INACTIVE;
		input_event(data->idev, EV_MSC, MSC_SCAN, scancode);
		input_sync(data->idev);
		return 0;
	}
@@ -418,9 +419,53 @@ static int ir_mce_kbd_unregister(struct rc_dev *dev)
	return 0;
}

static const struct ir_raw_timings_manchester ir_mce_kbd_timings = {
	.leader		= MCIR2_PREFIX_PULSE,
	.invert		= 1,
	.clock		= MCIR2_UNIT,
	.trailer_space	= MCIR2_UNIT * 10,
};

/**
 * ir_mce_kbd_encode() - Encode a scancode as a stream of raw events
 *
 * @protocol:   protocol to encode
 * @scancode:   scancode to encode
 * @events:     array of raw ir events to write into
 * @max:        maximum size of @events
 *
 * Returns:     The number of events written.
 *              -ENOBUFS if there isn't enough space in the array to fit the
 *              encoding. In this case all @max events will have been written.
 */
static int ir_mce_kbd_encode(enum rc_type protocol, u32 scancode,
			     struct ir_raw_event *events, unsigned int max)
{
	struct ir_raw_event *e = events;
	int len, ret;
	u64 raw;

	if (protocol == RC_TYPE_MCIR2_KBD) {
		raw = scancode |
		      ((u64)MCIR2_KEYBOARD_HEADER << MCIR2_KEYBOARD_NBITS);
		len = MCIR2_KEYBOARD_NBITS + MCIR2_HEADER_NBITS + 1;
	} else {
		raw = scancode |
		      ((u64)MCIR2_MOUSE_HEADER << MCIR2_MOUSE_NBITS);
		len = MCIR2_MOUSE_NBITS + MCIR2_HEADER_NBITS + 1;
	}

	ret = ir_raw_gen_manchester(&e, max, &ir_mce_kbd_timings, len, raw);
	if (ret < 0)
		return ret;

	return e - events;
}

static struct ir_raw_handler mce_kbd_handler = {
	.protocols	= RC_BIT_MCE_KBD,
	.protocols	= RC_BIT_MCIR2_KBD | RC_BIT_MCIR2_MSE,
	.decode		= ir_mce_kbd_decode,
	.encode		= ir_mce_kbd_encode,
	.raw_register	= ir_mce_kbd_register,
	.raw_unregister	= ir_mce_kbd_unregister,
};
+1 −1
Original line number Diff line number Diff line
@@ -185,7 +185,7 @@ struct ir_raw_timings_manchester {

int ir_raw_gen_manchester(struct ir_raw_event **ev, unsigned int max,
			  const struct ir_raw_timings_manchester *timings,
			  unsigned int n, unsigned int data);
			  unsigned int n, u64 data);

/**
 * ir_raw_gen_pulse_space() - generate pulse and space raw events.
+3 −3
Original line number Diff line number Diff line
@@ -258,13 +258,13 @@ static void ir_raw_disable_protocols(struct rc_dev *dev, u64 protocols)
 */
int ir_raw_gen_manchester(struct ir_raw_event **ev, unsigned int max,
			  const struct ir_raw_timings_manchester *timings,
			  unsigned int n, unsigned int data)
			  unsigned int n, u64 data)
{
	bool need_pulse;
	unsigned int i;
	u64 i;
	int ret = -ENOBUFS;

	i = 1 << (n - 1);
	i = BIT_ULL(n - 1);

	if (timings->leader) {
		if (!max--)
+6 −2
Original line number Diff line number Diff line
@@ -746,6 +746,8 @@ static int rc_validate_filter(struct rc_dev *dev,
		[RC_TYPE_NECX] = 0xffffff,
		[RC_TYPE_NEC32] = 0xffffffff,
		[RC_TYPE_SANYO] = 0x1fffff,
		[RC_TYPE_MCIR2_KBD] = 0xffff,
		[RC_TYPE_MCIR2_MSE] = 0x1fffff,
		[RC_TYPE_RC6_0] = 0xffff,
		[RC_TYPE_RC6_6A_20] = 0xfffff,
		[RC_TYPE_RC6_6A_24] = 0xffffff,
@@ -878,7 +880,8 @@ static const struct {
	{ RC_BIT_RC5_SZ,	"rc-5-sz",	"ir-rc5-decoder"	},
	{ RC_BIT_SANYO,		"sanyo",	"ir-sanyo-decoder"	},
	{ RC_BIT_SHARP,		"sharp",	"ir-sharp-decoder"	},
	{ RC_BIT_MCE_KBD,	"mce_kbd",	"ir-mce_kbd-decoder"	},
	{ RC_BIT_MCIR2_KBD |
	  RC_BIT_MCIR2_MSE,	"mce_kbd",	"ir-mce_kbd-decoder"	},
	{ RC_BIT_XMP,		"xmp",		"ir-xmp-decoder"	},
	{ RC_BIT_CEC,		"cec",		NULL			},
};
@@ -1346,7 +1349,8 @@ static const char * const proto_variant_names[] = {
	[RC_TYPE_NECX] = "nec-x",
	[RC_TYPE_NEC32] = "nec-32",
	[RC_TYPE_SANYO] = "sanyo",
	[RC_TYPE_MCE_KBD] = "mce_kbd",
	[RC_TYPE_MCIR2_KBD] = "mcir2-kbd",
	[RC_TYPE_MCIR2_MSE] = "mcir2-mse",
	[RC_TYPE_RC6_0] = "rc-6-0",
	[RC_TYPE_RC6_6A_20] = "rc-6-6a-20",
	[RC_TYPE_RC6_6A_24] = "rc-6-6a-24",
Loading