summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xnuttx/ChangeLog6
-rw-r--r--nuttx/configs/viewtool-stm32f107/README.txt7
-rw-r--r--nuttx/drivers/sensors/Kconfig7
-rw-r--r--nuttx/drivers/sensors/Make.defs6
-rw-r--r--nuttx/drivers/sensors/README.txt6
-rw-r--r--nuttx/drivers/sensors/mpl115a.c53
-rw-r--r--nuttx/include/nuttx/sensors/mpl115a.h14
-rw-r--r--nuttx/include/nuttx/spi/spi.h3
8 files changed, 75 insertions, 27 deletions
diff --git a/nuttx/ChangeLog b/nuttx/ChangeLog
index 9e5ad32f4..32b51ca1c 100755
--- a/nuttx/ChangeLog
+++ b/nuttx/ChangeLog
@@ -9765,3 +9765,9 @@
* settimeofday(): gettimeofday has been decrecated in POSIX 2008.
settimeofday() was never part of POSIX, but I decided to add it to
libc as well just for symmetry (2015-02-12).
+ * drivers/sensors/mpl115a.c and include/nuttx/sensors/mpl115a.h: Add
+ driver for the Feescale MPL115A baramoter. From Alan Carvalho de
+ Assis (2015-02-12).
+ * configs/viewtool-stm32f107: Add support for an optional, add-on
+ Freescale MPL115A baramoter. From Alan Carvalho de Assis
+ (2015-02-12).
diff --git a/nuttx/configs/viewtool-stm32f107/README.txt b/nuttx/configs/viewtool-stm32f107/README.txt
index 3aefe7ba4..c1b1b9bca 100644
--- a/nuttx/configs/viewtool-stm32f107/README.txt
+++ b/nuttx/configs/viewtool-stm32f107/README.txt
@@ -421,6 +421,13 @@ Freescale MPL115A barometer sensor
CONFIG_MPL115A=y
CONFIG_NSH_ARCHINIT=y
+
+ Note: this driver uses SPI3 then since PB3 pin is also use to JTAG TDO you
+ need to disable JTAG support to get this driver working:
+
+ System Type
+ CONFIG_STM32_JTAG_DISABLE=y
+
LCD/Touchscreen Interface
=========================
diff --git a/nuttx/drivers/sensors/Kconfig b/nuttx/drivers/sensors/Kconfig
index cedb9ac5c..f27d52baf 100644
--- a/nuttx/drivers/sensors/Kconfig
+++ b/nuttx/drivers/sensors/Kconfig
@@ -8,6 +8,13 @@ config LIS331DL
default n
select I2C
+config MPL115A
+ bool "Freescale MPL115A Barometer Sensor support"
+ default n
+ select SPI
+ ---help---
+ Enable driver support for the Freescale MPL115A barometer sensor.
+
config SENSORS_ADXL345
bool "AnalogDevices ADXL345 Driver"
default n
diff --git a/nuttx/drivers/sensors/Make.defs b/nuttx/drivers/sensors/Make.defs
index 8a358f070..4fc8e84cf 100644
--- a/nuttx/drivers/sensors/Make.defs
+++ b/nuttx/drivers/sensors/Make.defs
@@ -1,7 +1,7 @@
############################################################################
# drivers/sensors/Make.defs
#
-# Copyright (C) 2011-2012 Gregory Nutt. All rights reserved.
+# Copyright (C) 2011-2012, 2015 Gregory Nutt. All rights reserved.
# Author: Gregory Nutt <gnutt@nuttx.org>
#
# Redistribution and use in source and binary forms, with or without
@@ -64,6 +64,10 @@ ifeq ($(CONFIG_SPI),y)
ifeq ($(CONFIG_ADXL345_SPI),y)
CSRCS += adxl345_spi.c
endif
+
+ifeq ($(CONFIG_MPL115A),y)
+ CSRCS += mpl115a.c
+endif
endif # CONFIG_SPI
# Quadrature encoder upper half
diff --git a/nuttx/drivers/sensors/README.txt b/nuttx/drivers/sensors/README.txt
index 4f6c0072c..e0df3d629 100644
--- a/nuttx/drivers/sensors/README.txt
+++ b/nuttx/drivers/sensors/README.txt
@@ -8,3 +8,9 @@ In order to operate in SPI mode CS need to use connected to microcontroller,
it cannot leave unconnected.
In SPI mode it works with clock polarity (CPOL) = 1 and clock phase (CPHA) = 1.
+
+MPL115A
+=======
+
+This driver has support only for MPL115A1 (SPI), but support to MPL115A2 (I2C) can
+be added easily.
diff --git a/nuttx/drivers/sensors/mpl115a.c b/nuttx/drivers/sensors/mpl115a.c
index b507b3343..b5d64b117 100644
--- a/nuttx/drivers/sensors/mpl115a.c
+++ b/nuttx/drivers/sensors/mpl115a.c
@@ -2,7 +2,7 @@
* drivers/sensors/mpl115a.c
* Character driver for the Freescale MPL115A1 Barometer Sensor
*
- * Copyright (C) 2011, 2013 Gregory Nutt. All rights reserved.
+ * Copyright (C) 2015 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
@@ -71,7 +71,6 @@ struct mpl115a_dev_s
uint16_t mpl115a_pressure;
};
-
/****************************************************************************
* Private Function Prototypes
****************************************************************************/
@@ -95,15 +94,16 @@ static ssize_t mpl115a_write(FAR struct file *filep, FAR const char *buffer, siz
static const struct file_operations g_mpl115afops =
{
- mpl115a_open,
- mpl115a_close,
- mpl115a_read,
- mpl115a_write,
- 0,
- 0
+ mpl115a_open, /* open */
+ mpl115a_close, /* close */
+ mpl115a_read, /* read */
+ mpl115a_write, /* write */
+ 0, /* seek */
+ 0, /* ioctl */
#ifndef CONFIG_DISABLE_POLL
- , 0
+ 0, /* poll */
#endif
+ 0 /* unlink */
};
/****************************************************************************
@@ -176,26 +176,28 @@ static uint8_t mpl115a_getreg8(FAR struct mpl115a_dev_s *priv, uint8_t regaddr)
static void mpl115a_updatecaldata(FAR struct mpl115a_dev_s *priv)
{
/* Get a0 coefficient */
+
priv->mpl115a_cal_a0 = mpl115a_getreg8(priv, MPL115A_BASE_CMD | (MPL115A_A0_MSB << 1)) << 8;
priv->mpl115a_cal_a0 |= mpl115a_getreg8(priv, MPL115A_BASE_CMD | (MPL115A_A0_LSB << 1));
sndbg("a0 = %d\n", priv->mpl115a_cal_a0);
/* Get b1 coefficient */
+
priv->mpl115a_cal_b1 = mpl115a_getreg8(priv, MPL115A_BASE_CMD | (MPL115A_B1_MSB << 1)) << 8;
priv->mpl115a_cal_b1 |= mpl115a_getreg8(priv, MPL115A_BASE_CMD | (MPL115A_B1_LSB << 1));
sndbg("b1 = %d\n", priv->mpl115a_cal_b1);
/* Get b2 coefficient */
+
priv->mpl115a_cal_b2 = mpl115a_getreg8(priv, MPL115A_BASE_CMD | (MPL115A_B2_MSB << 1)) << 8;
priv->mpl115a_cal_b2 |= mpl115a_getreg8(priv, MPL115A_BASE_CMD | (MPL115A_B2_LSB << 1));
sndbg("b2 = %d\n", priv->mpl115a_cal_b2);
/* Get c12 coefficient */
+
priv->mpl115a_cal_c12 = mpl115a_getreg8(priv, MPL115A_BASE_CMD | (MPL115A_C12_MSB << 1)) << 8;
priv->mpl115a_cal_c12 |= mpl115a_getreg8(priv, MPL115A_BASE_CMD | (MPL115A_C12_LSB << 1));
sndbg("c12 = %d\n", priv->mpl115a_cal_c12);
-
- return;
}
/****************************************************************************
@@ -204,15 +206,19 @@ static void mpl115a_updatecaldata(FAR struct mpl115a_dev_s *priv)
* Description:
* Read raw pressure and temperature from MPL115A and store it in the
* mpl115a_dev_s structure.
- */
+ *
+ ****************************************************************************/
+
static void mpl115a_read_press_temp(FAR struct mpl115a_dev_s *priv)
{
uint16_t pressure;
- /* Start a new convertion */
+ /* Start a new conversion */
+
mpl115a_getreg8(priv, (MPL115A_CONVERT << 1));
/* Delay 5ms */
+
usleep(5000);
priv->mpl115a_pressure = mpl115a_getreg8(priv, MPL115A_BASE_CMD | (MPL115A_PADC_MSB << 1)) << 8;
@@ -232,8 +238,8 @@ static void mpl115a_read_press_temp(FAR struct mpl115a_dev_s *priv)
* Name: mpl115a_getpressure
*
* Description:
- * Calculate the Barometrc Pressure using the temperature compensated
- * See Freescale AN3785 and MPL115A1 datasheet for details
+ * Calculate the Barometric Pressure using the temperature compensated
+ * See Freescale AN3785 and MPL115A1 data sheet for details
*
****************************************************************************/
@@ -243,6 +249,7 @@ static int mpl115a_getpressure(FAR struct mpl115a_dev_s *priv)
uint16_t padc, tadc, pressure;
/* Check if coefficient data were read correctly */
+
if ( (priv->mpl115a_cal_a0 == 0) || (priv->mpl115a_cal_b1 == 0) ||
(priv->mpl115a_cal_b2 == 0) || (priv->mpl115a_cal_c12 == 0) )
{
@@ -250,11 +257,13 @@ static int mpl115a_getpressure(FAR struct mpl115a_dev_s *priv)
}
/* Read temperature and pressure */
+
mpl115a_read_press_temp(priv);
padc = priv->mpl115a_pressure;
tadc = priv->mpl115a_temperature;
/* These code are from Freescale AN3785 */
+
c12x2 = ((int32_t)priv->mpl115a_cal_c12 * tadc) >> 11;
a1 = (int32_t) (priv->mpl115a_cal_b1 + c12x2);
a1x1 = a1 * padc;
@@ -263,11 +272,13 @@ static int mpl115a_getpressure(FAR struct mpl115a_dev_s *priv)
pcomp = (y1 + a2x2) >> 9;
/* Calculate the pressure in 1/16 kPa from compensated */
+
pressure = (((((int32_t)pcomp) * 1041) >> 14) + 800);
/* Note that the final pressure value is reported with 4 bit fractional
* This may be eliminated by right shifting the result 4 bits.
*/
+
sndbg("Final Pressure = %d\n", pressure >> 4);
return pressure;
}
@@ -321,9 +332,11 @@ static ssize_t mpl115a_read(FAR struct file *filep, FAR char *buffer, size_t buf
}
/* Get the pressure compensated */
+
*press = mpl115a_getpressure(priv);
/* Return size of uint16_t (2 bytes) */
+
return 2;
}
@@ -349,10 +362,11 @@ static ssize_t mpl115a_write(FAR struct file *filep, FAR const char *buffer,
*
* Input Parameters:
* devpath - The full path to the driver to register. E.g., "/dev/temp0"
- * i2c - An instance of the I2C interface to use to communicate with MPL115A
- * addr - The I2C address of the LM-75. The base I2C address of the MPL115A
- * is 0x48. Bits 0-3 can be controlled to get 8 unique addresses from 0x48
- * through 0x4f.
+ * i2c - An instance of the I2C interface to use to communicate with
+ * MPL115A
+ * addr - The I2C address of the LM-75. The base I2C address of the
+ * MPL115A is 0x48. Bits 0-3 can be controlled to get 8 unique
+ * addresses from 0x48 through 0x4f.
*
* Returned Value:
* Zero (OK) on success; a negated errno value on failure.
@@ -380,6 +394,7 @@ int mpl115a_register(FAR const char *devpath, FAR struct spi_dev_s *spi)
priv->mpl115a_cal_c12 = 0;
/* Read the coefficient value */
+
mpl115a_updatecaldata(priv);
/* Register the character driver */
diff --git a/nuttx/include/nuttx/sensors/mpl115a.h b/nuttx/include/nuttx/sensors/mpl115a.h
index c1f01ba70..95859b96d 100644
--- a/nuttx/include/nuttx/sensors/mpl115a.h
+++ b/nuttx/include/nuttx/sensors/mpl115a.h
@@ -78,9 +78,9 @@
#define MPL115A_B1_LSB 0x07 /* b1 coefficient LSB */
#define MPL115A_B2_MSB 0x08 /* b2 coefficient MSB */
#define MPL115A_B2_LSB 0x09 /* b2 coefficient LSB */
-#define MPL115A_C12_MSB 0x0A /* c12 coefficient MSB */
-#define MPL115A_C12_LSB 0x0B /* c12 coefficient LSB */
- /* 0x0C - 0x11 are reserved */
+#define MPL115A_C12_MSB 0x0a /* c12 coefficient MSB */
+#define MPL115A_C12_LSB 0x0b /* c12 coefficient LSB */
+ /* 0x0c - 0x11 are reserved */
#define MPL115A_CONVERT 0x12 /* Start Pressure and Temperature Conversion */
/********************************************************************************************
@@ -89,7 +89,8 @@
#ifdef __cplusplus
#define EXTERN extern "C"
-extern "C" {
+extern "C"
+{
#else
#define EXTERN extern
#endif
@@ -102,14 +103,15 @@ extern "C" {
*
* Input Parameters:
* devpath - The full path to the driver to register. E.g., "/dev/temp0"
- * spi - An instance of the SPI interface to use to communicate with MPL115A
+ * spi - An instance of the SPI interface to use to communicate with
+ * MPL115A
*
* Returned Value:
* Zero (OK) on success; a negated errno value on failure.
*
****************************************************************************/
-EXTERN int mpl115a_register(FAR const char *devpath, FAR struct spi_dev_s *spi);
+int mpl115a_register(FAR const char *devpath, FAR struct spi_dev_s *spi);
#undef EXTERN
#ifdef __cplusplus
diff --git a/nuttx/include/nuttx/spi/spi.h b/nuttx/include/nuttx/spi/spi.h
index b85b26ec7..5fe2423a9 100644
--- a/nuttx/include/nuttx/spi/spi.h
+++ b/nuttx/include/nuttx/spi/spi.h
@@ -362,7 +362,8 @@ enum spi_dev_e
SPIDEV_AUDIO_DATA, /* Select SPI audio codec device data port */
SPIDEV_AUDIO_CTRL, /* Select SPI audio codec device control port */
SPIDEV_EEPROM, /* Select SPI EEPROM device */
- SPIDEV_GSENSOR /* Select SPI Accelerometer device */
+ SPIDEV_GSENSOR, /* Select SPI Accelerometer device */
+ SPIDEV_BAROMETER /* Select SPI Pressure/Barometer device */
};
/* Certain SPI devices may required differnt clocking modes */