📄 parallel.h
字号:
// screw up. - dvrh
} PARALLEL_SAFETY;
//
// The following structure is returned by
// IOCTL_INTERNAL_PARCLASS_CONNECT.
//
typedef
USHORT
(*PDETERMINE_IEEE_MODES) (
IN PVOID Context
);
#define OLD_PARCLASS 0
#if OLD_PARCLASS
typedef
NTSTATUS
(*PNEGOTIATE_IEEE_MODE) (
IN PVOID Extension,
IN UCHAR Extensibility
);
#else
typedef
NTSTATUS
(*PNEGOTIATE_IEEE_MODE) (
IN PVOID Context,
IN USHORT ModeMaskFwd,
IN USHORT ModeMaskRev,
IN PARALLEL_SAFETY ModeSafety,
IN BOOLEAN IsForward
);
#endif
typedef
NTSTATUS
(*PTERMINATE_IEEE_MODE) (
IN PVOID Context
);
typedef
NTSTATUS
(*PPARALLEL_IEEE_FWD_TO_REV)(
IN PVOID Context
);
typedef
NTSTATUS
(*PPARALLEL_IEEE_REV_TO_FWD)(
IN PVOID Context
);
typedef
NTSTATUS
(*PPARALLEL_READ) (
IN PVOID Context,
OUT PVOID Buffer,
IN ULONG NumBytesToRead,
OUT PULONG NumBytesRead,
IN UCHAR Channel
);
typedef
NTSTATUS
(*PPARALLEL_WRITE) (
IN PVOID Context,
OUT PVOID Buffer,
IN ULONG NumBytesToWrite,
OUT PULONG NumBytesWritten,
IN UCHAR Channel
);
typedef
NTSTATUS
(*PPARALLEL_TRYSELECT_DEVICE) (
IN PVOID Context,
IN PARALLEL_1284_COMMAND Command
);
typedef
NTSTATUS
(*PPARALLEL_DESELECT_DEVICE) (
IN PVOID Context,
IN PARALLEL_1284_COMMAND Command
);
typedef struct _PARCLASS_INFORMATION {
PUCHAR Controller;
PUCHAR EcrController;
ULONG SpanOfController;
PDETERMINE_IEEE_MODES DetermineIeeeModes;
PNEGOTIATE_IEEE_MODE NegotiateIeeeMode;
PTERMINATE_IEEE_MODE TerminateIeeeMode;
PPARALLEL_IEEE_FWD_TO_REV IeeeFwdToRevMode;
PPARALLEL_IEEE_REV_TO_FWD IeeeRevToFwdMode;
PPARALLEL_READ ParallelRead;
PPARALLEL_WRITE ParallelWrite;
PVOID ParclassContext;
ULONG HardwareCapabilities;
ULONG FifoDepth;
ULONG FifoWidth;
PPARALLEL_TRYSELECT_DEVICE ParallelTryselect;
PPARALLEL_DESELECT_DEVICE ParallelDeSelect;
} PARCLASS_INFORMATION, *PPARCLASS_INFORMATION;
//
// Standard and ECP parallel port offsets.
//
#define DATA_OFFSET 0
#define OFFSET_ECP_AFIFO 0x0000 // ECP Mode Address FIFO
#define AFIFO_OFFSET OFFSET_ECP_AFIFO // ECP Mode Address FIFO
#define DSR_OFFSET 1
#define DCR_OFFSET 2
#define EPP_OFFSET 4
// default to the old defines - note that the old defines break on PCI cards
#ifndef DVRH_USE_PARPORT_ECP_ADDR
#define DVRH_USE_PARPORT_ECP_ADDR 0
#endif
// DVRH_USE_PARPORT_ECP_ADDR settings
// 0 - ECP registers are hardcoded to
// Controller + 0x400
// 1 - ECP registers are pulled from
// Parport which hopefully got
// them from PnP.
#if (0 == DVRH_USE_PARPORT_ECP_ADDR)
// ***Note: These do not hold for PCI parallel ports
#define ECP_OFFSET 0x400
#define CNFGB_OFFSET 0x401
#define ECR_OFFSET 0x402
#else
#define ECP_OFFSET 0x0
#define CNFGB_OFFSET 0x1
#define ECR_OFFSET 0x2
#endif
#define FIFO_OFFSET ECP_OFFSET
#define CFIFO_OFFSET ECP_OFFSET
#define CNFGA_OFFSET ECP_OFFSET
#define ECP_DFIFO_OFFSET ECP_OFFSET // ECP Mode Data FIFO
#define TFIFO_OFFSET ECP_OFFSET
#define OFFSET_ECP_DFIFO ECP_OFFSET // ECP Mode Data FIFO
#define OFFSET_TFIFO ECP_OFFSET // Test FIFO
#define OFFSET_CFIFO ECP_OFFSET // Fast Centronics Data FIFO
#define OFFSET_ECR ECR_OFFSET // Extended Control Register
#define OFFSET_PARALLEL_REGISTER_SPAN 0x0003
#define ECP_SPAN 3
#define EPP_SPAN 4
//
// 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_NULL 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
//
// Bit definitions for configuration register A.
//
#define CNFGA_IMPID_MASK 0x70
#define CNFGA_IMPID_16BIT 0x00
#define CNFGA_IMPID_8BIT 0x10
#define CNFGA_IMPID_32BIT 0x20
#define CNFGA_NO_TRANS_BYTE 0x04
////////////////////////////////////////////////////////////////////////////////
// ECR values that establish basic hardware modes. In each case, the default
// is to disable error interrupts, DMA, and service interrupts.
////////////////////////////////////////////////////////////////////////////////
#if (0 == PARCHIP_ECR_ARBITRATOR)
#define DEFAULT_ECR_PS2 0x34
#define DEFAULT_ECR_ECP 0x74
#endif
//
// Bit definitions for ECR register.
//
#define ECR_ERRINT_DISABLED 0x10
#define ECR_DMA_ENABLED 0x08
#define ECR_SVC_INT_DISABLED 0x04
#define ECR_MODE_MASK 0x1F
#define ECR_SPP_MODE 0x00
#define ECR_BYTE_MODE 0x20 // PS/2
#define ECR_BYTE_PIO_MODE (ECR_BYTE_MODE | ECR_ERRINT_DISABLED | ECR_SVC_INT_DISABLED)
#define ECR_FASTCENT_MODE 0x40
#define ECR_ECP_MODE 0x60
#define ECR_ECP_PIO_MODE (ECR_ECP_MODE | ECR_ERRINT_DISABLED | ECR_SVC_INT_DISABLED)
#define ECR_EPP_MODE 0x80
#define ECR_EPP_PIO_MODE (ECR_EPP_MODE | ECR_ERRINT_DISABLED | ECR_SVC_INT_DISABLED)
#define ECR_RESERVED_MODE 0x10
#define ECR_TEST_MODE 0xC0
#define ECR_CONFIG_MODE 0xE0
#define DEFAULT_ECR_TEST 0xD4
#define DEFAULT_ECR_COMPATIBILITY 0x14
#define DEFAULT_ECR_CONFIGURATION 0xF4
#define ECR_FIFO_MASK 0x03 // Mask to isolate FIFO bits
#define ECR_FIFO_FULL 0x02 // FIFO completely full
#define ECR_FIFO_EMPTY 0x01 // FIFO completely empty
#define ECR_FIFO_SOME_DATA 0x00 // FIFO has some data in it
#define ECP_MAX_FIFO_DEPTH 4098 // Likely max for ECP HW FIFO size
//------------------------------------------------------------------------
// Mask and test values for extracting the Implementation ID from the
// ConfigA register
//------------------------------------------------------------------------
#define CNFGA_IMPID_MASK 0x70
#define CNFGA_IMPID_SHIFT 4
#define FIFO_PWORD_8BIT 1
#define FIFO_PWORD_16BIT 0
#define FIFO_PWORD_32BIT 2
#define TEST_ECR_FIFO(registerValue,testValue) \
( ( (registerValue) & ECR_FIFO_MASK ) == testValue )
//////////////////////////////////////////////////////////////////////////////
// The following BIT_x definitions provide a generic bit shift value
// based upon the bit's position in a hardware register or byte of
// memory. These constants are used by some of the macros that are
// defined below.
//////////////////////////////////////////////////////////////////////////////
#define BIT_7 7
#define BIT_6 6
#define BIT_5 5
#define BIT_4 4
#define BIT_3 3
#define BIT_2 2
#define BIT_1 1
#define BIT_0 0
#define BIT_7_SET 0x80
#define BIT_6_SET 0x40
#define BIT_5_SET 0x20
#define BIT_4_SET 0x10
#define BIT_3_SET 0x8
#define BIT_2_SET 0x4
#define BIT_1_SET 0x2
#define BIT_0_SET 0x1
//////////////////////////////////////////////////////////////////////////////
// The following defines and macros may be used to set, test, and
// update the Device Control Register (DCR).
//////////////////////////////////////////////////////////////////////////////
#define DIR_READ 1
#define DIR_WRITE 0
#define IRQEN_ENABLE 1
#define IRQEN_DISABLE 0
#define ACTIVE 1
#define INACTIVE 0
#define DONT_CARE 2
#define DVRH_USE_FAST_MACROS 1
#define DVRH_USE_NIBBLE_MACROS 1
//////////////////////////////////////////////////////////////////////////////
// The following defines may be used generically in any of the SET_xxx,
// TEST_xxx, or UPDATE_xxx macros that follow.
//////////////////////////////////////////////////////////////////////////////
#if (1 == DVRH_USE_FAST_MACROS)
#define SET_DCR(b5,b4,b3,b2,b1,b0) \
((UCHAR)((b5==ACTIVE? BIT_5_SET : 0) | \
(b4==ACTIVE? BIT_4_SET : 0) | \
(b3==ACTIVE? 0 : BIT_3_SET) | \
(b2==ACTIVE? BIT_2_SET : 0) | \
(b1==ACTIVE? 0 : BIT_1_SET) | \
(b0==ACTIVE? 0 : BIT_0_SET) ) )
#else
#define SET_DCR(b5,b4,b3,b2,b1,b0) \
((UCHAR)(((b5==ACTIVE?1:0)<<BIT_5) | \
((b4==ACTIVE?1:0)<<BIT_4) | \
((b3==ACTIVE?0:1)<<BIT_3) | \
((b2==ACTIVE?1:0)<<BIT_2) | \
((b1==ACTIVE?0:1)<<BIT_1) | \
((b0==ACTIVE?0:1)<<BIT_0) ) )
#endif
typedef enum {
PHASE_UNKNOWN,
PHASE_NEGOTIATION,
PHASE_SETUP, // Used in ECP mode only
PHASE_FORWARD_IDLE,
PHASE_FORWARD_XFER,
PHASE_FWD_TO_REV,
PHASE_REVERSE_IDLE,
PHASE_REVERSE_XFER,
PHASE_REV_TO_FWD,
PHASE_TERMINATE,
PHASE_DATA_AVAILABLE, // Used in nibble and byte modes only
PHASE_DATA_NOT_AVAIL, // Used in nibble and byte modes only
PHASE_INTERRUPT_HOST // Used in nibble and byte modes only
} P1284_PHASE;
typedef enum {
HW_MODE_COMPATIBILITY,
HW_MODE_PS2,
HW_MODE_FAST_CENTRONICS,
HW_MODE_ECP,
HW_MODE_EPP,
HW_MODE_RESERVED,
HW_MODE_TEST,
HW_MODE_CONFIGURATION
} P1284_HW_MODE;
#endif // _PARALLEL_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -