diff options
Diffstat (limited to '')
-rw-r--r-- | private/ntos/ndis/irmini/comm.h | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/private/ntos/ndis/irmini/comm.h b/private/ntos/ndis/irmini/comm.h new file mode 100644 index 000000000..2ce431b32 --- /dev/null +++ b/private/ntos/ndis/irmini/comm.h @@ -0,0 +1,194 @@ +/* + ************************************************************************ + * + * COMM.h + * + * IRMINI Infrared Serial NDIS Miniport driver. + * + * (C) Copyright 1996 Microsoft Corp. + * + * + * (ep) + * + ************************************************************************* + */ + + +#ifndef COMM_H + #define COMM_H + + /* + * Size of the 16550 read and write FIFOs + */ + #define FIFO_SIZE 16 + + /* + * The programming interface to a UART (COM serial port) + * consists of eight consecutive registers. + * These are the port offsets from the UART's base I/O address. + */ + typedef enum comPortRegOffsets { + XFER_REG_OFFSET = 0, + INT_ENABLE_REG_OFFSET = 1, + INT_ID_AND_FIFO_CNTRL_REG_OFFSET = 2, + LINE_CONTROL_REG_OFFSET = 3, + MODEM_CONTROL_REG_OFFSET = 4, + LINE_STAT_REG_OFFSET = 5, + MODEM_STAT_REG_OFFSET = 6, + SCRATCH_REG_OFFSET = 7 + } comPortRegOffset; + + + /* + * Bits in the UART Interrupt-Id register. + */ + #define INTID_INTERRUPT_NOT_PENDING (UCHAR)(1 << 0) + + /* + * Values for bits 2-1 of Interrupt-Id register: + * 00 Modem Stat reg interrupt + * 01 Transmitter holding reg interrupt + * 10 Receive data ready interrupt + * 11 Receive line status interrupt + * + */ + #define INTID_INTIDMASK (UCHAR)(3 << 1) + #define INTID_MODEMSTAT_INT (UCHAR)(0 << 1) + #define INTID_XMITREG_INT (UCHAR)(1 << 1) + #define INTID_RCVDATAREADY_INT (UCHAR)(2 << 1) + #define INTID_RCVLINESTAT_INT (UCHAR)(3 << 1) + + + + /* + * Bits in the UART line-status register. + */ + #define LINESTAT_DATAREADY (UCHAR)(1 << 0) + #define LINESTAT_OVERRUNERROR (UCHAR)(1 << 1) + #define LINESTAT_PARITYERROR (UCHAR)(1 << 2) + #define LINESTAT_FRAMINGERROR (UCHAR)(1 << 3) + #define LINESTAT_BREAK (UCHAR)(1 << 4) + #define LINESTAT_XMIT_HOLDING_REG_EMPTY (UCHAR)(1 << 5) + #define LINESTAT_XMIT_SHIFT_AND_HOLDING_REG_EMPTY (UCHAR)(1 << 6) + + + /* + * These are bits in the UART's interrupt-enable register (INT_ENABLE_REG_OFFSET). + */ + #define DATA_AVAIL_INT_ENABLE (1 << 0) + #define READY_FOR_XMIT_INT_ENABLE (1 << 1) + #define RCV_LINE_STAT_INT_ENABLE (1 << 2) + #define MODEM_STAT_INT_ENABLE (1 << 3) + + #define RCV_MODE_INTS_ENABLE (DATA_AVAIL_INT_ENABLE) + #define XMIT_MODE_INTS_ENABLE (READY_FOR_XMIT_INT_ENABLE|DATA_AVAIL_INT_ENABLE) + #define ALL_INTS_ENABLE (RCV_MODE_INTS_ENABLE | XMIT_MODE_INTS_ENABLE) + #define ALL_INTS_DISABLE 0 + + /* + * Some UART transceivers have minor differences which require + * special treatment. We'll get the actual type out of the + * registry. + * + * Note that this enumeration must match that in irmini.inf. + */ + typedef enum irTransceiverType { + STANDARD_UART = 0, + ESI_9680 = 1, + ACTISYS_220L = 2, + CRYSTAL = 3, + ADAPTEC = 4, + PARALLAX = 5, + NSC_DEMO_BD = 6, // NSC PC87108 demo board + + NUM_TRANSCEIVER_TYPES + } irTransceiverType; + + /* + * These are fine-tuning parameters for the COM port ISR. + * Number of times we poll a COM port register waiting + * for a value which may/must appear. + */ + #define REG_POLL_LOOPS 2 + #define REG_TIMEOUT_LOOPS 1000000 + + + typedef enum { + STATE_INIT = 0, + STATE_GOT_BOF, + STATE_ACCEPTING, + STATE_ESC_SEQUENCE, + STATE_SAW_EOF, + STATE_CLEANUP + } portRcvState; + + + + /* + * This is the information that we need to keep for each COMM port. + */ + typedef struct { + + /* + * HW resource settings for COM port. + */ + UINT irq; + UINT ioBase; + + /* + * Is this COM port a 16550 with a 16-byte FIFO or + * a 16450/8250 with no FIFO ? + */ + BOOLEAN haveFIFO; + + /* + * Data for our rcv state machine. + */ + UCHAR rawBuf[FIFO_SIZE]; + PUCHAR readBuf; + UINT readBufPos; + portRcvState rcvState; + + /* + * Data for send state machine + */ + UCHAR writeBuf[MAX_IRDA_DATA_SIZE]; + UINT writeBufPos; + UINT writeBufLen; + BOOLEAN writePending; + + /* + * Dongle or part-specific information + */ + dongleCapabilities hwCaps; + UINT dongleContext; + + } comPortInfo; + + + extern USHORT comPortIOBase[]; + + /* + ************************************************************************* + * GetCOMPort + ************************************************************************* + */ + UCHAR __inline GetCOMPort(UINT comBase, comPortRegOffset portOffset) + { + UCHAR val; + NdisRawReadPortUchar(comBase+portOffset, &val); + return val; + } + + /* + ************************************************************************* + * SetCOMPort + ************************************************************************* + */ + VOID __inline SetCOMPort(UINT comBase, comPortRegOffset portOffset, UCHAR val) + { + NdisRawWritePortUchar(comBase+portOffset, val); + } + + +#endif COMM_H |