/*++ Copyright (c) 1995 Microsoft Corporation Copyright (c) 1997 Parallel Technologies, Inc. All Rights Reserved. Module Name: ptilink.h Abstract: This file defines the interface for the Parallel Technologies DirectParallel IO driver. This driver doubles as an NT device driver and an export library. Author: Norbert P. Kusters 4-Jan-1995 Jay Lowe, Parallel Technologies, Inc. Revision History: --*/ #ifndef _PTILINK_ #define _PTILINK_ #define NPORTS 3 // number of PTILINKx devices to make #define MAXLPTXNAME 99 typedef struct _PTI_EXTENSION PTI_EXTENSION; // // This structure contains configuration data, much of which // is read from the registry. // typedef struct _PAR_REG_DATA { ULONG PollInterval; ULONG TraceLevel; ULONG TraceMask; ULONG IoWait; ULONG SyncWait; } PAR_REG_DATA,*PPAR_REG_DATA; // // Client callbacks from PtiLink // // Ptilink requests a read buffer from the upward client typedef PVOID (*GET_READ_BUFFER_ROUTINE)( IN PVOID ParentContext, OUT PULONG BufferSize, OUT PVOID* RequestContext ); // Ptilink returns a completed read buffer to the upward client typedef VOID (*COMPLETE_READ_BUFFER_ROUTINE)( IN PVOID ParentContext, IN PVOID ReadBuffer, IN NTSTATUS Status, IN ULONG BytesTransfered, IN PVOID RequestContext ); // PtiLink notifies upward client of a link event typedef VOID (*NOTIFY_LINK_EVENT)( IN PVOID ParentContext, IN ULONG PtiLinkEventId, IN ULONG PtiLinkEventData ); // PtilinkEventIds #define PTILINK_LINK_UP 2 // link has been established // a LINK_OPEN or dataframe // was received on SHUT link // i.e., link is starting #define PTILINK_LINK_DOWN 4 // link has been terminated // peer has issued a LINK_SHUT // and is departing // // Device driver routines ... are of the form ParXXXXXX // BOOLEAN ParInterruptService( IN PKINTERRUPT Interrupt, IN OUT PVOID Extension ); VOID ParDpcForIsr( IN PKDPC Dpc, IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Extension ); VOID ParDeferredPortCheck( IN PVOID Extension ); VOID ParAllocTimerDpc( IN PKDPC Dpc, IN PVOID Extension, IN PVOID SystemArgument1, IN PVOID SystemArgument2 ); NTSTATUS ParCreate( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS ParClose( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS ParRead( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); PVOID ParGetReadBuffer( IN PVOID ParentContext, OUT PULONG BufferSize, OUT PVOID* RequestContext ); VOID ParCompleteReadBuffer( IN PVOID ParentContext, IN PVOID ReadBuffer, IN NTSTATUS Status, IN ULONG BytesTransfered, IN PVOID RequestContext ); VOID ParLinkEventNotification( IN PVOID ParentContext, IN ULONG PtiLinkEventId, IN ULONG PtiLinkEventData ); NTSTATUS ParWrite( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS ParCleanup( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); VOID ParUnload( IN PDRIVER_OBJECT DriverObject ); // // Link Level Routines ... are of the form PtiXXXXXX // NTSTATUS PtiInitialize( IN ULONG PortId, OUT PVOID pExtension, OUT PVOID pPtiExtension ); // // a word about registering callbacks: Par (the device driver level) // registers callbacks to itself at ParCreate time. If you are using // the Ptilink service API in a non-irp fashion, you need to open the // Ptilink device, and then re-register your own callbacks, which // effectively disconnects the Par device driver level - it will be // reconnected, of course, at the next ParCreate. // // So the sequence to use the PtiLink API without IRP's is: // // ZwCreateFile("\\\\.\\PTILINKx", ...) // at this time, Ptilink attempts tp make a link on LPTx // the ParCreate hooks up interrupts, calls PtiInit, etc // the only Ptilink stuff exposed to you are the callbacks // // PtiRegisterCallbacks(...your handlers here...) // you are overriding the inherent callbacks of the Par level // // PtiWrite(...) // ... // ... etc, etc ... // ... // // ZwClose() // #ifndef PID_STANDARD #define PID_STANDARD 0x13 #endif #ifndef PID_LINK #define PID_LINK 0x11 #endif NTSTATUS PtiQueryDeviceStatus( IN ULONG PortId, // parallel port number (0..2) OUT WCHAR* szPortName // Buffer of at least LPTXMAXNAME + 1 bytes ); NTSTATUS PtiRegisterCallbacks( IN PVOID Extension, IN GET_READ_BUFFER_ROUTINE GetReadBuffer, IN COMPLETE_READ_BUFFER_ROUTINE CompleteReadBuffer, IN NOTIFY_LINK_EVENT LinkEventNotification, IN PVOID ParentContext ); VOID PtiCleanup( IN PVOID PtiExtension ); NTSTATUS PtiWrite( IN PVOID PtiExtension, IN PVOID Buffer, IN ULONG BufferSize, IN UCHAR Pid ); BOOLEAN PtiIsReadPending( IN PVOID PtiExtension ); VOID PtiRead( IN PVOID PtiExtension ); ULONG PtiQueryMaxReadSize( ); VOID PtiPortNameFromPortId( IN ULONG PortId, OUT CHAR* szPortName ); //************************************************************************ //* Platform Id Codes * //************************************************************************ #define PLAT_WIN9X 0 // Win95 and Win98 #define PLAT_DOS 1 // Dos #define PLAT_NT 2 // WinNT v4 and v5 //************************************************************************ //* LinkInformation Structure * //************************************************************************ // // LinkInformation - Link Management Information // // This structure contains information which is exchanged by the Nodes // within Link Management Packets // // This structure must be maintained in parallel with it's twin in PTI.INC // // All changes must be backward compatible with all previous driver versions #define LINKINFOSIZE 45*4 // explicitly define expected size typedef struct _LINK_INFORMATION { UCHAR LinkFunction; // 1] Current/Last Link Function UCHAR res1; UCHAR res2; UCHAR res3; UCHAR VerPlat; // 2] Platform ID byte (see PLAT_XXXX) UCHAR VerReserved; // reserved UCHAR VerMajor; // Link Major version UCHAR VerMinor; // Link Minor version UCHAR IOMode; // 3] Current IO transfer mode UCHAR CableType; // Detected cable type UCHAR PortType; // Physical parallel port type UCHAR Station; // Address of this station USHORT FIFOlen; // 4] ECP FIFO length, if ECP port USHORT FIFOwidth; // ECP FIFO width, if ECP port ULONG CPUType; // 5] CPU type ULONG CPUSpeed; // 6] CPU speed rating ULONG RxBufSize; // 7] Rx buffer size ULONG NominalSpd; // 8] Estimated speed rating ULONG ActualSpd; // 9] Actual performance to date ULONG PpIOWait; // 10] default IO wait time ULONG PpLongWait; // 11] default synchronization wait time ULONG PpShortWait; // 12] default synchronization wait time ULONG LastLinkTime; // 13] time of last link receive activity ULONG CableTestTime; // 14] time of last cable detect // These times are not used on NT because // NT times are 64 bits ... see NT time below // some basic counters ULONG RxAttempts; // 15] Number of Ints w/ real RATTNs ULONG RxPackets; // 16] Number of good received packets ULONG TxAttempts; // 17] Number of TxPackets attempted ULONG TxPackets; // 18] Number of successful TxPackets ULONG GoodPackets; // 19] Number of successful recent Txs / Rxs ULONG HwIRQs; // 20] Number of real hardware IRQs // Main Error Counter Group ULONG TxHdrDataErrors; // 21] data error during header ULONG RxHdrDataErrors; // 22] data error during header ULONG TxHdrSyncErrors; // 23] sync error during header ULONG RxHdrSyncErrors; // 24] sync error during header ULONG TxSyncErrors; // 25] sync error during packet ULONG RxSyncErrors; // 26] sync error during packet // Tx Details Group ULONG TxTimeoutErrors1; // 27] timeouts in Tx IO code ULONG TxTimeoutErrors2; // 28] timeouts in Tx IO code ULONG TxTimeoutErrors3; // 29] timeouts in Tx IO code ULONG TxTimeoutErrors4; // 30] timeouts in Tx IO code ULONG TxTimeoutErrors5; // 31] timeouts in Tx IO code ULONG TxCollision; // 32] Collision in Tx IO code // Rx Details Group ULONG RxTimeoutErrors1; // 33] timeouts in Rx IO code ULONG RxTimeoutErrors2; // 34] timeouts in Rx IO code ULONG RxTimeoutErrors3; // 35] timeouts in Rx IO code ULONG RxTimeoutErrors4; // 36] timeouts in Rx IO code ULONG RxTimeoutErrors5; // 37] timeouts in Rx IO code ULONG RxTooBigErrors; // 38] Rx packet too big or won't fit // Misc Error Details Group ULONG CableDetects; // 39] Attempts to detect type of cable ULONG TxRetries; // 40] Tx Retry attempts ULONG TxRxPreempts; // 41] Tx Receive preemptions ULONG InternalErrors; // 42] Internal screwups ULONG ReservedError; // 43] // NT Specific Group TIME LastPacketTime; // 45] time of last good TX or Rx } LINK_INFORMATION, *PLINK_INFORMATION; // // This structure is filled in by ECP detection at PtiInitialize time // typedef struct _PTI_ECP_INFORMATION { BOOLEAN IsEcpPort; // Is this an ECP port? ULONG FifoWidth; // Number of bytes in a PWord. ULONG FifoDepth; // Number of PWords in FIFO. } PTI_ECP_INFORMATION, *PPTI_ECP_INFORMATION; // // The internal structure for the 'PtiExtension'. // typedef struct _PTI_EXTENSION { // // Base I/O address for parallel port. // PUCHAR Port; PUCHAR wPortECR; // ECR register if obtained from ParPort PUCHAR wPortDFIFO; // Data FIFO register if obtained from ParPort // // The link state // ULONG LinkState; // // TRUE if we are polling // BOOLEAN Polling; // "mutex" on the line // InterlockedCompareExchange64 to TRUE when using wire, FALSE when done // ULONG Busy; // // This structure holds the PTI-derived ECP port information. // PTI_ECP_INFORMATION EcpInfo; // Time of last good packet Tx or Rx // TIME LastGoodPacket; // Time of last pass through WatchDog // TIME LastDogTime; // // Functions for getting and completing read buffers. // GET_READ_BUFFER_ROUTINE GetReadBuffer; COMPLETE_READ_BUFFER_ROUTINE CompleteReadBuffer; NOTIFY_LINK_EVENT LinkEventNotify; PVOID ParentContext; // // Our and His Link Information. // LINK_INFORMATION Our; LINK_INFORMATION His; } PTI_EXTENSION, *PPTI_EXTENSION; #endif // _PTILINK_