Thread (45 messages) 45 messages, 8 authors, 2015-03-27

Re: [PATCH v3 10/15] serial: stm32-usart: Add STM32 USART Driver

From: Peter Hurley <hidden>
Date: 2015-03-27 11:32:58
Also in: linux-api, linux-arch, linux-arm-kernel, linux-gpio, linux-serial, lkml

On 03/26/2015 06:03 PM, Maxime Coquelin wrote:
quoted
quoted
+static void stm32_set_termios(struct uart_port *port, struct ktermios *termios,
+                         struct ktermios *old)
+{
+     unsigned int baud;
+     u32 usardiv, mantissa, fraction;
+     tcflag_t cflag;
+     u32 cr1, cr2, cr3;
+     unsigned long flags;
+
+     baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk / 16);
+     cflag = termios->c_cflag;
+
+     spin_lock_irqsave(&port->lock, flags);
+
+     /* Stop serial port and reset value */
+     writel_relaxed(0, port->membase + USART_CR1);
+
+     cr1 = USART_CR1_TE | USART_CR1_RE | USART_CR1_UE | USART_CR1_RXNEIE;
+
+     if (cflag & CSTOPB)
+             cr2 = USART_CR2_STOP_2B;
+
+     if (cflag & PARENB) {
+             cr1 |= USART_CR1_PCE;
+             if ((cflag & CSIZE) == CS8)
+                     cr1 |= USART_CR1_M;
+     }
+
+     if (cflag & PARODD)
+             cr1 |= USART_CR1_PS;
+
+     if (cflag & CRTSCTS)
+             cr3 = USART_CR3_RTSE | USART_CR3_CTSE;
If this means autoflow control, then you need to define
throttle()/unthrottle() methods, otherwise the serial core won't
be able to throttle the remote when input buffers are about
to overflow.

And you should only enable the autoCTS and let the serial
core enable autoRTS through set_mctrl(TIOCM_RTS).

Just let me know if you need more info about how to do this.
Ok, let's see if I have well understood.

USART_CR3_RTSE should be set/cleared in set_mctrl(), depending on
TIOCM_RTS  value.
The throttle callback should disable the rx interrupt, and the
unthrottle enable it.
For CTS, it should be enabled in set_termios() if CRTSCTS, as done here.

Am I right?
Yeah, basically. You also have to indicate to the serial core that you
require throttle/unthrottle handling in this mode by setting port->status.

Your set_termios() method would look like:

	port->status &= ~(UPSTAT_AUTOCTS | UPSTAT_AUTORTS);
	if (cflag & CRTSCTS) {
		port->status |= UPSTAT_AUTOCTS | UPSTAT_AUTORTS;
		cr3 = USART_CR3_CTSE;
	}

and your set_mctrl() method would look like:

	if ((mctrl & TIOCM_RTS) && (port->status & UPSTAT_AUTORTS))
		stm32_set_bits(port, USART_CR3, USART_CR3_RTSE);
	else
		stm32_clear_bits(port, USART_CR3, USART_CR3_RTSE);

The UPSTAT_AUTOCTS doesn't really do anything right now but please
use it anyway to indicate this driver has that functionality.

Regards,
Peter Hurley
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help