^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * ATI X10 RF remote keytable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 2011 Anssi Hannula <anssi.hannula@?ki.fi>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * This file is based on the static generic keytable previously found in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * ati_remote.c, which is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * Copyright (c) 2004 Torrey Hoffman <thoffman@arnor.net>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * Copyright (c) 2002 Vladimir Dergachev
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <media/rc-map.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) * Intended usage comments below are from vendor-supplied
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) * Source: ATI REMOTE WONDER™ Installation Guide
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) * http://www2.ati.com/manuals/remctrl.pdf
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) * Scancodes were in strict left-right, top-bottom order on the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) * original ATI Remote Wonder, but were moved on later models.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) * Keys A-F are intended to be user-programmable.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) static struct rc_map_table ati_x10[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) /* keyboard - Above the cursor pad */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) { 0x00, KEY_A },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) { 0x01, KEY_B },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) { 0x02, KEY_POWER }, /* Power */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) { 0x03, KEY_TV }, /* TV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) { 0x04, KEY_DVD }, /* DVD */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) { 0x05, KEY_WWW }, /* WEB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) { 0x06, KEY_BOOKMARKS }, /* "book": Open Media Library */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) { 0x07, KEY_EDIT }, /* "hand": Toggle left mouse button (grab) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) /* Mouse emulation pad goes here, handled by driver separately */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) { 0x09, KEY_VOLUMEDOWN }, /* VOL + */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) { 0x08, KEY_VOLUMEUP }, /* VOL - */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) { 0x0a, KEY_MUTE }, /* MUTE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) { 0x0b, KEY_CHANNELUP }, /* CH + */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) { 0x0c, KEY_CHANNELDOWN },/* CH - */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) * We could use KEY_NUMERIC_x for these, but the X11 protocol
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) * has problems with keycodes greater than 255, so avoid those high
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) * keycodes in default maps.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) { 0x0d, KEY_NUMERIC_1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) { 0x0e, KEY_NUMERIC_2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) { 0x0f, KEY_NUMERIC_3 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) { 0x10, KEY_NUMERIC_4 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) { 0x11, KEY_NUMERIC_5 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) { 0x12, KEY_NUMERIC_6 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) { 0x13, KEY_NUMERIC_7 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) { 0x14, KEY_NUMERIC_8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) { 0x15, KEY_NUMERIC_9 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) { 0x16, KEY_MENU }, /* "menu": DVD root menu */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) /* KEY_NUMERIC_STAR? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) { 0x17, KEY_NUMERIC_0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) { 0x18, KEY_SETUP }, /* "check": DVD setup menu */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) /* KEY_NUMERIC_POUND? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) /* DVD navigation buttons */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) { 0x19, KEY_C },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) { 0x1a, KEY_UP }, /* up */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) { 0x1b, KEY_D },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) { 0x1c, KEY_PROPS }, /* "timer" Should be Data On Screen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) /* Symbol is "circle nailed to box" */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) { 0x1d, KEY_LEFT }, /* left */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) { 0x1e, KEY_OK }, /* "OK" */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) { 0x1f, KEY_RIGHT }, /* right */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) { 0x20, KEY_SCREEN }, /* "max" (X11 warning: 0x177) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) /* Should be AC View Toggle, but
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) that's not in <input/input.h>.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) KEY_ZOOM (0x174)? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) { 0x21, KEY_E },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) { 0x22, KEY_DOWN }, /* down */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) { 0x23, KEY_F },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) /* Play/stop/pause buttons */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) { 0x24, KEY_REWIND }, /* (<<) Rewind */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) { 0x25, KEY_PLAY }, /* ( >) Play (KEY_PLAYCD?) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) { 0x26, KEY_FASTFORWARD }, /* (>>) Fast forward */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) { 0x27, KEY_RECORD }, /* ( o) red */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) { 0x28, KEY_STOPCD }, /* ([]) Stop (KEY_STOP is something else!) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) { 0x29, KEY_PAUSE }, /* ('') Pause (KEY_PAUSECD?) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) /* Extra keys, not on the original ATI remote */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) { 0x2a, KEY_NEXT }, /* (>+) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) { 0x2b, KEY_PREVIOUS }, /* (<-) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) { 0x2d, KEY_INFO }, /* PLAYING (X11 warning: 0x166) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) { 0x2e, KEY_HOME }, /* TOP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) { 0x2f, KEY_END }, /* END */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) { 0x30, KEY_SELECT }, /* SELECT (X11 warning: 0x161) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) static struct rc_map_list ati_x10_map = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) .map = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) .scan = ati_x10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) .size = ARRAY_SIZE(ati_x10),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) .rc_proto = RC_PROTO_OTHER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) .name = RC_MAP_ATI_X10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) static int __init init_rc_map_ati_x10(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) return rc_map_register(&ati_x10_map);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) static void __exit exit_rc_map_ati_x10(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) rc_map_unregister(&ati_x10_map);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) module_init(init_rc_map_ati_x10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) module_exit(exit_rc_map_ati_x10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) MODULE_LICENSE("GPL");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) MODULE_AUTHOR("Anssi Hannula <anssi.hannula@iki.fi>");