mirror of
https://github.com/apache/nuttx.git
synced 2026-06-02 17:48:54 +08:00
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 <liaoao@xiaomi.com>
This commit is contained in:
@@ -312,7 +312,7 @@ static void rpmsg_port_spi_exchange(FAR struct rpmsg_port_spi_s *rpspi)
|
|||||||
rpmsg_port_spi_pm_action(rpspi, true);
|
rpmsg_port_spi_pm_action(rpspi, true);
|
||||||
SPI_SELECT(rpspi->spi, rpspi->devid, true);
|
SPI_SELECT(rpspi->spi, rpspi->devid, true);
|
||||||
SPI_EXCHANGE(rpspi->spi, txhdr, rpspi->rxhdr,
|
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;
|
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->rxhdr = rpmsg_port_queue_get_available_buffer(
|
||||||
&rpspi->port.rxq, true);
|
&rpspi->port.rxq, true);
|
||||||
DEBUGASSERT(rpspi->cmdhdr != NULL && rpspi->rxhdr != NULL);
|
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) *
|
rpspi->rxthres = rpmsg_port_queue_navail(&rpspi->port.rxq) *
|
||||||
CONFIG_RPMSG_PORT_SPI_RX_THRESHOLD / 100;
|
CONFIG_RPMSG_PORT_SPI_RX_THRESHOLD / 100;
|
||||||
|
|||||||
@@ -276,7 +276,7 @@ static void rpmsg_port_spi_exchange(FAR struct rpmsg_port_spi_s *rpspi)
|
|||||||
|
|
||||||
rpmsg_port_spi_pm_action(rpspi, true);
|
rpmsg_port_spi_pm_action(rpspi, true);
|
||||||
SPIS_CTRLR_ENQUEUE(rpspi->spictrlr, txhdr,
|
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);
|
IOEXP_WRITEPIN(rpspi->ioe, rpspi->sreq, 1);
|
||||||
|
|
||||||
rpspi->rxavail = txhdr->avail;
|
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);
|
container_of(dev, struct rpmsg_port_spi_s, spislv);
|
||||||
|
|
||||||
*data = rpspi->rxhdr;
|
*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->rxhdr = rpmsg_port_queue_get_available_buffer(
|
||||||
&rpspi->port.rxq, true);
|
&rpspi->port.rxq, true);
|
||||||
DEBUGASSERT(rpspi->cmdhdr != NULL && rpspi->rxhdr != NULL);
|
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) *
|
rpspi->rxthres = rpmsg_port_queue_navail(&rpspi->port.rxq) *
|
||||||
CONFIG_RPMSG_PORT_SPI_RX_THRESHOLD / 100;
|
CONFIG_RPMSG_PORT_SPI_RX_THRESHOLD / 100;
|
||||||
|
|||||||
Reference in New Issue
Block a user