NT4/private/ntos/dd/sermouse/uart.h
2020-09-30 17:12:29 +02:00

247 lines
6.4 KiB
C

/*++
Copyright (c) 1993 Microsoft Corporation
Copyright (c) 1993 Logitech Inc.
Module Name:
uart.h
Abstract:
Hardware dependent support for the serial port.
Environment:
Kernel mode only.
Notes:
Revision History:
--*/
#ifndef UART_H
#define UART_H
//
// Constants
//
//
// Define the INS8250 ACE Register Offsets And Bit Definitions
//
#define ACE_RBR 0 // Receiver Buffer
#define ACE_THR 0 // Transmit Holding Register
#define ACE_IER 1 // Interrupt Enable
#define ACE_ERBFI 0x01 // Received Data Available 00000001b
#define ACE_ETBEI 0x02 // Transmitter Holding Register Empty 00000010b
#define ACE_ELSI 0x04 // Receiver Line Status 00000100b
#define ACE_EDSSI 0x08 // Modem Status 00001000b
#define ACE_IIDR 2 // Interrupt Identification
#define ACE_IIP 0x01 // Inverted Interrupt Pending (0=int) 00000001b
#define ACE_IID 0x06 // Interrupt ID 00000110b
#define ACE_MSI 0x00 // Modem Status 00000000b
#define ACE_THREI 0x02 // Transmitter Holding Register Empty 00000010b
#define ACE_RDAI 0x04 // Received Data Available 00000100b
#define ACE_RLSI 0x06 // Receiver Line Status 00000110b
#define ACE_LCR 3 // Line Control
#define ACE_WLS 0x03 // Word Length Select Bits 00000011b
#define ACE_WLS0 0x01 // Word Length Select Bit 0 00000001b
#define ACE_WLS1 0x02 // Word Length Select Bit 1 00000010b
#define ACE_5BW 0x00 // 5 Bit Words 00000000b
#define ACE_6BW 0x01 // 6 Bit Words 00000001b
#define ACE_7BW 0x02 // 7 Bit Words 00000010b
#define ACE_8BW 0x03 // 8 Bit Words 00000011b
#define ACE_STB 0x04 // Stop Bits 00000100b
#define ACE_1SB 0x00 // 1 Stop Bits (1.5 for 5 bit words) 00000000b
#define ACE_2SB 0x04 // 2 Stop Bits 00000100b
#define ACE_PEN 0x08 // Parity Enable 00001000b
#define ACE_PSB 0x30 // Parity Select bits 00110000b
#define ACE_EPS 0x10 // Even Parity Select 00010000b
#define ACE_SP 0x20 // Stick Parity 00100000b
#define ACE_SB 0x40 // Set Break 01000000b
#define ACE_DLAB 0x80 // Divisor Latch Access Bit 10000000b
#define ACE_MCR 4 // Modem Control
#define ACE_DTR 0x01 // Data Terminal ready 00000001b
#define ACE_RTS 0x02 // Request To Send 00000010b
#define ACE_OUT1 0x04 // Output Line 1 00000100b
#define ACE_OUT2 0x08 // Output Line 2 00001000b
#define ACE_LOOP 0x10 // Loopback 00010000b
#define ACE_LSR 5 // Line Status
#define ACE_DR 0x01 // Data Ready 00000001b
#define ACE_OR 0x02 // Overrun Error 00000010b
#define ACE_PE 0x04 // Parity Error 00000100b
#define ACE_FE 0x08 // Framing Error 00001000b
#define ACE_BI 0x10 // Break Interrupt 00010000b
#define ACE_THRE 0x20 // Transmitter Holding Register Empty 00100000b
#define ACE_TSRE 0x40 // Transmitter Shift Register Empty 01000000b
#define ACE_LERR (ACE_OR | ACE_PE | ACE_FE | ACE_BI)
#define ACE_MSR 6 // Modem Status
#define ACE_DCTS 0x01 // Delta Clear to Send 00000001b
#define ACE_DDSR 0x02 // Delta Data Set Ready 00000010b
#define ACE_TERI 0x04 // Trailing Edge Ring Indicator 00000100b
#define ACE_DRLSD 0x08 // Delta Receive Line Signal Detect 00001000b
#define ACE_CTS 0x10 // Clear To Send 00010000b
#define ACE_DSR 0x20 // Data Set ready 00100000b
#define ACE_RI 0x40 // Ring Indicator 01000000b
#define ACE_RLSD 0x80 // Receive Line Signal Detect 10000000b
#define ACE_DLL 0 // LSB Baud Rate Divisor
#define ACE_DLM 1 // MSB Baud Rate Divisor
//
// Define the Baud Generator Divisor. BaudClock (a value known via the
// hardware registry) is actually BAUD_GENERATOR_DIVISOR times the baud rate.
// For example, if the output frequency of the Baud Generator is 16 times
// the baud rate, then BAUD_GENERATOR_DIVISOR is 16.
//
// The Baud Rate Factor is BaudClock/BAUD_GENERATOR_DIVISOR.
//
// The Baud Rate Divisor for the DLAB is Baud Rate Factor divided by the
// desired baud rate, where the desired baud rate is 1200, 2400, and so on.
//
#define BAUD_GENERATOR_DIVISOR 16
//
// Type definitions.
//
//
// UART configuration
//
typedef struct _UART {
ULONG BaudRate;
UCHAR LineCtrl;
UCHAR ModemCtrl;
UCHAR InterruptCtrl;
} UART, *PUART;
//
// Function prototypes
//
VOID
UARTSetFifo(
PUCHAR Port,
UCHAR Value
);
UCHAR
UARTGetInterruptCtrl(
PUCHAR Port
);
UCHAR
UARTSetInterruptCtrl(
PUCHAR Port,
UCHAR Value
);
UCHAR
UARTGetLineCtrl(
PUCHAR Port
);
UCHAR
UARTSetLineCtrl(
PUCHAR Port,
UCHAR Value
);
UCHAR
UARTGetModemCtrl(
PUCHAR Port
);
UCHAR
UARTSetModemCtrl(
PUCHAR Port,
UCHAR Value
);
BOOLEAN
UARTSetDlab(
PUCHAR Port,
BOOLEAN Set
);
ULONG
UARTGetBaudRate(
PUCHAR Port,
ULONG BaudClock
);
VOID
UARTSetBaudRate(
PUCHAR Port,
ULONG BaudRate,
ULONG BaudClock
);
VOID
UARTGetState(
PUCHAR Port,
PUART Uart,
ULONG BaudClock
);
VOID
UARTSetState(
PUCHAR Port,
PUART Uart,
ULONG BaudClock
);
BOOLEAN
UARTIsReceiveBufferFull(
PUCHAR Port
);
BOOLEAN
UARTReadCharNoWait(
PUCHAR Port,
PUCHAR Value
);
BOOLEAN
UARTReadChar(
PUCHAR Port,
PUCHAR Value,
ULONG Timeout
);
BOOLEAN
UARTFlushReadBuffer(
PUCHAR Port
);
BOOLEAN
UARTIsTransmitEmpty(
PUCHAR Port
);
BOOLEAN
UARTWriteChar(
PUCHAR Port,
UCHAR Value
);
BOOLEAN
UARTWriteString(
PUCHAR Port,
PSZ Buffer
);
#endif // UART_H