This repository has been archived on 2025-06-06. You can view files and clone it, but cannot push or open issues or pull requests.
Files
android-g900/kernel-2.6.33/arch/arm/mach-pxa/g900/g900_keyboard.c

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");