Patch by tinus: Resolves issue of keyboard detection when e.g. booting ReactOS under VMWare with no keyboard grabbed.
Modified: trunk/reactos/drivers/input/i8042prt/keyboard.c

Modified: trunk/reactos/drivers/input/i8042prt/keyboard.c
--- trunk/reactos/drivers/input/i8042prt/keyboard.c	2005-05-06 20:45:30 UTC (rev 15061)
+++ trunk/reactos/drivers/input/i8042prt/keyboard.c	2005-05-06 21:18:20 UTC (rev 15062)
@@ -551,6 +551,26 @@
 	return Irp->IoStatus.Status;
 }
 
+/* This is all pretty confusing. There's more than one way to
+ * disable/enable the keyboard. You can send KBD_ENABLE to the
+ * keyboard, and it will start scanning keys. Sending KBD_DISABLE
+ * will disable the key scanning but also reset the parameters to
+ * defaults.
+ *
+ * You can also send 0xAE to the controller for enabling the
+ * keyboard clock line and 0xAD for disabling it. Then it'll
+ * automatically get turned on at the next command. The last
+ * way is by modifying the bit that drives the clock line in the
+ * 'command byte' of the controller. This is almost, but not quite,
+ * the same as the AE/AD thing. The difference can be used to detect
+ * some really old broken keyboard controllers which I hope won't be
+ * necessary.
+ *
+ * Anyway, disabling the keyboard helps the detection and it also
+ * clears the keyboard buffer and sets defaults which is what we
+ * want.
+ */
+
 BOOLEAN STDCALL I8042KeyboardEnable(PDEVICE_EXTENSION DevExt)
 {
 	DPRINT("Enabling keyboard\n");
@@ -564,6 +584,19 @@
 	return TRUE;
 }
 
+BOOLEAN STDCALL I8042KeyboardDefaultsAndDisable(PDEVICE_EXTENSION DevExt)
+{
+	DPRINT("Disabling keyboard\n");
+	if (STATUS_SUCCESS != I8042SynchWritePort(DevExt,
+	                                          0,
+	                                          KBD_DISABLE,
+	                                          TRUE)) {
+		DPRINT("Can't disable keyboard\n");
+		return FALSE;
+	}
+	return TRUE;
+}
+
 BOOLEAN STDCALL I8042KeyboardEnableInterrupt(PDEVICE_EXTENSION DevExt)
 {
 	UCHAR Value;
@@ -606,12 +639,14 @@
 
 	DPRINT("Detecting keyboard\n");
 
+	I8042KeyboardDefaultsAndDisable(DevExt);
+
 	do {
 		Status = I8042SynchWritePort(DevExt, 0, KBD_GET_ID, TRUE);
 	} while (STATUS_TIMEOUT == Status && RetryCount--);
 
 	if (Status != STATUS_SUCCESS) {
-		DPRINT("Can't write GET_ID (%x)\n", Status);
+		DPRINT1("Can't write GET_ID (%x)\n", Status);
 		return FALSE;
 	}