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/05 14:34:37 UTC
[mynewt-core] 06/08: hw/drivers/lis2dh12: Add proper I2C/SPI
interface handling
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 4a246d17bba2d5e89ebf9f7dc2749c71ff3ac70d
Author: Andrzej Kaczmarek <an...@codecoup.pl>
AuthorDate: Tue Dec 4 17:48:55 2018 +0100
hw/drivers/lis2dh12: Add proper I2C/SPI interface handling
---
.../sensors/lis2dh12/include/lis2dh12/lis2dh12.h | 3 +++
hw/drivers/sensors/lis2dh12/src/lis2dh12.c | 26 ++++++++++++++++++++--
hw/drivers/sensors/lis2dh12/src/lis2dh12_priv.h | 4 ++--
3 files changed, 29 insertions(+), 4 deletions(-)
diff --git a/hw/drivers/sensors/lis2dh12/include/lis2dh12/lis2dh12.h b/hw/drivers/sensors/lis2dh12/include/lis2dh12/lis2dh12.h
index b7b86ca..fe89b57 100644
--- a/hw/drivers/sensors/lis2dh12/include/lis2dh12/lis2dh12.h
+++ b/hw/drivers/sensors/lis2dh12/include/lis2dh12/lis2dh12.h
@@ -274,6 +274,9 @@ struct lis2dh12 {
struct lis2dh12_int intr;
os_time_t last_read_time;
struct lis2dh12_pdd pdd;
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+ bool node_is_spi;
+#endif
};
/**
diff --git a/hw/drivers/sensors/lis2dh12/src/lis2dh12.c b/hw/drivers/sensors/lis2dh12/src/lis2dh12.c
index 41bdce6..20042f8 100644
--- a/hw/drivers/sensors/lis2dh12/src/lis2dh12.c
+++ b/hw/drivers/sensors/lis2dh12/src/lis2dh12.c
@@ -236,7 +236,7 @@ lis2dh12_i2c_readlen(struct sensor_itf *itf, uint8_t addr, uint8_t *buffer,
int rc;
if (len > 1)
{
- addr |= 0x80;
+ addr |= LIS2DH12_I2C_ADDR_INC;
}
uint8_t payload[20] = { addr, 0, 0, 0, 0, 0, 0, 0,
@@ -310,7 +310,7 @@ lis2dh12_spi_readlen(struct sensor_itf *itf, uint8_t addr, uint8_t *payload,
* requested is more than 1
*/
if (len > 1) {
- addr |= LIS2DH12_SPI_ADR_INC;
+ addr |= LIS2DH12_SPI_ADDR_INC;
}
/* Select the device */
@@ -483,6 +483,13 @@ lis2dh12_writelen(struct sensor_itf *itf, uint8_t addr, uint8_t *payload,
*/
uint8_t payload[19];
} write_data;
+ struct lis2dh12 *dev = (struct lis2dh12 *)itf->si_dev;
+
+ if (dev->node_is_spi) {
+ addr |= LIS2DH12_SPI_ADDR_INC;
+ } else {
+ addr |= LIS2DH12_I2C_ADDR_INC;
+ }
if (len > sizeof(write_data.payload)) {
return -1;
@@ -526,6 +533,15 @@ lis2dh12_readlen(struct sensor_itf *itf, uint8_t addr, uint8_t *payload,
int rc;
#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+ struct lis2dh12 *dev = (struct lis2dh12 *)itf->si_dev;
+
+ if (dev->node_is_spi) {
+ addr |= LIS2DH12_SPI_READ_CMD_BIT;
+ addr |= LIS2DH12_SPI_ADDR_INC;
+ } else {
+ addr |= LIS2DH12_I2C_ADDR_INC;
+ }
+
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));
@@ -3019,11 +3035,14 @@ 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 lis2dh12 *dev = (struct lis2dh12 *)node;
struct bus_node_callbacks cbs = {
.init = init_node_cb,
};
int rc;
+ dev->node_is_spi = false;
+
bus_node_set_callbacks((struct os_dev *)node, &cbs);
rc = bus_i2c_node_create(name, node, i2c_cfg, sensor_itf);
@@ -3036,11 +3055,14 @@ 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 lis2dh12 *dev = (struct lis2dh12 *)node;
struct bus_node_callbacks cbs = {
.init = init_node_cb,
};
int rc;
+ dev->node_is_spi = true;
+
bus_node_set_callbacks((struct os_dev *)node, &cbs);
rc = bus_spi_node_create(name, node, spi_cfg, sensor_itf);
diff --git a/hw/drivers/sensors/lis2dh12/src/lis2dh12_priv.h b/hw/drivers/sensors/lis2dh12/src/lis2dh12_priv.h
index 6848b15..035a2ce 100644
--- a/hw/drivers/sensors/lis2dh12/src/lis2dh12_priv.h
+++ b/hw/drivers/sensors/lis2dh12/src/lis2dh12_priv.h
@@ -171,8 +171,8 @@ extern "C" {
#define LIS2DH12_REG_ACT_DUR 0x3F
#define LIS2DH12_SPI_READ_CMD_BIT 0x80
-
-#define LIS2DH12_SPI_ADR_INC 0x40
+#define LIS2DH12_SPI_ADDR_INC 0x40
+#define LIS2DH12_I2C_ADDR_INC 0x80
int lis2dh12_writelen(struct sensor_itf *itf, uint8_t addr, uint8_t *payload, uint8_t len);
int lis2dh12_readlen(struct sensor_itf *itf, uint8_t addr, uint8_t *payload, uint8_t len);