|
|
/*++
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_
|