Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
嗨,你的益达!
rt-thread
提交
7c3f5c38
R
rt-thread
项目概览
嗨,你的益达!
/
rt-thread
与 Fork 源项目一致
Fork自
RT-Thread / rt-thread
通知
1
Star
0
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,体验更适合开发者的 AI 搜索 >>
提交
7c3f5c38
编写于
6月 07, 2023
作者:
哈哈哈可是开电脑
提交者:
mysterywolf
6月 09, 2023
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[bsp][stm32][spi] 优化DMA数据非字节对齐的处理流程
上级
1d239db5
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
41 addition
and
22 deletion
+41
-22
bsp/stm32/libraries/HAL_Drivers/drv_spi.c
bsp/stm32/libraries/HAL_Drivers/drv_spi.c
+41
-22
未找到文件。
bsp/stm32/libraries/HAL_Drivers/drv_spi.c
浏览文件 @
7c3f5c38
...
...
@@ -341,35 +341,50 @@ static rt_ssize_t spixfer(struct rt_spi_device *device, struct rt_spi_message *m
recv_buf
=
(
rt_uint8_t
*
)
message
->
recv_buf
+
already_send_length
;
}
#if defined(SOC_SERIES_STM32H7) || defined(SOC_SERIES_STM32F7)
rt_uint32_t
*
dma_buf
=
RT_NULL
;
if
((
spi_drv
->
spi_dma_flag
&
SPI_USING_TX_DMA_FLAG
)
&&
(
spi_drv
->
spi_dma_flag
&
SPI_USING_RX_DMA_FLAG
)
&&
(
send_length
>=
DMA_TRANS_MIN_LEN
))
rt_uint32_t
*
dma_aligned_buffer
=
RT_NULL
;
rt_uint32_t
*
p_txrx_buffer
=
RT_NULL
;
if
((
spi_drv
->
spi_dma_flag
&
SPI_USING_TX_DMA_FLAG
)
&&
(
send_length
>=
DMA_TRANS_MIN_LEN
))
{
dma_buf
=
(
rt_uint32_t
*
)
rt_malloc_align
(
send_length
,
32
);
if
(
send_buf
)
#if defined(SOC_SERIES_STM32H7) || defined(SOC_SERIES_STM32F7)
if
(
RT_IS_ALIGN
((
rt_uint32_t
)
send_buf
,
32
))
/* aligned with 32 bytes? */
{
rt_memcpy
(
dma_buf
,
send_buf
,
send_length
);
p_txrx_buffer
=
(
rt_uint32_t
*
)
send_buf
;
/* send_buf aligns with 32 bytes, no more operations */
}
else
{
rt_memset
(
dma_buf
,
0xFF
,
send_length
);
/* send_buf doesn't align with 32 bytes, so creat a cache buffer with 32 bytes aligned */
dma_aligned_buffer
=
(
rt_uint32_t
*
)
rt_malloc_align
(
send_length
,
32
);
rt_memcpy
(
dma_aligned_buffer
,
send_buf
,
send_length
);
p_txrx_buffer
=
dma_aligned_buffer
;
}
rt_hw_cpu_dcache_ops
(
RT_HW_CACHE_FLUSH
,
dma_aligned_buffer
,
send_length
);
#else
if
(
RT_IS_ALIGN
((
rt_uint32_t
)
send_buf
,
4
))
/* aligned with 4 bytes? */
{
p_txrx_buffer
=
(
rt_uint32_t
*
)
send_buf
;
/* send_buf aligns with 4 bytes, no more operations */
}
else
{
/* send_buf doesn't align with 4 bytes, so creat a cache buffer with 4 bytes aligned */
dma_aligned_buffer
=
(
rt_uint32_t
*
)
rt_malloc
(
send_length
);
/* aligned with RT_ALIGN_SIZE (8 bytes by default) */
rt_memcpy
(
dma_aligned_buffer
,
send_buf
,
send_length
);
p_txrx_buffer
=
dma_aligned_buffer
;
}
rt_hw_cpu_dcache_ops
(
RT_HW_CACHE_FLUSH
,
dma_buf
,
send_length
);
state
=
HAL_SPI_TransmitReceive_DMA
(
spi_handle
,
(
uint8_t
*
)
dma_buf
,
(
uint8_t
*
)
dma_buf
,
send_length
);
}
else
#endif
/* SOC_SERIES_STM32H7 || SOC_SERIES_STM32F7 */
}
/* start once data exchange in DMA mode */
if
(
message
->
send_buf
&&
message
->
recv_buf
)
{
if
((
spi_drv
->
spi_dma_flag
&
SPI_USING_TX_DMA_FLAG
)
&&
(
spi_drv
->
spi_dma_flag
&
SPI_USING_RX_DMA_FLAG
)
&&
(
send_length
>=
DMA_TRANS_MIN_LEN
))
{
state
=
HAL_SPI_TransmitReceive_DMA
(
spi_handle
,
(
uint8_t
*
)
send_buf
,
(
uint8_t
*
)
recv_buf
,
send_length
);
state
=
HAL_SPI_TransmitReceive_DMA
(
spi_handle
,
(
uint8_t
*
)
p_txrx_buffer
,
(
uint8_t
*
)
p_txrx_buffer
,
send_length
);
}
else
if
((
spi_drv
->
spi_dma_flag
&
SPI_USING_TX_DMA_FLAG
)
&&
(
send_length
>=
DMA_TRANS_MIN_LEN
))
{
/* same as Tx ONLY. It will not receive SPI data any more. */
state
=
HAL_SPI_Transmit_DMA
(
spi_handle
,
(
uint8_t
*
)
send_buf
,
send_length
);
state
=
HAL_SPI_Transmit_DMA
(
spi_handle
,
(
uint8_t
*
)
p_txrx_buffer
,
send_length
);
}
else
if
((
spi_drv
->
spi_dma_flag
&
SPI_USING_RX_DMA_FLAG
)
&&
(
send_length
>=
DMA_TRANS_MIN_LEN
))
{
...
...
@@ -386,7 +401,7 @@ static rt_ssize_t spixfer(struct rt_spi_device *device, struct rt_spi_message *m
{
if
((
spi_drv
->
spi_dma_flag
&
SPI_USING_TX_DMA_FLAG
)
&&
(
send_length
>=
DMA_TRANS_MIN_LEN
))
{
state
=
HAL_SPI_Transmit_DMA
(
spi_handle
,
(
uint8_t
*
)
send_buf
,
send_length
);
state
=
HAL_SPI_Transmit_DMA
(
spi_handle
,
(
uint8_t
*
)
p_txrx_buffer
,
send_length
);
}
else
{
...
...
@@ -404,7 +419,7 @@ static rt_ssize_t spixfer(struct rt_spi_device *device, struct rt_spi_message *m
rt_memset
((
uint8_t
*
)
recv_buf
,
0xff
,
send_length
);
if
((
spi_drv
->
spi_dma_flag
&
SPI_USING_RX_DMA_FLAG
)
&&
(
send_length
>=
DMA_TRANS_MIN_LEN
))
{
state
=
HAL_SPI_Receive_DMA
(
spi_handle
,
(
uint8_t
*
)
recv_buf
,
send_length
);
state
=
HAL_SPI_Receive_DMA
(
spi_handle
,
(
uint8_t
*
)
p_txrx_buffer
,
send_length
);
}
else
{
...
...
@@ -449,17 +464,21 @@ static rt_ssize_t spixfer(struct rt_spi_device *device, struct rt_spi_message *m
while
(
HAL_SPI_GetState
(
spi_handle
)
!=
HAL_SPI_STATE_READY
);
}
#if defined(SOC_SERIES_STM32H7) || defined(SOC_SERIES_STM32F7)
if
(
dma_buf
)
if
(
dma_aligned_buffer
!=
RT_NULL
)
/* re-aligned, so need to copy the data to recv_buf */
{
if
(
recv_buf
)
if
(
recv_buf
!=
RT_NULL
)
{
rt_hw_cpu_dcache_ops
(
RT_HW_CACHE_INVALIDATE
,
dma_buf
,
send_length
);
rt_memcpy
(
recv_buf
,
dma_buf
,
send_length
);
#if defined(SOC_SERIES_STM32H7) || defined(SOC_SERIES_STM32F7)
rt_hw_cpu_dcache_ops
(
RT_HW_CACHE_INVALIDATE
,
p_txrx_buffer
,
send_length
);
#endif
/* SOC_SERIES_STM32H7 || SOC_SERIES_STM32F7 */
rt_memcpy
(
recv_buf
,
p_txrx_buffer
,
send_length
);
}
rt_free_align
(
dma_buf
);
}
#if defined(SOC_SERIES_STM32H7) || defined(SOC_SERIES_STM32F7)
rt_free_align
(
dma_aligned_buffer
);
#else
rt_free
(
dma_aligned_buffer
);
#endif
/* SOC_SERIES_STM32H7 || SOC_SERIES_STM32F7 */
}
}
if
(
message
->
cs_release
&&
!
(
device
->
config
.
mode
&
RT_SPI_NO_CS
)
&&
(
device
->
cs_pin
!=
PIN_NONE
))
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录