[NTVDM]: We can specify device "command" procedures for each PS/2 port so that when...
authorHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Tue, 16 Sep 2014 18:54:50 +0000 (18:54 +0000)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Tue, 16 Sep 2014 18:54:50 +0000 (18:54 +0000)
svn path=/trunk/; revision=64171

reactos/subsystems/ntvdm/hardware/keyboard.c
reactos/subsystems/ntvdm/hardware/keyboard.h
reactos/subsystems/ntvdm/hardware/mouse.c
reactos/subsystems/ntvdm/hardware/mouse.h
reactos/subsystems/ntvdm/hardware/ps2.c
reactos/subsystems/ntvdm/hardware/ps2.h

index d5669ce..7ce2aa2 100644 (file)
 #include "keyboard.h"
 #include "ps2.h"
 
+/* PRIVATE VARIABLES **********************************************************/
+
 static BYTE PS2Port = 0;
 
+/* PRIVATE FUNCTIONS **********************************************************/
+
+static VOID WINAPI KeyboardCommand(LPVOID Param, BYTE Command)
+{
+    UNIMPLEMENTED;
+}
+
 /* PUBLIC FUNCTIONS ***********************************************************/
 
 VOID KeyboardEventHandler(PKEY_EVENT_RECORD KeyEvent)
@@ -34,13 +43,11 @@ VOID KeyboardEventHandler(PKEY_EVENT_RECORD KeyEvent)
     // PicInterruptRequest(1);
 }
 
-VOID KeyboardCommand(BYTE Command)
-{
-    UNIMPLEMENTED;
-}
-
 BOOLEAN KeyboardInit(BYTE PS2Connector)
 {
+    /* Finish to plug the mouse to the specified PS/2 port */
     PS2Port = PS2Connector;
+    PS2SetDeviceCmdProc(PS2Port, NULL, KeyboardCommand);
+
     return TRUE;
 }
index bbbe9be..39c91bc 100644 (file)
@@ -22,7 +22,6 @@
 /* FUNCTIONS ******************************************************************/
 
 VOID KeyboardEventHandler(PKEY_EVENT_RECORD KeyEvent);
-VOID KeyboardCommand(BYTE Command);
 BOOLEAN KeyboardInit(BYTE PS2Connector);
 
 #endif // _KEYBOARD_H_
index 9956afb..9c5c84e 100644 (file)
@@ -136,31 +136,17 @@ static VOID MouseGetPacket(PMOUSE_PACKET Packet)
     ButtonState = NewButtonState;
 }
 
-/* PUBLIC FUNCTIONS ***********************************************************/
-
-VOID MouseEventHandler(PMOUSE_EVENT_RECORD MouseEvent)
-{
-    // FIXME: Sync our private data
-
-    // HACK: Bypass PS/2 and instead, notify the MOUSE.COM driver directly
-    MouseBiosUpdatePosition(&MouseEvent->dwMousePosition);
-    MouseBiosUpdateButtons(LOWORD(MouseEvent->dwButtonState));
-
-    // PS2QueuePush(PS2Port, Data);
-    // PicInterruptRequest(12);
-}
-
-VOID MouseScroll(LONG Direction)
+/*static*/ VOID MouseScroll(LONG Direction)
 {
     ScrollCounter += Direction;
 }
 
-COORD MouseGetPosition(VOID)
+/*static*/ COORD MouseGetPosition(VOID)
 {
     return Position;
 }
 
-VOID MouseCommand(BYTE Command)
+static VOID WINAPI MouseCommand(LPVOID Param, BYTE Command)
 {
     switch (Command)
     {
@@ -319,6 +305,20 @@ VOID MouseCommand(BYTE Command)
     }
 }
 
+/* PUBLIC FUNCTIONS ***********************************************************/
+
+VOID MouseEventHandler(PMOUSE_EVENT_RECORD MouseEvent)
+{
+    // FIXME: Sync our private data
+
+    // HACK: Bypass PS/2 and instead, notify the MOUSE.COM driver directly
+    MouseBiosUpdatePosition(&MouseEvent->dwMousePosition);
+    MouseBiosUpdateButtons(LOWORD(MouseEvent->dwButtonState));
+
+    // PS2QueuePush(PS2Port, Data);
+    // PicInterruptRequest(12);
+}
+
 BOOLEAN MouseInit(BYTE PS2Connector)
 {
     HWND hWnd;
@@ -341,7 +341,9 @@ BOOLEAN MouseInit(BYTE PS2Connector)
     /* Release the device context */
     ReleaseDC(hWnd, hDC);
 
+    /* Finish to plug the mouse to the specified PS/2 port */
     PS2Port = PS2Connector;
+    PS2SetDeviceCmdProc(PS2Port, NULL, MouseCommand);
 
     MouseReset();
     return TRUE;
index d3ad0b9..66fc2d0 100644 (file)
@@ -69,11 +69,6 @@ typedef struct _MOUSE_PACKET
 /* FUNCTIONS ******************************************************************/
 
 VOID MouseEventHandler(PMOUSE_EVENT_RECORD MouseEvent);
-
-VOID MouseScroll(LONG Direction);
-COORD MouseGetPosition(VOID);
-
-VOID MouseCommand(BYTE Command);
 BOOLEAN MouseInit(BYTE PS2Connector);
 
 #endif // _MOUSE_H_
index c78453b..d354c60 100644 (file)
@@ -16,9 +16,6 @@
 #include "ps2.h"
 #include "pic.h"
 
-#include "keyboard.h"
-#include "mouse.h"
-
 /* PRIVATE VARIABLES **********************************************************/
 
 #define BUFFER_SIZE 32
@@ -32,6 +29,9 @@ typedef struct _PS2_PORT
     UINT    QueueStart;
     UINT    QueueEnd;
     HANDLE  QueueMutex;
+
+    LPVOID             Param;
+    PS2_DEVICE_CMDPROC DeviceCommand;
 } PS2_PORT, *PPS2_PORT;
 
 /*
@@ -51,6 +51,14 @@ static BYTE OutputBuffer = 0x00; // PS/2 Output Buffer
 
 /* PRIVATE FUNCTIONS **********************************************************/
 
+static VOID PS2SendCommand(PPS2_PORT Port, BYTE Command)
+{
+    if (!Port->IsEnabled) return;
+
+    /* Call the device command */
+    if (Port->DeviceCommand) Port->DeviceCommand(Port->Param, Command);
+}
+
 static BYTE WINAPI PS2ReadPort(ULONG Port)
 {
     if (Port == PS2_CONTROL_PORT)
@@ -238,10 +246,7 @@ static VOID WINAPI PS2WritePort(ULONG Port, BYTE Data)
                  */
                 case 0xD4:
                 {
-                    if (Ports[1].IsEnabled)
-                        // Ports[1].Function
-                        MouseCommand(Data);
-
+                    PS2SendCommand(&Ports[1], Data);
                     break;
                 }
             }
@@ -249,10 +254,8 @@ static VOID WINAPI PS2WritePort(ULONG Port, BYTE Data)
             return;
         }
 
-        // TODO: Implement PS/2 device commands
-        if (Ports[0].IsEnabled)
-            // Ports[0].Function
-            KeyboardCommand(Data);
+        /* By default, send a command to the first PS/2 port */
+        PS2SendCommand(&Ports[0], Data);
     }
 }
 
@@ -301,6 +304,14 @@ Done:
 
 /* PUBLIC FUNCTIONS ***********************************************************/
 
+VOID PS2SetDeviceCmdProc(BYTE PS2Port, LPVOID Param, PS2_DEVICE_CMDPROC DeviceCommand)
+{
+    if (PS2Port >= PS2_PORTS) return;
+
+    Ports[PS2Port].Param         = Param;
+    Ports[PS2Port].DeviceCommand = DeviceCommand;
+}
+
 // PS2SendToPort
 BOOLEAN PS2QueuePush(BYTE PS2Port, BYTE Data)
 {
index 2bf21f2..95fb02a 100644 (file)
 #define PS2_DATA_PORT       0x60
 #define PS2_CONTROL_PORT    0x64
 
+typedef VOID (WINAPI *PS2_DEVICE_CMDPROC)(LPVOID Param, BYTE Command);
+
 /* FUNCTIONS ******************************************************************/
 
+VOID PS2SetDeviceCmdProc(BYTE PS2Port, LPVOID Param, PS2_DEVICE_CMDPROC DeviceCommand);
+
 BOOLEAN PS2QueuePush(BYTE PS2Port, BYTE Data);
 
 VOID GenerateIrq1(VOID);