Date: Tue, 29 Jul 2003 01:27:25 -0700 (PDT) From: Marcel Moolenaar <marcel@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 35159 for review Message-ID: <200307290827.h6T8RPlG094470@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=35159 Change 35159 by marcel@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); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200307290827.h6T8RPlG094470>