/* rc-hauppauge.c - Keytable for Hauppauge Remote Controllers
 *
 * keymap imported from ir-keymaps.c
 *
 * This map currently contains the code for four different RCs:
 *	- New Hauppauge Gray;
 *	- Old Hauppauge Gray (with a golden screen for media keys);
 *	- Hauppauge Black;
 *	- DSR-0112 remote bundled with Haupauge MiniStick.
 *
 * Copyright (c) 2010-2011 by Mauro Carvalho Chehab <mchehab@redhat.com>
 *
 * 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.
 */

#include <media/rc-map.h>

/*
 * Hauppauge:the newer, gray remotes (seems there are multiple
 * slightly different versions), shipped with cx88+ivtv cards.
 *
 * This table contains the complete RC5 code, instead of just the data part
 */

static struct rc_map_table rc5_hauppauge_new[] = {
	/*
	 * Remote Controller Hauppauge Gray found on modern devices
	 * Keycodes start with address = 0x1e
	 */

	{ 0x1e3b, KEY_SELECT },		/* GO / house symbol */
	{ 0x1e3d, KEY_POWER2 },		/* system power (green button) */

	{ 0x1e1c, KEY_TV },
	{ 0x1e18, KEY_VIDEO },		/* Videos */
	{ 0x1e19, KEY_AUDIO },		/* Music */
	{ 0x1e1a, KEY_CAMERA },		/* Pictures */

	{ 0x1e1b, KEY_EPG },		/* Guide */
	{ 0x1e0c, KEY_RADIO },

	{ 0x1e14, KEY_UP },
	{ 0x1e15, KEY_DOWN },
	{ 0x1e16, KEY_LEFT },
	{ 0x1e17, KEY_RIGHT },
	{ 0x1e25, KEY_OK },		/* OK */

	{ 0x1e1f, KEY_EXIT },		/* back/exit */
	{ 0x1e0d, KEY_MENU },

	{ 0x1e10, KEY_VOLUMEUP },
	{ 0x1e11, KEY_VOLUMEDOWN },

	{ 0x1e12, KEY_PREVIOUS },	/* previous channel */
	{ 0x1e0f, KEY_MUTE },

	{ 0x1e20, KEY_CHANNELUP },	/* channel / program + */
	{ 0x1e21, KEY_CHANNELDOWN },	/* channel / program - */

	{ 0x1e37, KEY_RECORD },		/* recording */
	{ 0x1e36, KEY_STOP },

	{ 0x1e32, KEY_REWIND },		/* backward << */
	{ 0x1e35, KEY_PLAY },
	{ 0x1e34, KEY_FASTFORWARD },	/* forward >> */

	{ 0x1e24, KEY_PREVIOUSSONG },	/* replay |< */
	{ 0x1e30, KEY_PAUSE },		/* pause */
	{ 0x1e1e, KEY_NEXTSONG },	/* skip >| */

	{ 0x1e01, KEY_1 },
	{ 0x1e02, KEY_2 },
	{ 0x1e03, KEY_3 },

	{ 0x1e04, KEY_4 },
	{ 0x1e05, KEY_5 },
	{ 0x1e06, KEY_6 },

	{ 0x1e07, KEY_7 },
	{ 0x1e08, KEY_8 },
	{ 0x1e09, KEY_9 },

	{ 0x1e0a, KEY_TEXT },		/* keypad asterisk as well */
	{ 0x1e00, KEY_0 },
	{ 0x1e0e, KEY_SUBTITLE },	/* also the Pound key (#) */

	{ 0x1e0b, KEY_RED },		/* red button */
	{ 0x1e2e, KEY_GREEN },		/* green button */
	{ 0x1e38, KEY_YELLOW },		/* yellow key */
	{ 0x1e29, KEY_BLUE },		/* blue key */

	/*
	 * Old Remote Controller Hauppauge Gray with a golden screen
	 * Keycodes start with address = 0x1f
	 */
	{ 0x1f3d, KEY_POWER2 },		/* system power (green button) */
	{ 0x1f3b, KEY_SELECT },		/* GO */

	/* Keys 0 to 9 */
	{ 0x1f00, KEY_0 },
	{ 0x1f01, KEY_1 },
	{ 0x1f02, KEY_2 },
	{ 0x1f03, KEY_3 },
	{ 0x1f04, KEY_4 },
	{ 0x1f05, KEY_5 },
	{ 0x1f06, KEY_6 },
	{ 0x1f07, KEY_7 },
	{ 0x1f08, KEY_8 },
	{ 0x1f09, KEY_9 },

	{ 0x1f1f, KEY_EXIT },		/* back/exit */
	{ 0x1f0d, KEY_MENU },

	{ 0x1f10, KEY_VOLUMEUP },
	{ 0x1f11, KEY_VOLUMEDOWN },
	{ 0x1f20, KEY_CHANNELUP },	/* channel / program + */
	{ 0x1f21, KEY_CHANNELDOWN },	/* channel / program - */
	{ 0x1f25, KEY_ENTER },		/* OK */

	{ 0x1f0b, KEY_RED },		/* red button */
	{ 0x1f2e, KEY_GREEN },		/* green button */
	{ 0x1f38, KEY_YELLOW },		/* yellow key */
	{ 0x1f29, KEY_BLUE },		/* blue key */

	{ 0x1f0f, KEY_MUTE },
	{ 0x1f0c, KEY_RADIO },		/* There's no indicator on this key */
	{ 0x1f3c, KEY_ZOOM },		/* full */

	{ 0x1f32, KEY_REWIND },		/* backward << */
	{ 0x1f35, KEY_PLAY },
	{ 0x1f34, KEY_FASTFORWARD },	/* forward >> */

	{ 0x1f37, KEY_RECORD },		/* recording */
	{ 0x1f36, KEY_STOP },
	{ 0x1f30, KEY_PAUSE },		/* pause */

	{ 0x1f24, KEY_PREVIOUSSONG },	/* replay |< */
	{ 0x1f1e, KEY_NEXTSONG },	/* skip >| */

	/*
	 * Keycodes for DSR-0112 remote bundled with Haupauge MiniStick
	 * Keycodes start with address = 0x1d
	 */
	{ 0x1d00, KEY_0 },
	{ 0x1d01, KEY_1 },
	{ 0x1d02, KEY_2 },
	{ 0x1d03, KEY_3 },
	{ 0x1d04, KEY_4 },
	{ 0x1d05, KEY_5 },
	{ 0x1d06, KEY_6 },
	{ 0x1d07, KEY_7 },
	{ 0x1d08, KEY_8 },
	{ 0x1d09, KEY_9 },
	{ 0x1d0a, KEY_TEXT },
	{ 0x1d0d, KEY_MENU },
	{ 0x1d0f, KEY_MUTE },
	{ 0x1d10, KEY_VOLUMEUP },
	{ 0x1d11, KEY_VOLUMEDOWN },
	{ 0x1d12, KEY_PREVIOUS },        /* Prev.Ch .. ??? */
	{ 0x1d14, KEY_UP },
	{ 0x1d15, KEY_DOWN },
	{ 0x1d16, KEY_LEFT },
	{ 0x1d17, KEY_RIGHT },
	{ 0x1d1c, KEY_TV },
	{ 0x1d1e, KEY_NEXT },           /* >|             */
	{ 0x1d1f, KEY_EXIT },
	{ 0x1d20, KEY_CHANNELUP },
	{ 0x1d21, KEY_CHANNELDOWN },
	{ 0x1d24, KEY_LAST },           /* <|             */
	{ 0x1d25, KEY_OK },
	{ 0x1d30, KEY_PAUSE },
	{ 0x1d32, KEY_REWIND },
	{ 0x1d34, KEY_FASTFORWARD },
	{ 0x1d35, KEY_PLAY },
	{ 0x1d36, KEY_STOP },
	{ 0x1d37, KEY_RECORD },
	{ 0x1d3b, KEY_GOTO },
	{ 0x1d3d, KEY_POWER },
	{ 0x1d3f, KEY_HOME },

	/*
	 * Keycodes for the old Black Remote Controller
	 * This one also uses RC-5 protocol
	 * Keycodes start with address = 0x00
	 */
	{ 0x001f, KEY_TV },
	{ 0x0020, KEY_CHANNELUP },
	{ 0x000c, KEY_RADIO },

	{ 0x0011, KEY_VOLUMEDOWN },
	{ 0x002e, KEY_ZOOM },		/* full screen */
	{ 0x0010, KEY_VOLUMEUP },

	{ 0x000d, KEY_MUTE },
	{ 0x0021, KEY_CHANNELDOWN },
	{ 0x0022, KEY_VIDEO },		/* source */

	{ 0x0001, KEY_1 },
	{ 0x0002, KEY_2 },
	{ 0x0003, KEY_3 },

	{ 0x0004, KEY_4 },
	{ 0x0005, KEY_5 },
	{ 0x0006, KEY_6 },

	{ 0x0007, KEY_7 },
	{ 0x0008, KEY_8 },
	{ 0x0009, KEY_9 },

	{ 0x001e, KEY_RED },	/* Reserved */
	{ 0x0000, KEY_0 },
	{ 0x0026, KEY_SLEEP },	/* Minimize */
};

static struct rc_map_list rc5_hauppauge_new_map = {
	.map = {
		.scan    = rc5_hauppauge_new,
		.size    = ARRAY_SIZE(rc5_hauppauge_new),
		.rc_type = RC_TYPE_RC5,
		.name    = RC_MAP_HAUPPAUGE,
	}
};

static int __init init_rc_map_rc5_hauppauge_new(void)
{
	return rc_map_register(&rc5_hauppauge_new_map);
}

static void __exit exit_rc_map_rc5_hauppauge_new(void)
{
	rc_map_unregister(&rc5_hauppauge_new_map);
}

module_init(init_rc_map_rc5_hauppauge_new)
module_exit(exit_rc_map_rc5_hauppauge_new)

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@redhat.com>");
