529 lines
9.9 KiB
C
529 lines
9.9 KiB
C
/*++
|
||
|
||
Copyright (c) 1989, 1990, 1991, 1992, 1993 Microsoft Corporation
|
||
Copyright (c) 1993 Logitech Inc.
|
||
|
||
Module Name:
|
||
|
||
sermouse.h
|
||
|
||
Abstract:
|
||
|
||
These are the structures and defines that are used in the
|
||
i8250 serial mouse port driver.
|
||
|
||
Revision History:
|
||
|
||
|
||
--*/
|
||
|
||
#ifndef _SERMOUSE_
|
||
#define _SERMOUSE_
|
||
|
||
#include <ntddmou.h>
|
||
#include "kbdmou.h"
|
||
#include "sermcfg.h"
|
||
#include "uart.h"
|
||
|
||
//
|
||
// Default number of buttons and sample rate for the serial mouse.
|
||
//
|
||
|
||
#define MOUSE_NUMBER_OF_BUTTONS 2
|
||
#define MOUSE_SAMPLE_RATE 40 // 1200 baud
|
||
|
||
|
||
//
|
||
// Protocol handler state constants.
|
||
//
|
||
|
||
#define STATE0 0 // Sync bit, buttons and high x & y bits
|
||
#define STATE1 1 // lower x bits
|
||
#define STATE2 2 // lower y bits
|
||
#define STATE3 3 // Switch 2, extended packet bit & low z data
|
||
#define STATE4 4 // high z data
|
||
#define STATE_MAX 5
|
||
|
||
//
|
||
// Useful constants.
|
||
//
|
||
|
||
#define MOUSE_BUTTON_1 0x01
|
||
#define MOUSE_BUTTON_2 0x02
|
||
#define MOUSE_BUTTON_3 0x04
|
||
|
||
#define MOUSE_BUTTON_LEFT 0x01
|
||
#define MOUSE_BUTTON_RIGHT 0x02
|
||
#define MOUSE_BUTTON_MIDDLE 0x04
|
||
|
||
//
|
||
// Conversion factor for milliseconds to microseconds.
|
||
//
|
||
|
||
#define MS_TO_MICROSECONDS 1000
|
||
|
||
//
|
||
// Protocol handler static data.
|
||
//
|
||
|
||
typedef struct _HANDLER_DATA {
|
||
ULONG Error; // Error count
|
||
ULONG State; // Keep the current state
|
||
ULONG PreviousButtons; // The previous button state
|
||
UCHAR Raw[STATE_MAX]; // Accumulate raw data
|
||
} HANDLER_DATA, *PHANDLER_DATA;
|
||
|
||
|
||
//
|
||
// Define the protocol handler type.
|
||
//
|
||
|
||
typedef BOOLEAN
|
||
(*PPROTOCOL_HANDLER)(
|
||
IN PMOUSE_INPUT_DATA CurrentInput,
|
||
IN PHANDLER_DATA HandlerData,
|
||
IN UCHAR Value,
|
||
IN UCHAR LineState);
|
||
|
||
//
|
||
// Defines for DeviceExtension->HardwarePresent.
|
||
// These should match the values in i8042prt
|
||
//
|
||
|
||
#define MOUSE_HARDWARE_PRESENT 0x02
|
||
#define BALLPOINT_HARDWARE_PRESENT 0x04
|
||
#define WHEELMOUSE_HARDWARE_PRESENT 0x08
|
||
|
||
//
|
||
// Serial mouse configuration information.
|
||
//
|
||
|
||
typedef struct _SERIAL_MOUSE_CONFIGURATION_INFORMATION {
|
||
|
||
//
|
||
// Bus interface type.
|
||
//
|
||
|
||
INTERFACE_TYPE InterfaceType;
|
||
|
||
//
|
||
// Bus Number.
|
||
//
|
||
|
||
ULONG BusNumber;
|
||
|
||
//
|
||
// The port/register resources used by this device.
|
||
//
|
||
|
||
CM_PARTIAL_RESOURCE_DESCRIPTOR PortList[1];
|
||
ULONG PortListCount;
|
||
|
||
//
|
||
// Interrupt resources.
|
||
//
|
||
|
||
CM_PARTIAL_RESOURCE_DESCRIPTOR MouseInterrupt;
|
||
|
||
//
|
||
// The mapped address for the set of this device's registers.
|
||
//
|
||
|
||
PUCHAR DeviceRegisters[1];
|
||
|
||
//
|
||
// The external frequency at which the UART is being driven.
|
||
//
|
||
|
||
ULONG BaudClock;
|
||
|
||
//
|
||
// The saved initial UART state.
|
||
//
|
||
|
||
UART UartSaved;
|
||
|
||
//
|
||
// Set at intialization to indicate that the base register
|
||
// address must be unmapped when the driver is unloaded.
|
||
//
|
||
|
||
BOOLEAN UnmapRegistersRequired;
|
||
|
||
//
|
||
// Flag set through the registry to force the type of hardware
|
||
// (bypassing NtDetect).
|
||
//
|
||
|
||
LONG OverrideHardwarePresent;
|
||
|
||
//
|
||
// Flag that indicates whether floating point context should be saved.
|
||
//
|
||
|
||
BOOLEAN FloatingSave;
|
||
|
||
//
|
||
// Mouse attributes.
|
||
//
|
||
|
||
MOUSE_ATTRIBUTES MouseAttributes;
|
||
|
||
} SERIAL_MOUSE_CONFIGURATION_INFORMATION,
|
||
*PSERIAL_MOUSE_CONFIGURATION_INFORMATION;
|
||
|
||
//
|
||
// Port device extension.
|
||
//
|
||
|
||
typedef struct _DEVICE_EXTENSION {
|
||
|
||
//
|
||
// If HardwarePresent is non-zero, there is some sort of serial
|
||
// pointing device present in the system, either a serial mouse
|
||
// (MOUSE_HARDWARE_PRESENT) or a serial ballpoint
|
||
// (BALLPOINT_HARDWARE_PRESENT).
|
||
//
|
||
|
||
ULONG HardwarePresent;
|
||
|
||
//
|
||
// Port configuration information.
|
||
//
|
||
|
||
SERIAL_MOUSE_CONFIGURATION_INFORMATION Configuration;
|
||
|
||
//
|
||
// Reference count for number of mouse enables.
|
||
//
|
||
|
||
LONG MouseEnableCount;
|
||
|
||
//
|
||
// Pointer to the device object.
|
||
//
|
||
|
||
PDEVICE_OBJECT DeviceObject;
|
||
|
||
//
|
||
// Mouse class connection data.
|
||
//
|
||
|
||
CONNECT_DATA ConnectData;
|
||
|
||
//
|
||
// Number of input data items currently in the mouse InputData queue.
|
||
//
|
||
|
||
ULONG InputCount;
|
||
|
||
//
|
||
// Start of the port mouse input data queue (really a circular buffer).
|
||
//
|
||
|
||
PMOUSE_INPUT_DATA InputData;
|
||
|
||
//
|
||
// Insertion pointer for mouse InputData.
|
||
//
|
||
|
||
PMOUSE_INPUT_DATA DataIn;
|
||
|
||
//
|
||
// Removal pointer for mouse InputData.
|
||
//
|
||
|
||
PMOUSE_INPUT_DATA DataOut;
|
||
|
||
//
|
||
// Points one input packet past the end of the InputData buffer.
|
||
//
|
||
|
||
PMOUSE_INPUT_DATA DataEnd;
|
||
|
||
//
|
||
// Current mouse input packet.
|
||
//
|
||
|
||
MOUSE_INPUT_DATA CurrentInput;
|
||
|
||
//
|
||
// Pointer to interrupt object.
|
||
//
|
||
|
||
PKINTERRUPT InterruptObject;
|
||
|
||
//
|
||
// Mouse ISR DPC queue.
|
||
//
|
||
|
||
KDPC IsrDpc;
|
||
|
||
//
|
||
// Mouse ISR DPC recall queue.
|
||
//
|
||
|
||
KDPC IsrDpcRetry;
|
||
|
||
//
|
||
// Used by the ISR and the ISR DPC (in SerMouDpcVariableOperation calls)
|
||
// to control processing by the ISR DPC.
|
||
//
|
||
|
||
LONG DpcInterlockVariable;
|
||
|
||
//
|
||
// Spinlock used to protect the DPC interlock variable.
|
||
//
|
||
|
||
KSPIN_LOCK SpinLock;
|
||
|
||
//
|
||
// Timer used to retry the ISR DPC routine when the class
|
||
// driver is unable to consume all the port driver's data.
|
||
//
|
||
|
||
KTIMER DataConsumptionTimer;
|
||
|
||
//
|
||
// DPC queue for logging overrun and internal driver errors.
|
||
//
|
||
|
||
KDPC ErrorLogDpc;
|
||
|
||
//
|
||
// Request sequence number (used for error logging).
|
||
//
|
||
|
||
ULONG SequenceNumber;
|
||
|
||
//
|
||
// Pointer to the interrupt protocol handler routine.
|
||
//
|
||
|
||
PPROTOCOL_HANDLER ProtocolHandler;
|
||
|
||
//
|
||
// Static state machine handler data.
|
||
//
|
||
|
||
HANDLER_DATA HandlerData;
|
||
|
||
//
|
||
// Indicates which pointer port device this driver created (UnitId
|
||
// is the suffix appended to the pointer port basename for the
|
||
// call to IoCreateDevice).
|
||
//
|
||
|
||
USHORT UnitId;
|
||
|
||
//
|
||
// Indicates whether it is okay to log overflow errors.
|
||
//
|
||
|
||
BOOLEAN OkayToLogOverflow;
|
||
|
||
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
|
||
|
||
//
|
||
// Define the port Get/SetDataQueuePointer context structures.
|
||
//
|
||
|
||
typedef struct _GET_DATA_POINTER_CONTEXT {
|
||
IN PDEVICE_EXTENSION DeviceExtension;
|
||
OUT PVOID DataIn;
|
||
OUT PVOID DataOut;
|
||
OUT ULONG InputCount;
|
||
} GET_DATA_POINTER_CONTEXT, *PGET_DATA_POINTER_CONTEXT;
|
||
|
||
typedef struct _SET_DATA_POINTER_CONTEXT {
|
||
IN PDEVICE_EXTENSION DeviceExtension;
|
||
IN ULONG InputCount;
|
||
IN PVOID DataOut;
|
||
} SET_DATA_POINTER_CONTEXT, *PSET_DATA_POINTER_CONTEXT;
|
||
|
||
//
|
||
// Define the context structure and operations for SerMouDpcVariableOperation.
|
||
//
|
||
|
||
typedef enum _OPERATION_TYPE {
|
||
IncrementOperation,
|
||
DecrementOperation,
|
||
WriteOperation,
|
||
ReadOperation
|
||
} OPERATION_TYPE;
|
||
|
||
typedef struct _VARIABLE_OPERATION_CONTEXT {
|
||
IN PLONG VariableAddress;
|
||
IN OPERATION_TYPE Operation;
|
||
IN OUT PLONG NewValue;
|
||
} VARIABLE_OPERATION_CONTEXT, *PVARIABLE_OPERATION_CONTEXT;
|
||
|
||
//
|
||
// Function prototypes.
|
||
//
|
||
|
||
|
||
NTSTATUS
|
||
DriverEntry(
|
||
IN PDRIVER_OBJECT DriverObject,
|
||
IN PUNICODE_STRING RegistryPath
|
||
);
|
||
|
||
VOID
|
||
SerMouInitializeDevice(
|
||
IN PDRIVER_OBJECT DriverObject,
|
||
IN PDEVICE_EXTENSION TmpDeviceExtension,
|
||
IN PUNICODE_STRING RegistryPath,
|
||
IN PUNICODE_STRING BaseDeviceName
|
||
);
|
||
|
||
VOID
|
||
SerialMouseErrorLogDpc(
|
||
IN PKDPC Dpc,
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PIRP Irp,
|
||
IN PVOID Context
|
||
);
|
||
|
||
NTSTATUS
|
||
SerialMouseFlush(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PIRP Irp
|
||
);
|
||
NTSTATUS
|
||
SerialMouseInternalDeviceControl(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PIRP Irp
|
||
);
|
||
|
||
BOOLEAN
|
||
SerialMouseInterruptService(
|
||
IN PKINTERRUPT Interrupt,
|
||
IN PVOID Context
|
||
);
|
||
|
||
VOID
|
||
SerialMouseIsrDpc(
|
||
IN PKDPC Dpc,
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PIRP Irp,
|
||
IN PVOID Context
|
||
);
|
||
|
||
NTSTATUS
|
||
SerialMouseOpenClose(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PIRP Irp
|
||
);
|
||
|
||
VOID
|
||
SerialMouseStartIo(
|
||
IN PDEVICE_OBJECT DeviceObject,
|
||
IN PIRP Irp
|
||
);
|
||
|
||
VOID
|
||
SerialMouseUnload(
|
||
IN PDRIVER_OBJECT DriverObject
|
||
);
|
||
|
||
VOID
|
||
SerMouBuildResourceList(
|
||
IN PDEVICE_EXTENSION DeviceExtension,
|
||
OUT PCM_RESOURCE_LIST *ResourceList,
|
||
OUT PULONG ResourceListSize
|
||
);
|
||
|
||
VOID
|
||
SerMouConfiguration(
|
||
IN OUT PLIST_ENTRY DeviceExtensionList,
|
||
IN PUNICODE_STRING RegistryPath,
|
||
IN PUNICODE_STRING DeviceName
|
||
);
|
||
|
||
VOID
|
||
SerMouDisableInterrupts(
|
||
IN PVOID Context
|
||
);
|
||
|
||
VOID
|
||
SerMouDpcVariableOperation(
|
||
IN PVOID Context
|
||
);
|
||
|
||
VOID
|
||
SerMouEnableInterrupts(
|
||
IN PVOID Context
|
||
);
|
||
|
||
VOID
|
||
SerMouGetDataQueuePointer(
|
||
IN PVOID Context
|
||
);
|
||
|
||
VOID
|
||
SerMouInitializeDataQueue(
|
||
IN PVOID Context
|
||
);
|
||
|
||
NTSTATUS
|
||
SerMouInitializeHardware(
|
||
IN PDEVICE_OBJECT DeviceObject
|
||
);
|
||
|
||
NTSTATUS
|
||
SerMouPeripheralCallout(
|
||
IN PVOID Context,
|
||
IN PUNICODE_STRING PathName,
|
||
IN INTERFACE_TYPE BusType,
|
||
IN ULONG BusNumber,
|
||
IN PKEY_VALUE_FULL_INFORMATION *BusInformation,
|
||
IN CONFIGURATION_TYPE ControllerType,
|
||
IN ULONG ControllerNumber,
|
||
IN PKEY_VALUE_FULL_INFORMATION *ControllerInformation,
|
||
IN CONFIGURATION_TYPE PeripheralType,
|
||
IN ULONG PeripheralNumber,
|
||
IN PKEY_VALUE_FULL_INFORMATION *PeripheralInformation
|
||
);
|
||
|
||
NTSTATUS
|
||
SerMouPeripheralListCallout(
|
||
IN PVOID Context,
|
||
IN PUNICODE_STRING PathName,
|
||
IN INTERFACE_TYPE BusType,
|
||
IN ULONG BusNumber,
|
||
IN PKEY_VALUE_FULL_INFORMATION *BusInformation,
|
||
IN CONFIGURATION_TYPE ControllerType,
|
||
IN ULONG ControllerNumber,
|
||
IN PKEY_VALUE_FULL_INFORMATION *ControllerInformation,
|
||
IN CONFIGURATION_TYPE PeripheralType,
|
||
IN ULONG PeripheralNumber,
|
||
IN PKEY_VALUE_FULL_INFORMATION *PeripheralInformation
|
||
);
|
||
|
||
VOID
|
||
SerMouSendReport(
|
||
IN PDEVICE_OBJECT DeviceObject
|
||
);
|
||
|
||
VOID
|
||
SerMouServiceParameters(
|
||
IN PDEVICE_EXTENSION DeviceExtension,
|
||
IN PUNICODE_STRING RegistryPath,
|
||
IN PUNICODE_STRING DeviceName
|
||
);
|
||
|
||
VOID
|
||
SerMouSetDataQueuePointer(
|
||
IN PVOID Context
|
||
);
|
||
|
||
BOOLEAN
|
||
SerMouWriteDataToQueue(
|
||
IN PDEVICE_EXTENSION DeviceExtension,
|
||
IN PMOUSE_INPUT_DATA InputData
|
||
);
|
||
|
||
#endif // _SERMOUSE_
|