You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by we...@apache.org on 2023/06/20 00:20:08 UTC

[mynewt-core] branch master updated (7430369be -> d2470161e)

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

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


    from 7430369be hw/bsp: Add BSP for Nordic Thingy:53
     new 2c7730f86 hw/bus/drivers/spi_da1469x: Allow for 16-bit dma transfers
     new f39917fe5 hw/bus/drivers/spi_da1469x: Allow for 16-bit dma transfers
     new a334ba6ab hw/bus/drivers/spi_da1469x: Allow for 16-bit dma transfers
     new d2470161e hw/bus/drivers/spi_da1469x: Allow for 16-bit dma transfers

The 4 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_da1469x/src/spi_da1469x.c | 118 +++++++++++++++++++++++----
 1 file changed, 101 insertions(+), 17 deletions(-)


[mynewt-core] 03/04: hw/bus/drivers/spi_da1469x: Allow for 16-bit dma transfers

Posted by we...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit a334ba6abe1eea0502c1cd226af0b56ba7c3e92b
Author: Will San Filippo <wi...@juul.com>
AuthorDate: Mon Jun 19 12:35:08 2023 -0400

    hw/bus/drivers/spi_da1469x: Allow for 16-bit dma transfers
    
    Allow for 16-bit transfers if using ISR as opposed to DMA.
---
 hw/bus/drivers/spi_da1469x/src/spi_da1469x.c | 67 +++++++++++++++++++++-------
 1 file changed, 51 insertions(+), 16 deletions(-)

diff --git a/hw/bus/drivers/spi_da1469x/src/spi_da1469x.c b/hw/bus/drivers/spi_da1469x/src/spi_da1469x.c
index bc4f8ff65..08ae413dd 100644
--- a/hw/bus/drivers/spi_da1469x/src/spi_da1469x.c
+++ b/hw/bus/drivers/spi_da1469x/src/spi_da1469x.c
@@ -163,12 +163,12 @@ static const struct da1469x_spi_hw da1469x_spi2 = {
 
 struct da1469x_transfer {
     /* Transmit or receive buffer */
-    uint8_t *data;
-    /* Transfer length */
+    void *data;
+    /* Transfer length (number of items) */
     uint16_t len;
-    /* Number of bytes written to output FIFO */
+    /* Number of items written to output FIFO */
     uint16_t wlen;
-    /* Number of bytes read from input FIFO */
+    /* Number of items read from input FIFO */
     uint16_t rlen;
 
     uint8_t nostop : 1;
@@ -178,6 +178,8 @@ struct da1469x_transfer {
     uint8_t dma : 1;
     /* Transfer started */
     uint8_t started : 1;
+    /* Transfer is 16 bits */
+    uint8_t xfr_16: 1;
 };
 
 struct spi_da1469x_driver_data {
@@ -243,6 +245,9 @@ spi_da1469x_dma_done_cb(void *arg)
         transfer->rlen += transferred;
 
 #if MYNEWT_VAL(SPI_DA1469X_STAT)
+        if (dd->transfer.xfr_16) {
+            transferred *= 2;
+        }
         if (transfer->write) {
             STATS_INCN(dd->stats, written_bytes, transferred);
         } else {
@@ -261,17 +266,27 @@ static void
 spi_da1469x_isr(SPI_Type *regs, struct spi_da1469x_driver_data *dd)
 {
     struct da1469x_transfer *transfer = &dd->transfer;
-    uint8_t rx_byte;
+    uint16_t rxdata;
 
     while ((transfer->wlen < transfer->len) &&
            !(regs->SPI_CTRL_REG & SPI_SPI_CTRL_REG_SPI_TXH_Msk)) {
         if (transfer->write) {
-            regs->SPI_RX_TX_REG = transfer->data[transfer->wlen];
+            if (transfer->xfr_16) {
+                regs->SPI_RX_TX_REG = *(uint16_t *)transfer->data;
+#if MYNEWT_VAL(SPI_DA1469X_STAT)
+                STATS_INCN(dd->stats, written_bytes, 2);
+#endif
+                transfer->data = (uint16_t *)transfer->data + 1;
+            } else {
+                regs->SPI_RX_TX_REG = *(uint8_t *)transfer->data;
 #if MYNEWT_VAL(SPI_DA1469X_STAT)
-            STATS_INC(dd->stats, written_bytes);
+                STATS_INC(dd->stats, written_bytes);
 #endif
+                transfer->data = (uint8_t *)transfer->data + 1;
+            }
         } else {
-            regs->SPI_RX_TX_REG = 0xFF;
+            /* Write 16 bits in case 16-bit transfer used */
+            regs->SPI_RX_TX_REG = 0xFFFF;
         }
         transfer->wlen++;
     }
@@ -281,13 +296,22 @@ spi_da1469x_isr(SPI_Type *regs, struct spi_da1469x_driver_data *dd)
     }
 
     while (0 != (regs->SPI_CTRL_REG & SPI_SPI_CTRL_REG_SPI_INT_BIT_Msk)) {
-        rx_byte = regs->SPI_RX_TX_REG;
+        rxdata = regs->SPI_RX_TX_REG;
         if (transfer->rlen < transfer->len) {
             if (!transfer->write) {
-                transfer->data[transfer->rlen] = rx_byte;
-#if MYNEWT_VAL(SPI_DA1469X_STAT)
-                STATS_INC(dd->stats, read_bytes);
-#endif
+                if (transfer->xfr_16) {
+                    *(uint16_t *)transfer->data = (uint16_t)rxdata;
+                    transfer->data = (uint16_t *)transfer->data + 1;
+    #if MYNEWT_VAL(SPI_DA1469X_STAT)
+                    STATS_INCN(dd->stats, read_bytes, 2);
+    #endif
+                } else {
+                    *(uint8_t *)transfer->data = (uint8_t)rxdata;
+                    transfer->data = (uint8_t *)transfer->data + 1;
+    #if MYNEWT_VAL(SPI_DA1469X_STAT)
+                    STATS_INC(dd->stats, read_bytes);
+    #endif
+                }
             }
             transfer->rlen++;
         }
@@ -521,10 +545,16 @@ spi_da1469x_read(struct bus_dev *bdev, struct bus_node *bnode,
     dd->transfer.wlen = 0;
     dd->transfer.write = 0;
     dd->transfer.started = 1;
+    if ((regs->SPI_CTRL_REG & SPI_SPI_CTRL_REG_SPI_WORD_Msk) == SPI_CTRL_REG_16BIT_WORD) {
+        dd->transfer.xfr_16 = 1;
+    } else {
+        dd->transfer.xfr_16 = 0;
+    }
+
     if (length >= MIN_DMA_SIZE && dd->dma_chans[0] != NULL) {
         dd->transfer.dma = 1;
         /* NOTE: assumes if 16-bit not used; dma transfers are 8-bits */
-        if ((regs->SPI_CTRL_REG & SPI_SPI_CTRL_REG_SPI_WORD_Msk) == SPI_CTRL_REG_16BIT_WORD) {
+        if (dd->transfer.xfr_16) {
             da1469x_dma_configure(dd->dma_chans[0], &spi_read_rx_dma_cfg16, spi_da1469x_dma_done_cb, dd);
             da1469x_dma_configure(dd->dma_chans[1], &spi_read_tx_dma_cfg16, NULL, NULL);
         } else {
@@ -602,13 +632,18 @@ spi_da1469x_write(struct bus_dev *bdev, struct bus_node *bnode,
     dd->transfer.nostop = (flags & BUS_F_NOSTOP) ? 1 : 0;
     dd->transfer.write = 1;
     dd->transfer.started = 1;
+    if ((regs->SPI_CTRL_REG & SPI_SPI_CTRL_REG_SPI_WORD_Msk) == SPI_CTRL_REG_16BIT_WORD) {
+        dd->transfer.xfr_16 = 1;
+    } else {
+        dd->transfer.xfr_16 = 0;
+    }
+
     if (length >= MIN_DMA_SIZE && dd->dma_chans[0] != NULL) {
         dd->transfer.dma = 1;
         regs->SPI_CTRL_REG &= ~SPI_SPI_CTRL_REG_SPI_INT_BIT_Msk;
         spi_da1469x_int_disable(regs);
-
         /* NOTE: assumes if 16-bit not used; dma transfers are 8-bits */
-        if ((regs->SPI_CTRL_REG & SPI_SPI_CTRL_REG_SPI_WORD_Msk) == SPI_CTRL_REG_16BIT_WORD) {
+        if (dd->transfer.xfr_16) {
             da1469x_dma_configure(dd->dma_chans[0], &spi_write_rx_dma_cfg16, spi_da1469x_dma_done_cb, dd);
             da1469x_dma_configure(dd->dma_chans[1], &spi_write_tx_dma_cfg16, NULL, NULL);
         } else {


[mynewt-core] 04/04: hw/bus/drivers/spi_da1469x: Allow for 16-bit dma transfers

Posted by we...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit d2470161e0dec8b903b4d6ca6160161e90baea13
Author: Will San Filippo <wi...@juul.com>
AuthorDate: Mon Jun 19 12:37:55 2023 -0400

    hw/bus/drivers/spi_da1469x: Allow for 16-bit dma transfers
    
    Fix style check issue.
---
 hw/bus/drivers/spi_da1469x/src/spi_da1469x.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/hw/bus/drivers/spi_da1469x/src/spi_da1469x.c b/hw/bus/drivers/spi_da1469x/src/spi_da1469x.c
index 08ae413dd..cf8fa95b6 100644
--- a/hw/bus/drivers/spi_da1469x/src/spi_da1469x.c
+++ b/hw/bus/drivers/spi_da1469x/src/spi_da1469x.c
@@ -179,7 +179,7 @@ struct da1469x_transfer {
     /* Transfer started */
     uint8_t started : 1;
     /* Transfer is 16 bits */
-    uint8_t xfr_16: 1;
+    uint8_t xfr_16 : 1;
 };
 
 struct spi_da1469x_driver_data {


[mynewt-core] 01/04: hw/bus/drivers/spi_da1469x: Allow for 16-bit dma transfers

Posted by we...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 2c7730f8658d1234609f4f5eae59442d5a6f5412
Author: Will San Filippo <wi...@juul.com>
AuthorDate: Tue Jun 13 17:42:15 2023 -0400

    hw/bus/drivers/spi_da1469x: Allow for 16-bit dma transfers
    
    Changes allow for 16-bit DMA transfers for spi. Note that the
    current hal and other configuration code do not allow the
    spi to be configured for 16 bits. However, if this is
    configured outside the provided API this code will allow for
    the proper size transfer.
---
 hw/bus/drivers/spi_da1469x/src/spi_da1469x.c | 57 ++++++++++++++++++++++++++--
 1 file changed, 53 insertions(+), 4 deletions(-)

diff --git a/hw/bus/drivers/spi_da1469x/src/spi_da1469x.c b/hw/bus/drivers/spi_da1469x/src/spi_da1469x.c
index 5287f9b02..8d2d5fe29 100644
--- a/hw/bus/drivers/spi_da1469x/src/spi_da1469x.c
+++ b/hw/bus/drivers/spi_da1469x/src/spi_da1469x.c
@@ -52,6 +52,9 @@ STATS_NAME_END(spi_da1469x_stats_section)
  */
 #define MIN_DMA_SIZE 8
 
+/* A value of 1 for the word size means 16-bit words */
+#define SPI_CTRL_REG_16BIT_WORD (1 << SPI_SPI_CTRL_REG_SPI_WORD_Pos) 
+
 static const struct da1469x_dma_config spi_write_rx_dma_cfg = {
     .priority = 0,
     .burst_mode = MCU_DMA_BURST_MODE_DISABLED,
@@ -68,6 +71,22 @@ static const struct da1469x_dma_config spi_write_tx_dma_cfg = {
     .src_inc = true,
 };
 
+static const struct da1469x_dma_config spi_write_rx_dma_cfg16 = {
+    .priority = 0,
+    .burst_mode = MCU_DMA_BURST_MODE_DISABLED,
+    .bus_width = MCU_DMA_BUS_WIDTH_2B,
+    .dst_inc = false,
+    .src_inc = false,
+};
+
+static const struct da1469x_dma_config spi_write_tx_dma_cfg16 = {
+    .priority = 0,
+    .burst_mode = MCU_DMA_BURST_MODE_DISABLED,
+    .bus_width = MCU_DMA_BUS_WIDTH_2B,
+    .dst_inc = false,
+    .src_inc = true,
+};
+
 static const struct da1469x_dma_config spi_read_rx_dma_cfg = {
     .priority = 0,
     .burst_mode = MCU_DMA_BURST_MODE_DISABLED,
@@ -84,6 +103,22 @@ static const struct da1469x_dma_config spi_read_tx_dma_cfg = {
     .src_inc = false,
 };
 
+static const struct da1469x_dma_config spi_read_rx_dma_cfg16 = {
+    .priority = 0,
+    .burst_mode = MCU_DMA_BURST_MODE_DISABLED,
+    .bus_width = MCU_DMA_BUS_WIDTH_2B,
+    .dst_inc = true,
+    .src_inc = false,
+};
+
+static const struct da1469x_dma_config spi_read_tx_dma_cfg16 = {
+    .priority = 0,
+    .burst_mode = MCU_DMA_BURST_MODE_DISABLED,
+    .bus_width = MCU_DMA_BUS_WIDTH_2B,
+    .dst_inc = false,
+    .src_inc = false,
+};
+
 static void spi_da1469x_spi0_isr(void);
 static void spi_da1469x_spi1_isr(void);
 
@@ -488,8 +523,14 @@ spi_da1469x_read(struct bus_dev *bdev, struct bus_node *bnode,
     dd->transfer.started = 1;
     if (length >= MIN_DMA_SIZE && dd->dma_chans[0] != NULL) {
         dd->transfer.dma = 1;
-        da1469x_dma_configure(dd->dma_chans[0], &spi_read_rx_dma_cfg, spi_da1469x_dma_done_cb, dd);
-        da1469x_dma_configure(dd->dma_chans[1], &spi_read_tx_dma_cfg, NULL, NULL);
+        /* NOTE: assumes if 16-bit not used; dma transfers are 8-bits */
+        if ((regs->SPI_CTRL_REG & SPI_SPI_CTRL_REG_SPI_WORD_Msk) == SPI_CTRL_REG_16BIT_WORD) {
+            da1469x_dma_configure(dd->dma_chans[0], &spi_read_rx_dma_cfg16, spi_da1469x_dma_done_cb, dd);
+            da1469x_dma_configure(dd->dma_chans[1], &spi_read_tx_dma_cfg16, NULL, NULL);
+        } else {
+            da1469x_dma_configure(dd->dma_chans[0], &spi_read_rx_dma_cfg, spi_da1469x_dma_done_cb, dd);
+            da1469x_dma_configure(dd->dma_chans[1], &spi_read_tx_dma_cfg, NULL, NULL);
+        }
         da1469x_dma_read_peripheral(dd->dma_chans[0], buf, length);
         da1469x_dma_write_peripheral(dd->dma_chans[1], &dma_dummy_src, length);
         regs->SPI_CTRL_REG |= SPI_SPI_CTRL_REG_SPI_ON_Msk;
@@ -565,8 +606,16 @@ spi_da1469x_write(struct bus_dev *bdev, struct bus_node *bnode,
         dd->transfer.dma = 1;
         regs->SPI_CTRL_REG &= ~SPI_SPI_CTRL_REG_SPI_INT_BIT_Msk;
         spi_da1469x_int_disable(regs);
-        da1469x_dma_configure(dd->dma_chans[0], &spi_write_rx_dma_cfg, spi_da1469x_dma_done_cb, dd);
-        da1469x_dma_configure(dd->dma_chans[1], &spi_write_tx_dma_cfg, NULL, NULL);
+
+        /* NOTE: assumes if 16-bit not used; dma transfers are 8-bits */
+        if ((regs->SPI_CTRL_REG & SPI_SPI_CTRL_REG_SPI_WORD_Msk) == SPI_CTRL_REG_16BIT_WORD) {
+            da1469x_dma_configure(dd->dma_chans[0], &spi_write_rx_dma_cfg16, spi_da1469x_dma_done_cb, dd);
+            da1469x_dma_configure(dd->dma_chans[1], &spi_write_tx_dma_cfg16, NULL, NULL);
+        } else {
+            da1469x_dma_configure(dd->dma_chans[0], &spi_write_rx_dma_cfg, spi_da1469x_dma_done_cb, dd);
+            da1469x_dma_configure(dd->dma_chans[1], &spi_write_tx_dma_cfg, NULL, NULL);
+        }
+
         da1469x_dma_read_peripheral(dd->dma_chans[0], &dma_dummy_dst, length);
         da1469x_dma_write_peripheral(dd->dma_chans[1], buf, length);
         regs->SPI_CTRL_REG |= SPI_SPI_CTRL_REG_SPI_ON_Msk;


[mynewt-core] 02/04: hw/bus/drivers/spi_da1469x: Allow for 16-bit dma transfers

Posted by we...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit f39917fe59526ccc2dad2753a115493f745ee2cd
Author: Will San Filippo <wi...@juul.com>
AuthorDate: Wed Jun 14 10:53:13 2023 -0400

    hw/bus/drivers/spi_da1469x: Allow for 16-bit dma transfers
    
    Fix trailing space.
---
 hw/bus/drivers/spi_da1469x/src/spi_da1469x.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/hw/bus/drivers/spi_da1469x/src/spi_da1469x.c b/hw/bus/drivers/spi_da1469x/src/spi_da1469x.c
index 8d2d5fe29..bc4f8ff65 100644
--- a/hw/bus/drivers/spi_da1469x/src/spi_da1469x.c
+++ b/hw/bus/drivers/spi_da1469x/src/spi_da1469x.c
@@ -53,7 +53,7 @@ STATS_NAME_END(spi_da1469x_stats_section)
 #define MIN_DMA_SIZE 8
 
 /* A value of 1 for the word size means 16-bit words */
-#define SPI_CTRL_REG_16BIT_WORD (1 << SPI_SPI_CTRL_REG_SPI_WORD_Pos) 
+#define SPI_CTRL_REG_16BIT_WORD (1 << SPI_SPI_CTRL_REG_SPI_WORD_Pos)
 
 static const struct da1469x_dma_config spi_write_rx_dma_cfg = {
     .priority = 0,