Skip to content

Commit 78e1190

Browse files
committed
stm32f7:Support DMA on IDLE
stm32f7:Enable IDEL INT only if DMA in use
1 parent 192bd8c commit 78e1190

File tree

1 file changed

+27
-1
lines changed

1 file changed

+27
-1
lines changed

arch/arm/src/stm32f7/stm32_serial.c

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1394,6 +1394,14 @@ static inline void up_setusartint(struct up_dev_s *priv, uint16_t ie)
13941394
cr = up_serialin(priv, STM32_USART_CR1_OFFSET);
13951395
cr &= ~(USART_CR1_USED_INTS);
13961396
cr |= (ie & (USART_CR1_USED_INTS));
1397+
1398+
#ifdef SERIAL_HAVE_RXDMA
1399+
if (priv->rxdma != 0)
1400+
{
1401+
cr |= USART_CR1_IDLEIE;
1402+
}
1403+
#endif
1404+
13971405
up_serialout(priv, STM32_USART_CR1_OFFSET, cr);
13981406

13991407
cr = up_serialin(priv, STM32_USART_CR3_OFFSET);
@@ -1963,7 +1971,8 @@ static int up_setup(struct uart_dev_s *dev)
19631971
/* Clear TE, REm and all interrupt enable bits */
19641972

19651973
regval = up_serialin(priv, STM32_USART_CR1_OFFSET);
1966-
regval &= ~(USART_CR1_TE | USART_CR1_RE | USART_CR1_ALLINTS);
1974+
regval &= ~(USART_CR1_TE | USART_CR1_RE | USART_CR1_IDLEIE |
1975+
USART_CR1_ALLINTS);
19671976

19681977
up_serialout(priv, STM32_USART_CR1_OFFSET, regval);
19691978

@@ -1985,6 +1994,13 @@ static int up_setup(struct uart_dev_s *dev)
19851994

19861995
regval = up_serialin(priv, STM32_USART_CR1_OFFSET);
19871996
regval |= (USART_CR1_UE | USART_CR1_TE | USART_CR1_RE);
1997+
#ifdef SERIAL_HAVE_RXDMA
1998+
if (priv->rxdma != 0)
1999+
{
2000+
regval |= USART_CR1_IDLEIE;
2001+
}
2002+
#endif
2003+
19882004
up_serialout(priv, STM32_USART_CR1_OFFSET, regval);
19892005

19902006
#endif /* CONFIG_SUPPRESS_UART_CONFIG */
@@ -2329,6 +2345,16 @@ static int up_interrupt(int irq, void *context, FAR void *arg)
23292345
}
23302346
#endif
23312347

2348+
#ifdef SERIAL_HAVE_RXDMA
2349+
/* The line going to idle, deliver any fractions of RX data */
2350+
2351+
if ((priv->sr & USART_ISR_IDLE) != 0)
2352+
{
2353+
up_serialout(priv, STM32_USART_ICR_OFFSET, USART_ICR_IDLECF);
2354+
up_dma_rxcallback(priv->rxdma, 0, priv);
2355+
}
2356+
#endif
2357+
23322358
/* Handle incoming, receive bytes. */
23332359

23342360
if ((priv->sr & USART_ISR_RXNE) != 0 &&

0 commit comments

Comments
 (0)