vrahane closed pull request #991: Add SPI to lps33hw driver
URL: https://github.com/apache/mynewt-core/pull/991
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/hw/drivers/sensors/lps33hw/include/lps33hw/lps33hw.h 
b/hw/drivers/sensors/lps33hw/include/lps33hw/lps33hw.h
index ae2ecea88..6648e74bb 100644
--- a/hw/drivers/sensors/lps33hw/include/lps33hw/lps33hw.h
+++ b/hw/drivers/sensors/lps33hw/include/lps33hw/lps33hw.h
@@ -30,6 +30,8 @@ extern "C" {
 
 #define LPS33HW_I2C_ADDR (0x5C)
 
+#define LPS33HW_SPI_READ_CMD_BIT (0x80)
+
 #define LPS33HW_INT_LEVEL (0x80)
 #define LPS33HW_INT_OPEN (0x40)
 #define LPS33HW_INT_LATCH_EN (0x20)
diff --git a/hw/drivers/sensors/lps33hw/src/lps33hw.c 
b/hw/drivers/sensors/lps33hw/src/lps33hw.c
index 9955dfbef..c3b587274 100644
--- a/hw/drivers/sensors/lps33hw/src/lps33hw.c
+++ b/hw/drivers/sensors/lps33hw/src/lps33hw.c
@@ -24,6 +24,8 @@
 
 #include "os/mynewt.h"
 #include "hal/hal_i2c.h"
+#include "hal/hal_spi.h"
+#include "hal/hal_gpio.h"
 #include "sensor/sensor.h"
 #include "sensor/pressure.h"
 #include "sensor/temperature.h"
@@ -32,7 +34,12 @@
 #include "log/log.h"
 #include "stats/stats.h"
 
-#include "lps33hw_priv.h"
+static struct hal_spi_settings spi_lps33hw_settings = {
+    .data_order = HAL_SPI_MSB_FIRST,
+    .data_mode  = HAL_SPI_MODE3,
+    .baudrate   = 4000,
+    .word_size  = HAL_SPI_WORD_SIZE_8BIT,
+};
 
 /* Define the stats section and records */
 STATS_SECT_START(lps33hw_stat_section)
@@ -63,6 +70,7 @@ static int lps33hw_sensor_read(struct sensor *, sensor_type_t,
         sensor_data_func_t, void *, uint32_t);
 static int lps33hw_sensor_get_config(struct sensor *, sensor_type_t,
         struct sensor_cfg *);
+static int lps33hw_sensor_set_config(struct sensor *, void *);
 static int lps33hw_sensor_set_trigger_thresh(struct sensor *sensor,
         sensor_type_t sensor_type, struct sensor_type_traits *stt);
 static int lps33hw_sensor_handle_interrupt(struct sensor *sensor);
@@ -74,6 +82,7 @@ static int lps33hw_sensor_clear_high_thresh(struct sensor 
*sensor,
 static const struct sensor_driver g_lps33hw_sensor_driver = {
     .sd_read                      = lps33hw_sensor_read,
     .sd_get_config                = lps33hw_sensor_get_config,
+    .sd_set_config                = lps33hw_sensor_set_config,
     .sd_set_trigger_thresh        = lps33hw_sensor_set_trigger_thresh,
     .sd_handle_interrupt          = lps33hw_sensor_handle_interrupt,
     .sd_clear_low_trigger_thresh  = lps33hw_sensor_clear_low_thresh,
@@ -145,9 +154,9 @@ lps33hw_reg_to_degc(int16_t reg)
     return reg / LPS33HW_TEMP_OUT_DIV;
 }
 
-
 /**
- * Writes a single byte to the specified register
+ * Writes a single byte to the specified register using i2c
+ * interface
  *
  * @param The sensor interface
  * @param The register address to write to
@@ -156,7 +165,7 @@ lps33hw_reg_to_degc(int16_t reg)
  * @return 0 on success, non-zero error on failure.
  */
 static int
-lps33hw_set_reg(struct sensor_itf *itf, uint8_t reg, uint8_t value)
+lps33hw_i2c_set_reg(struct sensor_itf *itf, uint8_t reg, uint8_t value)
 {
     int rc;
     uint8_t payload[2] = { reg, value };
@@ -180,16 +189,145 @@ lps33hw_set_reg(struct sensor_itf *itf, uint8_t reg, 
uint8_t value)
 }
 
 /**
- * Read bytes from the specified register
+ * Writes a single byte to the specified register using SPI
+ * interface
+ *
+ * @param The sensor interface
+ * @param The register address to write to
+ * @param The value to write
+ *
+ * @return 0 on success, non-zero error on failure.
+ */
+static int
+lps33hw_spi_set_reg(struct sensor_itf *itf, uint8_t reg, uint8_t value)
+{
+    int rc;
+
+    /* Select the device */
+    hal_gpio_write(itf->si_cs_pin, 0);
+
+    /* Send the register address w/write command */
+    rc = hal_spi_tx_val(itf->si_num, reg & ~LPS33HW_SPI_READ_CMD_BIT);
+    if (rc == 0xFFFF) {
+        rc = SYS_EINVAL;
+        LPS33HW_ERR("SPI_%u register write failed addr:0x%02X\n",
+                   itf->si_num, reg);
+        STATS_INC(g_lps33hwstats, write_errors);
+        goto err;
+    }
+
+    /* Write data */
+    rc = hal_spi_tx_val(itf->si_num, value);
+    if (rc == 0xFFFF) {
+        rc = SYS_EINVAL;
+        LPS33HW_ERR("SPI_%u write failed addr:0x%02X:0x%02X\n",
+                   itf->si_num, reg);
+        STATS_INC(g_lps33hwstats, write_errors);
+        goto err;
+    }
+
+    rc = 0;
+
+err:
+    /* De-select the device */
+    hal_gpio_write(itf->si_cs_pin, 1);
+
+    os_time_delay((OS_TICKS_PER_SEC * 30)/1000 + 1);
+
+    return rc;
+}
+
+/**
+ * Writes a single byte to the specified register using specified
+ * interface
+ *
+ * @param The sensor interface
+ * @param The register address to write to
+ * @param The value to write
+ *
+ * @return 0 on success, non-zero error on failure.
+ */
+static int
+lps33hw_set_reg(struct sensor_itf *itf, uint8_t reg, uint8_t value)
+{
+    int rc;
+
+    if (itf->si_type == SENSOR_ITF_I2C) {
+           rc = lps33hw_i2c_set_reg(itf, reg, value);
+       } else {
+           rc = lps33hw_spi_set_reg(itf, reg, value);
+       }
+
+    return rc;
+}
+
+/**
+ *
+ * Read bytes from the specified register using SPI interface
  *
  * @param The sensor interface
  * @param The register address to read from
+ * @param The number of bytes to read
  * @param Pointer to where the register value should be written
  *
  * @return 0 on success, non-zero error on failure.
  */
 static int
-lps33hw_get_regs(struct sensor_itf *itf, uint8_t reg, uint8_t size,
+lps33hw_spi_get_regs(struct sensor_itf *itf, uint8_t reg, uint8_t size,
+    uint8_t *buffer)
+{
+    int i;
+    uint16_t retval;
+    int rc;
+    rc = 0;
+
+    /* Select the device */
+    hal_gpio_write(itf->si_cs_pin, 0);
+
+    /* Send the address */
+    retval = hal_spi_tx_val(itf->si_num, reg | LPS33HW_SPI_READ_CMD_BIT);
+    if (retval == 0xFFFF) {
+        rc = SYS_EINVAL;
+        LPS33HW_ERR("SPI_%u register write failed addr:0x%02X\n",
+                   itf->si_num, reg);
+        STATS_INC(g_lps33hwstats, read_errors);
+        goto err;
+    }
+
+    for (i = 0; i < size; i++) {
+        /* Read data */
+        retval = hal_spi_tx_val(itf->si_num, 0);
+        if (retval == 0xFFFF) {
+            rc = SYS_EINVAL;
+            LPS33HW_ERR("SPI_%u read failed addr:0x%02X\n",
+                       itf->si_num, reg);
+            STATS_INC(g_lps33hwstats, read_errors);
+            goto err;
+        }
+        buffer[i] = retval;
+    }
+
+    rc = 0;
+
+err:
+    /* De-select the device */
+    hal_gpio_write(itf->si_cs_pin, 1);
+
+    return rc;
+}
+
+/**
+ * Read bytes from the specified register using i2c interface
+ *
+ * @param The sensor interface
+ * @param The register address to read from
+ * @param The number of bytes to read
+ * @param Pointer to where the register value should be written
+ *
+ * @return 0 on success, non-zero error on failure.
+ */
+static int
+lps33hw_i2c_get_regs(struct sensor_itf *itf, uint8_t reg, uint8_t size,
     uint8_t *buffer)
 {
     int rc;
@@ -222,6 +360,31 @@ lps33hw_get_regs(struct sensor_itf *itf, uint8_t reg, 
uint8_t size,
     return rc;
 }
 
+/**
+ * Read bytes from the specified register using specified interface
+ *
+ * @param The sensor interface
+ * @param The register address to read from
+ * @param The number of bytes to read
+ * @param Pointer to where the register value should be written
+ *
+ * @return 0 on success, non-zero error on failure.
+ */
+static int
+lps33hw_get_regs(struct sensor_itf *itf, uint8_t reg, uint8_t size,
+    uint8_t *buffer)
+{
+    int rc;
+
+    if (itf->si_type == SENSOR_ITF_I2C) {
+        rc = lps33hw_i2c_get_regs(itf, reg, size, buffer);
+    } else {
+        rc = lps33hw_spi_get_regs(itf, reg, size, buffer);
+    }
+
+    return rc;
+}
+
 static int
 lps33hw_apply_value(struct lps33hw_register_value addr, uint8_t value,
     uint8_t *reg)
@@ -723,7 +886,32 @@ lps33hw_init(struct os_dev *dev, void *arg)
         return rc;
     }
 
-    return sensor_mgr_register(sensor);
+    rc = sensor_mgr_register(sensor);
+    if (rc) {
+        return rc;
+    }
+
+    if (sensor->s_itf.si_type == SENSOR_ITF_SPI) {
+        rc = hal_spi_config(sensor->s_itf.si_num, &spi_lps33hw_settings);
+        if (rc == EINVAL) {
+            /* If spi is already enabled, for nrf52, it returns -1, We should 
not
+             * fail if the spi is already enabled
+             */
+            return rc;
+        }
+
+        rc = hal_spi_enable(sensor->s_itf.si_num);
+        if (rc) {
+            return rc;
+        }
+
+        rc = hal_gpio_init_out(sensor->s_itf.si_cs_pin, 1);
+        if (rc) {
+            return rc;
+        }
+    }
+
+    return rc;
 }
 
 int
@@ -857,6 +1045,14 @@ lps33hw_sensor_read(struct sensor *sensor, sensor_type_t 
type,
     return rc;
 }
 
+static int
+lps33hw_sensor_set_config(struct sensor *sensor, void *cfg)
+{
+    struct lps33hw* lps33hw = (struct lps33hw *)SENSOR_GET_DEVICE(sensor);
+
+    return lps33hw_config(lps33hw, (struct lps33hw_cfg*)cfg);
+}
+
 static int
 lps33hw_sensor_get_config(struct sensor *sensor, sensor_type_t type,
         struct sensor_cfg *cfg)


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


With regards,
Apache Git Services

Reply via email to