ReactOS  0.4.14-dev-114-gc8cbd56
ps2.h File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define PS2_DATA_PORT   0x60
 
#define PS2_CONTROL_PORT   0x64
 
#define PS2_STAT_OUT_BUF_FULL   (1 << 0)
 
#define PS2_STAT_SYSTEM   (1 << 2)
 
#define PS2_STAT_COMMAND   (1 << 3)
 
#define PS2_STAT_KBD_ENABLE   (1 << 4)
 
#define PS2_STAT_AUX_OUT_BUF_FULL   (1 << 5)
 
#define PS2_STAT_GEN_TIMEOUT   (1 << 6)
 
#define PS2_STAT_PARITY_ERROR   (1 << 7)
 
#define PS2_CONFIG_KBD_INT   (1 << 0)
 
#define PS2_CONFIG_AUX_INT   (1 << 1)
 
#define PS2_CONFIG_SYSTEM   (1 << 2)
 
#define PS2_CONFIG_NO_KEYLOCK   (1 << 3)
 
#define PS2_CONFIG_KBD_DISABLE   (1 << 4)
 
#define PS2_CONFIG_AUX_DISABLE   (1 << 5)
 
#define PS2_OUT_CPU_NO_RESET   (1 << 0)
 
#define PS2_OUT_A20_SET   (1 << 1)
 
#define PS2_OUT_AUX_DATA   (1 << 2)
 
#define PS2_OUT_IRQ01   (1 << 4)
 
#define PS2_OUT_IRQ12   (1 << 5)
 
#define PS2_OUT_KBD_DATA   (1 << 7)
 

Typedefs

typedef VOID(WINAPIPS2_DEVICE_CMDPROC) (LPVOID Param, BYTE Command)
 

Functions

VOID PS2SetDeviceCmdProc (BYTE PS2Port, LPVOID Param, PS2_DEVICE_CMDPROC DeviceCommand)
 
BOOLEAN PS2QueuePush (BYTE PS2Port, BYTE Data)
 
BOOLEAN PS2PortQueueRead (BYTE PS2Port)
 
BOOLEAN PS2Initialize (VOID)
 
VOID PS2Cleanup (VOID)
 

Macro Definition Documentation

◆ PS2_CONFIG_AUX_DISABLE

#define PS2_CONFIG_AUX_DISABLE   (1 << 5)

Definition at line 35 of file ps2.h.

◆ PS2_CONFIG_AUX_INT

#define PS2_CONFIG_AUX_INT   (1 << 1)

Definition at line 31 of file ps2.h.

◆ PS2_CONFIG_KBD_DISABLE

#define PS2_CONFIG_KBD_DISABLE   (1 << 4)

Definition at line 34 of file ps2.h.

◆ PS2_CONFIG_KBD_INT

#define PS2_CONFIG_KBD_INT   (1 << 0)

Definition at line 30 of file ps2.h.

◆ PS2_CONFIG_NO_KEYLOCK

#define PS2_CONFIG_NO_KEYLOCK   (1 << 3)

Definition at line 33 of file ps2.h.

◆ PS2_CONFIG_SYSTEM

#define PS2_CONFIG_SYSTEM   (1 << 2)

Definition at line 32 of file ps2.h.

◆ PS2_CONTROL_PORT

#define PS2_CONTROL_PORT   0x64

Definition at line 17 of file ps2.h.

◆ PS2_DATA_PORT

#define PS2_DATA_PORT   0x60

Definition at line 16 of file ps2.h.

◆ PS2_OUT_A20_SET

#define PS2_OUT_A20_SET   (1 << 1)

Definition at line 40 of file ps2.h.

◆ PS2_OUT_AUX_DATA

#define PS2_OUT_AUX_DATA   (1 << 2)

Definition at line 41 of file ps2.h.

◆ PS2_OUT_CPU_NO_RESET

#define PS2_OUT_CPU_NO_RESET   (1 << 0)

Definition at line 39 of file ps2.h.

◆ PS2_OUT_IRQ01

#define PS2_OUT_IRQ01   (1 << 4)

Definition at line 43 of file ps2.h.

◆ PS2_OUT_IRQ12

#define PS2_OUT_IRQ12   (1 << 5)

Definition at line 44 of file ps2.h.

◆ PS2_OUT_KBD_DATA

#define PS2_OUT_KBD_DATA   (1 << 7)

Definition at line 46 of file ps2.h.

◆ PS2_STAT_AUX_OUT_BUF_FULL

#define PS2_STAT_AUX_OUT_BUF_FULL   (1 << 5)

Definition at line 25 of file ps2.h.

◆ PS2_STAT_COMMAND

#define PS2_STAT_COMMAND   (1 << 3)

Definition at line 23 of file ps2.h.

◆ PS2_STAT_GEN_TIMEOUT

#define PS2_STAT_GEN_TIMEOUT   (1 << 6)

Definition at line 26 of file ps2.h.

◆ PS2_STAT_KBD_ENABLE

#define PS2_STAT_KBD_ENABLE   (1 << 4)

Definition at line 24 of file ps2.h.

◆ PS2_STAT_OUT_BUF_FULL

#define PS2_STAT_OUT_BUF_FULL   (1 << 0)

Definition at line 20 of file ps2.h.

◆ PS2_STAT_PARITY_ERROR

#define PS2_STAT_PARITY_ERROR   (1 << 7)

Definition at line 27 of file ps2.h.

◆ PS2_STAT_SYSTEM

#define PS2_STAT_SYSTEM   (1 << 2)

Definition at line 22 of file ps2.h.

Typedef Documentation

◆ PS2_DEVICE_CMDPROC

typedef VOID(WINAPI * PS2_DEVICE_CMDPROC) (LPVOID Param, BYTE Command)

Definition at line 48 of file ps2.h.

Function Documentation

◆ PS2Cleanup()

VOID PS2Cleanup ( VOID  )

Definition at line 546 of file ps2.c.

547 {
549 
550  CloseHandle(Ports[1].QueueMutex);
551  CloseHandle(Ports[0].QueueMutex);
552 }
#define CloseHandle
Definition: compat.h:398
static PS2_PORT Ports[PS2_PORTS]
Definition: ps2.c:52
VOID DestroyHardwareTimer(PHARDWARE_TIMER Timer)
Definition: clock.c:210
static PHARDWARE_TIMER IrqTimer
Definition: ps2.c:63

Referenced by EmulatorCleanup().

◆ PS2Initialize()

BOOLEAN PS2Initialize ( VOID  )

Definition at line 520 of file ps2.c.

521 {
522  /* Initialize the PS/2 ports */
523  Ports[0].IsEnabled = FALSE;
524  Ports[0].QueueEmpty = TRUE;
525  Ports[0].QueueStart = 0;
526  Ports[0].QueueEnd = 0;
528 
529  Ports[1].IsEnabled = FALSE;
530  Ports[1].QueueEmpty = TRUE;
531  Ports[1].QueueStart = 0;
532  Ports[1].QueueEnd = 0;
534 
535  /* Register the I/O Ports */
538 
540  HZ_TO_NS(100),
542 
543  return TRUE;
544 }
#define PS2_DATA_PORT
Definition: ps2.h:16
#define TRUE
Definition: types.h:120
UINT QueueStart
Definition: ps2.c:39
static BYTE WINAPI PS2ReadData(USHORT Port)
Definition: ps2.c:109
BOOLEAN QueueEmpty
Definition: ps2.c:37
VOID RegisterIoPort(USHORT Port, EMULATOR_INB_PROC InHandler, EMULATOR_OUTB_PROC OutHandler)
Definition: io.c:320
static VOID FASTCALL GeneratePS2Irq(ULONGLONG ElapsedTime)
Definition: ps2.c:392
static VOID WINAPI PS2WriteControl(USHORT Port, BYTE Data)
Definition: ps2.c:130
BOOLEAN IsEnabled
Definition: ps2.c:35
PHARDWARE_TIMER CreateHardwareTimer(ULONG Flags, ULONGLONG Delay, PHARDWARE_TIMER_PROC Callback)
Definition: clock.c:144
smooth NULL
Definition: ftsmooth.c:416
#define CreateMutex
Definition: winbase.h:3580
static PS2_PORT Ports[PS2_PORTS]
Definition: ps2.c:52
#define HARDWARE_TIMER_ONESHOT
Definition: clock.h:16
#define PS2_CONTROL_PORT
Definition: ps2.h:17
static VOID WINAPI PS2WriteData(USHORT Port, BYTE Data)
Definition: ps2.c:278
#define HZ_TO_NS(Freq)
Definition: clock.h:20
static BYTE WINAPI PS2ReadControl(USHORT Port)
Definition: ps2.c:90
HANDLE QueueMutex
Definition: ps2.c:41
UINT QueueEnd
Definition: ps2.c:40
static PHARDWARE_TIMER IrqTimer
Definition: ps2.c:63

Referenced by EmulatorInitialize().

◆ PS2PortQueueRead()

BOOLEAN PS2PortQueueRead ( BYTE  PS2Port)

Definition at line 415 of file ps2.c.

416 {
417  BOOLEAN Result = FALSE;
418  PPS2_PORT Port;
419 
420  // NOTE: The first PS/2 port (keyboard) has priority over the second one (mouse).
421 
422  Port = &Ports[PS2Port];
423 
424  if (!Port->IsEnabled) return FALSE;
425 
426  /* Make sure the queue is not empty (fast check) */
427  if (Port->QueueEmpty)
428  {
429  /* Only the keyboard should have its last data latched */
430  // FIXME: Alternatively this can be done in PS2ReadData when
431  // we read PS2_DATA_PORT. What is the best solution??
432  if (PS2Port == 0)
433  {
434  OutputBuffer = Port->Queue[(Port->QueueStart - 1) % BUFFER_SIZE];
435  StatusRegister &= ~PS2_STAT_AUX_OUT_BUF_FULL; // Clear flag: keyboard data
436  }
437 
438  return FALSE;
439  }
440 
441  WaitForSingleObject(Port->QueueMutex, INFINITE);
442 
443  /*
444  * Recheck whether the queue is not empty (it may
445  * have changed after having grabbed the mutex).
446  */
447  if (Port->QueueEmpty) goto Done;
448 
449  /* Get the data */
450  OutputBuffer = Port->Queue[Port->QueueStart];
451 
452  // StatusRegister &= ~(PS2_STAT_AUX_OUT_BUF_FULL | PS2_STAT_OUT_BUF_FULL);
453 
454  /* Always set the "Output buffer full" flag */
456 
457  /* Set the "Auxiliary output buffer full" flag according to where the data came from */
458  if (PS2Port == 0)
459  StatusRegister &= ~PS2_STAT_AUX_OUT_BUF_FULL; // Clear flag: keyboard data
460  else // if (PS2Port == 1)
461  StatusRegister |= PS2_STAT_AUX_OUT_BUF_FULL; // Set flag: mouse data
462 
463  /* Remove the value from the queue */
464  Port->QueueStart++;
465  Port->QueueStart %= BUFFER_SIZE;
466 
467  /* Check if the queue is now empty */
468  if (Port->QueueStart == Port->QueueEnd)
469  Port->QueueEmpty = TRUE;
470 
471  Result = TRUE;
472 
473 Done:
474  ReleaseMutex(Port->QueueMutex);
475  return Result;
476 }
static BYTE StatusRegister
Definition: ps2.c:57
CPPORT Port[4]
Definition: headless.c:34
#define TRUE
Definition: types.h:120
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
#define BUFFER_SIZE
Definition: ps2.c:31
unsigned char BOOLEAN
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:426
Definition: ps2.c:33
static PS2_PORT Ports[PS2_PORTS]
Definition: ps2.c:52
BOOL WINAPI DECLSPEC_HOTPATCH ReleaseMutex(IN HANDLE hMutex)
Definition: synch.c:618
static BYTE OutputBuffer
Definition: ps2.c:59
#define PS2_STAT_OUT_BUF_FULL
Definition: ps2.h:20
#define INFINITE
Definition: serial.h:102
#define PS2_STAT_AUX_OUT_BUF_FULL
Definition: ps2.h:25

Referenced by DisableMouseInt(), DosMouseIrq(), EnableMouseInt(), GeneratePS2Irq(), ReadMouseData(), and SendMouseCommand().

◆ PS2QueuePush()

BOOLEAN PS2QueuePush ( BYTE  PS2Port,
BYTE  Data 
)

Definition at line 486 of file ps2.c.

487 {
488  BOOLEAN Result = FALSE;
489  PPS2_PORT Port;
490 
491  ASSERT(PS2Port < PS2_PORTS);
492  Port = &Ports[PS2Port];
493 
494  if (!Port->IsEnabled) return FALSE;
495 
496  WaitForSingleObject(Port->QueueMutex, INFINITE);
497 
498  /* Check if the queue is full */
499  if (!Port->QueueEmpty && (Port->QueueStart == Port->QueueEnd))
500  goto Done;
501 
502  /* Insert the value in the queue */
503  Port->Queue[Port->QueueEnd] = Data;
504  Port->QueueEnd++;
505  Port->QueueEnd %= BUFFER_SIZE;
506 
507  /* The queue is not empty anymore */
508  Port->QueueEmpty = FALSE;
509 
510  /* Schedule the IRQ */
512 
513  Result = TRUE;
514 
515 Done:
516  ReleaseMutex(Port->QueueMutex);
517  return Result;
518 }
CPPORT Port[4]
Definition: headless.c:34
#define TRUE
Definition: types.h:120
#define PS2_PORTS
Definition: ps2.c:51
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
#define BUFFER_SIZE
Definition: ps2.c:31
unsigned char BOOLEAN
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:426
_In_ LPGUID _In_ PVOID Data
Definition: classpnp.h:778
Definition: ps2.c:33
static PS2_PORT Ports[PS2_PORTS]
Definition: ps2.c:52
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
BOOL WINAPI DECLSPEC_HOTPATCH ReleaseMutex(IN HANDLE hMutex)
Definition: synch.c:618
VOID EnableHardwareTimer(PHARDWARE_TIMER Timer)
Definition: clock.c:161
#define INFINITE
Definition: serial.h:102
static PHARDWARE_TIMER IrqTimer
Definition: ps2.c:63

Referenced by KeyboardCommand(), KeyboardEventHandler(), MouseCommand(), MouseDispatchPacket(), and PS2WriteData().

◆ PS2SetDeviceCmdProc()

VOID PS2SetDeviceCmdProc ( BYTE  PS2Port,
LPVOID  Param,
PS2_DEVICE_CMDPROC  DeviceCommand 
)

Definition at line 478 of file ps2.c.

479 {
480  ASSERT(PS2Port < PS2_PORTS);
481  Ports[PS2Port].Param = Param;
482  Ports[PS2Port].DeviceCommand = DeviceCommand;
483 }
#define PS2_PORTS
Definition: ps2.c:51
PS2_DEVICE_CMDPROC DeviceCommand
Definition: ps2.c:44
static PS2_PORT Ports[PS2_PORTS]
Definition: ps2.c:52
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
LPVOID Param
Definition: ps2.c:43

Referenced by KeyboardInit(), and MouseInit().