240 lines
6.3 KiB
C
Executable File
240 lines
6.3 KiB
C
Executable File
/*
|
|
* Keypad driver for Toshiba G900.
|
|
*
|
|
* This file is subject to the terms and conditions of the GNU General Public
|
|
* License. See the file COPYING in the main directory of this archive for
|
|
* more details.
|
|
*
|
|
*
|
|
*/
|
|
|
|
#include <linux/input.h>
|
|
#include <linux/module.h>
|
|
#include <linux/init.h>
|
|
#include <linux/interrupt.h>
|
|
#include <linux/irq.h>
|
|
#include <linux/platform_device.h>
|
|
#include <asm/mach-types.h>
|
|
#include <mach/pxa27x_keypad.h>
|
|
#include <mach/mfp-pxa27x.h>
|
|
#include "../generic.h"
|
|
/****************************************************************
|
|
* Keyboard
|
|
****************************************************************/
|
|
|
|
static unsigned long g900_keypad_pins[] __initdata = {
|
|
GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH,
|
|
GPIO101_KP_MKIN_1 | WAKEUP_ON_LEVEL_HIGH,
|
|
GPIO102_KP_MKIN_2 | WAKEUP_ON_LEVEL_HIGH,
|
|
GPIO97_KP_MKIN_3 | WAKEUP_ON_LEVEL_HIGH,
|
|
GPIO98_KP_MKIN_4 | WAKEUP_ON_LEVEL_HIGH,
|
|
GPIO99_KP_MKIN_5 | WAKEUP_ON_LEVEL_HIGH,
|
|
GPIO95_KP_MKIN_6 | WAKEUP_ON_LEVEL_HIGH,
|
|
GPIO13_KP_MKIN_7 | WAKEUP_ON_LEVEL_HIGH,
|
|
GPIO103_KP_MKOUT_0,
|
|
GPIO104_KP_MKOUT_1,
|
|
GPIO105_KP_MKOUT_2,
|
|
GPIO106_KP_MKOUT_3,
|
|
GPIO107_KP_MKOUT_4,
|
|
GPIO108_KP_MKOUT_5,
|
|
GPIO35_KP_MKOUT_6,
|
|
GPIO22_KP_MKOUT_7,
|
|
};
|
|
|
|
|
|
static unsigned int g900_matrix_keys[] = {
|
|
KEY(0, 0, KEY_C),
|
|
KEY(0, 1, KEY_Z),
|
|
KEY(0, 2, KEY_B),
|
|
KEY(0, 3, KEY_X),
|
|
KEY(0, 4, KEY_V),
|
|
KEY(0, 5, KEY_LEFTSHIFT), /* Shift on keyboard */
|
|
KEY(0, 6, KEY_F1), /* Left Softkey on keyboard */
|
|
KEY(0, 7, KEY_N),
|
|
|
|
// KEY(1, 0, KEY_LANGUAGE), /* RU button */
|
|
KEY(1, 0, KEY_X), /* RU button */
|
|
KEY(1, 1, KEY_MENU), /* WIN key on keyboard */
|
|
KEY(1, 2, KEY_SPACE),
|
|
KEY(1, 3, KEY_LEFTALT), /*KEY_OK*/
|
|
KEY(1, 4, KEY_2),
|
|
KEY(1, 5, KEY_FN), /* GREEN COMMA */
|
|
// KEY(1, 5, KEY_8),
|
|
KEY(1, 6, KEY_F2), /* Right Softkey on keyboard */
|
|
KEY(1, 7, KEY_COMMA),
|
|
|
|
KEY(2, 0, KEY_R),
|
|
KEY(2, 1, KEY_W),
|
|
KEY(2, 2, KEY_Y),
|
|
KEY(2, 3, KEY_E),
|
|
KEY(2, 4, KEY_T),
|
|
KEY(2, 5, KEY_Q),
|
|
KEY(2, 6, KEY_U),
|
|
KEY(2, 7, KEY_J),
|
|
|
|
KEY(3, 0, KEY_F),
|
|
KEY(3, 1, KEY_S),
|
|
KEY(3, 2, KEY_G),
|
|
KEY(3, 3, KEY_D),
|
|
KEY(3, 4, KEY_H),
|
|
KEY(3, 5, KEY_A),
|
|
KEY(3, 6, KEY_WWW), /* IE button upper the screen */
|
|
KEY(3, 7, KEY_ENTER),
|
|
|
|
KEY(4, 0, KEY_BACKSPACE),
|
|
KEY(4, 1, KEY_P),
|
|
KEY(4, 2, KEY_O),
|
|
KEY(4, 3, KEY_I),
|
|
KEY(4, 4, KEY_1),
|
|
KEY(4, 5, KEY_VOLUMEDOWN), /* VOLUME DOWN */
|
|
KEY(4, 6, KEY_VOLUMEUP), /* VOLUME UP */
|
|
KEY(4, 7, KEY_CAMERA),
|
|
|
|
KEY(5, 0, KEY_KPENTER), /* Middle button below the screen */
|
|
KEY(5, 1, KEY_UP),
|
|
KEY(5, 2, KEY_APOSTROPHE),
|
|
KEY(5, 3, KEY_M),
|
|
KEY(5, 4, KEY_F3), /* GREEN PHONE */
|
|
KEY(5, 5, KEY_UP), /* UP dpad*/
|
|
KEY(5, 6, KEY_BACK), /* KEY_OK */
|
|
KEY(5, 7, KEY_F4), /* RED PHONE */
|
|
|
|
KEY(6, 0, KEY_LEFTCTRL),
|
|
KEY(6, 1, KEY_BACKSLASH), /* + shift = | */
|
|
KEY(6, 2, KEY_L),
|
|
KEY(6, 3, KEY_K),
|
|
KEY(6, 4, KEY_F2), /* Right Softkey below the screen */
|
|
KEY(6, 5, KEY_LEFT), /* LEFT dpad*/
|
|
KEY(6, 6, KEY_F1), /* Left Softkey below the screen */
|
|
KEY(6, 7, KEY_DOWN), /* DOWN dpad*/
|
|
|
|
KEY(7, 0, KEY_RIGHT),
|
|
KEY(7, 1, KEY_DOWN),
|
|
KEY(7, 2, KEY_LEFT),
|
|
KEY(7, 3, KEY_DOT),
|
|
KEY(7, 4, KEY_MAIL), /* Key mail below the screen */
|
|
KEY(7, 5, KEY_RIGHT), /* RIGHT dpad*/
|
|
KEY(7, 6, KEY_MENU), /* Windows key below the screen KEY_RIGHTMETA*/
|
|
KEY(7, 7, KEY_HOME), /* Key Contact below the screen */
|
|
|
|
/* keys alternate function */
|
|
|
|
|
|
KEY(8, 0, KEY_SEMICOLON), /* + shift = : */
|
|
KEY(8, 1, KEY_MINUS), /* + shift = _ */
|
|
KEY(8, 2, KEY_EQUAL),
|
|
KEY(8, 3, KEY_APOSTROPHE), /* + shift = ' */
|
|
KEY(8, 4, KEY_SEMICOLON),
|
|
KEY(8, 5, KEY_LEFTSHIFT),
|
|
KEY(8, 6, KEY_F1),
|
|
KEY(8, 7, KEY_7),
|
|
|
|
KEY(9, 0, KEY_TAB),
|
|
KEY(9, 1, KEY_LEFTMETA),
|
|
KEY(9, 2, KEY_SPACE),
|
|
KEY(9, 3, KEY_LEFTALT),
|
|
KEY(9, 4, KEY_2),
|
|
// KEY(9, 5, KEY_FN), /* KEY_FN */
|
|
KEY(9, 6, KEY_F2),
|
|
KEY(9, 7, KEY_8), /* + shift = * */
|
|
|
|
KEY(10, 0, KEY_7), /* + shift = & */
|
|
KEY(10, 1, KEY_4), /* + shift = $ */
|
|
KEY(10, 2, KEY_0), /* + shift = ) */
|
|
KEY(10, 3, KEY_5), /* + shift = % */
|
|
KEY(10, 4, KEY_9), /* + shift = ( */
|
|
KEY(10, 5, KEY_2), /* + shift = @ */
|
|
KEY(10, 6, KEY_1),
|
|
KEY(10, 7, KEY_4),
|
|
|
|
KEY(11, 0, KEY_SLASH), /* + shift = ? */
|
|
KEY(11, 1, KEY_6), /* + shift = ^ */
|
|
KEY(11, 2, KEY_1), /* + shift = ! */
|
|
KEY(11, 3, KEY_BACKSLASH),
|
|
KEY(11, 4, KEY_MINUS),
|
|
KEY(11, 5, KEY_GRAVE), /* + shift = ~ */
|
|
KEY(11, 6, KEY_WWW),
|
|
KEY(11, 7, KEY_ENTER),
|
|
|
|
KEY(12, 0, KEY_DELETE),
|
|
KEY(12, 1, KEY_SLASH),
|
|
KEY(12, 2, KEY_3),
|
|
KEY(12, 3, KEY_2),
|
|
KEY(12, 4, KEY_1),
|
|
KEY(12, 5, KEY_VOLUMEDOWN),
|
|
KEY(12, 6, KEY_VOLUMEUP),
|
|
KEY(12, 7, KEY_CAMERA),
|
|
|
|
KEY(13, 0, KEY_KPENTER),
|
|
KEY(13, 1, KEY_PAGEUP), /* PG UP*/
|
|
KEY(13, 2, KEY_9),
|
|
KEY(13, 3, KEY_8),
|
|
KEY(13, 4, KEY_PHONE), /* GREEN PHONE */
|
|
KEY(13, 5, KEY_UP),
|
|
KEY(13, 6, KEY_OK),
|
|
KEY(13, 7, KEY_F4), /* RED PHONE */
|
|
|
|
KEY(14, 0, KEY_ESC),
|
|
KEY(14, 1, KEY_KPPLUS),
|
|
KEY(14, 2, KEY_6),
|
|
KEY(14, 3, KEY_5),
|
|
KEY(14, 4, KEY_F2),
|
|
KEY(14, 5, KEY_LEFT),
|
|
KEY(14, 6, KEY_F1),
|
|
KEY(14, 7, KEY_DOWN),
|
|
|
|
KEY(15, 0, KEY_X), /* FOLDER */
|
|
KEY(15, 1, KEY_PAGEDOWN), /* PG DWN */
|
|
KEY(15, 2, KEY_3), /* shift + 3 = # */
|
|
KEY(15, 3, KEY_0),
|
|
KEY(15, 4, KEY_MAIL),
|
|
KEY(15, 5, KEY_RIGHT),
|
|
KEY(15, 6, KEY_RIGHTMETA),
|
|
KEY(15, 7, KEY_HOME)
|
|
};
|
|
|
|
static struct pxa27x_keypad_platform_data g900_keypad_platform_data = {
|
|
.matrix_key_rows = 8,
|
|
.matrix_key_cols = 8,
|
|
.matrix_key_map = g900_matrix_keys,
|
|
.matrix_key_map_size = ARRAY_SIZE(g900_matrix_keys),
|
|
// .direct_key_map = { KEY_CONNECT },
|
|
// .direct_key_num = 1,
|
|
// .debounce_interval = 30,
|
|
};
|
|
|
|
|
|
static int __devinit g900_keypad_probe(struct platform_device *dev)
|
|
{
|
|
pxa2xx_mfp_config(ARRAY_AND_SIZE(g900_keypad_pins));
|
|
pxa_set_keypad_info(&g900_keypad_platform_data);
|
|
return 0;
|
|
}
|
|
|
|
static struct platform_driver g900_keypad_driver = {
|
|
.driver = {
|
|
.name = "g900-keyboard",
|
|
},
|
|
.probe = g900_keypad_probe,
|
|
};
|
|
|
|
static int __init g900_keypad_init(void)
|
|
{
|
|
|
|
if (!machine_is_g900())
|
|
return -ENODEV;
|
|
return platform_driver_register(&g900_keypad_driver);
|
|
}
|
|
|
|
static void __exit g900_keypad_exit(void)
|
|
{
|
|
platform_driver_unregister(&g900_keypad_driver);
|
|
}
|
|
|
|
module_init(g900_keypad_init);
|
|
module_exit(g900_keypad_exit);
|
|
|
|
MODULE_AUTHOR ("Angell Fear <angell@angellfear.ru>");
|
|
MODULE_DESCRIPTION ("Keypad support for Toshiba G900");
|
|
MODULE_LICENSE ("GPL");
|