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 2019/12/04 20:10:52 UTC
[mynewt-core] branch master updated: sensors/tcs34725: Add bus
driver support
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
The following commit(s) were added to refs/heads/master by this push:
new c7c02d2 sensors/tcs34725: Add bus driver support
c7c02d2 is described below
commit c7c02d2cdcad1e287c08bdcb7f5fa89aa7b8e30e
Author: Jerzy Kasenberg <je...@codecoup.pl>
AuthorDate: Thu Nov 28 15:54:37 2019 +0100
sensors/tcs34725: Add bus driver support
Now tcs34725 can be configured with I2C bus drivers.
---
.../sensors/tcs34725/include/tcs34725/tcs34725.h | 20 ++++++++
hw/drivers/sensors/tcs34725/src/tcs34725.c | 53 ++++++++++++++++++++++
hw/drivers/sensors/tcs34725/src/tcs34725_shell.c | 31 +++++++++++++
hw/drivers/sensors/tcs34725/syscfg.yml | 3 ++
hw/sensor/creator/src/sensor_creator.c | 20 +++++++-
hw/sensor/creator/syscfg.yml | 6 +++
6 files changed, 132 insertions(+), 1 deletion(-)
diff --git a/hw/drivers/sensors/tcs34725/include/tcs34725/tcs34725.h b/hw/drivers/sensors/tcs34725/include/tcs34725/tcs34725.h
index 77827b1..5334375 100644
--- a/hw/drivers/sensors/tcs34725/include/tcs34725/tcs34725.h
+++ b/hw/drivers/sensors/tcs34725/include/tcs34725/tcs34725.h
@@ -47,7 +47,11 @@ struct tcs34725_cfg {
};
struct tcs34725 {
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+ struct bus_i2c_node i2c_node;
+#else
struct os_dev dev;
+#endif
struct sensor sensor;
struct tcs34725_cfg cfg;
os_time_t last_read_time;
@@ -212,6 +216,22 @@ tcs34725_get_rawdata(struct sensor_itf *itf, uint16_t *r, uint16_t *g,
int
tcs34725_get_int_limits(struct sensor_itf *itf, uint16_t *low, uint16_t *high);
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+
+/**
+ * Create I2C bus node for TCS34725 sensor
+ *
+ * @param node Bus node
+ * @param name Device name
+ * @param i2c_cfg I2C node configuration
+ * @param sensor_itf Sensors interface
+ *
+ * @return 0 on success, non-zero on failure
+ */
+int tcs34725_create_i2c_sensor_dev(struct bus_i2c_node *node, const char *name,
+ const struct bus_i2c_node_cfg *i2c_cfg,
+ struct sensor_itf *sensor_itf);
+#endif
#ifdef __cplusplus
}
diff --git a/hw/drivers/sensors/tcs34725/src/tcs34725.c b/hw/drivers/sensors/tcs34725/src/tcs34725.c
index 075bc7b..5d5c79b 100644
--- a/hw/drivers/sensors/tcs34725/src/tcs34725.c
+++ b/hw/drivers/sensors/tcs34725/src/tcs34725.c
@@ -85,6 +85,9 @@ tcs34725_write8(struct sensor_itf *itf, uint8_t reg, uint32_t value)
int rc;
uint8_t payload[2] = { reg | TCS34725_COMMAND_BIT, value & 0xFF };
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+ rc = bus_node_simple_write(itf->si_dev, payload, 2);
+#else
struct hal_i2c_master_data data_struct = {
.address = itf->si_addr,
.len = 2,
@@ -106,6 +109,7 @@ tcs34725_write8(struct sensor_itf *itf, uint8_t reg, uint32_t value)
}
sensor_itf_unlock(itf);
+#endif
return rc;
}
@@ -123,6 +127,11 @@ int
tcs34725_read8(struct sensor_itf *itf, uint8_t reg, uint8_t *value)
{
int rc;
+
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+ reg |= TCS34725_COMMAND_BIT;
+ rc = bus_node_simple_write_read_transact(itf->si_dev, ®, 1, value, 1);
+#else
uint8_t payload;
struct hal_i2c_master_data data_struct = {
@@ -160,6 +169,7 @@ tcs34725_read8(struct sensor_itf *itf, uint8_t reg, uint8_t *value)
err:
sensor_itf_unlock(itf);
+#endif
return rc;
}
@@ -177,6 +187,11 @@ int
tcs34725_readlen(struct sensor_itf *itf, uint8_t reg, uint8_t *buffer, uint8_t len)
{
int rc;
+
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+ reg |= TCS34725_COMMAND_BIT;
+ rc = bus_node_simple_write_read_transact(itf->si_dev, ®, 1, buffer, len);
+#else
uint8_t payload[9] = { reg | TCS34725_COMMAND_BIT, 0, 0, 0, 0, 0, 0, 0, 0};
struct hal_i2c_master_data data_struct = {
@@ -221,6 +236,7 @@ tcs34725_readlen(struct sensor_itf *itf, uint8_t reg, uint8_t *buffer, uint8_t l
err:
sensor_itf_unlock(itf);
+#endif
return rc;
}
@@ -240,6 +256,10 @@ tcs34725_writelen(struct sensor_itf *itf, uint8_t reg, uint8_t *buffer, uint8_t
int rc;
uint8_t payload[9] = { reg, 0, 0, 0, 0, 0, 0, 0, 0};
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+ memcpy(&payload[1], buffer, len);
+ rc = bus_node_simple_write(itf->si_dev, payload, len + 1);
+#else
struct hal_i2c_master_data data_struct = {
.address = itf->si_addr,
.len = 1,
@@ -282,6 +302,7 @@ tcs34725_writelen(struct sensor_itf *itf, uint8_t reg, uint8_t *buffer, uint8_t
err:
sensor_itf_unlock(itf);
+#endif
return rc;
}
@@ -971,6 +992,9 @@ tcs34725_clear_interrupt(struct sensor_itf *itf)
int rc;
uint8_t payload = TCS34725_COMMAND_BIT | TCS34725_CMD_TYPE | TCS34725_CMD_ADDR;
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+ rc = bus_node_simple_write(itf->si_dev, &payload, 1);
+#else
struct hal_i2c_master_data data_struct = {
.address = itf->si_addr,
.len = 0,
@@ -985,6 +1009,7 @@ tcs34725_clear_interrupt(struct sensor_itf *itf)
return 0;
err:
+#endif
return rc;
}
@@ -1065,3 +1090,31 @@ tcs34725_sensor_get_config(struct sensor *sensor, sensor_type_t type,
err:
return (rc);
}
+
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+static void
+init_node_cb(struct bus_node *bnode, void *arg)
+{
+ struct sensor_itf *itf = arg;
+
+ tcs34725_init((struct os_dev *)bnode, itf);
+}
+
+int
+tcs34725_create_i2c_sensor_dev(struct bus_i2c_node *node, const char *name,
+ const struct bus_i2c_node_cfg *i2c_cfg,
+ struct sensor_itf *sensor_itf)
+{
+ struct bus_node_callbacks cbs = {
+ .init = init_node_cb,
+ };
+ int rc;
+
+ sensor_itf->si_dev = &node->bnode.odev;
+ bus_node_set_callbacks((struct os_dev *)node, &cbs);
+
+ rc = bus_i2c_node_create(name, node, i2c_cfg, sensor_itf);
+
+ return rc;
+}
+#endif
diff --git a/hw/drivers/sensors/tcs34725/src/tcs34725_shell.c b/hw/drivers/sensors/tcs34725/src/tcs34725_shell.c
index 9b0b029..8cd8cf6 100644
--- a/hw/drivers/sensors/tcs34725/src/tcs34725_shell.c
+++ b/hw/drivers/sensors/tcs34725/src/tcs34725_shell.c
@@ -34,11 +34,15 @@ static struct shell_cmd tcs34725_shell_cmd_struct = {
.sc_cmd_func = tcs34725_shell_cmd
};
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+static struct sensor_itf g_sensor_itf;
+#else
static struct sensor_itf g_sensor_itf = {
.si_type = MYNEWT_VAL(TCS34725_SHELL_ITF_TYPE),
.si_num = MYNEWT_VAL(TCS34725_SHELL_ITF_NUM),
.si_addr = MYNEWT_VAL(TCS34725_SHELL_ITF_ADDR)
};
+#endif
static int
tcs34725_shell_err_too_many_args(char *cmd_name)
@@ -491,11 +495,38 @@ tcs34725_shell_cmd(int argc, char **argv)
return tcs34725_shell_err_unknown_arg(argv[1]);
}
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+
+struct tcs34725 tcs34725_raw;
+
+static const struct bus_i2c_node_cfg tcs34725_raw_cfg = {
+ .node_cfg = {
+ .bus_name = MYNEWT_VAL(TCS34725_SHELL_ITF_BUS),
+ },
+ .addr = MYNEWT_VAL(TCS34725_SHELL_ITF_ADDR),
+ .freq = 400,
+};
+
+#endif
+
int
tcs34725_shell_init(void)
{
int rc;
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+ struct os_dev *dev = NULL;
+
+ g_sensor_itf.si_dev = (struct os_dev *)&tcs34725_raw;
+ rc = bus_i2c_node_create("tcs34725_raw", &tcs34725_raw.i2c_node,
+ &tcs34725_raw_cfg, &g_sensor_itf);
+ if (rc == 0) {
+ dev = os_dev_open("tcs34725_raw", 0, NULL);
+ }
+ if (rc != 0 || dev == NULL) {
+ console_printf("Failed to create tcs34725_raw device\n");
+ }
+#endif
rc = shell_cmd_register(&tcs34725_shell_cmd_struct);
SYSINIT_PANIC_ASSERT(rc == 0);
diff --git a/hw/drivers/sensors/tcs34725/syscfg.yml b/hw/drivers/sensors/tcs34725/syscfg.yml
index 0c3b797..e12a010 100644
--- a/hw/drivers/sensors/tcs34725/syscfg.yml
+++ b/hw/drivers/sensors/tcs34725/syscfg.yml
@@ -30,6 +30,9 @@ syscfg.defs:
TCS34725_SHELL_ITF_ADDR:
description: 'TCS34725 I2C address'
value : 0x29
+ TCS34725_SHELL_ITF_BUS:
+ description: 'Shell interface bus for the TCS34725 when bus driver is used'
+ value: '"i2c0"'
TCS34725_ITF_LOCK_TMO:
description: 'TCS34725 interface lock timeout in milliseconds'
value: 1000
diff --git a/hw/sensor/creator/src/sensor_creator.c b/hw/sensor/creator/src/sensor_creator.c
index 985f502..54dcc0f 100644
--- a/hw/sensor/creator/src/sensor_creator.c
+++ b/hw/sensor/creator/src/sensor_creator.c
@@ -383,7 +383,15 @@ static struct sensor_itf i2c_0_itf_tsl2591 = {
};
#endif
-#if MYNEWT_VAL(I2C_0) && MYNEWT_VAL(TCS34725_OFB)
+#if MYNEWT_VAL(TCS34725_OFB)
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+struct bus_i2c_node_cfg tcs34725_i2c_cfg = {
+ .node_cfg.bus_name = MYNEWT_VAL(TCS34725_OFB_I2C_BUS),
+ .addr = MYNEWT_VAL(TCS34725_OFB_I2C_ADDR),
+ .freq = 400,
+};
+static struct sensor_itf i2c_0_itf_tcs;
+#elif MYNEWT_VAL(I2C_0)
static struct sensor_itf i2c_0_itf_tcs = {
.si_type = SENSOR_ITF_I2C,
.si_num = 0,
@@ -391,6 +399,7 @@ static struct sensor_itf i2c_0_itf_tcs = {
.si_addr = 0x29
};
#endif
+#endif
#if MYNEWT_VAL(I2C_0) && MYNEWT_VAL(MS5837_OFB)
static struct sensor_itf i2c_0_itf_ms37 = {
@@ -1819,6 +1828,14 @@ sensor_dev_create(void)
#endif
#if MYNEWT_VAL(TCS34725_OFB)
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+ rc = tcs34725_create_i2c_sensor_dev(&tcs34725.i2c_node, "tcs34725_0",
+ &tcs34725_i2c_cfg, &i2c_0_itf_tcs);
+ assert(rc == 0);
+
+ rc = config_tcs34725_sensor();
+ assert(rc == 0);
+#else
rc = os_dev_create((struct os_dev *) &tcs34725, "tcs34725_0",
OS_DEV_INIT_PRIMARY, 0, tcs34725_init, (void *)&i2c_0_itf_tcs);
assert(rc == 0);
@@ -1826,6 +1843,7 @@ sensor_dev_create(void)
rc = config_tcs34725_sensor();
assert(rc == 0);
#endif
+#endif
#if MYNEWT_VAL(BME280_OFB)
#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
diff --git a/hw/sensor/creator/syscfg.yml b/hw/sensor/creator/syscfg.yml
index b5f2f67..1a37acd 100644
--- a/hw/sensor/creator/syscfg.yml
+++ b/hw/sensor/creator/syscfg.yml
@@ -126,6 +126,12 @@ syscfg.defs:
TCS34725_OFB:
description: 'TCS34725 is present'
value : 0
+ TCS34725_OFB_I2C_BUS:
+ description: 'I2C interface used for TCS34725'
+ value: '"i2c0"'
+ TCS34725_OFB_I2C_ADDR:
+ description: 'I2C address of TCS34725'
+ value: 0x29
BMA253_OFB:
description: 'BMA253 is present'
value : 0