summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbernard <[email protected]>2021-05-04 15:20:05 +0800
committerGitee <[email protected]>2021-05-04 15:20:05 +0800
commit141effcae3f50a0096441984bb2bc973da1433ad (patch)
tree8988c7ae4d83359076bdd8e6e2c33179d9e2392c
parent39aa987fc8190850d7030527c3b3bfb9aa8bc812 (diff)
parente72008b614a0d2874e889827ce03205b21fa4c07 (diff)
!191 调整串口关闭时中断禁用和资源释放顺序
Merge pull request !191 from AubrCool/fix-serial.drv
-rw-r--r--components/drivers/serial/serial.c26
1 files changed, 15 insertions, 11 deletions
diff --git a/components/drivers/serial/serial.c b/components/drivers/serial/serial.c
index 32161ad0cb..2736ceed66 100644
--- a/components/drivers/serial/serial.c
+++ b/components/drivers/serial/serial.c
@@ -746,19 +746,24 @@ static rt_err_t rt_serial_close(struct rt_device *dev)
{
struct rt_serial_rx_fifo* rx_fifo;
+ /* configure low level device */
+ serial->ops->control(serial, RT_DEVICE_CTRL_CLR_INT, (void*)RT_DEVICE_FLAG_INT_RX);
+ dev->open_flag &= ~RT_DEVICE_FLAG_INT_RX;
+
rx_fifo = (struct rt_serial_rx_fifo*)serial->serial_rx;
RT_ASSERT(rx_fifo != RT_NULL);
rt_free(rx_fifo);
serial->serial_rx = RT_NULL;
- dev->open_flag &= ~RT_DEVICE_FLAG_INT_RX;
- /* configure low level device */
- serial->ops->control(serial, RT_DEVICE_CTRL_CLR_INT, (void*)RT_DEVICE_FLAG_INT_RX);
}
#ifdef RT_SERIAL_USING_DMA
else if (dev->open_flag & RT_DEVICE_FLAG_DMA_RX)
{
+ /* configure low level device */
+ serial->ops->control(serial, RT_DEVICE_CTRL_CLR_INT, (void *) RT_DEVICE_FLAG_DMA_RX);
+ dev->open_flag &= ~RT_DEVICE_FLAG_DMA_RX;
+
if (serial->config.bufsz == 0)
{
struct rt_serial_rx_dma* rx_dma;
@@ -778,10 +783,7 @@ static rt_err_t rt_serial_close(struct rt_device *dev)
rt_free(rx_fifo);
}
serial->serial_rx = RT_NULL;
- dev->open_flag &= ~RT_DEVICE_FLAG_DMA_RX;
- /* configure low level device */
- serial->ops->control(serial, RT_DEVICE_CTRL_CLR_INT, (void *) RT_DEVICE_FLAG_DMA_RX);
}
#endif /* RT_SERIAL_USING_DMA */
@@ -789,21 +791,26 @@ static rt_err_t rt_serial_close(struct rt_device *dev)
{
struct rt_serial_tx_fifo* tx_fifo;
+ serial->ops->control(serial, RT_DEVICE_CTRL_CLR_INT, (void*)RT_DEVICE_FLAG_INT_TX);
+ dev->open_flag &= ~RT_DEVICE_FLAG_INT_TX;
+
tx_fifo = (struct rt_serial_tx_fifo*)serial->serial_tx;
RT_ASSERT(tx_fifo != RT_NULL);
rt_free(tx_fifo);
serial->serial_tx = RT_NULL;
- dev->open_flag &= ~RT_DEVICE_FLAG_INT_TX;
/* configure low level device */
- serial->ops->control(serial, RT_DEVICE_CTRL_CLR_INT, (void*)RT_DEVICE_FLAG_INT_TX);
}
#ifdef RT_SERIAL_USING_DMA
else if (dev->open_flag & RT_DEVICE_FLAG_DMA_TX)
{
struct rt_serial_tx_dma* tx_dma;
+ /* configure low level device */
+ serial->ops->control(serial, RT_DEVICE_CTRL_CLR_INT, (void *) RT_DEVICE_FLAG_DMA_TX);
+ dev->open_flag &= ~RT_DEVICE_FLAG_DMA_TX;
+
tx_dma = (struct rt_serial_tx_dma*)serial->serial_tx;
RT_ASSERT(tx_dma != RT_NULL);
@@ -811,10 +818,7 @@ static rt_err_t rt_serial_close(struct rt_device *dev)
rt_free(tx_dma);
serial->serial_tx = RT_NULL;
- dev->open_flag &= ~RT_DEVICE_FLAG_DMA_TX;
- /* configure low level device */
- serial->ops->control(serial, RT_DEVICE_CTRL_CLR_INT, (void *) RT_DEVICE_FLAG_DMA_TX);
}
#endif /* RT_SERIAL_USING_DMA */