<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://pandorawiki.org/index.php?action=history&amp;feed=atom&amp;title=Cross_Install_Gentoo_kernel-patch-Fn-keys.txt</id>
	<title>Cross Install Gentoo kernel-patch-Fn-keys.txt - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://pandorawiki.org/index.php?action=history&amp;feed=atom&amp;title=Cross_Install_Gentoo_kernel-patch-Fn-keys.txt"/>
	<link rel="alternate" type="text/html" href="https://pandorawiki.org/index.php?title=Cross_Install_Gentoo_kernel-patch-Fn-keys.txt&amp;action=history"/>
	<updated>2026-05-03T16:08:52Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.32.0-alpha</generator>
	<entry>
		<id>https://pandorawiki.org/index.php?title=Cross_Install_Gentoo_kernel-patch-Fn-keys.txt&amp;diff=30283&amp;oldid=prev</id>
		<title>Jgeiss: Patch file released</title>
		<link rel="alternate" type="text/html" href="https://pandorawiki.org/index.php?title=Cross_Install_Gentoo_kernel-patch-Fn-keys.txt&amp;diff=30283&amp;oldid=prev"/>
		<updated>2018-06-05T06:41:17Z</updated>

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