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:13 UTC
[mynewt-core] 02/15: hw/drivers: Add bus driver support to LIS2DH12
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 41e8ac9d213bffaba532c68fc7f17bd27817b82a
Author: Andrzej Kaczmarek <an...@codecoup.pl>
AuthorDate: Fri Nov 23 17:25:20 2018 +0100
hw/drivers: Add bus driver support to LIS2DH12
---
.../sensors/lis2dh12/include/lis2dh12/lis2dh12.h | 44 ++++++++
hw/drivers/sensors/lis2dh12/src/lis2dh12.c | 118 +++++++++++++++------
2 files changed, 130 insertions(+), 32 deletions(-)
diff --git a/hw/drivers/sensors/lis2dh12/include/lis2dh12/lis2dh12.h b/hw/drivers/sensors/lis2dh12/include/lis2dh12/lis2dh12.h
index ab4b807..b7b86ca 100644
--- a/hw/drivers/sensors/lis2dh12/include/lis2dh12/lis2dh12.h
+++ b/hw/drivers/sensors/lis2dh12/include/lis2dh12/lis2dh12.h
@@ -22,6 +22,11 @@
#include "os/mynewt.h"
#include "sensor/sensor.h"
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+#include "bus/bus_driver.h"
+#include "bus/i2c.h"
+#include "bus/spi.h"
+#endif
#ifdef __cplusplus
extern "C" {
@@ -256,7 +261,14 @@ struct lis2dh12_pdd {
};
struct lis2dh12 {
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+ union {
+ struct bus_i2c_node i2c_node;
+ struct bus_spi_node spi_node;
+ };
+#else
struct os_dev dev;
+#endif
struct sensor sensor;
struct lis2dh12_cfg cfg;
struct lis2dh12_int intr;
@@ -629,6 +641,38 @@ lis2dh12_get_fifo_samples(struct sensor_itf *itf, uint8_t *samples);
int lis2dh12_shell_init(void);
#endif
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+/**
+ * Create I2C bus node for LIS2DH12 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
+lis2dh12_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);
+
+/**
+ * Create SPI bus node for LIS2DH12 sensor
+ *
+ * @param node Bus node
+ * @param name Device name
+ * @param spi_cfg SPI node configuration
+ * @param sensor_itf Sensors interface
+ *
+ * @return 0 on success, non-zero on failure
+ */
+int
+lis2dh12_create_spi_sensor_dev(struct bus_spi_node *node, const char *name,
+ const struct bus_spi_node_cfg *spi_cfg,
+ struct sensor_itf *sensor_itf);
+#endif
+
#ifdef __cplusplus
}
#endif
diff --git a/hw/drivers/sensors/lis2dh12/src/lis2dh12.c b/hw/drivers/sensors/lis2dh12/src/lis2dh12.c
index fcc272a..41bdce6 100644
--- a/hw/drivers/sensors/lis2dh12/src/lis2dh12.c
+++ b/hw/drivers/sensors/lis2dh12/src/lis2dh12.c
@@ -23,9 +23,13 @@
#include <string.h>
#include "os/mynewt.h"
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+#include "bus/bus.h"
+#else
#include "hal/hal_spi.h"
#include "hal/hal_i2c.h"
#include "i2cn/i2cn.h"
+#endif
#include "sensor/sensor.h"
#include "sensor/accel.h"
#include "lis2dh12/lis2dh12.h"
@@ -129,12 +133,14 @@ static const struct lis2dh12_notif_cfg dflt_notif_cfg[] = {
}
};
+#if !MYNEWT_VAL(BUS_DRIVER_PRESENT)
static struct hal_spi_settings spi_lis2dh12_settings = {
.data_order = HAL_SPI_MSB_FIRST,
.data_mode = HAL_SPI_MODE3,
.baudrate = 4000,
.word_size = HAL_SPI_WORD_SIZE_8BIT,
};
+#endif
/* Define the stats section and records */
STATS_SECT_START(lis2dh12_stat_section)
@@ -212,6 +218,7 @@ static const struct sensor_driver g_lis2dh12_sensor_driver = {
.sd_handle_interrupt = lis2dh12_sensor_handle_interrupt
};
+#if !MYNEWT_VAL(BUS_DRIVER_PRESENT)
/**
* Read multiple length data from LIS2DH12 sensor over I2C
*
@@ -449,6 +456,7 @@ err:
return rc;
}
+#endif
/**
* Write multiple length data to LIS2DH12 sensor over different interfaces
@@ -466,6 +474,25 @@ lis2dh12_writelen(struct sensor_itf *itf, uint8_t addr, uint8_t *payload,
{
int rc;
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+ struct {
+ uint8_t addr;
+ /*
+ * XXX lis2dh12_i2c_writelen has max payload of 20 including addr, not
+ * sure where it comes from
+ */
+ uint8_t payload[19];
+ } write_data;
+
+ if (len > sizeof(write_data.payload)) {
+ return -1;
+ }
+
+ write_data.addr = addr;
+ memcpy(write_data.payload, payload, len);
+
+ rc = bus_node_simple_write(itf->si_dev, &write_data, len + 1);
+#else
rc = sensor_itf_lock(itf, MYNEWT_VAL(LIS2DH12_ITF_LOCK_TMO));
if (rc) {
return rc;
@@ -478,6 +505,7 @@ lis2dh12_writelen(struct sensor_itf *itf, uint8_t addr, uint8_t *payload,
}
sensor_itf_unlock(itf);
+#endif
return rc;
}
@@ -497,6 +525,9 @@ lis2dh12_readlen(struct sensor_itf *itf, uint8_t addr, uint8_t *payload,
{
int rc;
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+ rc = bus_node_simple_write_read_transact(itf->si_dev, &addr, 1, payload, len);
+#else
rc = sensor_itf_lock(itf, MYNEWT_VAL(LIS2DH12_ITF_LOCK_TMO));
if (rc) {
return rc;
@@ -509,6 +540,7 @@ lis2dh12_readlen(struct sensor_itf *itf, uint8_t addr, uint8_t *payload,
}
sensor_itf_unlock(itf);
+#endif
return rc;
}
@@ -525,22 +557,7 @@ lis2dh12_readlen(struct sensor_itf *itf, uint8_t addr, uint8_t *payload,
int
lis2dh12_write8(struct sensor_itf *itf, uint8_t reg, uint8_t value)
{
- int rc;
-
- rc = sensor_itf_lock(itf, MYNEWT_VAL(LIS2DH12_ITF_LOCK_TMO));
- if (rc) {
- return rc;
- }
-
- if (itf->si_type == SENSOR_ITF_I2C) {
- rc = lis2dh12_i2c_writelen(itf, reg, &value, 1);
- } else {
- rc = lis2dh12_spi_writelen(itf, reg, &value, 1);
- }
-
- sensor_itf_unlock(itf);
-
- return rc;
+ return lis2dh12_writelen(itf, reg, &value, 1);
}
/**
@@ -555,22 +572,7 @@ lis2dh12_write8(struct sensor_itf *itf, uint8_t reg, uint8_t value)
int
lis2dh12_read8(struct sensor_itf *itf, uint8_t addr, uint8_t *reg)
{
- int rc;
-
- rc = sensor_itf_lock(itf, MYNEWT_VAL(LIS2DH12_ITF_LOCK_TMO));
- if (rc) {
- return rc;
- }
-
- if (itf->si_type == SENSOR_ITF_I2C) {
- rc = lis2dh12_i2c_readlen(itf, addr, reg, 1);
- } else {
- rc = lis2dh12_spi_readlen(itf, addr, reg, 1);
- }
-
- sensor_itf_unlock(itf);
-
- return rc;
+ return lis2dh12_readlen(itf, addr, reg, 1);
}
/**
@@ -1286,6 +1288,7 @@ lis2dh12_init(struct os_dev *dev, void *arg)
goto err;
}
+#if !MYNEWT_VAL(BUS_DRIVER_PRESENT)
if (sensor->s_itf.si_type == SENSOR_ITF_SPI) {
rc = hal_spi_disable(sensor->s_itf.si_num);
@@ -1311,6 +1314,7 @@ lis2dh12_init(struct os_dev *dev, void *arg)
goto err;
}
}
+#endif
init_interrupt(&lis2dh12->intr, lis2dh12->sensor.s_itf.si_ints);
@@ -1749,7 +1753,9 @@ lis2dh12_sensor_read(struct sensor *sensor, sensor_type_t type,
}
itf = SENSOR_GET_ITF(sensor);
+ (void)itf;
+#if !MYNEWT_VAL(BUS_DRIVER_PRESENT)
if (itf->si_type == SENSOR_ITF_SPI) {
rc = hal_spi_disable(sensor->s_itf.si_num);
@@ -1770,6 +1776,7 @@ lis2dh12_sensor_read(struct sensor *sensor, sensor_type_t type,
goto err;
}
}
+#endif
lis2dh12 = (struct lis2dh12 *)SENSOR_GET_DEVICE(sensor);
cfg = &lis2dh12->cfg;
@@ -2796,7 +2803,9 @@ lis2dh12_config(struct lis2dh12 *lis2dh12, struct lis2dh12_cfg *cfg)
itf = SENSOR_GET_ITF(&(lis2dh12->sensor));
sensor = &(lis2dh12->sensor);
+ (void)sensor;
+#if !MYNEWT_VAL(BUS_DRIVER_PRESENT)
if (itf->si_type == SENSOR_ITF_SPI) {
rc = hal_spi_disable(sensor->s_itf.si_num);
@@ -2817,6 +2826,7 @@ lis2dh12_config(struct lis2dh12 *lis2dh12, struct lis2dh12_cfg *cfg)
goto err;
}
}
+#endif
rc = lis2dh12_get_chip_id(itf, &chip_id);
if (rc) {
@@ -2994,3 +3004,47 @@ 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;
+
+ lis2dh12_init((struct os_dev *)bnode, itf);
+}
+
+int
+lis2dh12_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;
+}
+
+int
+lis2dh12_create_spi_sensor_dev(struct bus_spi_node *node, const char *name,
+ const struct bus_spi_node_cfg *spi_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_spi_node_create(name, node, spi_cfg, sensor_itf);
+
+ return rc;
+}
+#endif