GC keyboard adapter

Maarten ter Huurne <[email protected]> Sat, 15 Mar 2008 14:18:37 +0100
Newsgroups gmane.linux.ports.game-cube.devel
Message-ID <[email protected]>
Hi,

Attached are the modifications I had to make to get my PS/2 to GC keyboard 
adapter working properly. The adapter from "May Flash" and on the box it is 
called "GC Keyboard & PS Controller Adapter 2in1" (it can convert PSX 
joypads as well).

There are two parts to the modifications:
- getting the key codes from the raw data
- a few changes in the key mapping

The raw data was located in different nibbles as in the original code. I 
don't know if my adapter is different from the other keyboards/adapters, 
whether the data format is different in Wii mode compared to GC mode or 
whether the old code was simply broken.

The old code for the third key does look broken:
	key[2] = (raw[0] << 4) & 0xFF;
	key[2] |= (raw[1] << 28) & 0xFF;
The second statement has no effect, but if you replace "<<" by ">>", it 
starts making sense. Since this only makes a difference if 3 keys are 
pressed simultaneously, it's likely nobody noticed it, so the rest of it 
might still be correct.

If you look at the diff, the key mapping looks totally different, but that 
is because I had to realign the columns; in fact there are only a few 
changes:
	0A: scroll Lock
	36: PrtSc and numpad-slash
	37: numpad-star
	39: semicolon
	3A: apostrophe
	3F: backslash
	53: caps Lock
	cursors: 36 and listed
I'm using a US/International PS/2 PC keyboard, so differences are probably 
not due to a PC keyboard layout difference.

I am looking for someone with a different keyboard/adapter to test whether 
this new code works with it. And if it doesn't, if there is some way to 
auto-detect the keyboard type (maybe using other parts of the raw data).

Bye,
		Maarten

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/

_______________________________________________
Gc-linux-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/gc-linux-devel
keyboard.diff (text/x-diff, 9.8 KB)
Index: gcn-keymap.h
===================================================================
RCS file: /cvsroot/gc-linux/linux/drivers/input/si/gcn-keymap.h,v
retrieving revision 1.1
diff -u -r1.1 gcn-keymap.h
--- gcn-keymap.h	6 Jul 2005 16:41:08 -0000	1.1
+++ gcn-keymap.h	15 Mar 2008 12:57:19 -0000
@@ -1,46 +1,47 @@
 /*
  * keymap for a Datel adapater + US keyboard (not the normal keyboard)
  * not mapped:
- * 	printscreen / sysreq
- *	scroll lcok
+ *	printscreen / sysreq
  *	pause / break
  *	numlock
  *	windows key 1
  *	windows key 2
  *	windows menu key
+ *
+ * cursor keys send both 36 and their own code, so 36 must be RESERVED
  */
 
 static unsigned char gamecube_keymap[] = {
-	/* 00 */ KEY_RESERVED,  KEY_RESERVED, KEY_RESERVED,   KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,   KEY_HOME,      KEY_END,
-	/* 08 */ KEY_PAGEUP,    KEY_PAGEDOWN, KEY_RESERVED,   KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,
-	/* 10 */ KEY_A,         KEY_B,        KEY_C,          KEY_D,          KEY_E,         KEY_F,          KEY_G,         KEY_H,
-	/* 18 */ KEY_I,         KEY_J,        KEY_K,          KEY_L,          KEY_M,         KEY_N,          KEY_O,         KEY_P,
-	/* 20 */ KEY_Q,         KEY_R,        KEY_S,          KEY_T,          KEY_U,         KEY_V,          KEY_W,         KEY_X,
-	/* 28 */ KEY_Y,         KEY_Z,        KEY_1,          KEY_2,          KEY_3,         KEY_4,          KEY_5,         KEY_6,
-	/* 30 */ KEY_7,         KEY_8,        KEY_9,          KEY_0,          KEY_MINUS,     KEY_EQUAL,      KEY_BACKSLASH, KEY_APOSTROPHE,
-	/* 38 */ KEY_LEFTBRACE, KEY_EQUAL,    KEY_KPASTERISK, KEY_RIGHTBRACE, KEY_COMMA,     KEY_DOT,        KEY_SLASH,     KEY_RESERVED,
-	/* 40 */ KEY_F1,        KEY_F2,       KEY_F3,         KEY_F4,         KEY_F5,        KEY_F6,         KEY_F7,        KEY_F8,
-	/* 48 */ KEY_F9,        KEY_F10,      KEY_F11,        KEY_F12,        KEY_ESC,       KEY_INSERT,     KEY_DELETE,    KEY_GRAVE,
-	/* 50 */ KEY_BACKSPACE, KEY_TAB,      KEY_RESERVED,   KEY_CAPSLOCK,   KEY_LEFTSHIFT, KEY_RIGHTSHIFT, KEY_LEFTCTRL,  KEY_LEFTALT,
-	/* 58 */ KEY_RESERVED,  KEY_SPACE,    KEY_RESERVED,   KEY_RESERVED,   KEY_LEFT,      KEY_DOWN,       KEY_UP,        KEY_RIGHT,
-	/* 60 */ KEY_RESERVED,  KEY_ENTER,    KEY_RESERVED,   KEY_RESERVED,   KEY_SEMICOLON, KEY_KPPLUS,     KEY_RESERVED,  KEY_RESERVED,
-	/* 68 */ KEY_RESERVED,  KEY_RESERVED, KEY_RESERVED,   KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,
-	/* 70 */ KEY_RESERVED,  KEY_RESERVED, KEY_RESERVED,   KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,
-	/* 78 */ KEY_RESERVED,  KEY_RESERVED, KEY_RESERVED,   KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,
-	/* 80 */ KEY_RESERVED,  KEY_RESERVED, KEY_RESERVED,   KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,
-	/* 88 */ KEY_RESERVED,  KEY_RESERVED, KEY_RESERVED,   KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,
-	/* 90 */ KEY_RESERVED,  KEY_RESERVED, KEY_RESERVED,   KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,
-	/* 98 */ KEY_RESERVED,  KEY_RESERVED, KEY_RESERVED,   KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,
-	/* a0 */ KEY_RESERVED,  KEY_RESERVED, KEY_RESERVED,   KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,
-	/* a8 */ KEY_RESERVED,  KEY_RESERVED, KEY_RESERVED,   KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,
-	/* b0 */ KEY_RESERVED,  KEY_RESERVED, KEY_RESERVED,   KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,
-	/* b8 */ KEY_RESERVED,  KEY_RESERVED, KEY_RESERVED,   KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,
-	/* c0 */ KEY_RESERVED,  KEY_RESERVED, KEY_RESERVED,   KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,
-	/* c8 */ KEY_RESERVED,  KEY_RESERVED, KEY_RESERVED,   KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,
-	/* d0 */ KEY_RESERVED,  KEY_RESERVED, KEY_RESERVED,   KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,
-	/* d8 */ KEY_RESERVED,  KEY_RESERVED, KEY_RESERVED,   KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,
-	/* e0 */ KEY_RESERVED,  KEY_RESERVED, KEY_RESERVED,   KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,
-	/* e8 */ KEY_RESERVED,  KEY_RESERVED, KEY_RESERVED,   KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,
-	/* f0 */ KEY_RESERVED,  KEY_RESERVED, KEY_RESERVED,   KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,
-	/* f8 */ KEY_RESERVED,  KEY_RESERVED, KEY_RESERVED,   KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED
+	/* 00 */ KEY_RESERVED,  KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,   KEY_HOME,      KEY_END,
+	/* 08 */ KEY_PAGEUP,    KEY_PAGEDOWN,  KEY_SCROLLLOCK, KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,
+	/* 10 */ KEY_A,         KEY_B,         KEY_C,          KEY_D,          KEY_E,         KEY_F,          KEY_G,         KEY_H,
+	/* 18 */ KEY_I,         KEY_J,         KEY_K,          KEY_L,          KEY_M,         KEY_N,          KEY_O,         KEY_P,
+	/* 20 */ KEY_Q,         KEY_R,         KEY_S,          KEY_T,          KEY_U,         KEY_V,          KEY_W,         KEY_X,
+	/* 28 */ KEY_Y,         KEY_Z,         KEY_1,          KEY_2,          KEY_3,         KEY_4,          KEY_5,         KEY_6,
+	/* 30 */ KEY_7,         KEY_8,         KEY_9,          KEY_0,          KEY_MINUS,     KEY_EQUAL,      KEY_RESERVED,  KEY_KPASTERISK,
+	/* 38 */ KEY_LEFTBRACE, KEY_SEMICOLON, KEY_APOSTROPHE, KEY_RIGHTBRACE, KEY_COMMA,     KEY_DOT,        KEY_SLASH,     KEY_BACKSLASH,
+	/* 40 */ KEY_F1,        KEY_F2,        KEY_F3,         KEY_F4,         KEY_F5,        KEY_F6,         KEY_F7,        KEY_F8,
+	/* 48 */ KEY_F9,        KEY_F10,       KEY_F11,        KEY_F12,        KEY_ESC,       KEY_INSERT,     KEY_DELETE,    KEY_GRAVE,
+	/* 50 */ KEY_BACKSPACE, KEY_TAB,       KEY_RESERVED,   KEY_CAPSLOCK,   KEY_LEFTSHIFT, KEY_RIGHTSHIFT, KEY_LEFTCTRL,  KEY_LEFTALT,
+	/* 58 */ KEY_RESERVED,  KEY_SPACE,     KEY_RESERVED,   KEY_RESERVED,   KEY_LEFT,      KEY_DOWN,       KEY_UP,        KEY_RIGHT,
+	/* 60 */ KEY_RESERVED,  KEY_ENTER,     KEY_RESERVED,   KEY_RESERVED,   KEY_SEMICOLON, KEY_KPPLUS,     KEY_RESERVED,  KEY_RESERVED,
+	/* 68 */ KEY_RESERVED,  KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,
+	/* 70 */ KEY_RESERVED,  KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,
+	/* 78 */ KEY_RESERVED,  KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,
+	/* 80 */ KEY_RESERVED,  KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,
+	/* 88 */ KEY_RESERVED,  KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,
+	/* 90 */ KEY_RESERVED,  KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,
+	/* 98 */ KEY_RESERVED,  KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,
+	/* a0 */ KEY_RESERVED,  KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,
+	/* a8 */ KEY_RESERVED,  KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,
+	/* b0 */ KEY_RESERVED,  KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,
+	/* b8 */ KEY_RESERVED,  KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,
+	/* c0 */ KEY_RESERVED,  KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,
+	/* c8 */ KEY_RESERVED,  KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,
+	/* d0 */ KEY_RESERVED,  KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,
+	/* d8 */ KEY_RESERVED,  KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,
+	/* e0 */ KEY_RESERVED,  KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,
+	/* e8 */ KEY_RESERVED,  KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,
+	/* f0 */ KEY_RESERVED,  KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,
+	/* f8 */ KEY_RESERVED,  KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED,   KEY_RESERVED,  KEY_RESERVED
 };
Index: gcn-si.c
===================================================================
RCS file: /cvsroot/gc-linux/linux/drivers/input/si/gcn-si.c,v
retrieving revision 1.8
diff -u -r1.8 gcn-si.c
--- gcn-si.c	4 Mar 2008 06:01:49 -0000	1.8
+++ gcn-si.c	15 Mar 2008 12:57:19 -0000
@@ -329,10 +329,19 @@
 		break;
 		
 	case CTL_KEYBOARD:
-		key[0] = (raw[0] >> 12) & 0xFF;
-		key[1] = (raw[0] >> 4) & 0xFF;
-		key[2] = (raw[0] << 4) & 0xFF;
-		key[2] |= (raw[1] << 28) & 0xFF;
+		/*
+		raw nibbles:
+		  [4]<C>[0][0][0][0][0][0] <1H><1L><2H><2L><3H><3L><X><C>
+		where:
+		  [n] = fixed to n
+		  <nH> <nL> = high / low nibble of n-th key pressed
+		              (0 if not pressed)
+		  <X> = <1H> xor <2H> xor <3H>
+		  <C> = counter: 0, 0, 1, 1, 2, 2, ..., F, F, 0, 0, ...
+		*/
+		key[0] = (raw[1] >> 24) & 0xFF;
+		key[1] = (raw[1] >> 16) & 0xFF;
+		key[2] = (raw[1] >>  8) & 0xFF;
 
 		/* check if anything was released */
 		for (i = 0; i < 3; ++i) {
signature.asc (application/pgp-signature, 194 B)
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.4-svn0 (GNU/Linux)

iD8DBQBH28yzvd8ks9mF64IRAjbyAJ96X8smGZG42KPh0aSLs+Lzx2Be/gCggTFU
rN+72XdF2wDQluBFDtORg3w=
=go9h
-----END PGP SIGNATURE-----