You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by an...@apache.org on 2018/12/03 12:42:20 UTC

[mynewt-core] 09/15: hw/drivers: Add bus driver support to BMA253

This is an automated email from the ASF dual-hosted git repository.

andk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-core.git

commit 60ba2f359c18f50390f5869a1adc44799b4669db
Author: Andrzej Kaczmarek <an...@codecoup.pl>
AuthorDate: Fri Nov 23 17:26:32 2018 +0100

    hw/drivers: Add bus driver support to BMA253
---
 hw/drivers/sensors/bma253/include/bma253/bma253.h | 20 +++++++
 hw/drivers/sensors/bma253/src/bma253.c            | 73 +++++++++++++++++++----
 2 files changed, 83 insertions(+), 10 deletions(-)

diff --git a/hw/drivers/sensors/bma253/include/bma253/bma253.h b/hw/drivers/sensors/bma253/include/bma253/bma253.h
index 6d72451..e8876dc 100644
--- a/hw/drivers/sensors/bma253/include/bma253/bma253.h
+++ b/hw/drivers/sensors/bma253/include/bma253/bma253.h
@@ -201,8 +201,12 @@ struct bma253_private_driver_data {
 
 /* The device itself */
 struct bma253 {
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+    struct bus_i2c_node node;
+#else
     /* Underlying OS device */
     struct os_dev dev;
+#endif
     /* The sensor infrastructure */
     struct sensor sensor;
     /* Default configuration values */
@@ -463,6 +467,22 @@ int
 bma253_shell_init(void);
 #endif
 
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+/**
+ * Create I2C bus node for BMA253 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
+bma253_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/bma253/src/bma253.c b/hw/drivers/sensors/bma253/src/bma253.c
index 7acd2fa..5fd7821 100644
--- a/hw/drivers/sensors/bma253/src/bma253.c
+++ b/hw/drivers/sensors/bma253/src/bma253.c
@@ -25,8 +25,12 @@
 #include "bma253/bma253.h"
 #include "bma253_priv.h"
 #include "hal/hal_gpio.h"
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+#include "bus/bus.h"
+#else
 #include "hal/hal_i2c.h"
 #include "i2cn/i2cn.h"
+#endif
 
 #if MYNEWT_VAL(BMA253_LOG)
 #include "modlog/modlog.h"
@@ -148,11 +152,13 @@ get_register(struct bma253 * bma253,
              uint8_t addr,
              uint8_t * data)
 {
-    struct sensor_itf *itf;
-    struct hal_i2c_master_data oper;
+    struct sensor_itf *itf = SENSOR_GET_ITF(&bma253->sensor);
     int rc;
 
-    itf = SENSOR_GET_ITF(&bma253->sensor);
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+    rc = bus_node_simple_write_read_transact(itf->si_dev, &addr, 1, data, 1);
+#else
+    struct hal_i2c_master_data oper;
 
     rc = sensor_itf_lock(itf, MYNEWT_VAL(BMA253_ITF_LOCK_TMO));
     if (rc) {
@@ -183,6 +189,7 @@ get_register(struct bma253 * bma253,
 
 err:
     sensor_itf_unlock(itf);
+#endif
 
     return rc;
 }
@@ -193,11 +200,13 @@ get_registers(struct bma253 * bma253,
               uint8_t * data,
               uint8_t size)
 {
-    struct sensor_itf *itf;
-    struct hal_i2c_master_data oper;
+    struct sensor_itf *itf = SENSOR_GET_ITF(&bma253->sensor);
     int rc;
 
-    itf = SENSOR_GET_ITF(&bma253->sensor);
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+    rc = bus_node_simple_write_read_transact(itf->si_dev, &addr, 1, data, size);
+#else
+    struct hal_i2c_master_data oper;
 
     oper.address = itf->si_addr;
     oper.len     = 1;
@@ -228,6 +237,7 @@ get_registers(struct bma253 * bma253,
 
 err:
     sensor_itf_unlock(itf);
+#endif
 
     return rc;
 }
@@ -237,12 +247,27 @@ set_register(struct bma253 * bma253,
              uint8_t addr,
              uint8_t data)
 {
-    struct sensor_itf * itf;
-    uint8_t tuple[2];
-    struct hal_i2c_master_data oper;
+    struct sensor_itf *itf = SENSOR_GET_ITF(&bma253->sensor);
     int rc;
 
-    itf = SENSOR_GET_ITF(&bma253->sensor);
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+    rc = bus_node_lock(itf->si_dev, BUS_NODE_LOCK_DEFAULT_TIMEOUT);
+    if (rc) {
+        return SYS_EINVAL;
+    }
+
+    rc = bus_node_write(itf->si_dev, &addr, 1, OS_TIMEOUT_NEVER, BUS_F_NOSTOP);
+    if (rc) {
+        goto done;
+    }
+
+    rc = bus_node_simple_write(itf->si_dev, &data, 1);
+
+done:
+    (void)bus_node_unlock(itf->si_dev);
+#else
+    uint8_t tuple[2];
+    struct hal_i2c_master_data oper;
 
     rc = sensor_itf_lock(itf, MYNEWT_VAL(BMA253_ITF_LOCK_TMO));
     if (rc) {
@@ -273,6 +298,7 @@ set_register(struct bma253 * bma253,
     }
 
     sensor_itf_unlock(itf);
+#endif
 
     return rc;
 }
@@ -4763,3 +4789,30 @@ bma253_init(struct os_dev * dev, void * arg)
 
     return rc;
 }
+
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+static void
+init_node_cb(struct bus_node *bnode, void *arg)
+{
+    struct sensor_itf *itf = arg;
+
+    bma253_init((struct os_dev *)bnode, itf);
+}
+
+int
+bma253_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;
+
+    bus_node_set_callbacks((struct os_dev *)node, &cbs);
+
+    rc = bus_i2c_node_create(name, node, i2c_cfg, sensor_itf);
+
+    return rc;
+}
+#endif