Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
人间散章
rt-thread
提交
fac3c5cd
R
rt-thread
项目概览
人间散章
/
rt-thread
与 Fork 源项目一致
Fork自
RT-Thread / rt-thread
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rt-thread
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
fac3c5cd
编写于
6月 07, 2021
作者:
C
chenjh
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[serial] 优化dma接收处理流程,解耦驱动调用串口框架的API接口
上级
d94be14d
变更
6
展开全部
隐藏空白更改
内联
并排
Showing
6 changed file
with
190 addition
and
323 deletion
+190
-323
bsp/stm32/libraries/HAL_Drivers/drv_usart_v2.c
bsp/stm32/libraries/HAL_Drivers/drv_usart_v2.c
+21
-21
bsp/stm32/stm32l475-atk-pandora/.config
bsp/stm32/stm32l475-atk-pandora/.config
+1
-15
bsp/stm32/stm32l475-atk-pandora/project.uvprojx
bsp/stm32/stm32l475-atk-pandora/project.uvprojx
+136
-244
bsp/stm32/stm32l475-atk-pandora/rtconfig.h
bsp/stm32/stm32l475-atk-pandora/rtconfig.h
+0
-10
components/drivers/include/drivers/serial_v2.h
components/drivers/include/drivers/serial_v2.h
+4
-10
components/drivers/serial/serial_v2.c
components/drivers/serial/serial_v2.c
+28
-23
未找到文件。
bsp/stm32/libraries/HAL_Drivers/drv_usart_v2.c
浏览文件 @
fac3c5cd
...
...
@@ -342,37 +342,42 @@ static void dma_recv_isr(struct rt_serial_device *serial, rt_uint8_t isr_flag)
{
struct
stm32_uart
*
uart
;
rt_base_t
level
;
rt_
uint16_t
recv_len
=
0
;
rt_
size_t
recv_len
,
counter
;
RT_ASSERT
(
serial
!=
RT_NULL
);
uart
=
rt_container_of
(
serial
,
struct
stm32_uart
,
serial
);
struct
rt_serial_rx_fifo
*
rx_fifo
;
rx_fifo
=
(
struct
rt_serial_rx_fifo
*
)
serial
->
serial_rx
;
RT_ASSERT
(
rx_fifo
!=
RT_NULL
);
level
=
rt_hw_interrupt_disable
();
rt_uint16_t
index
=
__HAL_DMA_GET_COUNTER
(
&
(
uart
->
dma_rx
.
handle
));
recv_len
=
0
;
counter
=
__HAL_DMA_GET_COUNTER
(
&
(
uart
->
dma_rx
.
handle
));
switch
(
isr_flag
)
{
case
UART_RX_DMA_IT_TC_FLAG
:
if
(
index
>=
uart
->
dma_rx
.
remaining_cnt
)
recv_len
=
serial
->
config
.
rx_bufsz
+
uart
->
dma_rx
.
remaining_cnt
-
index
;
case
UART_RX_DMA_IT_IDLE_FLAG
:
if
(
counter
<=
uart
->
dma_rx
.
remaining_cnt
)
recv_len
=
uart
->
dma_rx
.
remaining_cnt
-
counter
;
else
recv_len
=
serial
->
config
.
rx_bufsz
+
uart
->
dma_rx
.
remaining_cnt
-
counter
;
break
;
case
UART_RX_DMA_IT_HT_FLAG
:
case
UART_RX_DMA_IT_IDLE_FLAG
:
if
(
index
<
uart
->
dma_rx
.
remaining_cnt
)
recv_len
=
uart
->
dma_rx
.
remaining_cnt
-
index
;
if
(
counter
<
uart
->
dma_rx
.
remaining_cnt
)
recv_len
=
uart
->
dma_rx
.
remaining_cnt
-
counter
;
break
;
case
UART_RX_DMA_IT_TC_FLAG
:
if
(
counter
>=
uart
->
dma_rx
.
remaining_cnt
)
recv_len
=
serial
->
config
.
rx_bufsz
+
uart
->
dma_rx
.
remaining_cnt
-
counter
;
default:
break
;
}
uart
->
dma_rx
.
remaining_cnt
=
index
;
rt_serial_update_write_index
(
&
(
rx_fifo
->
rb
),
recv_len
);
if
(
recv_len
)
{
uart
->
dma_rx
.
remaining_cnt
=
counter
;
rt_hw_serial_isr
(
serial
,
RT_SERIAL_EVENT_RX_DMADONE
|
(
recv_len
<<
8
));
}
rt_hw_interrupt_enable
(
level
);
}
...
...
@@ -444,7 +449,6 @@ static void uart_isr(struct rt_serial_device *serial)
&&
(
__HAL_UART_GET_IT_SOURCE
(
&
(
uart
->
handle
),
UART_IT_IDLE
)
!=
RESET
))
{
dma_recv_isr
(
serial
,
UART_RX_DMA_IT_IDLE_FLAG
);
rt_hw_serial_isr
(
serial
,
RT_SERIAL_EVENT_RX_IND
);
__HAL_UART_CLEAR_IDLEFLAG
(
&
uart
->
handle
);
}
#endif
...
...
@@ -1051,9 +1055,7 @@ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
struct
stm32_uart
*
uart
;
RT_ASSERT
(
huart
!=
NULL
);
uart
=
(
struct
stm32_uart
*
)
huart
;
dma_recv_isr
(
&
uart
->
serial
,
UART_RX_DMA_IT_TC_FLAG
);
rt_hw_serial_isr
(
&
uart
->
serial
,
RT_SERIAL_EVENT_RX_DMADONE
);
}
/**
...
...
@@ -1068,15 +1070,13 @@ void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart)
struct
stm32_uart
*
uart
;
RT_ASSERT
(
huart
!=
NULL
);
uart
=
(
struct
stm32_uart
*
)
huart
;
dma_recv_isr
(
&
uart
->
serial
,
UART_RX_DMA_IT_HT_FLAG
);
rt_hw_serial_isr
(
&
uart
->
serial
,
RT_SERIAL_EVENT_RX_DMADONE
);
}
/**
* @brief HAL_UART_TxCpltCallback
* @param huart: UART handle
* @note This callback can be called by two functions, first in UART_EndTransmit_IT when
* @note This callback can be called by two functions, first in UART_EndTransmit_IT when
* UART Tx complete and second in UART_DMATransmitCplt function in DMA Circular mode.
* @retval None
*/
...
...
bsp/stm32/stm32l475-atk-pandora/.config
浏览文件 @
fac3c5cd
...
...
@@ -197,21 +197,7 @@ CONFIG_RT_USING_PIN=y
# CONFIG_RT_USING_RYM is not set
# CONFIG_RT_USING_ULOG is not set
# CONFIG_RT_USING_UTEST is not set
CONFIG_RT_USING_RT_LINK
=
y
CONFIG_RT_LINK_USING_SF_CRC
=
y
# CONFIG_RT_LINK_USING_HW_CRC is not set
#
# rt-link hardware device configuration
#
CONFIG_RT_LINK_HW_DEVICE_NAME
=
"uart2"
CONFIG_RT_LINK_USING_UART
=
y
#
# rt link debug option
#
# CONFIG_USING_RT_LINK_DEBUG is not set
# CONFIG_USING_RT_LINK_HW_DEBUG is not set
# CONFIG_RT_USING_RT_LINK is not set
# CONFIG_RT_USING_LWP is not set
#
...
...
bsp/stm32/stm32l475-atk-pandora/project.uvprojx
浏览文件 @
fac3c5cd
此差异已折叠。
点击以展开。
bsp/stm32/stm32l475-atk-pandora/rtconfig.h
浏览文件 @
fac3c5cd
...
...
@@ -111,16 +111,6 @@
/* Utilities */
#define RT_USING_RT_LINK
#define RT_LINK_USING_SF_CRC
/* rt-link hardware device configuration */
#define RT_LINK_HW_DEVICE_NAME "uart2"
#define RT_LINK_USING_UART
/* rt link debug option */
/* RT-Thread Utestcases */
...
...
components/drivers/include/drivers/serial_v2.h
浏览文件 @
fac3c5cd
...
...
@@ -112,7 +112,7 @@ struct serial_configure
};
/*
* Serial
FIFO mode
* Serial
Receive FIFO mode
*/
struct
rt_serial_rx_fifo
{
...
...
@@ -128,6 +128,9 @@ struct rt_serial_rx_fifo
rt_uint8_t
buffer
[];
};
/*
* Serial Transmit FIFO mode
*/
struct
rt_serial_tx_fifo
{
struct
rt_ringbuffer
rb
;
...
...
@@ -174,15 +177,6 @@ struct rt_uart_ops
rt_uint32_t
tx_flag
);
};
rt_size_t
rt_serial_get_linear_buffer
(
struct
rt_ringbuffer
*
rb
,
rt_uint8_t
**
ptr
);
rt_size_t
rt_serial_update_read_index
(
struct
rt_ringbuffer
*
rb
,
rt_uint16_t
read_index
);
rt_size_t
rt_serial_update_write_index
(
struct
rt_ringbuffer
*
rb
,
rt_uint16_t
write_index
);
void
rt_hw_serial_isr
(
struct
rt_serial_device
*
serial
,
int
event
);
rt_err_t
rt_hw_serial_register
(
struct
rt_serial_device
*
serial
,
...
...
components/drivers/serial/serial_v2.c
浏览文件 @
fac3c5cd
...
...
@@ -157,7 +157,7 @@ static int serial_fops_poll(struct dfs_fd *fd, struct rt_pollreq *req)
rx_fifo
=
(
struct
rt_serial_rx_fifo
*
)
serial
->
serial_rx
;
level
=
rt_hw_interrupt_disable
();
if
(
rt_ringbuffer_data_len
(
&
rx_fifo
->
rb
))
mask
|=
POLLIN
;
rt_hw_interrupt_enable
(
level
);
...
...
@@ -180,8 +180,8 @@ const static struct dfs_file_ops _serial_fops =
};
#endif
rt_size_t
rt_serial_get_linear_buffer
(
struct
rt_ringbuffer
*
rb
,
rt_uint8_t
**
ptr
)
static
rt_size_t
rt_serial_get_linear_buffer
(
struct
rt_ringbuffer
*
rb
,
rt_uint8_t
**
ptr
)
{
rt_size_t
size
;
...
...
@@ -206,8 +206,8 @@ rt_size_t rt_serial_get_linear_buffer(struct rt_ringbuffer *rb,
return
rb
->
buffer_size
-
rb
->
read_index
;
}
rt_size_t
rt_serial_update_read_index
(
struct
rt_ringbuffer
*
rb
,
rt_uint16_t
read_index
)
static
rt_size_t
rt_serial_update_read_index
(
struct
rt_ringbuffer
*
rb
,
rt_uint16_t
read_index
)
{
rt_size_t
size
;
...
...
@@ -219,7 +219,7 @@ rt_size_t rt_serial_update_read_index(struct rt_ringbuffer *rb,
/* no data */
if
(
size
==
0
)
return
0
;
/* less data */
if
(
size
<
read_index
)
read_index
=
size
;
...
...
@@ -239,8 +239,8 @@ rt_size_t rt_serial_update_read_index(struct rt_ringbuffer *rb,
return
read_index
;
}
rt_size_t
rt_serial_update_write_index
(
struct
rt_ringbuffer
*
rb
,
rt_uint16_t
write_index
)
static
rt_size_t
rt_serial_update_write_index
(
struct
rt_ringbuffer
*
rb
,
rt_uint16_t
write_index
)
{
rt_uint16_t
size
;
RT_ASSERT
(
rb
!=
RT_NULL
);
...
...
@@ -499,7 +499,7 @@ static rt_size_t _serial_fifo_tx_blocking_buf(struct rt_device *dev,
while
(
size
)
{
/* Copy one piece of data into the ringbuffer at a time
/* Copy one piece of data into the ringbuffer at a time
* until the length of the data is equal to size */
tx_fifo
->
put_size
=
rt_ringbuffer_put
(
&
(
tx_fifo
->
rb
),
(
rt_uint8_t
*
)
buffer
+
offset
,
...
...
@@ -629,7 +629,7 @@ static rt_err_t rt_serial_tx_enable(struct rt_device *dev,
if
(
optmode
==
RT_SERIAL_TX_BLOCKING_BUFFER
)
{
/* If use RT_SERIAL_TX_BLOCKING_BUFFER, the ringbuffer is initialized */
tx_fifo
=
(
struct
rt_serial_tx_fifo
*
)
rt_malloc
tx_fifo
=
(
struct
rt_serial_tx_fifo
*
)
rt_malloc
(
sizeof
(
struct
rt_serial_tx_fifo
)
+
serial
->
config
.
tx_bufsz
);
RT_ASSERT
(
tx_fifo
!=
RT_NULL
);
...
...
@@ -641,9 +641,9 @@ static rt_err_t rt_serial_tx_enable(struct rt_device *dev,
}
else
{
/* If not use RT_SERIAL_TX_BLOCKING_BUFFER,
/* If not use RT_SERIAL_TX_BLOCKING_BUFFER,
* the control() API is called to configure the serial device */
tx_fifo
=
(
struct
rt_serial_tx_fifo
*
)
rt_malloc
tx_fifo
=
(
struct
rt_serial_tx_fifo
*
)
rt_malloc
(
sizeof
(
struct
rt_serial_tx_fifo
));
RT_ASSERT
(
tx_fifo
!=
RT_NULL
);
...
...
@@ -665,14 +665,14 @@ static rt_err_t rt_serial_tx_enable(struct rt_device *dev,
/* When using RT_SERIAL_TX_NON_BLOCKING, ringbuffer needs to be initialized,
* and initialize the tx_fifo->activated value is RT_FALSE.
*/
tx_fifo
=
(
struct
rt_serial_tx_fifo
*
)
rt_malloc
tx_fifo
=
(
struct
rt_serial_tx_fifo
*
)
rt_malloc
(
sizeof
(
struct
rt_serial_tx_fifo
)
+
serial
->
config
.
tx_bufsz
);
RT_ASSERT
(
tx_fifo
!=
RT_NULL
);
tx_fifo
->
activated
=
RT_FALSE
;
tx_fifo
->
put_size
=
0
;
rt_ringbuffer_init
(
&
(
tx_fifo
->
rb
),
tx_fifo
->
buffer
,
rt_ringbuffer_init
(
&
(
tx_fifo
->
rb
),
tx_fifo
->
buffer
,
serial
->
config
.
tx_bufsz
);
serial
->
serial_tx
=
tx_fifo
;
...
...
@@ -712,7 +712,7 @@ static rt_err_t rt_serial_rx_enable(struct rt_device *dev,
return
-
RT_EINVAL
;
}
dev
->
read
=
_serial_poll_rx
;
dev
->
read
=
_serial_poll_rx
;
dev
->
open_flag
|=
RT_SERIAL_RX_BLOCKING
;
return
RT_EOK
;
}
...
...
@@ -892,7 +892,7 @@ static rt_err_t rt_serial_open(struct rt_device *dev, rt_uint16_t oflag)
dev
->
open_flag
|=
RT_SERIAL_TX_BLOCKING
;
/* set steam flag */
if
((
oflag
&
RT_DEVICE_FLAG_STREAM
)
||
if
((
oflag
&
RT_DEVICE_FLAG_STREAM
)
||
(
dev
->
open_flag
&
RT_DEVICE_FLAG_STREAM
))
dev
->
open_flag
|=
RT_DEVICE_FLAG_STREAM
;
...
...
@@ -903,7 +903,7 @@ static rt_err_t rt_serial_open(struct rt_device *dev, rt_uint16_t oflag)
/* initialize the Tx structure according to open flag */
if
(
serial
->
serial_tx
==
RT_NULL
)
rt_serial_tx_enable
(
dev
,
dev
->
open_flag
&
rt_serial_tx_enable
(
dev
,
dev
->
open_flag
&
(
RT_SERIAL_TX_BLOCKING
|
RT_SERIAL_TX_NON_BLOCKING
));
return
RT_EOK
;
...
...
@@ -925,10 +925,10 @@ static rt_err_t rt_serial_close(struct rt_device *dev)
/* this device has more reference count */
if
(
dev
->
ref_count
>
1
)
return
-
RT_ERROR
;
/* Disable serial receive mode. */
rt_serial_rx_disable
(
dev
,
dev
->
open_flag
&
rt_serial_rx_disable
(
dev
,
dev
->
open_flag
&
(
RT_SERIAL_RX_BLOCKING
|
RT_SERIAL_RX_NON_BLOCKING
));
/* Disable serial tranmit mode. */
rt_serial_tx_disable
(
dev
,
dev
->
open_flag
&
rt_serial_tx_disable
(
dev
,
dev
->
open_flag
&
(
RT_SERIAL_TX_BLOCKING
|
RT_SERIAL_TX_NON_BLOCKING
));
/* Call the control() API to close the serial device */
...
...
@@ -978,7 +978,7 @@ static rt_err_t rt_serial_control(struct rt_device *dev,
}
/* set serial configure */
serial
->
config
=
*
pconfig
;
serial
->
ops
->
configure
(
serial
,
serial
->
ops
->
configure
(
serial
,
(
struct
serial_configure
*
)
args
);
}
...
...
@@ -994,7 +994,7 @@ static rt_err_t rt_serial_control(struct rt_device *dev,
}
#ifdef RT_USING_DEVICE_OPS
const
static
struct
rt_device_ops
serial_ops
=
const
static
struct
rt_device_ops
serial_ops
=
{
rt_serial_init
,
rt_serial_open
,
...
...
@@ -1070,9 +1070,14 @@ void rt_hw_serial_isr(struct rt_serial_device *serial, int event)
rx_fifo
=
(
struct
rt_serial_rx_fifo
*
)
serial
->
serial_rx
;
RT_ASSERT
(
rx_fifo
!=
RT_NULL
);
/* If the event is RT_SERIAL_EVENT_RX_IND, rx_length is equal to 0 */
rx_length
=
(
event
&
(
~
0xff
))
>>
8
;
if
(
rx_length
)
rt_serial_update_write_index
(
&
(
rx_fifo
->
rb
),
rx_length
);
/* Get the length of the data from the ringbuffer */
rx_length
=
rt_ringbuffer_data_len
(
&
rx_fifo
->
rb
);
if
(
rx_length
==
0
)
break
;
if
(
serial
->
parent
.
open_flag
&
RT_SERIAL_RX_BLOCKING
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录