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, ®, 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, ®, 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