#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)
// 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;
}
/* FUNCTIONS ******************************************************************/
VOID KeyboardEventHandler(PKEY_EVENT_RECORD KeyEvent);
-VOID KeyboardCommand(BYTE Command);
BOOLEAN KeyboardInit(BYTE PS2Connector);
#endif // _KEYBOARD_H_
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)
{
}
}
+/* 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;
/* 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;
/* 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_
#include "ps2.h"
#include "pic.h"
-#include "keyboard.h"
-#include "mouse.h"
-
/* PRIVATE VARIABLES **********************************************************/
#define BUFFER_SIZE 32
UINT QueueStart;
UINT QueueEnd;
HANDLE QueueMutex;
+
+ LPVOID Param;
+ PS2_DEVICE_CMDPROC DeviceCommand;
} PS2_PORT, *PPS2_PORT;
/*
/* 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)
*/
case 0xD4:
{
- if (Ports[1].IsEnabled)
- // Ports[1].Function
- MouseCommand(Data);
-
+ PS2SendCommand(&Ports[1], Data);
break;
}
}
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);
}
}
/* 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)
{
#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);