//************************************************************************** // // DEVICE.H -- Xena Gaming Project // // Version 3.XX // // Copyright (c) 1997 Microsoft Corporation. All rights reserved. // // @doc // @header DEVICE.H | Global includes and definitions for device interface //************************************************************************** #ifndef __DEVICE_H__ #define __DEVICE_H__ //--------------------------------------------------------------------------- // Definitions //--------------------------------------------------------------------------- #define MAX_DEVICE_UNITS 4 #define MAX_DETECT_ATTEMPTS 5 #define MAX_POLLING_ATTEMPTS 5 #define MAX_CONNECT_ATTEMPTS 2 #define MAX_DEVICE_NAME 64 #define HOT_PLUG_PACKETS 2 #define MAX_DETECT_INTERVAL 2000 #define QUICK_DETECT_TIME 1000 #define QUICK_DETECT_CLOCKS 8 #define IMODE_DIGITAL_STD 0 #define IMODE_DIGITAL_ENH 4 #define IMODE_ANALOG 8 #define IMODE_NONE -1 #define FLAG_WAIT_FOR_CLOCK 1 #define FLAG_START_CLOCK_LOW 2 #define FLAG_START_CLOCK_HIGH 4 #define INTERRUPT_AFTER_PACKET 1 #define INTERRUPT_DURING_PACKET 2 #define TIMEOUT 300 #define MAX_XA_TIMEOUT 1600 #define POLLING_INTERVAL 10 #define INTXA_BIT_MASK 0x01 #define CLOCK_BIT_MASK 0x10 #define DATA0_BIT_MASK 0x20 #define DATA1_BIT_MASK 0x40 #define DATA2_BIT_MASK 0x80 #define AXIS_ONLY_BIT_MASK 0x0f #define XA_BIT_MASK 0x01 #define YA_BIT_MASK 0x02 #define XB_BIT_MASK 0x04 #define YB_BIT_MASK 0x08 #define XAXIS_BIT_MASK 0x01 #define YAXIS_BIT_MASK 0x02 #define STATUS_GATE_MASK 0x90 // // Packet Speed Masks // #define GAME_SPEED_66K 0 #define GAME_SPEED_83K 1 #define GAME_SPEED_100K 2 #define GAME_SPEED_125K 3 #define GAME_SPEED_RANGE 4 #define GAME_SPEED_BITS 3 // // Wheel Speed Masks // #define WHEEL_SPEED_48K 0 #define WHEEL_SPEED_66K 1 #define WHEEL_SPEED_98K 2 #define WHEEL_SPEED_RANGE 3 #define WHEEL_SPEED_BITS 3 // // Internal error codes // #define ERROR_SUCCESS 0 #define ERROR_HANDSHAKING -1 #define ERROR_LOWCLOCKSTART -2 #define ERROR_HIGHCLOCKSTART -3 #define ERROR_CLOCKFALLING -4 #define ERROR_CLOCKRISING -5 #define ERROR_ERRORBITS -6 #define ERROR_PARITYBITS -7 #define ERROR_EXTRACLOCKS -8 #define ERROR_PHASEBITS -9 #define ERROR_CHECKSUM -10 #define ERROR_XA_TIMEOUT -11 #define ERROR_CLOCKOVERFLOW -12 // // Packet status codes // #define STATUS_SIBLING_ADDED ((NTSTATUS)0x40050001L) #define STATUS_SIBLING_REMOVED ((NTSTATUS)0x40050002L) #define STATUS_DEVICE_CHANGED ((NTSTATUS)0x40050003L) // // GAMEENUM_OEM_DATA Constants // #define OEM_DEVICE_INFO 0 #define OEM_DEVICE_UNIT 1 #define OEM_DEVICE_SIBLING 2 #define OEM_DEVICE_ID 3 #define OEM_DEVICE_DETECTED 4 #define OEM_DEVICE_OBJECT 5 // // Device Packet Constants // #define JOY_RETURNX 0x00000001 #define JOY_RETURNY 0x00000002 #define JOY_RETURNZ 0x00000004 #define JOY_RETURNR 0x00000008 #define JOY_RETURNU 0x00000010 #define JOY_RETURNV 0x00000020 #define JOY_RETURNPOV 0x00000040 #define JOY_RETURNBUTTONS 0x00000080 #define JOY_RETURNRAWDATA 0x00000100 #define JOY_RETURNPOVCTS 0x00000200 #define JOY_RETURNCENTERED 0x00000400 #define JOY_USEDEADZONE 0x00000800 #define JOY_RETURNALL (JOY_RETURNX | JOY_RETURNY | JOY_RETURNZ | \ JOY_RETURNR | JOY_RETURNU | JOY_RETURNV | \ JOY_RETURNPOV | JOY_RETURNBUTTONS) #define JOY_POVCENTERED (USHORT)-1 #define JOY_POVFORWARD 0 #define JOY_POVRIGHT 9000 #define JOY_POVBACKWARD 18000 #define JOY_POVLEFT 27000 // // HID Force Feature Identifiers // #define HIDP_REPORT_ID_1 0x85 #define MSGAME_INPUT_JOYINFOEX 0x01 #define MSGAME_FEATURE_GETID 0x02 #define MSGAME_FEATURE_GETSTATUS 0x03 #define MSGAME_FEATURE_GETACKNAK 0x04 #define MSGAME_FEATURE_GETNAKACK 0x05 #define MSGAME_FEATURE_GETSYNC 0x06 #define MSGAME_FEATURE_RESET 0x07 #define MSGAME_FEATURE_GETVERSION 0x08 //--------------------------------------------------------------------------- // Types //--------------------------------------------------------------------------- typedef enum { // @enum DETECT_ORDER | Device detection order DETECT_FIRST, // @emem Highest priority devices DETECT_NORMAL, // @emem Default priority devices DETECT_LAST // @emem Lowest priority devices } DETECT_ORDER; //--------------------------------------------------------------------------- // Structures //--------------------------------------------------------------------------- typedef struct { // @struct DEVICE_PACKET | Game device packet ULONG id; // @field Device unit id ULONG do_other; // @field Packet flags ULONG dwX; // @field X position ULONG dwY; // @field Y position ULONG dwZ; // @field Z position ULONG dwR; // @field Rudder position ULONG dwU; // @field U position ULONG dwV; // @field Z position ULONG dwPOV; // @field Point of view state ULONG dwButtons; // @field Button states ULONG dwButtonNumber; // @field Current button number pressed } DEVICE_PACKET, *PDEVICE_PACKET; typedef struct { // @struct PACKETINFO | Packet acquistion data ULONG Size; // @field Size of structure PCHAR DeviceName; // @field Device name string MSGAME_TRANSACTION Transaction; // @field Transaction type ULONG Mode; // @field Digital mode indicator LONG Speed; // @field Transmission speed indicator LONG LastError; // @field Last internal error result GAMEPORT PortInfo; // @field Gameport parameters ULONG Acquisition; // @field Packet acquisition mode ULONG NumPackets; // @field Number packets received ULONG TimeStamp; // @field Last packet time in milliseconds ULONG ClocksSampled; // @field Number of clocks encountered ULONG B4Transitions; // @field Number of Button 4 transitions ULONG StartTimeout; // @field Packet start timeout, calibrated ULONG HighLowTimeout; // @field Packet high-low timeout, calibrated ULONG LowHighTimeout; // @field Packet low-high timeout, calibrated ULONG InterruptDelay; // @field Packet interruptdelay, calibrated ULONG ClockDutyCycle; // @field Packet clock duty cycle, calibrated ULONG Attempts; // @field Packet attempt count ULONG Failures; // @field Packet failure count ULONG DataSize; // @field Size of packet data buffer PVOID Data; // @field Packet data buffer pointer } PACKETINFO, *PPACKETINFO; typedef struct { // @struct DEVICE_VALUES | Device registry data ULONG PacketStartTimeout; // @field Packet start timeout in microseconds ULONG PacketHighLowTimeout; // Packet high-low timeout in microseconds ULONG PacketLowHighTimeout; // @field Packet low-high timeout in microseconds ULONG IdStartTimeout; // @field IDstring start timeout in microseconds ULONG IdHighLowTimeout; // @field IDstring high-low timeout in microseconds ULONG IdLowHighTimeout; // @field IDstring low-high timeout in microseconds ULONG InterruptDelay; // @field Interrupt delay timeout in microseconds ULONG MaxClockDutyCycle; // @field Clock duty cycle timeout in microseconds ULONG StatusStartTimeout; // @field Status start timeout in microseconds ULONG StatusHighLowTimeout; // @field Status high-low timeout in microseconds ULONG StatusLowHighTimeout; // @field Status low-high timeout in microseconds ULONG StatusGateTimeout; // @field Status gate timeout in microseconds } DEVICE_VALUES, *PDEVICE_VALUES; typedef struct { // @struct DRIVERSERVICES | Device services table // @field NTSTATUS (*DriverEntry)(VOID) | ConnectDevice | ConnectDevice service procedure NTSTATUS (*DriverEntry)(VOID); // @field NTSTATUS (*ConnectDevice)(PortInfo) | ConnectDevice | ConnectDevice service procedure NTSTATUS (*ConnectDevice)(PGAMEPORT PortInfo); // @field NTSTATUS (*StartDevice)(PortInfo) | StartDevice | StartDevice service procedure NTSTATUS (*StartDevice)(PGAMEPORT PortInfo); // @field NTSTATUS (*ReadReport)(PortInfo, Report) | ReadReport | ReadReport service procedure NTSTATUS (*ReadReport)(PGAMEPORT PortInfo, PDEVICE_PACKET Report); // @field NTSTATUS (*StopDevice)(PGAMEPORT PortInfo) | StopDevice | StopDevice service procedure NTSTATUS (*StopDevice)(PGAMEPORT PortInfo, BOOLEAN TouchHardware); // @field NTSTATUS (*GetFeature)(PGAMEPORT PortInfo ...) | GetFeature | GetFeature service procedure NTSTATUS (*GetFeature)(PGAMEPORT PortInfo, HID_REPORT_ID ReportId, PVOID ReportBuffer, ULONG ReportSize, PULONG Returned); } DRIVERSERVICES, *PDRIVERSERVICES; typedef struct { // @struct DEVICEINFO | Game device object PDRIVERSERVICES Services; // @field Pointer to service table PGAMEPORT Siblings; // @field Sibling device list PHID_DESCRIPTOR DevDescriptor; // @field Pointer to device descriptor PUCHAR RptDescriptor; // @field Pointer to report descriptor ULONG RptDescSize; // @field Size of report descriptor ULONG NumDevices; // @field Number of devices detected ULONG DeviceCount; // @field Number of devices started LONG DevicePending; // @field Number devices pending PCHAR DeviceName; // @field Device name string DETECT_ORDER DetectOrder; // @field Detection priority BOOLEAN IsAnalog; // @field Analog device flag USHORT DeviceId; // @field Hid device identifier PWCHAR HardwareId; // @field Pnp hardware identifier } DEVICEINFO, *PDEVICEINFO; //--------------------------------------------------------------------------- // Macros //--------------------------------------------------------------------------- #define DECLARE_DEVICE(x) extern DEVICEINFO x##Info #define INSTANCE_DEVICE(x) &x##Info #define GET_DEVICE_INFO(p) ((PDEVICEINFO)((p)->OemData[OEM_DEVICE_INFO])) #define SET_DEVICE_INFO(p,x) ((p)->OemData[OEM_DEVICE_INFO]=(ULONG)x) #define GET_DEVICE_UNIT(p) ((ULONG)((p)->OemData[OEM_DEVICE_UNIT])) #define SET_DEVICE_UNIT(p,x) ((p)->OemData[OEM_DEVICE_UNIT]=(ULONG)x) #define GET_DEVICE_SIBLING(p) ((PGAMEPORT)((p)->OemData[OEM_DEVICE_SIBLING])) #define SET_DEVICE_SIBLING(p,x) ((p)->OemData[OEM_DEVICE_SIBLING]=(ULONG)x) #define GET_DEVICE_ID(p) ((USHORT)((p)->OemData[OEM_DEVICE_ID])) #define SET_DEVICE_ID(p,x) ((p)->OemData[OEM_DEVICE_ID]=(USHORT)x) #define GET_DEVICE_DETECTED(p) ((PDEVICEINFO)((p)->OemData[OEM_DEVICE_DETECTED])) #define SET_DEVICE_DETECTED(p,x) ((p)->OemData[OEM_DEVICE_DETECTED]=(ULONG)x) #define GET_DEVICE_OBJECT(p) ((PDEVICE_OBJECT)((p)->OemData[OEM_DEVICE_OBJECT])) #define SET_DEVICE_OBJECT(p,x) ((p)->OemData[OEM_DEVICE_OBJECT]=(ULONG)x) //--------------------------------------------------------------------------- // Public Data //--------------------------------------------------------------------------- extern ULONG POV_Values[]; extern ULONG PollingInterval; //--------------------------------------------------------------------------- // Procedures //--------------------------------------------------------------------------- BOOLEAN DEVICE_IsOddParity ( IN PVOID Data, IN ULONG Count ); BOOLEAN DEVICE_IsCollision ( IN PPACKETINFO DataPacket ); NTSTATUS DEVICE_DriverEntry (VOID); NTSTATUS DEVICE_GetDeviceDescriptor ( IN PGAMEPORT PortInfo, OUT PUCHAR Descriptor, IN ULONG MaxSize, OUT PULONG Copied ); NTSTATUS DEVICE_GetReportDescriptor ( IN PGAMEPORT PortInfo, OUT PUCHAR Descriptor, IN ULONG MaxSize, OUT PULONG Copied ); NTSTATUS DEVICE_StartDevice ( IN PGAMEPORT PortInfo, IN PWCHAR HardwareId ); NTSTATUS DEVICE_ReadReport ( IN PGAMEPORT PortInfo, OUT PUCHAR Report, IN ULONG MaxSize, OUT PULONG Copied ); NTSTATUS DEVICE_StopDevice ( IN PGAMEPORT PortInfo, IN BOOLEAN TouchHardware ); NTSTATUS DEVICE_GetFeature ( IN PGAMEPORT PortInfo, IN HID_REPORT_ID ReportId, OUT PVOID ReportBuffer, IN ULONG ReportSize, OUT PULONG Returned ); //=========================================================================== // End //=========================================================================== #endif __DEVICE_H__