PERFORCE change 88439 for review
Warner Losh
imp at FreeBSD.org
Mon Dec 19 21:39:16 PST 2005
http://perforce.freebsd.org/chv.cgi?CH=88439
Change 88439 by imp at 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)
More information about the p4-projects
mailing list