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

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

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