Date: Tue, 20 Dec 2005 05:39:13 GMT From: Warner Losh <imp@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 88439 for review Message-ID: <200512200539.jBK5dDoo067105@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=88439 Change 88439 by imp@imp_hammer on 2005/12/20 05:38:48 Flesh out parameter setting Affected files ... .. //depot/projects/arm/src/sys/arm/at91/at91usartreg.h#3 edit .. //depot/projects/arm/src/sys/arm/at91/uart_dev_at91usart.c#6 edit Differences ... ==== //depot/projects/arm/src/sys/arm/at91/at91usartreg.h#3 (text+ko) ==== @@ -76,6 +76,15 @@ #define USART_MR_CHMODE_ECHO (1U << 14) #define USART_MR_CHMODE_LOOP (2U << 14) #define USART_MR_CHMODE_REMLOOP (3U << 14) +#define USART_MR_MSBF (1U << 16) +#define USART_MR_MODE9 (1U << 17) +#define USART_MR_CKLO_SCK (1U << 18) +#define USART_MR_OVER16 0 +#define USART_MR_OVER8 (1U << 19) +#define USART_MR_INACK (1U << 20) /* Inhibit NACK generation */ +#define USART_MR_DSNACK (1U << 21) /* Disable Successive NACK */ +#define USART_MR_MAXITERATION(x) ((x) << 24) +#define USART_MR_FILTER (1U << 28) /* Filters for Ir lines */ #define USART_IER 0x08 /* Interrupt enable register */ #define USART_IDR 0x0c /* Interrupt disable register */ ==== //depot/projects/arm/src/sys/arm/at91/uart_dev_at91usart.c#6 (text+ko) ==== @@ -47,13 +47,14 @@ #define DEFAULT_RCLK AT91C_MASTER_CLOCK #define SIGCHG(c, i, s, d) \ - if (c) { \ - i |= (i & s) ? s : s | d; \ - } else { \ - i = (i & s) ? (i & ~s) | d : i; \ - } + do { \ + if (c) { \ + i |= (i & s) ? s : s | d; \ + } else { \ + i = (i & s) ? (i & ~s) | d : i; \ + } \ + } while (0); - /* * Low-level UART interface. */ @@ -80,6 +81,11 @@ mr = USART_MR_MODE_NORMAL; mr |= USART_MR_USCLKS_MCK; /* Assume MCK */ + /* + * Or in the databits requested + */ + if (databits < 9) + mr &= ~USART_MR_MODE9; switch (databits) { case 5: mr |= USART_MR_CHRL_5BITS; @@ -93,10 +99,59 @@ case 8: mr |= USART_MR_CHRL_8BITS; break; + case 9: + mr |= USART_MR_CHRL_8BITS | USART_MR_MODE9; + break; default: return (EINVAL); } + /* + * Or in the parity + */ + switch (parity) { + case UART_PARITY_NONE: + mr |= USART_MR_PAR_NONE; + break; + case UART_PARITY_ODD: + mr |= USART_MR_PAR_ODD; + break; + case UART_PARITY_EVEN: + mr |= USART_MR_PAR_EVEN; + break; + case UART_PARITY_MARK: + mr |= USART_MR_PAR_MARK; + break; + case UART_PARITY_SPACE: + mr |= USART_MR_PAR_SPACE; + break; + default: + return (EINVAL); + } + + /* + * Or in the stop bits. Note: The hardware supports + * 1.5 stop bits in async mode, but there's no way to + * specify that AFAICT. + */ + if (stopbits > 1) + mr |= USART_MR_NBSTOP_2; + else + mr |= USART_MR_NBSTOP_2; + /* else if (stopbits == 1.5) + mr |= USART_MR_NBSTOP_1_5; */ + + /* + * We want normal plumbing mode too, none of this fancy + * loopback or echo mode. + */ + mr |= USART_MR_CHMODE_NORMAL; + + mr &= ~USART_MR_MSBF; /* lsb first */ + mr &= ~USART_MR_CKLO_SCK; /* Don't drive SCK */ + + /* XXX Need to take possible synchronous mode into account */ + return (0); } @@ -133,7 +188,8 @@ } /* - * Free resources now that we're no longer the console. + * Free resources now that we're no longer the console. This appears to + * be never called, and I'm unsure quite what to do if I am called. */ static void at91_usart_term(struct uart_bas *bas) @@ -204,7 +260,7 @@ KOBJMETHOD(uart_setsig, at91_usart_bus_setsig), KOBJMETHOD(uart_transmit, at91_usart_bus_transmit), - {0, 0 } + { 0, 0 } }; int @@ -228,7 +284,7 @@ { int i; - /* XXX very sub-optimial */ + /* XXX VERY sub-optimial */ mtx_lock_spin(&sc->sc_hwmtx); for (i = 0; i < sc->sc_txdatasz; i++) at91_usart_putc(&sc->sc_bas, sc->sc_txbuf[i]); @@ -244,14 +300,10 @@ do { old = sc->sc_hwsig; new = old; - if (sig & SER_DDTR) { - SIGCHG(sig & SER_DTR, new, SER_DTR, - SER_DDTR); - } - if (sig & SER_DRTS) { - SIGCHG(sig & SER_RTS, new, SER_RTS, - SER_DRTS); - } + if (sig & SER_DDTR) + SIGCHG(sig & SER_DTR, new, SER_DTR, SER_DDTR); + if (sig & SER_DRTS) + SIGCHG(sig & SER_RTS, new, SER_RTS, SER_DRTS); } while (!atomic_cmpset_32(&sc->sc_hwsig, old, new)); bas = &sc->sc_bas; mtx_lock_spin(&sc->sc_hwmtx); @@ -281,7 +333,8 @@ at91_usart_bus_param(struct uart_softc *sc, int baudrate, int databits, int stopbits, int parity) { - return (0); + return (at91_usart_param(&sc->sc_bas, baudrate, databits, stopbits, + parity)); } static int at91_usart_bus_ipend(struct uart_softc *sc)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200512200539.jBK5dDoo067105>