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