You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by vi...@apache.org on 2018/04/05 00:27:41 UTC
[mynewt-core] branch master updated: Add SPI to lps33hw driver
(#991)
This is an automated email from the ASF dual-hosted git repository.
vipulrahane pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-core.git
The following commit(s) were added to refs/heads/master by this push:
new b91942a Add SPI to lps33hw driver (#991)
b91942a is described below
commit b91942a8b5d269c5da403a40cddd9cb3b3a59e5d
Author: Jamirsen <20...@users.noreply.github.com>
AuthorDate: Wed Apr 4 17:27:39 2018 -0700
Add SPI to lps33hw driver (#991)
- adding set_config function for lps33hw sensor driver
- adding and setting SPI configuration
- adding documentation
---
.../sensors/lps33hw/include/lps33hw/lps33hw.h | 2 +
hw/drivers/sensors/lps33hw/src/lps33hw.c | 210 ++++++++++++++++++++-
2 files changed, 205 insertions(+), 7 deletions(-)
diff --git a/hw/drivers/sensors/lps33hw/include/lps33hw/lps33hw.h b/hw/drivers/sensors/lps33hw/include/lps33hw/lps33hw.h
index ae2ecea..6648e74 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 9955dfb..c3b5872 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
@@ -858,6 +1046,14 @@ lps33hw_sensor_read(struct sensor *sensor, sensor_type_t type,
}
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)
{
--
To stop receiving notification emails like this one, please contact
vipulrahane@apache.org.