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, &reg, 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, &reg, 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