@@ -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