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