windows-nt/Source/XPSP1/NT/drivers/input/busmouse/i386/busmouse.h
2020-09-26 16:20:57 +08:00

486 lines
8.7 KiB
C
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
Copyright (c) 1990, 1991, 1992, 1993 Microsoft Corporation
Copyright (c) 1992 Logitech Inc.
Module Name:
busmouse.h
Abstract:
These are the structures and defines that are used in the
Microsoft/Logitech Bus mouse port driver.
Revision History:
--*/
#ifndef _BUSMOUSE_
#define _BUSMOUSE_
#include <ntddmou.h>
#include "kbdmou.h"
#include "buscfg.h"
//
// Default number of buttons and sample rate for the Inport mouse.
//
#define MOUSE_NUMBER_OF_BUTTONS 3
#define MOUSE_SAMPLE_RATE_50HZ 50
//
// NOTE: This should be defined in the DDK instead...
//
#define MOUSE_BUS_HARDWARE MOUSE_INPORT_HARDWARE
#define FILE_DEVICE_BUS_PORT FILE_DEVICE_INPORT_PORT
#define BUSMOUSE_ERROR_VALUE_BASE INPORT_ERROR_VALUE_BASE
//
// Define the control port bits.
//
#define BUS_CONTROL_INTERRUPT_DISABLE 0x10
#define BUS_CONTROL_COUNTER_CAPTURE 0x80
#define BUS_CONTROL_X_LOW 0x00
#define BUS_CONTROL_X_HIGH 0x20
#define BUS_CONTROL_Y_LOW 0x40
#define BUS_CONTROL_Y_HIGH 0x60
//
// Define the Bus data bits
//
#define BUS_DATA_BUTTON_1 0x80
#define BUS_DATA_BUTTON_1_SHIFT 0x06
#define BUS_DATA_BUTTON_2 0x40
#define BUS_DATA_BUTTON_2_SHIFT 0x04
#define BUS_DATA_BUTTON_3 0x20
#define BUS_DATA_BUTTON_3_SHIFT 0x05
//
// Define the Configuration byte
//
#define BUS_CONFIGURATION_VALUE 0x91
//
// Define the registers.
//
#define BUS_DATA_PORT_READ 0x00
#define BUS_SIGNATURE_PORT_READ_WRITE 0x01
#define BUS_INTERRUPT_PORT_READ 0x02
#define BUS_CONTROL_PORT_WRITE 0x02
#define BUS_CONFIGURATION_PORT_READ_WRITE 0x03
//
// Inport mouse configuration information.
//
typedef struct _BUS_CONFIGURATION_INFORMATION {
//
// Bus interface type.
//
INTERFACE_TYPE InterfaceType;
//
// Bus Number.
//
ULONG BusNumber;
#ifdef PNP_IDENTIFY
//
// Controller type & number
//
CONFIGURATION_TYPE ControllerType;
ULONG ControllerNumber;
//
// Peripheral type & number
CONFIGURATION_TYPE PeripheralType;
ULONG PeripheralNumber;
#endif
//
// 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];
//
// Set at intialization to indicate that the base register
// address must be unmapped when the driver is unloaded.
//
BOOLEAN UnmapRegistersRequired;
//
// Flag that indicates whether floating point context should be saved.
//
BOOLEAN FloatingSave;
//
// Mouse attributes.
//
MOUSE_ATTRIBUTES MouseAttributes;
} BUS_CONFIGURATION_INFORMATION, *PBUS_CONFIGURATION_INFORMATION;
//
// Port device extension.
//
typedef struct _DEVICE_EXTENSION {
//
// If HardwarePresent is TRUE, there is an Inport mouse present in
// the system.
//
BOOLEAN HardwarePresent;
//
// Port configuration information.
//
BUS_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;
//
// Keep track of the previous button state.
//
UCHAR PreviousButtons;
//
// 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 BusDpcVariableOperation 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;
//
// 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 BusDpcVariableOperation.
//
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
);
NTSTATUS
DBusFlush(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
DBusInternalDeviceControl(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
BOOLEAN
DBusInterruptService(
IN PKINTERRUPT Interrupt,
IN PVOID Context
);
VOID
DBusIsrDpc(
IN PKDPC Dpc,
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context
);
NTSTATUS
DBusOpenClose(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
VOID
DBusStartIo(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
VOID
DBusUnload(
IN PDRIVER_OBJECT DriverObject
);
VOID
BusBuildResourceList(
IN PDEVICE_EXTENSION DeviceExtension,
OUT PCM_RESOURCE_LIST *ResourceList,
OUT PULONG ResourceListSize
);
VOID
BusConfiguration(
IN PDEVICE_EXTENSION DeviceExtension,
IN PUNICODE_STRING RegistryPath,
IN PUNICODE_STRING DeviceName
);
VOID
BusDisableInterrupts(
IN PVOID Context
);
VOID
BusDpcVariableOperation(
IN PVOID Context
);
VOID
BusEnableInterrupts(
IN PVOID Context
);
VOID
BusErrorLogDpc(
IN PKDPC Dpc,
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context
);
VOID
BusGetDataQueuePointer(
IN PVOID Context
);
VOID
BusInitializeDataQueue(
IN PVOID Context
);
NTSTATUS
BusInitializeHardware(
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
BusPeripheralCallout(
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
BusServiceParameters(
IN PDEVICE_EXTENSION DeviceExtension,
IN PUNICODE_STRING RegistryPath,
IN PUNICODE_STRING DeviceName
);
VOID
BusSetDataQueuePointer(
IN PVOID Context
);
BOOLEAN
BusWriteDataToQueue(
IN PDEVICE_EXTENSION DeviceExtension,
IN PMOUSE_INPUT_DATA InputData
);
#if DBG
VOID
BusDebugPrint(
IN ULONG DebugPrintLevel,
IN PCCHAR DebugMessage,
...
);
#define BusPrint(x) BusDebugPrint x
#else
#define BusPrint(x)
#endif
#endif // _BUSMOUSE_