Date: Tue, 29 Jul 2003 00:05:44 -0700 (PDT) From: Marcel Moolenaar <marcel@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 35156 for review Message-ID: <200307290705.h6T75i1V084888@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=35156 Change 35156 by marcel@marcel_nfs on 2003/07/29 00:05:31 o Add method param for setting the line characteristics. o Implement t_param. o Revisit t_oproc and t_stop. Affected files ... .. //depot/projects/uart/dev/uart/uart_core.c#13 edit .. //depot/projects/uart/dev/uart/uart_dev_ns8250.c#13 edit .. //depot/projects/uart/dev/uart/uart_dev_sab82532.c#7 edit .. //depot/projects/uart/dev/uart/uart_dev_z8530.c#3 edit .. //depot/projects/uart/dev/uart/uart_if.m#7 edit Differences ... ==== //depot/projects/uart/dev/uart/uart_core.c#13 (text+ko) ==== @@ -32,6 +32,7 @@ #include <sys/bus.h> #include <sys/conf.h> #include <sys/cons.h> +#include <sys/fcntl.h> #include <sys/interrupt.h> #include <sys/kernel.h> #include <sys/malloc.h> @@ -79,18 +80,6 @@ sc = tp->t_dev->si_drv1; if (sc == NULL || sc->sc_leaving) return; - - if (tp->t_state & TS_TBLOCK) { - /* XXX clear RTS */ - } else { - /* XXX set RTS */ - } - - if (tp->t_state & (TS_TIMEOUT | TS_TTSTOP)) { - ttwwakeup(tp); - return; - } - if (tp->t_outq.c_cc > 0 && !sc->sc_txbusy) { sc->sc_txdatasz = q_to_b(&tp->t_outq, sc->sc_txbuf, sc->sc_txfifosz); @@ -103,6 +92,34 @@ static int uart_tty_param(struct tty *tp, struct termios *t) { + struct uart_softc *sc; + int databits, parity, stopbits; + + sc = tp->t_dev->si_drv1; + if (sc == NULL || sc->sc_leaving) + return (ENODEV); + if (t->c_ispeed != t->c_ospeed && t->c_ospeed != 0) + return (EINVAL); + if (t->c_ospeed == 0) { + UART_SETSIG(sc, UART_SIG_DDTR | UART_SIG_DRTS); + return (0); + } + switch (t->c_cflag & CSIZE) { + case CS5: databits = 5; break; + case CS6: databits = 6; break; + case CS7: databits = 7; break; + default: databits = 8; break; + } + stopbits = (t->c_cflag & CSTOPB) ? 2 : 1; + if (t->c_cflag & PARENB) + parity = (t->c_cflag & PARODD) ? UART_PARITY_ODD + : UART_PARITY_EVEN; + else + parity = UART_PARITY_NONE; + UART_PARAM(sc, t->c_ospeed, databits, stopbits, parity); + UART_SETSIG(sc, UART_SIG_DDTR | UART_SIG_DTR); + if ((t->c_cflag & CRTS_IFLOW) == 0) + UART_SETSIG(sc, UART_SIG_DRTS | UART_SIG_RTS); return (0); } @@ -114,6 +131,17 @@ sc = tp->t_dev->si_drv1; if (sc == NULL || sc->sc_leaving) return; + if (rw & FWRITE) { + if (sc->sc_txbusy) { + sc->sc_txbusy = 0; + UART_FLUSH(sc, UART_FLUSH_TRANSMITTER); + } + tp->t_state &= ~TS_BUSY; + } + if (rw & FREAD) { + UART_FLUSH(sc, UART_FLUSH_RECEIVER); + sc->sc_rxget = sc->sc_rxput = 0; + } } void ==== //depot/projects/uart/dev/uart/uart_dev_ns8250.c#13 (text+ko) ==== @@ -146,6 +146,43 @@ uart_barrier(bas); } +static int +ns8250_param(struct uart_bas *bas, int baudrate, int databits, int stopbits, + int parity) +{ + int divisor; + uint8_t lcr; + + lcr = 0; + if (databits >= 8) + lcr |= LCR_8BITS; + else if (databits == 7) + lcr |= LCR_7BITS; + else if (databits == 6) + lcr |= LCR_6BITS; + else + lcr |= LCR_5BITS; + if (stopbits > 1) + lcr |= LCR_STOPB; + lcr |= parity << 3; + + /* Set baudrate. */ + if (baudrate > 0) { + uart_setreg(bas, REG_LCR, lcr | LCR_DLAB); + uart_barrier(bas); + divisor = ns8250_divisor(bas->rclk, baudrate); + if (divisor == 0) + return (EINVAL); + uart_setdreg(bas, REG_DL, divisor); + uart_barrier(bas); + } + + /* Set LCR and clear DLAB. */ + uart_setreg(bas, REG_LCR, lcr); + uart_barrier(bas); + return (0); +} + /* * Low-level UART interface. */ @@ -201,35 +238,10 @@ ns8250_init(struct uart_bas *bas, int baudrate, int databits, int stopbits, int parity) { - int divisor; - u_char iir, lcr; + uint8_t iir; - lcr = 0; - if (databits >= 8) - lcr |= LCR_8BITS; - else if (databits == 7) - lcr |= LCR_7BITS; - else if (databits == 6) - lcr |= LCR_6BITS; - else - lcr |= LCR_5BITS; - if (stopbits > 1) - lcr |= LCR_STOPB; - lcr |= parity << 3; + ns8250_param(bas, baudrate, databits, stopbits, parity); - /* Set baudrate. */ - if (baudrate != 0UL) { - uart_setreg(bas, REG_LCR, lcr | LCR_DLAB); - uart_barrier(bas); - divisor = ns8250_divisor(bas->rclk, baudrate); - uart_setdreg(bas, REG_DL, divisor); - uart_barrier(bas); - } - - /* Set LCR and clear DLAB. */ - uart_setreg(bas, REG_LCR, lcr); - uart_barrier(bas); - /* Disable all interrupt sources. */ uart_setreg(bas, REG_IER, 0); uart_barrier(bas); @@ -325,6 +337,7 @@ static int ns8250_bus_flush(struct uart_softc *, int); static int ns8250_bus_getsig(struct uart_softc *); static int ns8250_bus_ipend(struct uart_softc *); +static int ns8250_bus_param(struct uart_softc *, int, int, int, int); static int ns8250_bus_probe(struct uart_softc *); static int ns8250_bus_receive(struct uart_softc *); static int ns8250_bus_setsig(struct uart_softc *, int); @@ -336,6 +349,7 @@ KOBJMETHOD(uart_flush, ns8250_bus_flush), KOBJMETHOD(uart_getsig, ns8250_bus_getsig), KOBJMETHOD(uart_ipend, ns8250_bus_ipend), + KOBJMETHOD(uart_param, ns8250_bus_param), KOBJMETHOD(uart_probe, ns8250_bus_probe), KOBJMETHOD(uart_receive, ns8250_bus_receive), KOBJMETHOD(uart_setsig, ns8250_bus_setsig), @@ -452,6 +466,16 @@ } static int +ns8250_bus_param(struct uart_softc *sc, int baudrate, int databits, + int stopbits, int parity) +{ + struct uart_bas *bas; + + bas = &sc->sc_bas; + return (ns8250_param(bas, baudrate, databits, stopbits, parity)); +} + +static int ns8250_bus_probe(struct uart_softc *sc) { struct uart_bas *bas; ==== //depot/projects/uart/dev/uart/uart_dev_sab82532.c#7 (text+ko) ==== @@ -120,6 +120,7 @@ static int sab82532_bus_flush(struct uart_softc *, int); static int sab82532_bus_getsig(struct uart_softc *); static int sab82532_bus_ipend(struct uart_softc *); +static int sab82532_bus_param(struct uart_softc *, int, int, int, int); static int sab82532_bus_probe(struct uart_softc *); static int sab82532_bus_receive(struct uart_softc *); static int sab82532_bus_setsig(struct uart_softc *, int); @@ -131,6 +132,7 @@ KOBJMETHOD(uart_flush, sab82532_bus_flush), KOBJMETHOD(uart_getsig, sab82532_bus_getsig), KOBJMETHOD(uart_ipend, sab82532_bus_ipend), + KOBJMETHOD(uart_param, sab82532_bus_param), KOBJMETHOD(uart_probe, sab82532_bus_probe), KOBJMETHOD(uart_receive, sab82532_bus_receive), KOBJMETHOD(uart_setsig, sab82532_bus_setsig), @@ -198,6 +200,14 @@ } static int +sab82532_bus_param(struct uart_softc *sc, int baudrate, int databits, + int stopbits, int parity) +{ + + return (0); +} + +static int sab82532_bus_probe(struct uart_softc *sc) { char buf[80]; ==== //depot/projects/uart/dev/uart/uart_dev_z8530.c#3 (text+ko) ==== @@ -108,6 +108,7 @@ static int z8530_bus_flush(struct uart_softc *, int); static int z8530_bus_getsig(struct uart_softc *); static int z8530_bus_ipend(struct uart_softc *); +static int z8530_bus_param(struct uart_softc *, int, int, int, int); static int z8530_bus_probe(struct uart_softc *); static int z8530_bus_receive(struct uart_softc *); static int z8530_bus_setsig(struct uart_softc *, int); @@ -119,6 +120,7 @@ KOBJMETHOD(uart_flush, z8530_bus_flush), KOBJMETHOD(uart_getsig, z8530_bus_getsig), KOBJMETHOD(uart_ipend, z8530_bus_ipend), + KOBJMETHOD(uart_param, z8530_bus_param), KOBJMETHOD(uart_probe, z8530_bus_probe), KOBJMETHOD(uart_receive, z8530_bus_receive), KOBJMETHOD(uart_setsig, z8530_bus_setsig), @@ -170,6 +172,14 @@ } static int +z8530_bus_param(struct uart_softc *sc, int baudrate, int databits, + int stopbits, int parity) +{ + + return (0); +} + +static int z8530_bus_probe(struct uart_softc *sc) { ==== //depot/projects/uart/dev/uart/uart_if.m#7 (text+ko) ==== @@ -50,7 +50,7 @@ # XXX needs explanation. METHOD int flush { struct uart_softc *this; - int what; + int what; }; # getsig() - get line and modem signals. @@ -77,6 +77,16 @@ struct uart_softc *this; } +# param() +# XXX needs explanation. +METHOD int param { + struct uart_softc *this; + int baudrate; + int databits; + int stopbits; + int parity; +}; + # probe() # XXX needs explanation. METHOD int probe { @@ -97,7 +107,7 @@ # DTE delta bits set of those DTE signals that did change by this method. METHOD int setsig { struct uart_softc *this; - int sig; + int sig; }; # transmit() - move data from the transmit buffer to the transmit FIFO.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200307290705.h6T75i1V084888>