PERFORCE change 35068 for review

Marcel Moolenaar marcel at FreeBSD.org
Sat Jul 26 20:12:09 PDT 2003


http://perforce.freebsd.org/chv.cgi?CH=35068

Change 35068 by marcel at marcel_nfs on 2003/07/26 20:11:07

	o  Add delta bit to the signals.
	o  Add a description for getsig & setsig.
	o  Implement getsig and setsig properly for ns8250.

Affected files ...

.. //depot/projects/uart/dev/uart/uart_bus.h#10 edit
.. //depot/projects/uart/dev/uart/uart_core.c#10 edit
.. //depot/projects/uart/dev/uart/uart_dev_ns8250.c#10 edit
.. //depot/projects/uart/dev/uart/uart_if.m#6 edit

Differences ...

==== //depot/projects/uart/dev/uart/uart_bus.h#10 (text+ko) ====

@@ -50,16 +50,24 @@
 #define	UART_STAT_OVERRUN	0x0400
 #define	UART_STAT_PARERR	0x0800
 
-/* Modem and line signals */
+/* Modem and line signals. */
 #define	UART_SIG_DTR		0x0001
 #define	UART_SIG_RTS		0x0002
-#define	UART_SIG_DCR		0x0100
-#define	UART_SIG_CTS		0x0200
-#define	UART_SIG_DCD		0x0400
-#define	UART_SIG_RI		0x0800
+#define	UART_SIG_DSR		0x0004
+#define	UART_SIG_CTS		0x0008
+#define	UART_SIG_DCD		0x0010
+#define	UART_SIG_RI		0x0020
+#define	UART_SIG_DDTR		0x0100
+#define	UART_SIG_DRTS		0x0200
+#define	UART_SIG_DDSR		0x0400
+#define	UART_SIG_DCTS		0x0800
+#define	UART_SIG_DDCD		0x1000
+#define	UART_SIG_DRI		0x2000
 
-#define	UART_SIGMASK_DTE	0x00FF
-#define	UART_SIGMASK_DCE	0xFF00
+#define	UART_SIGMASK_DTE	0x0003
+#define	UART_SIGMASK_DCE	0x003c
+#define	UART_SIGMASK_STATE	0x003f
+#define	UART_SIGMASK_DELTA	0x3f00
 
 /*
  * UART class & instance (=softc)

==== //depot/projects/uart/dev/uart/uart_core.c#10 (text+ko) ====

@@ -510,7 +510,8 @@
 		} else
 			tp->t_ispeed = tp->t_ospeed = TTYDEF_SPEED;
 
-		UART_SETSIG(sc, UART_SIG_DTR|UART_SIG_RTS);
+		UART_SETSIG(sc, UART_SIG_DDTR | UART_SIG_DRTS |
+		    UART_SIG_DTR | UART_SIG_RTS);
 	}
 
 	error = (*linesw[tp->t_line].l_open)(dev, tp);

==== //depot/projects/uart/dev/uart/uart_dev_ns8250.c#10 (text+ko) ====

@@ -317,8 +317,7 @@
 	uint8_t		fcr;
 	uint8_t		lcr;
 	uint8_t		mcr;
-	uint8_t		signals;
-	uint8_t		sigchg;
+	int		signals;
 };
 
 static int ns8250_bus_attach(struct uart_softc *);
@@ -352,6 +351,13 @@
 	.uc_rclk = 1843200
 };
 
+#define	SIGCHG(c, i, s, d)				\
+	if (c) {					\
+		i |= (i & s) ? s : s | d;		\
+	} else {					\
+		i = (i & s) ? (i & ~s) | d : i;		\
+	}
+
 static int
 ns8250_bus_attach(struct uart_softc *sc)
 {
@@ -367,8 +373,11 @@
 	uart_setreg(bas, REG_IER,
 	    IER_ERXRDY | IER_ETXRDY | IER_ERLS | IER_EMSC);
 	uart_barrier(bas);
-	ns8250->signals = uart_getreg(bas, REG_MSR) >> 4;
-	ns8250->sigchg = 0;
+	if (ns8250->mcr & MCR_DTR)
+		ns8250->signals |= UART_SIG_DTR;
+	if (ns8250->mcr & MCR_RTS)
+		ns8250->signals |= UART_SIG_RTS;
+	ns8250_bus_getsig(sc);
 	return (0);
 }
 
@@ -394,14 +403,17 @@
 ns8250_bus_getsig(struct uart_softc *sc)
 {
 	struct ns8250_softc *ns8250 = (struct ns8250_softc*)sc;
-	struct uart_bas *bas;
-	uint8_t sig;
+	uint8_t msr;
+	int sig;
 
-	bas = &sc->sc_bas;
-	sig = uart_getreg(bas, REG_MSR) >> 4;
-	ns8250->sigchg |= ns8250->signals ^ sig;
-	ns8250->signals = sig;
-	return ((ns8250->sigchg << 4) | ns8250->signals);
+	msr = uart_getreg(&sc->sc_bas, REG_MSR);
+	sig = ns8250->signals;
+	SIGCHG(msr & MSR_DSR, sig, UART_SIG_DSR, UART_SIG_DDSR);
+	SIGCHG(msr & MSR_CTS, sig, UART_SIG_CTS, UART_SIG_DCTS);
+	SIGCHG(msr & MSR_DCD, sig, UART_SIG_DCD, UART_SIG_DDCD);
+	SIGCHG(msr & MSR_RI,  sig, UART_SIG_RI,  UART_SIG_DRI);
+	ns8250->signals = sig & ~UART_SIGMASK_DELTA;
+	return (sig);
 }
 
 static int
@@ -409,8 +421,8 @@
 {
 	struct ns8250_softc *ns8250 = (struct ns8250_softc*)sc;
 	struct uart_bas *bas;
-	int ipend;
-	uint8_t lsr, sig;
+	int ipend, sig;
+	uint8_t lsr;
 
 	bas = &sc->sc_bas;
 	ipend = 0;
@@ -423,11 +435,11 @@
 		ipend |= UART_IPEND_RXREADY;
 	if (lsr & LSR_TEMT)
 		ipend |= UART_IPEND_TXIDLE;
-	sig = uart_getreg(bas, REG_MSR) >> 4;
-	ns8250->sigchg |= ns8250->signals ^ sig;
-	ns8250->signals = sig;
-	if (ns8250->sigchg)
+	sig = ns8250_bus_getsig(sc);
+	if (sig & UART_SIGMASK_DELTA) {
+		ns8250->signals = sig;	/* restore delta bits. */
 		ipend |= UART_IPEND_SIGCHG;
+	}
 	return (ipend);
 }
 
@@ -567,7 +579,6 @@
 	uint8_t lsr;
 
 	bas = &sc->sc_bas;
-
 	while (!uart_rx_full(sc)) {
 		lsr = uart_getreg(bas, REG_LSR);
 		if ((lsr & LSR_RXRDY) == 0)
@@ -585,7 +596,23 @@
 static int
 ns8250_bus_setsig(struct uart_softc *sc, int sig)
 {
+	struct ns8250_softc *ns8250 = (struct ns8250_softc*)sc;
 
+	if (sig & UART_SIG_DDTR) {
+		SIGCHG(sig & UART_SIG_DTR, ns8250->signals, UART_SIG_DTR,
+		    UART_SIG_DDTR);
+	}
+	if (sig & UART_SIG_DRTS) {
+		SIGCHG(sig & UART_SIG_DTR, ns8250->signals, UART_SIG_DTR,
+		    UART_SIG_DDTR);
+	}
+	ns8250->mcr &= ~(MCR_DTR|MCR_RTS);
+	if (ns8250->signals & UART_SIG_DTR)
+		ns8250->mcr |= MCR_DTR;
+	if (ns8250->signals & UART_SIG_RTS)
+		ns8250->mcr |= MCR_RTS;
+	uart_setreg(&sc->sc_bas, REG_MCR, ns8250->mcr);
+	uart_barrier(&sc->sc_bas);
 	return (0);
 }
 
@@ -596,7 +623,6 @@
 	int xc;
 
 	bas = &sc->sc_bas;
-
 	while (!uart_tx_empty(sc)) {
 		if ((uart_getreg(bas, REG_LSR) & LSR_THRE) == 0)
 			break;

==== //depot/projects/uart/dev/uart/uart_if.m#6 (text+ko) ====

@@ -54,7 +54,12 @@
 };
 
 # getsig() - get line and modem signals.
-# XXX needs explanation.
+# This method retrieves the DTE and DCE signals and their corresponding
+# delta bits. The delta bits include those corresponding to DTE signals
+# when they were changed by a call to setsig. The delta bits maintained
+# by the hardware driver are cleared as a side-effect. A second call to
+# this function will have not have any delta bits set, unless there was
+# a change in the signals in the mean time.
 METHOD int getsig {
 	struct uart_softc *this;
 };
@@ -86,7 +91,10 @@
 };
 
 # setsig() - set line and modem signals.
-# XXX needs explanation.
+# This method allows changing DTE signals. The DTE delta bits indicate which
+# signals are to be changed and the DTE bits themselves indicate whether to
+# set or clear the signals. A subsequent call to getsig will return with the
+# DTE delta bits set of those DTE signals that did change by this method.
 METHOD int setsig {
 	struct uart_softc *this;
 	int sig;


More information about the p4-projects mailing list