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:56 UTC

[mynewt-core] branch master updated (d54ab4206 -> 31b7e5494)

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

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


    from d54ab4206 stm32h7: Fix APB1 divider conversion function
     new 420bce6dd hw/bus: Add duplex_write_read function to bus_dev_ops
     new a7ddedcbf bus/spi_stm32: Add implementation of duplex write/read
     new 31b7e5494 hw/bus/spi_hal: Add bus_spi_duplex_write_read

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 hw/bus/drivers/spi_hal/src/spi_hal.c     | 29 +++++++++++++++++
 hw/bus/drivers/spi_stm32/src/spi_stm32.c | 53 ++++++++++++++++++++++++++++++++
 hw/bus/include/bus/bus.h                 | 21 +++++++++++++
 hw/bus/include/bus/bus_driver.h          |  4 +++
 hw/bus/src/bus.c                         | 39 +++++++++++++++++++++++
 5 files changed, 146 insertions(+)


[mynewt-core] 01/03: hw/bus: Add duplex_write_read function to bus_dev_ops

Posted by je...@apache.org.
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 420bce6ddcbd37031cf489cc0a11b9131fe29746
Author: Jerzy Kasenberg <je...@codecoup.pl>
AuthorDate: Fri Feb 17 15:21:24 2023 +0100

    hw/bus: Add duplex_write_read function to bus_dev_ops
    
    Duplex of SPI was not covered in bus drivers.
    This adds bus_node_duplex_write_read() function that
    can be used with SPI drivers that support duplex
    mode.
    For simplicity both buffers provided to function
    have same length.
---
 hw/bus/include/bus/bus.h        | 21 +++++++++++++++++++++
 hw/bus/include/bus/bus_driver.h |  4 ++++
 hw/bus/src/bus.c                | 39 +++++++++++++++++++++++++++++++++++++++
 3 files changed, 64 insertions(+)

diff --git a/hw/bus/include/bus/bus.h b/hw/bus/include/bus/bus.h
index 4d357f376..e43c091a1 100644
--- a/hw/bus/include/bus/bus.h
+++ b/hw/bus/include/bus/bus.h
@@ -128,6 +128,27 @@ bus_node_write_read_transact(struct os_dev *node, const void  *wbuf,
                              uint16_t wlength, void *rbuf, uint16_t rlength,
                              os_time_t timeout, uint16_t flags);
 
+/**
+ * Perform write and read in duplex mode (SPI)
+ *
+ * Writes data to node and automatically reads response at the same time.
+ *
+ * The timeout parameter applies to complete transaction time.
+ *
+ * @param node     Node device object
+ * @param wbuf     Buffer with data to be written
+ * @param rbuf     Buffer to read data into
+ * @param length   Length of data to be written and read
+ * @param timeout  Operation timeout
+ * @param flags    Flags
+ *
+ * @return 0 on success, SYS_xxx on error
+ */
+int
+bus_node_duplex_write_read(struct os_dev *node, const void *wbuf,
+                           void *rbuf, uint16_t length,
+                           os_time_t timeout, uint16_t flags);
+
 /**
  * Read data from node
  *
diff --git a/hw/bus/include/bus/bus_driver.h b/hw/bus/include/bus/bus_driver.h
index 8429ab6a2..207aeb23f 100644
--- a/hw/bus/include/bus/bus_driver.h
+++ b/hw/bus/include/bus/bus_driver.h
@@ -68,6 +68,10 @@ struct bus_dev_ops {
                        const uint8_t *wbuf, uint16_t wlength,
                        uint8_t *rbuf, uint16_t rlength,
                        os_time_t timeout,  uint16_t flags);
+    /* Duplex write and read */
+    int (* 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);
 };
 
 /**
diff --git a/hw/bus/src/bus.c b/hw/bus/src/bus.c
index 29987542a..f481be6dd 100644
--- a/hw/bus/src/bus.c
+++ b/hw/bus/src/bus.c
@@ -456,6 +456,45 @@ done:
     return rc;
 }
 
+int
+bus_node_duplex_write_read(struct os_dev *node, const void *wbuf,
+                           void *rbuf, uint16_t length,
+                           os_time_t timeout, uint16_t flags)
+{
+    struct bus_node *bnode = (struct bus_node *)node;
+    struct bus_dev *bdev = bnode->parent_bus;
+    int rc;
+
+    BUS_DEBUG_VERIFY_DEV(bdev);
+    BUS_DEBUG_VERIFY_NODE(bnode);
+
+    if (!bdev->dops->duplex_write_read) {
+        return SYS_ENOTSUP;
+    }
+
+    rc = bus_node_lock(node, bus_node_get_lock_timeout(node));
+    if (rc) {
+        return rc;
+    }
+
+    if (!bdev->enabled) {
+        rc = SYS_EIO;
+        goto done;
+    }
+
+    BUS_STATS_INC(bdev, bnode, write_ops);
+    BUS_STATS_INC(bdev, bnode, read_ops);
+    rc = bdev->dops->duplex_write_read(bdev, bnode, wbuf, rbuf, length, timeout, flags);
+    if (rc) {
+        BUS_STATS_INC(bdev, bnode, write_errors);
+        BUS_STATS_INC(bdev, bnode, read_errors);
+    }
+
+done:
+    (void)bus_node_unlock(node);
+
+    return rc;
+}
 
 int
 bus_node_lock(struct os_dev *node, os_time_t timeout)


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

Posted by je...@apache.org.
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


[mynewt-core] 02/03: bus/spi_stm32: Add implementation of duplex write/read

Posted by je...@apache.org.
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 a7ddedcbf9bf96dee2ed2336062e3cb8345b2f6f
Author: Jerzy Kasenberg <je...@codecoup.pl>
AuthorDate: Fri Feb 17 15:23:02 2023 +0100

    bus/spi_stm32: Add implementation of duplex write/read
    
    This implements duplex_write_read for STM devices
---
 hw/bus/drivers/spi_stm32/src/spi_stm32.c | 53 ++++++++++++++++++++++++++++++++
 1 file changed, 53 insertions(+)

diff --git a/hw/bus/drivers/spi_stm32/src/spi_stm32.c b/hw/bus/drivers/spi_stm32/src/spi_stm32.c
index a6b0cf5bf..931243064 100644
--- a/hw/bus/drivers/spi_stm32/src/spi_stm32.c
+++ b/hw/bus/drivers/spi_stm32/src/spi_stm32.c
@@ -651,6 +651,14 @@ HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi)
     os_sem_release(&dd->sem);
 }
 
+void
+HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi)
+{
+    struct spi_stm32_driver_data *dd = (struct spi_stm32_driver_data *)hspi;
+
+    os_sem_release(&dd->sem);
+}
+
 static int
 spi_stm32_read(struct bus_dev *bdev, struct bus_node *bnode,
                uint8_t *buf, uint16_t length, os_time_t timeout,
@@ -736,6 +744,50 @@ spi_stm32_write(struct bus_dev *bdev, struct bus_node *bnode,
     return rc;
 }
 
+static int
+spi_stm32_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_dev *dev = (struct bus_spi_dev *)bdev;
+    struct bus_spi_node *node = (struct bus_spi_node *)bnode;
+    struct spi_stm32_driver_data *dd;
+    int rc;
+
+    BUS_DEBUG_VERIFY_DEV(dev);
+    BUS_DEBUG_VERIFY_NODE(node);
+
+    dd = driver_data(dev);
+
+    assert(os_sem_get_count(&dd->sem) == 0);
+
+    /* Activate CS */
+    if (node->pin_cs >= 0) {
+        hal_gpio_write(node->pin_cs, 0);
+    }
+
+    if (MIN_DMA_TX_SIZE >= 0 && length >= MIN_DMA_TX_SIZE) {
+        HAL_SPI_TransmitReceive_DMA(&dd->hspi, (uint8_t *)wbuf, rbuf, length);
+    } else {
+        HAL_SPI_TransmitReceive_IT(&dd->hspi, (uint8_t *)wbuf, rbuf, length);
+    }
+
+    rc = os_sem_pend(&dd->sem, timeout);
+
+    if (rc) {
+        HAL_SPI_Abort(&dd->hspi);
+    }
+
+    rc = os_error_to_sys(rc);
+
+    /* Deactivate CS if needed */
+    if ((rc != 0 || !(flags & BUS_F_NOSTOP)) && node->pin_cs >= 0) {
+        hal_gpio_write(node->pin_cs, 1);
+    }
+
+    return rc;
+}
+
 static int
 spi_stm32_enable(struct bus_dev *bdev)
 {
@@ -772,6 +824,7 @@ static const struct bus_dev_ops bus_spi_stm32_ops = {
     .read = spi_stm32_read,
     .write = spi_stm32_write,
     .disable = spi_stm32_disable,
+    .duplex_write_read = spi_stm32_duplex_write_read,
 };
 
 /* Helper function to setup interrupt handler for SPI and DMA */