📄 parport.h
字号:
#define FAMILY_ECP 0x3
#define FAMILY_EPP 0x4
#define FAMILY_BECP 0x5
#define FAMILY_MAX FAMILY_BECP
//
// For pnp id strings
//
#define MAX_ID_SIZE 256
// used to construct IEEE 1284.3 "Dot" name suffixes
// table lookup for integer to WCHAR conversion
#define PAR_UNICODE_PERIOD L'.'
#define PAR_UNICODE_COLON L':'
//
// DeviceStateFlags
//
#define PAR_DEVICE_DELETED ((ULONG)0x00000002) // IoDeleteDevice has been called
#define PAR_DEVICE_PAUSED ((ULONG)0x00000010) // stop-pending, stopped, or remove-pending states
#define PAR_DEVICE_PORT_REMOVE_PENDING ((ULONG)0x00000200) // our ParPort is in a Remove Pending State
#define PAR_REV_MODE_SKIP_MASK (CHANNEL_NIBBLE | BYTE_BIDIR | EPP_ANY | ECP_ANY)
#define PAR_FWD_MODE_SKIP_MASK (EPP_ANY | BOUNDED_ECP | ECP_HW_NOIRQ | ECP_HW_IRQ)
#define PAR_MAX_CHANNEL 127
#define PAR_COMPATIBILITY_RESET 300
//
// ParClass DeviceObject structure
//
// - Lists the ParClass created PODO and all PDOs associated with a specific ParPort device
//
typedef struct _PAR_DEVOBJ_STRUCT {
PUCHAR Controller; // host controller address for devices in this structure
PDEVICE_OBJECT LegacyPodo; // legacy or "raw" port device
PDEVICE_OBJECT EndOfChainPdo; // End-Of-Chain PnP device
PDEVICE_OBJECT Dot3Id0Pdo; // 1284.3 daisy chain device, 1284.3 deviceID == 0
PDEVICE_OBJECT Dot3Id1Pdo;
PDEVICE_OBJECT Dot3Id2Pdo;
PDEVICE_OBJECT Dot3Id3Pdo; // 1284.3 daisy chain device, 1284.3 deviceID == 3
PDEVICE_OBJECT LegacyZipPdo; // Legacy Zip Drive
PFILE_OBJECT pFileObject; // Need an open handle to ParPort device to prevent it
// from being removed out from under us
struct _PAR_DEVOBJ_STRUCT *Next;
} PAR_DEVOBJ_STRUCT, *PPAR_DEVOBJ_STRUCT;
//
// Used in device extension for DeviceType field
//
#define PAR_DEVTYPE_FDO 0x00000001
#define PAR_DEVTYPE_PODO 0x00000002
#define PAR_DEVTYPE_PDO 0x00000004
//
// Protocol structure definitions
//
typedef
BOOLEAN
(*PPROTOCOL_IS_MODE_SUPPORTED_ROUTINE) (
IN PPDO_EXTENSION Extension
);
typedef
NTSTATUS
(*PPROTOCOL_CONNECT_ROUTINE) (
IN PPDO_EXTENSION Extension,
IN BOOLEAN DeviceIdRequest
);
typedef
VOID
(*PPROTOCOL_DISCONNECT_ROUTINE) (
IN PPDO_EXTENSION Extension
);
typedef
NTSTATUS
(*PPROTOCOL_ENTER_FORWARD_ROUTINE) (
IN PPDO_EXTENSION Extension
);
typedef
NTSTATUS
(*PPROTOCOL_EXIT_FORWARD_ROUTINE) (
IN PPDO_EXTENSION Extension
);
typedef
NTSTATUS
(*PPROTOCOL_ENTER_REVERSE_ROUTINE) (
IN PPDO_EXTENSION Extension
);
typedef
NTSTATUS
(*PPROTOCOL_EXIT_REVERSE_ROUTINE) (
IN PPDO_EXTENSION Extension
);
typedef
VOID
(*PPROTOCOL_READSHADOW_ROUTINE) (
IN Queue *pShadowBuffer,
IN PUCHAR lpsBufPtr,
IN ULONG dCount,
OUT ULONG *fifoCount
);
typedef
BOOLEAN
(*PPROTOCOL_HAVEREADDATA_ROUTINE) (
IN PPDO_EXTENSION Extension
);
typedef
NTSTATUS
(*PPROTOCOL_SET_INTERFACE_ADDRESS_ROUTINE) (
IN PPDO_EXTENSION Extension,
IN UCHAR Address
);
typedef struct _FORWARD_PTCL {
PPROTOCOL_IS_MODE_SUPPORTED_ROUTINE fnIsModeSupported;
PPROTOCOL_CONNECT_ROUTINE fnConnect;
PPROTOCOL_DISCONNECT_ROUTINE fnDisconnect;
PPROTOCOL_SET_INTERFACE_ADDRESS_ROUTINE fnSetInterfaceAddress;
PPROTOCOL_ENTER_FORWARD_ROUTINE fnEnterForward;
PPROTOCOL_EXIT_FORWARD_ROUTINE fnExitForward;
PPROTOCOL_WRITE_ROUTINE fnWrite;
USHORT Protocol;
USHORT ProtocolFamily;
} FORWARD_PTCL, *PFORWARD_PTCL;
typedef struct _REVERSE_PTCL {
PPROTOCOL_IS_MODE_SUPPORTED_ROUTINE fnIsModeSupported;
PPROTOCOL_CONNECT_ROUTINE fnConnect;
PPROTOCOL_DISCONNECT_ROUTINE fnDisconnect;
PPROTOCOL_SET_INTERFACE_ADDRESS_ROUTINE fnSetInterfaceAddress;
PPROTOCOL_ENTER_REVERSE_ROUTINE fnEnterReverse;
PPROTOCOL_EXIT_REVERSE_ROUTINE fnExitReverse;
PPROTOCOL_READSHADOW_ROUTINE fnReadShadow;
PPROTOCOL_HAVEREADDATA_ROUTINE fnHaveReadData;
PPROTOCOL_READ_ROUTINE fnRead;
USHORT Protocol;
USHORT ProtocolFamily;
} REVERSE_PTCL, *PREVERSE_PTCL;
extern FORWARD_PTCL afpForward[];
extern REVERSE_PTCL arpReverse[];
//
// WARNING...Make sure that enumeration matches the protocol array...
//
typedef enum _FORWARD_MODE {
FORWARD_FASTEST = 0, // 0
BOUNDED_ECP_FORWARD = FORWARD_FASTEST, // 0
ECP_HW_FORWARD_NOIRQ, // 1
EPP_HW_FORWARD, // 2
EPP_SW_FORWARD, // 3
ECP_SW_FORWARD, //......................// 4
IEEE_COMPAT_MODE, // 6
CENTRONICS_MODE, // 7
FORWARD_NONE // 8
} FORWARD_MODE;
typedef enum _REVERSE_MODE {
REVERSE_FASTEST = 0, // 0
BOUNDED_ECP_REVERSE = REVERSE_FASTEST, // 0
ECP_HW_REVERSE_NOIRQ, // 1
EPP_HW_REVERSE, // 2
EPP_SW_REVERSE, // 3
ECP_SW_REVERSE, //......................// 4
BYTE_MODE, // 5
NIBBLE_MODE, // 6
CHANNELIZED_NIBBLE_MODE, // 7
REVERSE_NONE // 8
} REVERSE_MODE;
//
// Ieee Extensibility constants
//
#define NIBBLE_EXTENSIBILITY 0x00
#define BYTE_EXTENSIBILITY 0x01
#define CHANNELIZED_EXTENSIBILITY 0x08
#define ECP_EXTENSIBILITY 0x10
#define BECP_EXTENSIBILITY 0x18
#define EPP_EXTENSIBILITY 0x40
#define DEVICE_ID_REQ 0x04
//
// Bit Definitions in the status register.
//
#define PAR_STATUS_NOT_ERROR 0x08 //not error on device
#define PAR_STATUS_SLCT 0x10 //device is selected (on-line)
#define PAR_STATUS_PE 0x20 //paper empty
#define PAR_STATUS_NOT_ACK 0x40 //not acknowledge (data transfer was not ok)
#define PAR_STATUS_NOT_BUSY 0x80 //operation in progress
//
// Bit Definitions in the control register.
//
#define PAR_CONTROL_STROBE 0x01 //to read or write data
#define PAR_CONTROL_AUTOFD 0x02 //to autofeed continuous form paper
#define PAR_CONTROL_NOT_INIT 0x04 //begin an initialization routine
#define PAR_CONTROL_SLIN 0x08 //to select the device
#define PAR_CONTROL_IRQ_ENB 0x10 //to enable interrupts
#define PAR_CONTROL_DIR 0x20 //direction = read
#define PAR_CONTROL_WR_CONTROL 0xc0 //the 2 highest bits of the control
// register must be 1
//
// More bit definitions.
//
#define DATA_OFFSET 0
#define DSR_OFFSET 1
#define DCR_OFFSET 2
#define OFFSET_DATA DATA_OFFSET // Put in for compatibility with legacy code
#define OFFSET_DSR DSR_OFFSET // Put in for compatibility with legacy code
#define OFFSET_DCR DCR_OFFSET // Put in for compatibility with legacy code
//
// Bit definitions for the DSR.
//
#define DSR_NOT_BUSY 0x80
#define DSR_NOT_ACK 0x40
#define DSR_PERROR 0x20
#define DSR_SELECT 0x10
#define DSR_NOT_FAULT 0x08
//
// More bit definitions for the DSR.
//
#define DSR_NOT_PTR_BUSY 0x80
#define DSR_NOT_PERIPH_ACK 0x80
#define DSR_WAIT 0x80
#define DSR_PTR_CLK 0x40
#define DSR_PERIPH_CLK 0x40
#define DSR_INTR 0x40
#define DSR_ACK_DATA_REQ 0x20
#define DSR_NOT_ACK_REVERSE 0x20
#define DSR_XFLAG 0x10
#define DSR_NOT_DATA_AVAIL 0x08
#define DSR_NOT_PERIPH_REQUEST 0x08
//
// Bit definitions for the DCR.
//
#define DCR_RESERVED 0xC0
#define DCR_DIRECTION 0x20
#define DCR_ACKINT_ENABLED 0x10
#define DCR_SELECT_IN 0x08
#define DCR_NOT_INIT 0x04
#define DCR_AUTOFEED 0x02
#define DCR_STROBE 0x01
//
// More bit definitions for the DCR.
//
#define DCR_NOT_1284_ACTIVE 0x08
#define DCR_ASTRB 0x08
#define DCR_NOT_REVERSE_REQUEST 0x04
#define DCR_NOT_HOST_BUSY 0x02
#define DCR_NOT_HOST_ACK 0x02
#define DCR_DSTRB 0x02
#define DCR_NOT_HOST_CLK 0x01
#define DCR_WRITE 0x01
#define DCR_NEUTRAL (DCR_RESERVED | DCR_SELECT_IN | DCR_NOT_INIT)
//
// Give a timeout of 300 seconds. Some postscript printers will
// buffer up a lot of commands then proceed to render what they
// have. The printer will then refuse to accept any characters
// until it's done with the rendering. This render process can
// take a while. We'll give it 300 seconds.
//
// Note that an application can change this value.
//
#define PAR_WRITE_TIMEOUT_VALUE 300
#ifdef JAPAN // IBM-J printers
//
// Support for IBM-J printers.
//
// When the printer operates in Japanese (PS55) mode, it redefines
// the meaning of parallel lines so that extended error status can
// be reported. It is roughly compatible with PC/AT, but we have to
// take care of a few cases where the status looks like PC/AT error
// condition.
//
// Status Busy /AutoFdXT Paper Empty Select /Fault
// ------ ---- --------- ----------- ------ ------
// Not RMR 1 1 1 1 1
// Head Alarm 1 1 1 1 0
// ASF Jam 1 1 1 0 0
// Paper Empty 1 0 1 0 0
// No Error 0 0 0 1 1
// Can Req 1 0 0 0 1
// Deselect 1 0 0 0 0
//
// The printer keeps "Not RMR" during the parallel port
// initialization, then it takes "Paper Empty", "No Error"
// or "Deselect". Other status can be thought as an
// H/W error condition.
//
// Namely, "Not RMR" conflicts with PAR_NO_CABLE and "Deselect"
// should also be regarded as another PAR_OFF_LINE. When the
// status is PAR_PAPER_EMPTY, the initialization is finished
// (we should not send init purlse again.)
//
// See ParInitializeDevice() for more information.
//
// [takashim]
#define PAR_OFF_LINE_COMMON( Status ) ( \
(IsNotNEC_98) ? \
(Status & PAR_STATUS_NOT_ERROR) && \
((Status & PAR_STATUS_NOT_BUSY) ^ PAR_STATUS_NOT_BUSY) && \
!(Status & PAR_STATUS_SLCT) : \
\
((Status & PAR_STATUS_NOT_ERROR) ^ PAR_STATUS_NOT_ERROR) && \
((Status & PAR_STATUS_NOT_BUSY) ^ PAR_STATUS_NOT_BUSY) && \
((Status & PAR_STATUS_PE) ^ PAR_STATUS_PE) && \
!(Status & PAR_STATUS_SLCT) \
)
#define PAR_OFF_LINE_IBM55( Status ) ( \
((Status & PAR_STATUS_NOT_BUSY) ^ PAR_STATUS_NOT_BUSY) && \
((Status & PAR_STATUS_PE) ^ PAR_STATUS_PE) && \
((Status & PAR_STATUS_SLCT) ^ PAR_STATUS_SLCT) && \
((Status & PAR_STATUS_NOT_ERROR) ^ PAR_STATUS_NOT_ERROR))
#define PAR_PAPER_EMPTY2( Status ) ( \
((Status & PAR_STATUS_NOT_BUSY) ^ PAR_STATUS_NOT_BUSY) && \
(Status & PAR_STATUS_PE) && \
((Status & PAR_STATUS_SLCT) ^ PAR_STATUS_SLCT) && \
((Status & PAR_STATUS_NOT_ERROR) ^ PAR_STATUS_NOT_ERROR))
//
// Redefine this for Japan.
//
#define PAR_OFF_LINE( Status ) ( \
PAR_OFF_LINE_COMMON( Status ) || \
PAR_OFF_LINE_IBM55( Status ))
#else // JAPAN
//
// Busy, not select, not error
//
// !JAPAN
#define PAR_OFF_LINE( Status ) ( \
(IsNotNEC_98) ? \
(Status & PAR_STATUS_NOT_ERROR) && \
((Status & PAR_STATUS_NOT_BUSY) ^ PAR_STATUS_NOT_BUSY) && \
!(Status & PAR_STATUS_SLCT) : \
\
((Status & PAR_STATUS_NOT_ERROR) ^ PAR_STATUS_NOT_ERROR) && \
((Status & PAR_STATUS_NOT_BUSY) ^ PAR_STATUS_NOT_BUSY) && \
((Status & PAR_STATUS_PE) ^ PAR_STATUS_PE) && \
!(Status & PAR_STATUS_SLCT) \
)
#endif // JAPAN
//
// Busy, PE
//
#define PAR_PAPER_EMPTY( Status ) ( \
(Status & PAR_STATUS_PE) )
//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -