This is an automated email from the ASF dual-hosted git repository. xiaoxiang pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit fd6ab203624ad1d1154b59ef5748c1c6ebf3dbd3 Author: liaoao <[email protected]> AuthorDate: Mon May 19 15:41:39 2025 +0800 drivers/rpmsg_port_spi: fix SPI exchange length calculation The cmdhdr->len was uninitialized before being used in SPI exchange operations. This caused incorrect transfer lengths. Changes: - Initialize cmdhdr->len to sizeof(struct rpmsg_port_header_s) during initialization for both SPI master and slave drivers - Use port.txq.len instead of cmdhdr->len for TX exchange length - Use port.rxq.len instead of cmdhdr->len for RX getdata length Signed-off-by: liaoao <[email protected]> --- drivers/rpmsg/rpmsg_port_spi.c | 3 ++- drivers/rpmsg/rpmsg_port_spi_slave.c | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/drivers/rpmsg/rpmsg_port_spi.c b/drivers/rpmsg/rpmsg_port_spi.c index 10756b98212..8ec6bf9ea77 100644 --- a/drivers/rpmsg/rpmsg_port_spi.c +++ b/drivers/rpmsg/rpmsg_port_spi.c @@ -312,7 +312,7 @@ static void rpmsg_port_spi_exchange(FAR struct rpmsg_port_spi_s *rpspi) rpmsg_port_spi_pm_action(rpspi, true); SPI_SELECT(rpspi->spi, rpspi->devid, true); SPI_EXCHANGE(rpspi->spi, txhdr, rpspi->rxhdr, - RPMSG_PORT_SPI_BYTES2WORDS(rpspi, rpspi->cmdhdr->len)); + RPMSG_PORT_SPI_BYTES2WORDS(rpspi, rpspi->port.txq.len)); rpspi->rxavail = txhdr->avail; } @@ -772,6 +772,7 @@ rpmsg_port_spi_initialize(FAR const struct rpmsg_port_config_s *cfg, rpspi->rxhdr = rpmsg_port_queue_get_available_buffer( &rpspi->port.rxq, true); DEBUGASSERT(rpspi->cmdhdr != NULL && rpspi->rxhdr != NULL); + rpspi->cmdhdr->len = sizeof(struct rpmsg_port_header_s); rpspi->rxthres = rpmsg_port_queue_navail(&rpspi->port.rxq) * CONFIG_RPMSG_PORT_SPI_RX_THRESHOLD / 100; diff --git a/drivers/rpmsg/rpmsg_port_spi_slave.c b/drivers/rpmsg/rpmsg_port_spi_slave.c index 18796ae90d0..934245856f4 100644 --- a/drivers/rpmsg/rpmsg_port_spi_slave.c +++ b/drivers/rpmsg/rpmsg_port_spi_slave.c @@ -276,7 +276,7 @@ static void rpmsg_port_spi_exchange(FAR struct rpmsg_port_spi_s *rpspi) rpmsg_port_spi_pm_action(rpspi, true); SPIS_CTRLR_ENQUEUE(rpspi->spictrlr, txhdr, - RPMSG_PORT_SPI_BYTES2WORDS(rpspi, rpspi->cmdhdr->len)); + RPMSG_PORT_SPI_BYTES2WORDS(rpspi, rpspi->port.txq.len)); IOEXP_WRITEPIN(rpspi->ioe, rpspi->sreq, 1); rpspi->rxavail = txhdr->avail; @@ -364,7 +364,7 @@ static size_t rpmsg_port_spi_slave_getdata(FAR struct spi_slave_dev_s *dev, container_of(dev, struct rpmsg_port_spi_s, spislv); *data = rpspi->rxhdr; - return RPMSG_PORT_SPI_BYTES2WORDS(rpspi, rpspi->cmdhdr->len); + return RPMSG_PORT_SPI_BYTES2WORDS(rpspi, rpspi->port.rxq.len); } /**************************************************************************** @@ -813,6 +813,7 @@ rpmsg_port_spi_slave_initialize(FAR const struct rpmsg_port_config_s *cfg, rpspi->rxhdr = rpmsg_port_queue_get_available_buffer( &rpspi->port.rxq, true); DEBUGASSERT(rpspi->cmdhdr != NULL && rpspi->rxhdr != NULL); + rpspi->cmdhdr->len = sizeof(struct rpmsg_port_header_s); rpspi->rxthres = rpmsg_port_queue_navail(&rpspi->port.rxq) * CONFIG_RPMSG_PORT_SPI_RX_THRESHOLD / 100;
