Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
宁楠萍
rt-thread
提交
99911a4c
R
rt-thread
项目概览
宁楠萍
/
rt-thread
与 Fork 源项目一致
Fork自
RT-Thread / rt-thread
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rt-thread
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
99911a4c
编写于
5月 24, 2017
作者:
armink_ztl
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[DeviceDriver] Make uart rx DMA FIFO to use the FIFO full flag.
上级
14728ff4
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
29 addition
and
14 deletion
+29
-14
components/drivers/serial/serial.c
components/drivers/serial/serial.c
+29
-14
未找到文件。
components/drivers/serial/serial.c
浏览文件 @
99911a4c
...
...
@@ -168,14 +168,21 @@ rt_inline int _serial_int_tx(struct rt_serial_device *serial, const rt_uint8_t *
*/
static
rt_size_t
rt_dma_calc_recved_len
(
struct
rt_serial_device
*
serial
)
{
rt_size_t
rx_length
;
struct
rt_serial_rx_fifo
*
rx_fifo
=
(
struct
rt_serial_rx_fifo
*
)
serial
->
serial_rx
;
RT_ASSERT
(
rx_fifo
!=
RT_NULL
);
rx_length
=
(
rx_fifo
->
put_index
>=
rx_fifo
->
get_index
)
?
(
rx_fifo
->
put_index
-
rx_fifo
->
get_index
)
:
(
serial
->
config
.
bufsz
-
(
rx_fifo
->
get_index
-
rx_fifo
->
put_index
));
return
rx_length
;
if
(
rx_fifo
->
put_index
>
rx_fifo
->
get_index
)
return
rx_fifo
->
put_index
-
rx_fifo
->
get_index
;
else
if
(
rx_fifo
->
put_index
<
rx_fifo
->
get_index
)
return
serial
->
config
.
bufsz
-
(
rx_fifo
->
get_index
-
rx_fifo
->
put_index
);
else
{
if
(
rx_fifo
->
is_full
)
return
serial
->
config
.
bufsz
;
else
return
0
;
}
}
/**
...
...
@@ -191,10 +198,12 @@ static void rt_dma_recv_update_get_index(struct rt_serial_device *serial, rt_siz
RT_ASSERT
(
rx_fifo
!=
RT_NULL
);
RT_ASSERT
(
len
<=
rt_dma_calc_recved_len
(
serial
));
if
(
rx_fifo
->
is_full
&&
len
!=
0
)
rx_fifo
->
is_full
=
RT_FALSE
;
rx_fifo
->
get_index
+=
len
;
if
(
rx_fifo
->
get_index
>
serial
->
config
.
bufsz
)
{
rx_fifo
->
get_index
-
=
serial
->
config
.
bufsz
;
rx_fifo
->
get_index
%
=
serial
->
config
.
bufsz
;
}
}
...
...
@@ -220,7 +229,8 @@ static void rt_dma_recv_update_put_index(struct rt_serial_device *serial, rt_siz
/* force overwrite get index */
if
(
rx_fifo
->
put_index
>=
rx_fifo
->
get_index
)
{
rx_fifo
->
get_index
=
rx_fifo
->
put_index
+
1
;
rx_fifo
->
get_index
=
rx_fifo
->
put_index
;
rx_fifo
->
is_full
=
RT_TRUE
;
}
}
}
...
...
@@ -235,7 +245,8 @@ static void rt_dma_recv_update_put_index(struct rt_serial_device *serial, rt_siz
rx_fifo
->
put_index
%=
serial
->
config
.
bufsz
;
}
/* force overwrite get index */
rx_fifo
->
get_index
=
rx_fifo
->
put_index
+
1
;
rx_fifo
->
get_index
=
rx_fifo
->
put_index
;
rx_fifo
->
is_full
=
RT_TRUE
;
}
}
if
(
rx_fifo
->
get_index
>=
serial
->
config
.
bufsz
)
rx_fifo
->
get_index
=
0
;
...
...
@@ -252,7 +263,8 @@ rt_inline int _serial_dma_rx(struct rt_serial_device *serial, rt_uint8_t *data,
level
=
rt_hw_interrupt_disable
();
if
(
serial
->
config
.
bufsz
==
0
)
{
if
(
serial
->
config
.
bufsz
==
0
)
{
int
result
=
RT_EOK
;
struct
rt_serial_rx_dma
*
rx_dma
;
...
...
@@ -272,21 +284,23 @@ rt_inline int _serial_dma_rx(struct rt_serial_device *serial, rt_uint8_t *data,
rt_set_errno
(
result
);
return
0
;
}
else
{
}
else
{
struct
rt_serial_rx_fifo
*
rx_fifo
=
(
struct
rt_serial_rx_fifo
*
)
serial
->
serial_rx
;
rt_size_t
recv_len
=
0
,
fifo_recved_len
=
rt_dma_calc_recved_len
(
serial
);
RT_ASSERT
(
rx_fifo
!=
RT_NULL
);
if
(
length
<
fifo_recved_len
)
{
if
(
length
<
fifo_recved_len
)
recv_len
=
length
;
}
else
{
else
recv_len
=
fifo_recved_len
;
}
if
(
rx_fifo
->
get_index
+
recv_len
<
serial
->
config
.
bufsz
)
{
if
(
rx_fifo
->
get_index
+
recv_len
<
serial
->
config
.
bufsz
)
rt_memcpy
(
data
,
rx_fifo
->
buffer
+
rx_fifo
->
get_index
,
recv_len
);
}
else
{
else
{
rt_memcpy
(
data
,
rx_fifo
->
buffer
+
rx_fifo
->
get_index
,
serial
->
config
.
bufsz
-
rx_fifo
->
get_index
);
rt_memcpy
(
data
+
serial
->
config
.
bufsz
-
rx_fifo
->
get_index
,
rx_fifo
->
buffer
,
...
...
@@ -398,6 +412,7 @@ static rt_err_t rt_serial_open(struct rt_device *dev, rt_uint16_t oflag)
rt_memset
(
rx_fifo
->
buffer
,
0
,
serial
->
config
.
bufsz
);
rx_fifo
->
put_index
=
0
;
rx_fifo
->
get_index
=
0
;
rx_fifo
->
is_full
=
RT_FALSE
;
serial
->
serial_rx
=
rx_fifo
;
/* configure fifo address and length to low level device */
serial
->
ops
->
control
(
serial
,
RT_DEVICE_CTRL_CONFIG
,
(
void
*
)
RT_DEVICE_FLAG_DMA_RX
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录