From 613e5a3e516154c69349619c820a7e895fe73332 Mon Sep 17 00:00:00 2001 From: nobody Date: Sat, 29 Apr 2023 20:50:21 +0800 Subject: [PATCH] =?UTF-8?q?[HUST=20CSE]fix:=E4=BF=AE=E6=94=B9drv=5Fspi.c?= =?UTF-8?q?=E7=A9=BA=E6=8C=87=E9=92=88=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bsp/at32/libraries/rt_drivers/drv_spi.c | 11 +++++++++-- bsp/hc32/libraries/hc32_drivers/drv_spi.c | 12 ++++++++++-- bsp/stm32/libraries/HAL_Drivers/drv_spi.c | 13 ++++++++++--- bsp/wch/risc-v/Libraries/ch32_drivers/drv_spi.c | 11 +++++++++-- 4 files changed, 38 insertions(+), 9 deletions(-) diff --git a/bsp/at32/libraries/rt_drivers/drv_spi.c b/bsp/at32/libraries/rt_drivers/drv_spi.c index 98b0cf388e..a3a8deec54 100644 --- a/bsp/at32/libraries/rt_drivers/drv_spi.c +++ b/bsp/at32/libraries/rt_drivers/drv_spi.c @@ -393,8 +393,15 @@ static rt_ssize_t xfer(struct rt_spi_device* device, struct rt_spi_message* mess /* calculate the start address */ already_send_length = message->length - send_length - message_length; - send_buf = (rt_uint8_t *)message->send_buf + already_send_length; - recv_buf = (rt_uint8_t *)message->recv_buf + already_send_length; + /* avoid null pointer problems */ + if (message->send_buf) + { + send_buf = (rt_uint8_t *)message->send_buf + already_send_length; + } + if (message->recv_buf) + { + recv_buf = (rt_uint8_t *)message->recv_buf + already_send_length; + } /* start once data exchange in dma mode */ if (message->send_buf && message->recv_buf) diff --git a/bsp/hc32/libraries/hc32_drivers/drv_spi.c b/bsp/hc32/libraries/hc32_drivers/drv_spi.c index a24d932065..370224b17d 100644 --- a/bsp/hc32/libraries/hc32_drivers/drv_spi.c +++ b/bsp/hc32/libraries/hc32_drivers/drv_spi.c @@ -441,8 +441,16 @@ static rt_uint32_t hc32_spi_xfer(struct rt_spi_device *device, struct rt_spi_mes /* calculate the start address */ already_send_length = message->length - send_length - message_length; - send_buf = (rt_uint8_t *)message->send_buf + already_send_length; - recv_buf = (rt_uint8_t *)message->recv_buf + already_send_length; + /* avoid null pointer problems */ + if (message->send_buf) + { + send_buf = (rt_uint8_t *)message->send_buf + already_send_length; + } + if (message->recv_buf) + { + recv_buf = (rt_uint8_t *)message->recv_buf + already_send_length; + } + if (message->send_buf && message->recv_buf) { if ((spi_drv->spi_dma_flag & RT_DEVICE_FLAG_DMA_TX) && (spi_drv->spi_dma_flag & RT_DEVICE_FLAG_DMA_RX)) diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_spi.c b/bsp/stm32/libraries/HAL_Drivers/drv_spi.c index 593c2f6022..24765769c1 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drv_spi.c +++ b/bsp/stm32/libraries/HAL_Drivers/drv_spi.c @@ -329,9 +329,16 @@ static rt_ssize_t spixfer(struct rt_spi_device *device, struct rt_spi_message *m /* calculate the start address */ already_send_length = message->length - send_length - message_length; - send_buf = (rt_uint8_t *)message->send_buf + already_send_length; - recv_buf = (rt_uint8_t *)message->recv_buf + already_send_length; - + /* avoid null pointer problems */ + if (message->send_buf) + { + send_buf = (rt_uint8_t *)message->send_buf + already_send_length; + } + if (message->recv_buf) + { + 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)) diff --git a/bsp/wch/risc-v/Libraries/ch32_drivers/drv_spi.c b/bsp/wch/risc-v/Libraries/ch32_drivers/drv_spi.c index 22a078b8f5..ca439feccd 100644 --- a/bsp/wch/risc-v/Libraries/ch32_drivers/drv_spi.c +++ b/bsp/wch/risc-v/Libraries/ch32_drivers/drv_spi.c @@ -410,8 +410,15 @@ static rt_ssize_t spi_xfer(struct rt_spi_device *device, struct rt_spi_message * /* calculate the start address */ already_send_length = message->length - send_length - message_length; - send_buf = (rt_uint8_t *)message->send_buf + already_send_length; - recv_buf = (rt_uint8_t *)message->recv_buf + already_send_length; + /* avoid null pointer problems */ + if (message->send_buf) + { + send_buf = (rt_uint8_t *)message->send_buf + already_send_length; + } + if (message->recv_buf) + { + recv_buf = (rt_uint8_t *)message->recv_buf + already_send_length; + } /* start once data exchange */ if (message->send_buf && message->recv_buf)