Cross Install Gentoo kernel-patch-Fn-keys.txt
From Pandora Wiki
diff --git a/arch/arm/boot/dts/omap3-pandora-common.dtsi b/arch/arm/boot/dts/omap3-pandora-common.dtsi index c3db2086be41..beed98eee1d3 100644 --- a/arch/arm/boot/dts/omap3-pandora-common.dtsi +++ b/arch/arm/boot/dts/omap3-pandora-common.dtsi @@ -483,13 +483,56 @@ MATRIX_KEY(6, 1, KEY_2) MATRIX_KEY(6, 2, KEY_W) MATRIX_KEY(6, 3, KEY_A) - MATRIX_KEY(6, 4, KEY_RIGHTBRACE) + MATRIX_KEY(6, 4, KEY_DOT) MATRIX_KEY(7, 0, KEY_ENTER) MATRIX_KEY(7, 1, KEY_1) MATRIX_KEY(7, 2, KEY_Q) MATRIX_KEY(7, 3, KEY_LEFTSHIFT) - MATRIX_KEY(7, 4, KEY_LEFTBRACE ) - >; + MATRIX_KEY(7, 4, KEY_COMMA) + MATRIX_KEY(8, 0, KEY_F9) + MATRIX_KEY(8, 1, KEY_F8) + MATRIX_KEY(8, 2, KEY_BRIGHTNESSUP) + MATRIX_KEY(8, 3, KEY_F13) /* apostrophe, differs from Fn-A? */ + MATRIX_KEY(8, 4, KEY_F22) + MATRIX_KEY(8, 5, KEY_F23) + MATRIX_KEY(9, 0, KEY_F10) + MATRIX_KEY(9, 1, KEY_F7) + MATRIX_KEY(9, 2, KEY_BRIGHTNESSDOWN) + MATRIX_KEY(9, 3, KEY_GRAVE) + MATRIX_KEY(9, 4, KEY_F14) /* pipe/bar */ + MATRIX_KEY(9, 5, KEY_TAB) + MATRIX_KEY(10, 0, KEY_INSERT) + MATRIX_KEY(10, 1, KEY_F6) + MATRIX_KEY(10, 2, KEY_F15) /* dash */ + MATRIX_KEY(10, 3, KEY_EQUAL) + MATRIX_KEY(10, 4, KEY_F16) /* # (pound/hash) */ + MATRIX_KEY(10, 5, KEY_FN) + MATRIX_KEY(11, 0, KEY_F11) + MATRIX_KEY(11, 1, KEY_F5) + MATRIX_KEY(11, 2, KEY_F17) /* ! */ + MATRIX_KEY(11, 3, KEY_KPPLUS) + MATRIX_KEY(11, 4, KEY_BACKSLASH) + MATRIX_KEY(12, 0, KEY_F12) + MATRIX_KEY(12, 1, KEY_F4) + MATRIX_KEY(12, 2, KEY_RIGHTBRACE) + MATRIX_KEY(12, 3, KEY_KPMINUS) + MATRIX_KEY(12, 4, KEY_QUESTION) + MATRIX_KEY(13, 0, KEY_F18) /* £ (pound) */ + MATRIX_KEY(13, 1, KEY_F3) + MATRIX_KEY(13, 2, KEY_LEFTBRACE) + MATRIX_KEY(13, 3, KEY_F19) /* " */ + MATRIX_KEY(13, 4, KEY_SLASH) + MATRIX_KEY(14, 0, KEY_YEN) + MATRIX_KEY(14, 1, KEY_F2) + MATRIX_KEY(14, 2, KEY_F20) /* @ */ + MATRIX_KEY(14, 3, KEY_APOSTROPHE) + MATRIX_KEY(14, 4, KEY_F21) /* : */ + MATRIX_KEY(15, 0, KEY_ENTER) + MATRIX_KEY(15, 1, KEY_F1) + MATRIX_KEY(15, 2, KEY_ESC) + MATRIX_KEY(15, 3, KEY_CAPSLOCK) + MATRIX_KEY(15, 4, KEY_SEMICOLON) + >; }; /* backup battery charger */ diff --git a/drivers/input/keyboard/twl4030_keypad.c b/drivers/input/keyboard/twl4030_keypad.c index 323a0fb575a4..b9e19aa3d4e4 100644 --- a/drivers/input/keyboard/twl4030_keypad.c +++ b/drivers/input/keyboard/twl4030_keypad.c @@ -55,7 +55,7 @@ * row lines connected to the gnd (see twl4030_col_xlate()). */ #define TWL4030_ROW_SHIFT 4 -#define TWL4030_KEYMAP_SIZE (TWL4030_MAX_ROWS << TWL4030_ROW_SHIFT) +#define TWL4030_KEYMAP_SIZE ((TWL4030_MAX_ROWS << TWL4030_ROW_SHIFT)*2) struct twl4030_keypad { unsigned short keymap[TWL4030_KEYMAP_SIZE]; @@ -65,6 +65,9 @@ struct twl4030_keypad { unsigned int n_cols; unsigned int irq; + unsigned fn_down:1; + unsigned fn_sticked:1; + struct device *dbg_dev; struct input_dev *input; }; @@ -233,6 +236,7 @@ static void twl4030_kp_scan(struct twl4030_keypad *kp, bool release_all) /* Extra column handles "all gnd" rows */ for (col = 0; col < kp->n_cols + 1; col++) { int code; + int code2, kcode, is_down; if (!(changed & (1 << col))) continue; @@ -242,9 +246,34 @@ static void twl4030_kp_scan(struct twl4030_keypad *kp, bool release_all) "press" : "release"); code = MATRIX_SCAN_CODE(row, col, TWL4030_ROW_SHIFT); + kcode = kp->keymap[code]; + is_down = (new_state[row] & (1 << col)) ? 1 : 0; + + dev_dbg(kp->dbg_dev, "code: %d %d\n", code, kcode); + /* Fn handling */ + if (kcode == KEY_FN) { + kp->fn_down = is_down; + kp->fn_sticked |= is_down; + } else if (kp->fn_down || kp->fn_sticked) { + /* make sure other function is up */ + input_event(input, EV_MSC, MSC_SCAN, code); + input_report_key(input, kcode, 0); + + code = MATRIX_SCAN_CODE(row + TWL4030_MAX_ROWS, + col, TWL4030_ROW_SHIFT); + kcode = kp->keymap[code]; + + kp->fn_sticked = 0; + } else { + code2 = MATRIX_SCAN_CODE(row + TWL4030_MAX_ROWS, + col, TWL4030_ROW_SHIFT); + input_event(input, EV_MSC, MSC_SCAN, code2); + input_report_key(input, kp->keymap[code2], 0); + } + + dev_dbg(kp->dbg_dev, "code(fn): %d %d\n", code, kcode); input_event(input, EV_MSC, MSC_SCAN, code); - input_report_key(input, kp->keymap[code], - new_state[row] & (1 << col)); + input_report_key(input, kcode, is_down); } kp->kp_state[row] = new_state[row]; } @@ -395,7 +424,7 @@ static int twl4030_kp_probe(struct platform_device *pdev) } error = matrix_keypad_build_keymap(keymap_data, NULL, - TWL4030_MAX_ROWS, + TWL4030_MAX_ROWS << 1, 1 << TWL4030_ROW_SHIFT, kp->keymap, input); if (error) {