PERFORCE change 35159 for review

Marcel Moolenaar marcel at FreeBSD.org
Tue Jul 29 01:27:27 PDT 2003


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

Change 35159 by marcel at marcel_nfs on 2003/07/29 01:27:00

	Implement ioctl(). Add UART_SIG_DBREAK and UART_SIG_BREAK to
	allow setting and clearing line breaks with setsig().

Affected files ...

.. //depot/projects/uart/dev/uart/uart_bus.h#12 edit
.. //depot/projects/uart/dev/uart/uart_core.c#14 edit
.. //depot/projects/uart/dev/uart/uart_dev_ns8250.c#14 edit

Differences ...

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

@@ -57,12 +57,14 @@
 #define	UART_SIG_CTS		0x0008
 #define	UART_SIG_DCD		0x0010
 #define	UART_SIG_RI		0x0020
+#define	UART_SIG_BREAK		0x0040
 #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_SIG_DBREAK		0x4000
 
 #define	UART_SIGMASK_DTE	0x0003
 #define	UART_SIGMASK_DCE	0x003c

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

@@ -542,12 +542,15 @@
 			tp->t_ispeed = tp->t_ospeed = uart_console.baudrate;
 		} else
 			tp->t_ispeed = tp->t_ospeed = TTYDEF_SPEED;
-
-		UART_SETSIG(sc, UART_SIG_DDTR | UART_SIG_DRTS |
-		    UART_SIG_DTR | UART_SIG_RTS);
+		error = uart_tty_param(tp, &tp->t_termios);
+		if (error)
+			return (error);
+		ttsetwater(tp);
 	}
 
-	error = (*linesw[tp->t_line].l_open)(dev, tp);
+	error = ttyopen(dev, tp);
+	if (error == 0)
+		error = (*linesw[tp->t_line].l_open)(dev, tp);
 	return (error);
 }
 
@@ -573,20 +576,79 @@
 {
 	struct uart_softc *sc;
 	struct tty *tp;
-	int error;
+	int bits, error, sig;
+
+	sc = dev->si_drv1;
+	if (sc == NULL || sc->sc_leaving)
+		return (ENXIO);
 
 	tp = dev->si_tty;
 	error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, flags, td);
 	if (error != ENOIOCTL)
 		return (error);
-
 	error = ttioctl(tp, cmd, data, flags);
 	if (error != ENOIOCTL)
 		return (error);
 
-	sc = dev->si_drv1;
-	if (sc == NULL || sc->sc_leaving)
-		return (ENXIO);
-
-	return (ENOTTY);
+	switch (cmd) {
+	case TIOCSBRK:
+		UART_SETSIG(sc, UART_SIG_DBREAK | UART_SIG_BREAK);
+		break;
+	case TIOCCBRK:
+		UART_SETSIG(sc, UART_SIG_DBREAK);
+		break;
+	case TIOCSDTR:
+		UART_SETSIG(sc, UART_SIG_DDTR | UART_SIG_DTR);
+		break;
+	case TIOCCDTR:
+		UART_SETSIG(sc, UART_SIG_DDTR);
+		break;
+	case TIOCMSET:
+		bits = *(int*)data;
+		sig = UART_SIG_DDTR | UART_SIG_DRTS;
+		if (bits & TIOCM_DTR)
+			sig |= UART_SIG_DTR;
+		if (bits & TIOCM_RTS)
+			sig |= UART_SIG_RTS;
+		UART_SETSIG(sc, sig);
+		break;
+        case TIOCMBIS:
+		bits = *(int*)data;
+		sig = 0;
+		if (bits & TIOCM_DTR)
+			sig |= UART_SIG_DDTR | UART_SIG_DTR;
+		if (bits & TIOCM_RTS)
+			sig |= UART_SIG_DRTS | UART_SIG_RTS;
+		UART_SETSIG(sc, sig);
+		break;
+        case TIOCMBIC:
+		bits = *(int*)data;
+		sig = 0;
+		if (bits & TIOCM_DTR)
+			sig |= UART_SIG_DDTR;
+		if (bits & TIOCM_RTS)
+			sig |= UART_SIG_DRTS;
+		UART_SETSIG(sc, sig);
+		break;
+        case TIOCMGET:
+		sig = UART_GETSIG(sc);
+		bits = 0;
+		if (sig & UART_SIG_DTR)
+			bits |= TIOCM_DTR;
+		if (sig & UART_SIG_RTS)
+			bits |= TIOCM_RTS;
+		if (sig & UART_SIG_DSR)
+			bits |= TIOCM_DSR;
+		if (sig & UART_SIG_CTS)
+			bits |= TIOCM_CTS;
+		if (sig & UART_SIG_DCD)
+			bits |= TIOCM_CD;
+		if (sig & (UART_SIG_DRI | UART_SIG_RI))
+			bits |= TIOCM_RI;
+		*(int*)data = bits;
+		break;
+	default:
+		return (ENOTTY);
+	}
+	return (0);
 }

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

@@ -327,7 +327,6 @@
 struct ns8250_softc {
 	struct uart_softc base;
 	uint8_t		fcr;
-	uint8_t		lcr;
 	uint8_t		mcr;
 	int		signals;
 };
@@ -381,7 +380,6 @@
 	bas = &sc->sc_bas;
 
 	ns8250->mcr = uart_getreg(bas, REG_MCR);
-	ns8250->lcr = uart_getreg(bas, REG_LCR);
 	ns8250->fcr = FCR_ENABLE | FCR_RX_MEDL;
 	uart_setreg(bas, REG_FCR, ns8250->fcr);
 	uart_barrier(bas);
@@ -629,6 +627,7 @@
 ns8250_bus_setsig(struct uart_softc *sc, int sig)
 {
 	struct ns8250_softc *ns8250 = (struct ns8250_softc*)sc;
+	uint8_t lcr;
 
 	if (sig & UART_SIG_DDTR) {
 		SIGCHG(sig & UART_SIG_DTR, ns8250->signals, UART_SIG_DTR,
@@ -645,6 +644,14 @@
 		ns8250->mcr |= MCR_RTS;
 	uart_setreg(&sc->sc_bas, REG_MCR, ns8250->mcr);
 	uart_barrier(&sc->sc_bas);
+	if (sig & UART_SIG_DBREAK) {
+		lcr = uart_getreg(&sc->sc_bas, REG_LCR);
+		if (sig & UART_SIG_BREAK)
+			lcr |= LCR_SBREAK;
+		else
+			lcr &= ~LCR_SBREAK;
+		uart_setreg(&sc->sc_bas, REG_LCR, lcr);
+	}
 	return (0);
 }
 


More information about the p4-projects mailing list