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;
}