[NTVDM]: We can specify device "command" procedures for each PS/2 port so that when one writes to port 0x60, one can write to the correct device "plugged" into it (keyboard, mouse). modularity++;

svn path=/trunk/; revision=64171
This commit is contained in:
Hermès Bélusca-Maïto 2014-09-16 18:54:50 +00:00
parent 28b04f02e8
commit a760af54a3
6 changed files with 57 additions and 39 deletions

View file

@ -13,8 +13,17 @@
#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;
}

View file

@ -22,7 +22,6 @@
/* FUNCTIONS ******************************************************************/
VOID KeyboardEventHandler(PKEY_EVENT_RECORD KeyEvent);
VOID KeyboardCommand(BYTE Command);
BOOLEAN KeyboardInit(BYTE PS2Connector);
#endif // _KEYBOARD_H_

View 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;

View 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_

View 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)
{

View file

@ -19,8 +19,12 @@
#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);