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 <andrzej.kaczma...@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