Skip site navigation (1)Skip section navigation (2)
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>