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