Date: Wed, 27 Aug 2003 16:28:24 -0700 (PDT) From: Marcel Moolenaar <marcel@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 37045 for review Message-ID: <200308272328.h7RNSOwD030402@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=37045 Change 37045 by marcel@marcel_nfs on 2003/08/27 16:28:17 Add register constants for the enhanced feature register. We need that later on when we add hardware flow control. Rename some constants to be more consistent. While here: always make the size of the Tx FIFO 16 bytes, even if the Rx FIFO is larger. We don't program the Tx trigger level so we get interrupts every 16 bytes. However, we assume that all data has been sent when we get the interrupt. This does not hold if we previously wrote 32 (or so) characters to the Tx FIFO. This needs to be improved, but now at least it's correct. Affected files ... .. //depot/projects/uart/dev/uart/uart_dev_ns8250.c#22 edit .. //depot/projects/uart/dev/uart/uart_dev_ns8250.h#2 edit Differences ... ==== //depot/projects/uart/dev/uart/uart_dev_ns8250.c#22 (text+ko) ==== @@ -277,7 +277,7 @@ uart_barrier(bas); /* Set RTS & DTR. */ - uart_setreg(bas, REG_MCR, MCR_IENABLE | MCR_RTS | MCR_DTR); + uart_setreg(bas, REG_MCR, MCR_IE | MCR_RTS | MCR_DTR); uart_barrier(bas); ns8250_clrint(bas); @@ -288,7 +288,7 @@ { /* Clear RTS & DTR. */ - uart_setreg(bas, REG_MCR, MCR_IENABLE); + uart_setreg(bas, REG_MCR, MCR_IE); uart_barrier(bas); } @@ -506,7 +506,7 @@ if (error) return (error); - mcr = MCR_IENABLE; + mcr = MCR_IE; if (sc->sc_sysdev == NULL) { /* By using ns8250_init() we also set DTR and RTS. */ ns8250_init(bas, 9600, 8, 1, UART_PARITY_NONE); @@ -521,8 +521,7 @@ * Set loopback mode. This avoids having garbage on the wire and * also allows us send and receive data. We set DTR and RTS to * avoid the possibility that automatic flow-control prevents - * any data from being sent. We clear IENABLE to avoid raising - * interrupts. + * any data from being sent. We clear IE to avoid raising interrupts. */ uart_setreg(bas, REG_MCR, MCR_LOOPBACK | MCR_DTR | MCR_RTS); uart_barrier(bas); @@ -547,7 +546,7 @@ return (0); } - uart_setreg(bas, REG_FCR, FCR_ENABLE | FCR_DMA_MODE | FCR_RX_HIGH | + uart_setreg(bas, REG_FCR, FCR_ENABLE | FCR_DMA | FCR_RX_HIGH | FCR_XMT_RST | FCR_RCV_RST); uart_barrier(bas); @@ -616,7 +615,12 @@ "Non-standard ns8250 class UART with FIFOs"); } - sc->sc_txfifosz = sc->sc_rxfifosz; + /* + * Force the Tx FIFO size to 16 bytes for now. We don't program the + * Tx trigger. Also, we assume that all data has been sent when the + * interrupt happens. + */ + sc->sc_txfifosz = 16; return (0); } ==== //depot/projects/uart/dev/uart/uart_dev_ns8250.h#2 (text+ko) ==== @@ -26,34 +26,59 @@ * $FreeBSD$ */ -#ifndef _DEV_UART_8250REG_H_ -#define _DEV_UART_8250REG_H_ +#ifndef _DEV_UART_DEV_NS8250_H_ +#define _DEV_UART_DEV_NS8250_H_ + +/* Enhanced Feature Register. */ +#define EFR_CTS 0x80 +#define EFR_RTS 0x40 +#define EFR_SCD 0x20 /* Special Character Detect. */ +#define EFR_EFC 0x10 /* Enhanced Function Control. */ +#define EFR_SFC_MASK 0x0f /* Software Flow Control. */ +#define EFR_SFC_TX12 0x0c /* BIT: Transmit XON1+2/XOFF1+2. */ +#define EFR_SFC_TX1 0x08 /* BIT: Transmit XON1/XOFF1. */ +#define EFR_SFC_TX2 0x04 /* BIT: Transmit XON2/XOFF2. */ +#define EFR_SFC_RX1 0x02 /* BIT: Receive XON1/XOFF1. */ +#define EFR_SFC_RX2 0x01 /* BIT: Receive XON2/XOFF2. */ +#define EFR_SFC_T12R12 0x0f /* VAL: TX 1+2, RX 1+2. */ +#define EFR_SFC_T1R12 0x0b /* VAL: TX 1, RX 1+2. */ +#define EFR_SFC_T2R12 0x07 /* VAL: TX 2, RX 1+2. */ /* FIFO Control Register. */ +#define FCR_RX_HIGH 0xc0 +#define FCR_RX_MEDH 0x80 +#define FCR_RX_MEDL 0x40 +#define FCR_RX_LOW 0x00 +#define FCR_TX_HIGH 0x30 +#define FCR_TX_MEDH 0x20 +#define FCR_TX_LOW 0x10 +#define FCR_TX_MEDL 0x00 +#define FCR_DMA 0x08 +#define FCR_XMT_RST 0x04 +#define FCR_RCV_RST 0x02 #define FCR_ENABLE 0x01 -#define FCR_RCV_RST 0x02 -#define FCR_XMT_RST 0x04 -#define FCR_DMA_MODE 0x08 -#define FCR_RX_LOW 0x00 -#define FCR_RX_MEDL 0x40 -#define FCR_RX_MEDH 0x80 -#define FCR_RX_HIGH 0xc0 /* Interrupt Enable Register. */ +#define IER_CTS 0x80 +#define IER_RTS 0x40 +#define IER_XOFF 0x20 +#define IER_SLEEP 0x10 +#define IER_EMSC 0x08 +#define IER_ERLS 0x04 +#define IER_ETXRDY 0x02 #define IER_ERXRDY 0x01 -#define IER_ETXRDY 0x02 -#define IER_ERLS 0x04 -#define IER_EMSC 0x08 /* Interrupt Identification Register. */ +#define IIR_FIFO_MASK 0xc0 +#define IIR_RTSCTS 0x20 +#define IIR_XOFF 0x10 #define IIR_IMASK 0x0f #define IIR_RXTOUT 0x0c #define IIR_RLS 0x06 #define IIR_RXRDY 0x04 #define IIR_TXRDY 0x02 +#define IIR_MLSC 0x00 #define IIR_NOPEND 0x01 -#define IIR_MLSC 0x00 -#define IIR_FIFO_MASK 0xc0 /* Line Control Register. */ #define LCR_DLAB 0x80 @@ -70,7 +95,7 @@ #define LCR_5BITS 0x00 /* Line Status Register. */ -#define LSR_RCV_FIFO 0x80 +#define LSR_DERR 0x80 #define LSR_TEMT 0x40 /* Transmitter Empty. */ #define LSR_THRE 0x20 /* Transmitter Holding Register Empty. */ #define LSR_BI 0x10 @@ -78,13 +103,15 @@ #define LSR_PE 0x04 #define LSR_OE 0x02 #define LSR_RXRDY 0x01 -#define LSR_RCV_MASK 0x1f /* Modem Control Register. */ -#define MCR_PRESCALE 0x80 +#define MCR_CS 0x80 +#define MCR_IRE 0x40 +#define MCR_ISEL 0x20 #define MCR_LOOPBACK 0x10 -#define MCR_IENABLE 0x08 -#define MCR_DRS 0x04 +#define MCR_IE 0x08 +#define MCR_LBDCD MCR_IE +#define MCR_LBRI 0x04 #define MCR_RTS 0x02 #define MCR_DTR 0x01 @@ -98,13 +125,10 @@ #define MSR_DDSR 0x02 #define MSR_DCTS 0x01 -/* Register offsets. */ +/* General registers. */ #define REG_DATA 0 /* Data Register. */ #define REG_RBR REG_DATA /* Receiver Buffer Register (R). */ #define REG_THR REG_DATA /* Transmitter Holding Register (W). */ -#define REG_DLBL 0 /* Divisor Latch (LSB). */ -#define REG_DLBH 1 /* Divisor Latch (MSB). */ -#define REG_DL REG_DLBL /* Divisor Latch (16-bit I/O). */ #define REG_IER 1 /* Interrupt Enable Register */ #define REG_IIR 2 /* Interrupt Ident. Register (R). */ #define REG_FCR 2 /* FIFO Control Register (W). */ @@ -114,4 +138,16 @@ #define REG_MSR 6 /* Modem Status Register. */ #define REG_SPR 7 /* Scratch Pad Register. */ -#endif /* _DEV_UART_8250REG_H_ */ +/* Baudrate registers (LCR[7] = 1). */ +#define REG_DLBL 0 /* Divisor Latch (LSB). */ +#define REG_DLBH 1 /* Divisor Latch (MSB). */ +#define REG_DL REG_DLBL /* Divisor Latch (16-bit I/O). */ + +/* Enhanced registers (LCR = 0xBF). */ +#define REG_EFR 2 /* Enhanced Feature Register. */ +#define REG_XON1 4 /* XON character 1. */ +#define REG_XON2 5 /* XON character 2. */ +#define REG_XOFF1 6 /* XOFF character 1. */ +#define REG_XOFF2 7 /* XOFF character 2. */ + +#endif /* _DEV_UART_DEV_NS8250_H_ */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200308272328.h7RNSOwD030402>