From owner-p4-projects@FreeBSD.ORG Tue Dec 20 05:39:15 2005 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 75CE516A422; Tue, 20 Dec 2005 05:39:15 +0000 (GMT) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 308F516A41F for ; Tue, 20 Dec 2005 05:39:15 +0000 (GMT) (envelope-from imp@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 76F4443D62 for ; Tue, 20 Dec 2005 05:39:13 +0000 (GMT) (envelope-from imp@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.1/8.13.1) with ESMTP id jBK5dD68067108 for ; Tue, 20 Dec 2005 05:39:13 GMT (envelope-from imp@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.1/8.13.1/Submit) id jBK5dDoo067105 for perforce@freebsd.org; Tue, 20 Dec 2005 05:39:13 GMT (envelope-from imp@freebsd.org) Date: Tue, 20 Dec 2005 05:39:13 GMT Message-Id: <200512200539.jBK5dDoo067105@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to imp@freebsd.org using -f From: Warner Losh To: Perforce Change Reviews Cc: Subject: PERFORCE change 88439 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 20 Dec 2005 05:39:16 -0000 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)