You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by je...@apache.org on 2023/02/23 07:09:59 UTC

[mynewt-core] 03/03: hw/bus/spi_hal: Add bus_spi_duplex_write_read

This is an automated email from the ASF dual-hosted git repository.

jerzy pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-core.git

commit 31b7e54948e959cd01bc6fd1006e3a122bf1382b
Author: Jerzy Kasenberg <je...@codecoup.pl>
AuthorDate: Fri Feb 17 15:25:53 2023 +0100

    hw/bus/spi_hal: Add bus_spi_duplex_write_read
    
    This implements new bus driver duplex_write_read function for
    spi_hal bus driver implementation.
---
 hw/bus/drivers/spi_hal/src/spi_hal.c | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)

diff --git a/hw/bus/drivers/spi_hal/src/spi_hal.c b/hw/bus/drivers/spi_hal/src/spi_hal.c
index 5832feed4..5a2d347c2 100644
--- a/hw/bus/drivers/spi_hal/src/spi_hal.c
+++ b/hw/bus/drivers/spi_hal/src/spi_hal.c
@@ -252,6 +252,34 @@ bus_spi_write_read(struct bus_dev *bdev, struct bus_node *bnode,
     return rc;
 }
 
+static int
+bus_spi_duplex_write_read(struct bus_dev *bdev, struct bus_node *bnode,
+                          const uint8_t *wbuf, uint8_t *rbuf, uint16_t length,
+                          os_time_t timeout, uint16_t flags)
+{
+    struct bus_spi_hal_dev *dev = (struct bus_spi_hal_dev *)bdev;
+    struct bus_spi_node *node = (struct bus_spi_node *)bnode;
+    int rc;
+
+    BUS_DEBUG_VERIFY_DEV(&dev->spi_dev);
+    BUS_DEBUG_VERIFY_NODE(node);
+
+    hal_gpio_write(node->pin_cs, 0);
+
+    rc = hal_spi_txrx_noblock(dev->spi_dev.cfg.spi_num, (uint8_t *)wbuf, rbuf, length);
+#if MYNEWT_VAL(SPI_HAL_USE_NOBLOCK)
+    if (rc == 0) {
+        os_sem_pend(&dev->sem, OS_TIMEOUT_NEVER);
+    }
+#endif
+
+    if (rc || !(flags & BUS_F_NOSTOP)) {
+        hal_gpio_write(node->pin_cs, 1);
+    }
+
+    return rc;
+}
+
 static int bus_spi_disable(struct bus_dev *bdev)
 {
     struct bus_spi_dev *spi_dev = (struct bus_spi_dev *)bdev;
@@ -275,6 +303,7 @@ static const struct bus_dev_ops bus_spi_ops = {
     .write = bus_spi_write,
     .disable = bus_spi_disable,
     .write_read = bus_spi_write_read,
+    .duplex_write_read = bus_spi_duplex_write_read,
 };
 
 int