STM32: Handle setting of USART CR1_M when 8 bits of data plus parity

This commit is contained in:
Gregory Nutt
2014-06-11 15:49:54 -06:00
parent 7d7693acb3
commit 3bfc1effaf
+18 -10
View File
@@ -1253,7 +1253,7 @@ static void up_set_format(struct uart_dev_s *dev)
/* Configure parity mode */ /* Configure parity mode */
regval = up_serialin(priv, STM32_USART_CR1_OFFSET); regval = up_serialin(priv, STM32_USART_CR1_OFFSET);
regval &= ~(USART_CR1_PCE|USART_CR1_PS); regval &= ~(USART_CR1_PCE | USART_CR1_PS | USART_CR1_M);
if (priv->parity == 1) /* Odd parity */ if (priv->parity == 1) /* Odd parity */
{ {
@@ -1264,6 +1264,21 @@ static void up_set_format(struct uart_dev_s *dev)
regval |= USART_CR1_PCE; regval |= USART_CR1_PCE;
} }
/* Configure word length (parity uses one of configured bits)
*
* Default: 1 start, 8 data (no parity), n stop, OR
* 1 start, 7 data + parity, n stop
*/
if (priv->bits == 9 || (priv->bits == 8 && priv->parity != 0))
{
/* Select: 1 start, 8 data + parity, n stop, OR
* 1 start, 9 data (no parity), n stop.
*/
regval |= USART_CR1_M;
}
up_serialout(priv, STM32_USART_CR1_OFFSET, regval); up_serialout(priv, STM32_USART_CR1_OFFSET, regval);
/* Configure STOP bits */ /* Configure STOP bits */
@@ -1457,17 +1472,10 @@ static int up_setup(struct uart_dev_s *dev)
up_serialout(priv, STM32_USART_CR2_OFFSET, regval); up_serialout(priv, STM32_USART_CR2_OFFSET, regval);
/* Configure CR1 */ /* Configure CR1 */
/* Clear M, TE, REm and all interrupt enable bits */ /* Clear TE, REm and all interrupt enable bits */
regval = up_serialin(priv, STM32_USART_CR1_OFFSET); regval = up_serialin(priv, STM32_USART_CR1_OFFSET);
regval &= ~(USART_CR1_M|USART_CR1_TE|USART_CR1_RE|USART_CR1_ALLINTS); regval &= ~(USART_CR1_TE | USART_CR1_RE | USART_CR1_ALLINTS);
/* Configure word length */
if (priv->bits == 9) /* Default: 1 start, 8 data, n stop */
{
regval |= USART_CR1_M; /* 1 start, 9 data, n stop */
}
up_serialout(priv, STM32_USART_CR1_OFFSET, regval); up_serialout(priv, STM32_USART_CR1_OFFSET, regval);