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/06/08 06:15:00 UTC

[mynewt-core] 05/10: sensors/mpu6050: Add I2C 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

commit c71cc0d174f0c73c1efcc3fb7ba3d5b162b1b238
Author: Jerzy Kasenberg <je...@codecoup.pl>
AuthorDate: Fri May 31 08:14:19 2019 +0200

    sensors/mpu6050: Add I2C bus driver support
---
 .../sensors/mpu6050/include/mpu6050/mpu6050.h      | 21 +++++++++++
 hw/drivers/sensors/mpu6050/src/mpu6050.c           | 42 +++++++++++++++++++++-
 2 files changed, 62 insertions(+), 1 deletion(-)

diff --git a/hw/drivers/sensors/mpu6050/include/mpu6050/mpu6050.h b/hw/drivers/sensors/mpu6050/include/mpu6050/mpu6050.h
index 69ac7c2..01ec82f 100644
--- a/hw/drivers/sensors/mpu6050/include/mpu6050/mpu6050.h
+++ b/hw/drivers/sensors/mpu6050/include/mpu6050/mpu6050.h
@@ -70,7 +70,11 @@ struct mpu6050_cfg {
 };
 
 struct mpu6050 {
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+    struct bus_i2c_node i2c_node;
+#else
     struct os_dev dev;
+#endif
     struct sensor sensor;
     struct mpu6050_cfg cfg;
     os_time_t last_read_time;
@@ -100,6 +104,23 @@ int mpu6050_config_interrupt(struct sensor_itf *itf, uint8_t cfg);
 int mpu6050_init(struct os_dev *, void *);
 int mpu6050_config(struct mpu6050 *, struct mpu6050_cfg *);
 
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+/**
+ * Create I2C bus node for MPU6050 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
+mpu6050_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
 }
 #endif
diff --git a/hw/drivers/sensors/mpu6050/src/mpu6050.c b/hw/drivers/sensors/mpu6050/src/mpu6050.c
index a8e4056..6a2c83f 100644
--- a/hw/drivers/sensors/mpu6050/src/mpu6050.c
+++ b/hw/drivers/sensors/mpu6050/src/mpu6050.c
@@ -75,8 +75,11 @@ int
 mpu6050_write8(struct sensor_itf *itf, uint8_t reg, uint32_t value)
 {
     int rc;
-    uint8_t payload[2] = { reg, value & 0xFF };
+    uint8_t payload[2] = { reg, (uint8_t)value };
 
+#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,
@@ -99,6 +102,7 @@ mpu6050_write8(struct sensor_itf *itf, uint8_t reg, uint32_t value)
     }
 
     sensor_itf_unlock(itf);
+#endif
 
     return rc;
 }
@@ -117,6 +121,9 @@ mpu6050_read8(struct sensor_itf *itf, uint8_t reg, uint8_t *value)
 {
     int rc;
 
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+    rc = bus_node_simple_write_read_transact(itf->si_dev, &reg, 1, value, 1);
+#else
     struct hal_i2c_master_data data_struct = {
         .address = itf->si_addr,
         .len = 1,
@@ -150,6 +157,7 @@ mpu6050_read8(struct sensor_itf *itf, uint8_t reg, uint8_t *value)
     }
 
     sensor_itf_unlock(itf);
+#endif
 
     return rc;
 }
@@ -168,6 +176,9 @@ mpu6050_read48(struct sensor_itf *itf, uint8_t reg, uint8_t *buffer)
 {
     int rc;
 
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+    rc = bus_node_simple_write_read_transact(itf->si_dev, &reg, 1, buffer, 6);
+#else
     struct hal_i2c_master_data data_struct = {
         .address = itf->si_addr,
         .len = 1,
@@ -202,6 +213,7 @@ mpu6050_read48(struct sensor_itf *itf, uint8_t reg, uint8_t *buffer)
     }
 
     sensor_itf_unlock(itf);
+#endif
 
     return rc;
 }
@@ -646,3 +658,31 @@ mpu6050_sensor_get_config(struct sensor *sensor, sensor_type_t type,
 
     return 0;
 }
+
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+static void
+init_node_cb(struct bus_node *bnode, void *arg)
+{
+    struct sensor_itf *itf = arg;
+
+    mpu6050_init((struct os_dev *)bnode, itf);
+}
+
+int
+mpu6050_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