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 2022/02/14 08:11:44 UTC

[mynewt-core] branch master updated (1d08a37 -> 71e395f)

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 1d08a37  hw/mcu/cmac: Use 31250Hz for hal_timer and os_tick
     new 4b5826f  bus/i2c: Add probe functionality
     new 2628c6b  hw/bus/i2c: Add probe to i2c_hal driver
     new 13b20d0  bus/i2c_nrf5x: Split configure function
     new ba643ca  bus/i2c_nrf5x: Add probe to i2c_nrf52_twim driver
     new 85024bf  bus/i2c_nrf5340: Add missing 1MHz frequency setting
     new b2f2ba0  bus/i2c_nrf5340: Split configure function
     new c2e0d05  bus/i2c_nrf5340: Add probe to i2c_nrf5340 driver
     new b46da65  bus/i2c_da1469x: Split configure function
     new 0dfd3da  bus/i2c_da1469x: Add probe to i2c_da1469x driver
     new 71e395f  i2c_scan: Allow usage with bus drivers

The 10 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:
 .../i2c_common/include/bus/drivers/i2c_common.h    |  13 +++
 hw/bus/drivers/i2c_da1469x/src/i2c_da1469x.c       | 124 ++++++++++++++++++---
 hw/bus/drivers/i2c_hal/src/i2c_hal.c               |  31 ++++--
 hw/bus/drivers/i2c_nrf52_twim/src/i2c_nrf52_twim.c | 103 +++++++++++++----
 hw/bus/drivers/i2c_nrf5340/src/i2c_nrf5340.c       | 110 ++++++++++++++----
 test/i2c_scan/src/i2c_scan.c                       |  31 +++++-
 6 files changed, 340 insertions(+), 72 deletions(-)

[mynewt-core] 01/10: bus/i2c: Add probe functionality

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 4b5826f8b2c362aae3247af6592d3b292a14431c
Author: Jerzy Kasenberg <je...@codecoup.pl>
AuthorDate: Wed Jun 30 15:25:56 2021 +0200

    bus/i2c: Add probe functionality
    
    This adds probe function to I2C bus driver operations.
    It will allow to use i2c_scan module for bus driver
    builds.
---
 hw/bus/drivers/i2c_common/include/bus/drivers/i2c_common.h | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/hw/bus/drivers/i2c_common/include/bus/drivers/i2c_common.h b/hw/bus/drivers/i2c_common/include/bus/drivers/i2c_common.h
index 9f70123..e7fa161 100644
--- a/hw/bus/drivers/i2c_common/include/bus/drivers/i2c_common.h
+++ b/hw/bus/drivers/i2c_common/include/bus/drivers/i2c_common.h
@@ -90,6 +90,11 @@ struct bus_i2c_node {
 #endif
 };
 
+struct i2c_dev_ops {
+    struct bus_dev_ops bus_ops;
+    int (*probe)(struct bus_i2c_dev *dev, uint16_t address, os_time_t timeout);
+};
+
 /**
  * Create bus I2C node
  *
@@ -113,6 +118,14 @@ bus_i2c_node_create(const char *name, struct bus_i2c_node *node,
                          bus_node_init_func, (void *)cfg);
 }
 
+static inline int
+bus_i2c_probe(struct bus_i2c_dev *dev, uint16_t address, int timeout)
+{
+    struct i2c_dev_ops *i2c_ops = (struct i2c_dev_ops *)dev->bdev.dops;
+
+    return i2c_ops->probe ? i2c_ops->probe(dev, address, timeout) : SYS_ENOTSUP;
+}
+
 #ifdef __cplusplus
 }
 #endif

[mynewt-core] 02/10: hw/bus/i2c: Add probe to i2c_hal driver

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 2628c6bc588b319235efd4135fea02d328dc2a56
Author: Jerzy Kasenberg <je...@codecoup.pl>
AuthorDate: Wed Jun 30 15:31:14 2021 +0200

    hw/bus/i2c: Add probe to i2c_hal driver
    
    This adds probe function to generic i2c_hal driver.
---
 hw/bus/drivers/i2c_hal/src/i2c_hal.c | 31 ++++++++++++++++++++++++-------
 1 file changed, 24 insertions(+), 7 deletions(-)

diff --git a/hw/bus/drivers/i2c_hal/src/i2c_hal.c b/hw/bus/drivers/i2c_hal/src/i2c_hal.c
index 3e2f675..2c6ed68 100644
--- a/hw/bus/drivers/i2c_hal/src/i2c_hal.c
+++ b/hw/bus/drivers/i2c_hal/src/i2c_hal.c
@@ -178,13 +178,30 @@ static int bus_i2c_disable(struct bus_dev *bdev)
     return 0;
 }
 
-static const struct bus_dev_ops bus_i2c_hal_ops = {
-    .init_node = bus_i2c_init_node,
-    .enable = bus_i2c_enable,
-    .configure = bus_i2c_configure,
-    .read = bus_i2c_read,
-    .write = bus_i2c_write,
-    .disable = bus_i2c_disable,
+static int
+bus_i2c_hal_probe(struct bus_i2c_dev *dev, uint16_t address, os_time_t timeout)
+{
+    int rc;
+
+    rc = os_error_to_sys(os_mutex_pend(&dev->bdev.lock, timeout));
+
+    if (rc == 0) {
+        rc = bus_i2c_translate_hal_error(hal_i2c_master_probe(dev->cfg.i2c_num, address, timeout));
+        os_mutex_release(&dev->bdev.lock);
+    }
+    return rc;
+}
+
+static const struct i2c_dev_ops bus_i2c_hal_ops = {
+    .bus_ops = {
+        .init_node = bus_i2c_init_node,
+        .enable = bus_i2c_enable,
+        .configure = bus_i2c_configure,
+        .read = bus_i2c_read,
+        .write = bus_i2c_write,
+        .disable = bus_i2c_disable,
+    },
+    .probe = bus_i2c_hal_probe,
 };
 
 int

[mynewt-core] 06/10: bus/i2c_nrf5340: Split configure function

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 b2f2ba04a609ec8884487a062881e05db88548bc
Author: Jerzy Kasenberg <je...@codecoup.pl>
AuthorDate: Wed Jun 30 15:49:26 2021 +0200

    bus/i2c_nrf5340: Split configure function
    
    configure function needed by i2c interface sets up controller
    to be used with specific node (device with address and speed).
    
    This introduces local configuration functions that configures
    controller without node.
    It will be useful for configuration of controller to scan for
    any devices with specific address.
    Without this probing i2c bus would require creation of dummy
    nodes.
---
 hw/bus/drivers/i2c_nrf5340/src/i2c_nrf5340.c | 36 +++++++++++++++-------------
 1 file changed, 19 insertions(+), 17 deletions(-)

diff --git a/hw/bus/drivers/i2c_nrf5340/src/i2c_nrf5340.c b/hw/bus/drivers/i2c_nrf5340/src/i2c_nrf5340.c
index 22871e3..c183b59 100644
--- a/hw/bus/drivers/i2c_nrf5340/src/i2c_nrf5340.c
+++ b/hw/bus/drivers/i2c_nrf5340/src/i2c_nrf5340.c
@@ -202,28 +202,14 @@ bus_i2c_nrf5340_enable(struct bus_dev *bdev)
 }
 
 static int
-bus_i2c_nrf5340_configure(struct bus_dev *bdev, struct bus_node *bnode)
+bus_i2c_nrf5340_configure_controller(struct bus_i2c_dev *dev, uint8_t address, uint16_t freq)
 {
-    struct bus_i2c_dev *dev = (struct bus_i2c_dev *)bdev;
-    struct bus_i2c_node *node = (struct bus_i2c_node *)bnode;
-    struct bus_i2c_node *current_node = (struct bus_i2c_node *)bdev->configured_for;
     NRF_TWIM_Type *nrf_twim;
-    int rc;
-
-    BUS_DEBUG_VERIFY_DEV(dev);
-    BUS_DEBUG_VERIFY_NODE(node);
+    int rc = 0;
 
     nrf_twim = twims[dev->cfg.i2c_num].nrf_twim;
 
-    nrf_twim->ADDRESS = node->addr;
-
-    if (current_node && (current_node->freq == node->freq)) {
-        return 0;
-    }
-
-    rc = 0;
-
-    switch (node->freq) {
+    switch (freq) {
     case 100:
         nrf_twim->FREQUENCY = TWIM_FREQUENCY_FREQUENCY_K100;
         break;
@@ -240,10 +226,26 @@ bus_i2c_nrf5340_configure(struct bus_dev *bdev, struct bus_node *bnode)
         rc = SYS_EIO;
     }
 
+    if (rc == 0) {
+        nrf_twim->ADDRESS = address;
+    }
+
     return rc;
 }
 
 static int
+bus_i2c_nrf5340_configure(struct bus_dev *bdev, struct bus_node *bnode)
+{
+    struct bus_i2c_dev *dev = (struct bus_i2c_dev *)bdev;
+    struct bus_i2c_node *node = (struct bus_i2c_node *)bnode;
+
+    BUS_DEBUG_VERIFY_DEV(dev);
+    BUS_DEBUG_VERIFY_NODE(node);
+
+    return bus_i2c_nrf5340_configure_controller(dev, node->addr, node->freq);
+}
+
+static int
 bus_i2c_nrf5340_read(struct bus_dev *bdev, struct bus_node *bnode,
                      uint8_t *buf, uint16_t length, os_time_t timeout,
                      uint16_t flags)

[mynewt-core] 04/10: bus/i2c_nrf5x: Add probe to i2c_nrf52_twim driver

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 ba643caceff110eaa911e35b93dc10f94137d070
Author: Jerzy Kasenberg <je...@codecoup.pl>
AuthorDate: Wed Jun 30 15:41:24 2021 +0200

    bus/i2c_nrf5x: Add probe to i2c_nrf52_twim driver
    
    This adds probe function to i2c_nrf52_twim driver.
    
    Probing functionality uses write without data bytes.
---
 hw/bus/drivers/i2c_nrf52_twim/src/i2c_nrf52_twim.c | 70 +++++++++++++++++++---
 1 file changed, 63 insertions(+), 7 deletions(-)

diff --git a/hw/bus/drivers/i2c_nrf52_twim/src/i2c_nrf52_twim.c b/hw/bus/drivers/i2c_nrf52_twim/src/i2c_nrf52_twim.c
index 5240349..ad43f61 100644
--- a/hw/bus/drivers/i2c_nrf52_twim/src/i2c_nrf52_twim.c
+++ b/hw/bus/drivers/i2c_nrf52_twim/src/i2c_nrf52_twim.c
@@ -580,6 +580,59 @@ bus_i2c_nrf52_twim_write(struct bus_dev *bdev, struct bus_node *bnode,
     return rc;
 }
 
+int
+bus_i2c_nrf52_twim_probe(struct bus_i2c_dev *dev, uint16_t address, os_time_t timeout)
+{
+    struct twim_dev_data *dd;
+    NRF_TWIM_Type *nrf_twim;
+    int rc;
+
+    BUS_DEBUG_VERIFY_DEV(dev);
+
+    rc = os_error_to_sys(os_mutex_pend(&dev->bdev.lock, timeout));
+    if (rc == 0) {
+        rc = bus_i2c_nrf52_twim_configure_controller(dev, address, 100);
+        assert(rc == 0);
+        nrf_twim = twims[dev->cfg.i2c_num].nrf_twim;
+        dd = &twim_devs_data[dev->cfg.i2c_num];
+
+        nrf_twim->TXD.MAXCNT = 0;
+        nrf_twim->TXD.LIST = 0;
+
+        nrf_twim->EVENTS_STOPPED = 0;
+        nrf_twim->EVENTS_ERROR = 0;
+
+        nrf_twim->SHORTS = 0;
+        nrf_twim->INTEN = TWIM_INTEN_ERROR_Msk;
+
+        nrf_twim->TASKS_STARTTX = 1;
+
+        /* Wait for enough time to have NACK detected. */
+        os_cputime_delay_usecs(125);
+
+        /* If semaphore is signaled, there was an error. */
+        rc = os_sem_pend(&dd->sem, 0);
+        /* Stop condition was not automatically send. */
+        nrf_twim->INTEN = TWIM_INTEN_STOPPED_Msk;
+        nrf_twim->TASKS_STOP = 1;
+
+        /*
+         * Previous os_sem_pend() returning OS_TIMEOUT means that
+         * device ACK'ed address.
+         */
+        if (rc == OS_TIMEOUT) {
+            rc = 0;
+        } else {
+            rc = SYS_ENOENT;
+        }
+        /* Wait for STOP condition interrupt. */
+        (void)os_sem_pend(&dd->sem, OS_TICKS_PER_SEC);
+        (void)os_mutex_release(&dev->bdev.lock);
+    }
+
+    return rc;
+}
+
 static int bus_i2c_nrf52_twim_disable(struct bus_dev *bdev)
 {
     struct bus_i2c_dev *dev = (struct bus_i2c_dev *)bdev;
@@ -593,13 +646,16 @@ static int bus_i2c_nrf52_twim_disable(struct bus_dev *bdev)
     return 0;
 }
 
-static const struct bus_dev_ops bus_i2c_nrf52_twim_ops = {
-    .init_node = bus_i2c_nrf52_twim_init_node,
-    .enable = bus_i2c_nrf52_twim_enable,
-    .configure = bus_i2c_nrf52_twim_configure,
-    .read = bus_i2c_nrf52_twim_read,
-    .write = bus_i2c_nrf52_twim_write,
-    .disable = bus_i2c_nrf52_twim_disable,
+static const struct i2c_dev_ops bus_i2c_nrf52_twim_ops = {
+    .bus_ops = {
+        .init_node = bus_i2c_nrf52_twim_init_node,
+        .enable = bus_i2c_nrf52_twim_enable,
+        .configure = bus_i2c_nrf52_twim_configure,
+        .read = bus_i2c_nrf52_twim_read,
+        .write = bus_i2c_nrf52_twim_write,
+        .disable = bus_i2c_nrf52_twim_disable,
+    },
+    .probe = bus_i2c_nrf52_twim_probe,
 };
 
 int

[mynewt-core] 07/10: bus/i2c_nrf5340: Add probe to i2c_nrf5340 driver

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 c2e0d053cb3df6008aab29e1eadbb50dae7f2bf4
Author: Jerzy Kasenberg <je...@codecoup.pl>
AuthorDate: Wed Jun 30 15:50:59 2021 +0200

    bus/i2c_nrf5340: Add probe to i2c_nrf5340 driver
    
    This adds probe function to i2c_nrf5340 driver.
    
    Probing functionality uses write without data bytes.
---
 hw/bus/drivers/i2c_nrf5340/src/i2c_nrf5340.c | 71 +++++++++++++++++++++++++---
 1 file changed, 64 insertions(+), 7 deletions(-)

diff --git a/hw/bus/drivers/i2c_nrf5340/src/i2c_nrf5340.c b/hw/bus/drivers/i2c_nrf5340/src/i2c_nrf5340.c
index c183b59..b354310 100644
--- a/hw/bus/drivers/i2c_nrf5340/src/i2c_nrf5340.c
+++ b/hw/bus/drivers/i2c_nrf5340/src/i2c_nrf5340.c
@@ -389,13 +389,70 @@ bus_i2c_nrf5340_disable(struct bus_dev *bdev)
     return 0;
 }
 
-static const struct bus_dev_ops bus_i2c_nrf5340_ops = {
-    .init_node = bus_i2c_nrf5340_init_node,
-    .enable = bus_i2c_nrf5340_enable,
-    .configure = bus_i2c_nrf5340_configure,
-    .read = bus_i2c_nrf5340_read,
-    .write = bus_i2c_nrf5340_write,
-    .disable = bus_i2c_nrf5340_disable,
+static int
+bus_i2c_nrf5340_probe(struct bus_i2c_dev *dev, uint16_t address, os_time_t timeout)
+{
+    struct twim_dev_data *dd;
+    NRF_TWIM_Type *nrf_twim;
+    int rc;
+
+    BUS_DEBUG_VERIFY_DEV(dev);
+
+    rc = os_error_to_sys(os_mutex_pend(&dev->bdev.lock, timeout));
+    if (rc == 0) {
+        rc = bus_i2c_nrf5340_configure_controller(dev, address, 100);
+        assert(rc == 0);
+        nrf_twim = twims[dev->cfg.i2c_num].nrf_twim;
+        dd = &twim_devs_data[dev->cfg.i2c_num];
+
+        nrf_twim->TXD.MAXCNT = 0;
+        nrf_twim->TXD.LIST = 0;
+
+        nrf_twim->EVENTS_STOPPED = 0;
+        nrf_twim->EVENTS_ERROR = 0;
+
+        nrf_twim->SHORTS = 0;
+        nrf_twim->INTEN = TWIM_INTEN_ERROR_Msk;
+
+        nrf_twim->TASKS_STARTTX = 1;
+
+        /* Wait for enough time to have NACK detected */
+        os_cputime_delay_usecs(125);
+
+        /* If semaphore is signaled, there was an error. */
+        rc = os_sem_pend(&dd->sem, 0);
+        /* Stop condition is not automatically send */
+        nrf_twim->INTEN = TWIM_INTEN_STOPPED_Msk;
+        nrf_twim->TASKS_STOP = 1;
+
+        /*
+         * Previous os_sem_pend() returning OS_TIMEOUT means that
+         * device ACK'ed address.
+         */
+        if (rc == OS_TIMEOUT) {
+            rc = 0;
+        } else {
+            rc = SYS_ENOENT;
+        }
+        /* Wait for STOP condition */
+        (void)os_sem_pend(&dd->sem, OS_TICKS_PER_SEC);
+
+        (void)os_mutex_release(&dev->bdev.lock);
+    }
+
+    return rc;
+}
+
+static const struct i2c_dev_ops bus_i2c_nrf5340_ops = {
+    .bus_ops = {
+        .init_node = bus_i2c_nrf5340_init_node,
+        .enable = bus_i2c_nrf5340_enable,
+        .configure = bus_i2c_nrf5340_configure,
+        .read = bus_i2c_nrf5340_read,
+        .write = bus_i2c_nrf5340_write,
+        .disable = bus_i2c_nrf5340_disable,
+    },
+    .probe = bus_i2c_nrf5340_probe,
 };
 
 #include <hal/hal_gpio.h>

[mynewt-core] 08/10: bus/i2c_da1469x: Split configure function

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 b46da65c7e6ec2ffd2f7307c2c6bb49c5491a08c
Author: Jerzy Kasenberg <je...@codecoup.pl>
AuthorDate: Wed Jun 30 16:15:05 2021 +0200

    bus/i2c_da1469x: Split configure function
    
    configure function needed by i2c interface sets up controller
    to be used with specific node (device with address and speed).
    
    This introduces local configuration functions that configures
    controller without node.
    It will be useful for configuration of controller to scan for
    any devices with specific address.
    Without this probing i2c bus would require creation of dummy
    nodes.
---
 hw/bus/drivers/i2c_da1469x/src/i2c_da1469x.c | 26 +++++++++++++++-----------
 1 file changed, 15 insertions(+), 11 deletions(-)

diff --git a/hw/bus/drivers/i2c_da1469x/src/i2c_da1469x.c b/hw/bus/drivers/i2c_da1469x/src/i2c_da1469x.c
index c20b29f..b361abb 100644
--- a/hw/bus/drivers/i2c_da1469x/src/i2c_da1469x.c
+++ b/hw/bus/drivers/i2c_da1469x/src/i2c_da1469x.c
@@ -413,17 +413,13 @@ i2c_da1469x_enable(struct bus_dev *bdev)
 }
 
 static int
-i2c_da1469x_configure(struct bus_dev *bdev, struct bus_node *bnode)
+i2c_da1469x_configure_controller(struct bus_i2c_dev *dev, uint8_t address, uint16_t freq)
 {
-    struct bus_i2c_dev *dev = (struct bus_i2c_dev *)bdev;
-    struct bus_i2c_node *node = (struct bus_i2c_node *)bnode;
-    struct bus_i2c_node *current_node = (struct bus_i2c_node *)bdev->configured_for;
     I2C_Type *i2c_regs;
     uint32_t speed;
     int rc = 0;
 
     BUS_DEBUG_VERIFY_DEV(dev);
-    BUS_DEBUG_VERIFY_NODE(node);
 
     i2c_regs = da1469x_i2c[dev->cfg.i2c_num].regs;
 
@@ -431,13 +427,9 @@ i2c_da1469x_configure(struct bus_dev *bdev, struct bus_node *bnode)
         i2c_regs->I2C_ENABLE_REG &= ~(1U << I2C_I2C_ENABLE_REG_I2C_EN_Pos);
     }
 
-    i2c_regs->I2C_TAR_REG = node->addr & I2C_I2C_TAR_REG_IC_TAR_Msk;
+    i2c_regs->I2C_TAR_REG = address & I2C_I2C_TAR_REG_IC_TAR_Msk;
 
-    if (current_node && (current_node->freq == node->freq)) {
-        goto end;
-    }
-
-    switch (node->freq) {
+    switch (freq) {
     case 100:
         speed = 1;
         break;
@@ -458,6 +450,18 @@ end:
 }
 
 static int
+i2c_da1469x_configure(struct bus_dev *bdev, struct bus_node *bnode)
+{
+    struct bus_i2c_dev *dev = (struct bus_i2c_dev *)bdev;
+    struct bus_i2c_node *node = (struct bus_i2c_node *)bnode;
+
+    BUS_DEBUG_VERIFY_DEV(dev);
+    BUS_DEBUG_VERIFY_NODE(node);
+
+    return i2c_da1469x_configure_controller(dev, node->addr, node->freq);
+}
+
+static int
 i2c_da1469x_translate_abort(uint32_t abort_code)
 {
     if (abort_code &

[mynewt-core] 10/10: i2c_scan: Allow usage with bus drivers

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 71e395f88c67889ed32d5a13be01f8cc5ce6dd26
Author: Jerzy Kasenberg <je...@codecoup.pl>
AuthorDate: Wed Jun 30 16:18:20 2021 +0200

    i2c_scan: Allow usage with bus drivers
    
    Package test/i2c_scan can be now used with MCUs
    that have only bus driver support.
---
 test/i2c_scan/src/i2c_scan.c | 31 ++++++++++++++++++++++++++++++-
 1 file changed, 30 insertions(+), 1 deletion(-)

diff --git a/test/i2c_scan/src/i2c_scan.c b/test/i2c_scan/src/i2c_scan.c
index 8420497..00cffda 100644
--- a/test/i2c_scan/src/i2c_scan.c
+++ b/test/i2c_scan/src/i2c_scan.c
@@ -23,6 +23,9 @@
 #include <shell/shell.h>
 #include <console/console.h>
 #include <parse/parse.h>
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+#include <bus/drivers/i2c_common.h>
+#endif
 
 static int i2c_scan_cli_cmd(int argc, char **argv);
 
@@ -31,6 +34,32 @@ static struct shell_cmd i2c_scan_cmd_struct = {
     .sc_cmd_func = i2c_scan_cli_cmd
 };
 
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+static int
+i2c_scan_probe(int i2c_num, uint16_t address, uint32_t timeout)
+{
+    char bus_name[5] = "i2cX";
+    struct bus_i2c_dev *bus;
+    int rc = SYS_EINVAL;
+
+    bus_name[3] = i2c_num + '0';
+
+    bus = (struct bus_i2c_dev *)os_dev_open(bus_name, timeout, NULL);
+    if (bus) {
+        rc = bus_i2c_probe(bus, address, timeout);
+        (void)os_dev_close((struct os_dev *)bus);
+    }
+
+    return rc;
+}
+#else
+static int
+i2c_scan_probe(int i2cnum, uint16_t address, uint32_t timeout)
+{
+    return hal_i2c_master_probe(i2cnum, address, timeout);
+}
+#endif
+
 static int
 i2c_scan_cli_cmd(int argc, char **argv)
 {
@@ -60,7 +89,7 @@ i2c_scan_cli_cmd(int argc, char **argv)
 
     /* Scan all valid I2C addresses (0x08..0x77) */
     for (addr = 0x08; addr < 0x78; addr++) {
-        rc = hal_i2c_master_probe(i2cnum, addr, timeout);
+        rc = i2c_scan_probe(i2cnum, addr, timeout);
         /* Print addr header every 16 bytes */
         if (!(addr % 16)) {
             console_printf("\n%02x: ", addr);

[mynewt-core] 09/10: bus/i2c_da1469x: Add probe to i2c_da1469x driver

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 0dfd3da37133ea06123fd7fb5b2e348ffdf76fc9
Author: Jerzy Kasenberg <je...@codecoup.pl>
AuthorDate: Wed Jun 30 16:16:42 2021 +0200

    bus/i2c_da1469x: Add probe to i2c_da1469x driver
    
    This adds probe function to i2c_da1469x driver.
    
    Probing functionality uses write without data bytes.
    Due to inability of read or writes without data
    probing is done with GPIO.
---
 hw/bus/drivers/i2c_da1469x/src/i2c_da1469x.c | 98 ++++++++++++++++++++++++++--
 1 file changed, 91 insertions(+), 7 deletions(-)

diff --git a/hw/bus/drivers/i2c_da1469x/src/i2c_da1469x.c b/hw/bus/drivers/i2c_da1469x/src/i2c_da1469x.c
index b361abb..a473636 100644
--- a/hw/bus/drivers/i2c_da1469x/src/i2c_da1469x.c
+++ b/hw/bus/drivers/i2c_da1469x/src/i2c_da1469x.c
@@ -623,13 +623,97 @@ i2c_da1469x_disable(struct bus_dev *bdev)
     return 0;
 }
 
-static const struct bus_dev_ops bus_i2c_da1469x_dma_ops = {
-    .init_node = i2c_da1469x_init_node,
-    .enable = i2c_da1469x_enable,
-    .configure = i2c_da1469x_configure,
-    .read = i2c_da1469x_read,
-    .write = i2c_da1469x_write,
-    .disable = i2c_da1469x_disable,
+static int
+i2c_da1469x_probe(struct bus_i2c_dev *dev, uint16_t address, os_time_t timeout)
+{
+    I2C_Type *i2c_regs;
+    int rc;
+    int i;
+    int pin_sda;
+    int pin_scl;
+    uint32_t half_clock_ticks = os_cputime_usecs_to_ticks(5);
+    const struct da1469x_i2c_hw *i2c_hw;
+    int nack;
+    bool reenable = false;
+    BUS_DEBUG_VERIFY_DEV(dev);
+
+    rc = os_error_to_sys(os_mutex_pend(&dev->bdev.lock, timeout));
+    if (rc == 0) {
+        i2c_hw = &da1469x_i2c[dev->cfg.i2c_num];
+        i2c_regs = da1469x_i2c[dev->cfg.i2c_num].regs;
+
+        pin_scl = dev->cfg.pin_scl;
+        pin_sda = dev->cfg.pin_sda;
+        if (i2c_regs->I2C_ENABLE_REG & I2C_I2C_ENABLE_REG_I2C_EN_Msk) {
+            i2c_regs->I2C_ENABLE_REG &= ~(1U << I2C_I2C_ENABLE_REG_I2C_EN_Pos);
+            reenable = true;
+        }
+        hal_gpio_write(pin_scl, 1);
+        hal_gpio_write(pin_sda, 1);
+        mcu_gpio_set_pin_function(pin_scl, MCU_GPIO_MODE_OUTPUT_OPEN_DRAIN,
+                                  MCU_GPIO_FUNC_GPIO);
+        mcu_gpio_set_pin_function(pin_sda, MCU_GPIO_MODE_OUTPUT_OPEN_DRAIN,
+                                  MCU_GPIO_FUNC_GPIO);
+
+        /* Start condition */
+        hal_gpio_write(pin_sda, 0);
+        hal_gpio_write(pin_scl, 0);
+        address <<= 1;
+        os_cputime_delay_ticks(half_clock_ticks);
+        for (i = 7; i >= 0; --i) {
+            hal_gpio_write(pin_sda, address & (1 << i));
+            os_cputime_delay_ticks(half_clock_ticks);
+            hal_gpio_write(pin_scl, 1);
+            os_cputime_delay_ticks(half_clock_ticks);
+            hal_gpio_write(pin_scl, 0);
+        }
+        mcu_gpio_set_pin_function(pin_sda, MCU_GPIO_MODE_INPUT_PULLUP,
+                                  MCU_GPIO_FUNC_GPIO);
+        os_cputime_delay_ticks(half_clock_ticks);
+
+        hal_gpio_write(pin_scl, 1);
+        while (hal_gpio_read(pin_scl) == 0) ;
+        nack = hal_gpio_read(pin_sda);
+        os_cputime_delay_ticks(half_clock_ticks);
+        hal_gpio_write(pin_scl, 0);
+        /* Stop condition */
+        mcu_gpio_set_pin_function(pin_sda, MCU_GPIO_MODE_OUTPUT, MCU_GPIO_FUNC_GPIO);
+        hal_gpio_write(pin_sda, 0);
+        os_cputime_delay_ticks(half_clock_ticks);
+        hal_gpio_write(pin_scl, 1);
+        os_cputime_delay_ticks(half_clock_ticks);
+        hal_gpio_write(pin_sda, 1);
+        mcu_gpio_set_pin_function(pin_scl, MCU_GPIO_MODE_OUTPUT_OPEN_DRAIN,
+                                  MCU_GPIO_FUNC_GPIO);
+        mcu_gpio_set_pin_function(pin_sda, MCU_GPIO_MODE_OUTPUT_OPEN_DRAIN,
+                                  MCU_GPIO_FUNC_GPIO);
+
+        mcu_gpio_set_pin_function(pin_scl, MCU_GPIO_MODE_OUTPUT_OPEN_DRAIN,
+                                  i2c_hw->scl_func);
+        mcu_gpio_set_pin_function(pin_sda, MCU_GPIO_MODE_OUTPUT_OPEN_DRAIN,
+                                  i2c_hw->sda_func);
+        if (reenable) {
+            i2c_regs->I2C_ENABLE_REG |= ~(1U << I2C_I2C_ENABLE_REG_I2C_EN_Pos);
+        }
+        rc = nack ? SYS_ENOENT : 0;
+
+        (void)os_mutex_release(&dev->bdev.lock);
+    }
+
+    return rc;
+}
+
+
+static const struct i2c_dev_ops bus_i2c_da1469x_dma_ops = {
+    .bus_ops = {
+        .init_node = i2c_da1469x_init_node,
+        .enable = i2c_da1469x_enable,
+        .configure = i2c_da1469x_configure,
+        .read = i2c_da1469x_read,
+        .write = i2c_da1469x_write,
+        .disable = i2c_da1469x_disable,
+    },
+    .probe = i2c_da1469x_probe,
 };
 
 int

[mynewt-core] 03/10: bus/i2c_nrf5x: Split configure function

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 13b20d06136f41ecd832e640f30597c28d2c0956
Author: Jerzy Kasenberg <je...@codecoup.pl>
AuthorDate: Wed Jun 30 15:37:41 2021 +0200

    bus/i2c_nrf5x: Split configure function
    
    configure function needed by i2c interface sets up controller
    to be used with specific node (device with address and speed).
    
    This introduces local configuration functions that configures
    controller without node.
    It will be useful for configuration of controller to scan for
    any devices with specific address.
    Without this probing i2c bus would require creation of dummy
    nodes.
---
 hw/bus/drivers/i2c_nrf52_twim/src/i2c_nrf52_twim.c | 33 ++++++++++++----------
 1 file changed, 18 insertions(+), 15 deletions(-)

diff --git a/hw/bus/drivers/i2c_nrf52_twim/src/i2c_nrf52_twim.c b/hw/bus/drivers/i2c_nrf52_twim/src/i2c_nrf52_twim.c
index 63c799a..5240349 100644
--- a/hw/bus/drivers/i2c_nrf52_twim/src/i2c_nrf52_twim.c
+++ b/hw/bus/drivers/i2c_nrf52_twim/src/i2c_nrf52_twim.c
@@ -399,28 +399,16 @@ bus_i2c_nrf52_twim_enable(struct bus_dev *bdev)
 }
 
 static int
-bus_i2c_nrf52_twim_configure(struct bus_dev *bdev, struct bus_node *bnode)
+bus_i2c_nrf52_twim_configure_controller(struct bus_i2c_dev *dev, uint8_t address, uint16_t freq)
 {
-    struct bus_i2c_dev *dev = (struct bus_i2c_dev *)bdev;
-    struct bus_i2c_node *node = (struct bus_i2c_node *)bnode;
-    struct bus_i2c_node *current_node = (struct bus_i2c_node *)bdev->configured_for;
     NRF_TWIM_Type *nrf_twim;
-    int rc;
+    int rc = 0;
 
     BUS_DEBUG_VERIFY_DEV(dev);
-    BUS_DEBUG_VERIFY_NODE(node);
 
     nrf_twim = twims[dev->cfg.i2c_num].nrf_twim;
 
-    nrf_twim->ADDRESS = node->addr;
-
-    if (current_node && (current_node->freq == node->freq)) {
-        return 0;
-    }
-
-    rc = 0;
-
-    switch (node->freq) {
+    switch (freq) {
     case 100:
         nrf_twim->FREQUENCY = TWIM_FREQUENCY_FREQUENCY_K100;
         break;
@@ -437,9 +425,24 @@ bus_i2c_nrf52_twim_configure(struct bus_dev *bdev, struct bus_node *bnode)
         rc = SYS_EIO;
     }
 
+    if (rc == 0) {
+        nrf_twim->ADDRESS = address;
+    }
+
     return rc;
 }
 
+static int
+bus_i2c_nrf52_twim_configure(struct bus_dev *bdev, struct bus_node *bnode)
+{
+    struct bus_i2c_dev *dev = (struct bus_i2c_dev *)bdev;
+    struct bus_i2c_node *node = (struct bus_i2c_node *)bnode;
+
+    BUS_DEBUG_VERIFY_DEV(dev);
+    BUS_DEBUG_VERIFY_NODE(node);
+
+    return bus_i2c_nrf52_twim_configure_controller(dev, node->addr, node->freq);
+}
 
 static int
 bus_i2c_nrf52_twim_read(struct bus_dev *bdev, struct bus_node *bnode,

[mynewt-core] 05/10: bus/i2c_nrf5340: Add missing 1MHz frequency setting

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 85024bf84c697dbef66e7b9bb28ba636b2db68dc
Author: Jerzy Kasenberg <je...@codecoup.pl>
AuthorDate: Wed Jun 30 15:47:32 2021 +0200

    bus/i2c_nrf5340: Add missing 1MHz frequency setting
    
    1 MHz speed is supported by hardware but software did
    not allow such speed (legacy from NRF52).
---
 hw/bus/drivers/i2c_nrf5340/src/i2c_nrf5340.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/hw/bus/drivers/i2c_nrf5340/src/i2c_nrf5340.c b/hw/bus/drivers/i2c_nrf5340/src/i2c_nrf5340.c
index 78e2e10..22871e3 100644
--- a/hw/bus/drivers/i2c_nrf5340/src/i2c_nrf5340.c
+++ b/hw/bus/drivers/i2c_nrf5340/src/i2c_nrf5340.c
@@ -233,6 +233,9 @@ bus_i2c_nrf5340_configure(struct bus_dev *bdev, struct bus_node *bnode)
     case 400:
         nrf_twim->FREQUENCY = TWIM_FREQUENCY_FREQUENCY_K400;
         break;
+    case 1000:
+        nrf_twim->FREQUENCY = TWIM_FREQUENCY_FREQUENCY_K1000;
+        break;
     default:
         rc = SYS_EIO;
     }