[drivers][serial_v2] 修复dma下rx_flush的bug

This commit is contained in:
ryancw 2025-07-21 20:44:46 +08:00 committed by Rbb666
parent 7c0fed5d68
commit d23006ea4f
1 changed files with 5 additions and 11 deletions

View File

@ -943,7 +943,7 @@ static rt_err_t rt_serial_rx_enable(struct rt_device *dev,
serial->config.rx_bufsz = RT_SERIAL_RX_MINBUFSZ; serial->config.rx_bufsz = RT_SERIAL_RX_MINBUFSZ;
#ifdef RT_SERIAL_USING_DMA #ifdef RT_SERIAL_USING_DMA
if (serial->config.dma_ping_bufsz > 0 && serial->config.dma_ping_bufsz < RT_SERIAL_RX_MINBUFSZ / 2) if (serial->config.dma_ping_bufsz < RT_SERIAL_RX_MINBUFSZ / 2)
serial->config.dma_ping_bufsz = RT_SERIAL_RX_MINBUFSZ / 2; serial->config.dma_ping_bufsz = RT_SERIAL_RX_MINBUFSZ / 2;
rx_fifo_size = sizeof(struct rt_serial_rx_fifo) + serial->config.rx_bufsz + serial->config.dma_ping_bufsz; rx_fifo_size = sizeof(struct rt_serial_rx_fifo) + serial->config.rx_bufsz + serial->config.dma_ping_bufsz;
#else #else
@ -959,12 +959,9 @@ static rt_err_t rt_serial_rx_enable(struct rt_device *dev,
serial->config.rx_bufsz); serial->config.rx_bufsz);
#ifdef RT_SERIAL_USING_DMA #ifdef RT_SERIAL_USING_DMA
if (serial->config.dma_ping_bufsz > 0) rt_ringbuffer_init(&rx_fifo->dma_ping_rb,
{ (rt_uint8_t *)rx_fifo + sizeof(struct rt_serial_rx_fifo) + serial->config.rx_bufsz,
rt_ringbuffer_init(&rx_fifo->dma_ping_rb, serial->config.dma_ping_bufsz);
(rt_uint8_t *)rx_fifo + sizeof(struct rt_serial_rx_fifo) + serial->config.rx_bufsz,
serial->config.dma_ping_bufsz);
}
#endif #endif
serial->serial_rx = rx_fifo; serial->serial_rx = rx_fifo;
@ -1219,10 +1216,7 @@ static void _serial_rx_flush(struct rt_serial_device *serial)
rt_ringbuffer_reset(&rx_fifo->rb); rt_ringbuffer_reset(&rx_fifo->rb);
rx_fifo->rx_cpt_index = 0; rx_fifo->rx_cpt_index = 0;
#ifdef RT_SERIAL_USING_DMA #ifdef RT_SERIAL_USING_DMA
if (serial->config.dma_ping_bufsz > 0) rt_serial_update_read_index(&rx_fifo->dma_ping_rb, rt_ringbuffer_get_size(&rx_fifo->dma_ping_rb));
{
rt_ringbuffer_reset(&rx_fifo->dma_ping_rb);
}
#endif #endif
rt_spin_unlock_irqrestore(&serial->spinlock, level); rt_spin_unlock_irqrestore(&serial->spinlock, level);
} }