aboutsummaryrefslogtreecommitdiffstats
path: root/os/ex/Bosch/bmp085.h
diff options
context:
space:
mode:
authorTheodore Ateba <tf.ateba@gmail.com>2017-09-22 20:49:12 +0000
committerTheodore Ateba <tf.ateba@gmail.com>2017-09-22 20:49:12 +0000
commite4bdd6d759d0bc5e9d30db302fb7e7a6a45e03d3 (patch)
treea8e5fc39511df031853b48a7c015bacaf0519e8c /os/ex/Bosch/bmp085.h
parentd6f80d88f4399fd26ff71c2079ed5482eb9624c5 (diff)
downloadChibiOS-e4bdd6d759d0bc5e9d30db302fb7e7a6a45e03d3.tar.gz
ChibiOS-e4bdd6d759d0bc5e9d30db302fb7e7a6a45e03d3.tar.bz2
ChibiOS-e4bdd6d759d0bc5e9d30db302fb7e7a6a45e03d3.zip
Add Bosch digital barometer driver to ChibiOS/EX.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@10684 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'os/ex/Bosch/bmp085.h')
-rw-r--r--os/ex/Bosch/bmp085.h400
1 files changed, 400 insertions, 0 deletions
diff --git a/os/ex/Bosch/bmp085.h b/os/ex/Bosch/bmp085.h
new file mode 100644
index 000000000..9bfa5b99e
--- /dev/null
+++ b/os/ex/Bosch/bmp085.h
@@ -0,0 +1,400 @@
+/*
+ ChibiOS - Copyright (C) 2016..2017 Theodore Ateba
+
+ This file is part of ChibiOS.
+
+ ChibiOS is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ ChibiOS is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+/**
+ * @file bmp085.h
+ *
+ * @brief BMP085 Digital pressure sensor interface module header.
+ *
+ * @author Theodore Ateba, tf.ateba@gmail.com
+ *
+ * @date 19 July 2016
+ *
+ * @{
+ */
+
+#ifndef BMP085_H
+#define BMP085_H
+
+#include "hal_barometer.h"
+#include "hal_thermometer.h"
+
+/*==========================================================================*/
+/* Driver constants. */
+/*==========================================================================*/
+
+/**
+ * @name Version identification
+ * @{
+ */
+
+/**
+ * @brief BMP085 driver version string.
+ */
+#define EX_BMP085_VERSION "1.0.0"
+
+/**
+ * @brief BMP085 driver version major number.
+ */
+#define EX_BMP085_MAJOR 1
+
+/**
+ * @brief BMP085 driver version minor number.
+ */
+#define EX_BMP085_MINOR 0
+
+/**
+ * @brief BMP085 driver version patch number.
+ */
+#define EX_BMP085_PATCH 0
+/** @}*/
+
+/**
+ * @brief BMP085 barometer subsystem characteristics.
+ * @{
+ */
+#define BMP085_BARO_NUMBER_OF_AXES 1U /**< Number of axes. */
+
+#define BMP085_P_RES 0.01 /**< Press resolution. */
+
+#define BMP085_CR_P_VAL0 0x34 /**< Press control reg value 0. */
+#define BMP085_CR_P_VAL1 0x74 /**< Press control reg value 1. */
+#define BMP085_CR_P_VAL2 0xB4 /**< Press control reg value 2. */
+#define BMP085_CR_P_VAL3 0xF4 /**< Press control reg value 3. */
+/** @} */
+
+/**
+ * @brief BMP085 thermometer subsystem characteristics.
+ * @{
+ */
+#define BMP085_THERMO_NUMBER_OF_AXES 1U /**< Number of axis. */
+
+#define BMP085_T_RES 0.1 /**< Temp resolution. */
+
+#define BMP085_CR_T_VAL 0x2E /**< Temp control register value. */
+/** @} */
+
+#define BMP085_SAD 0x77 /**< Slave address. */
+
+/**
+ * @name BMP085 Registers addresses.
+ * @{
+ */
+#define BMP085_AD_CR 0xF4 /**< Control register address. */
+#define BMP085_AD_T_DR_MSB 0xF6 /**< Temp MSB data register addr. */
+#define BMP085_AD_T_DR_LSB 0xF7 /**< Temp LSB data register addr. */
+#define BMP085_AD_P_DR_MSB 0xF6 /**< Press MSB data register addr. */
+#define BMP085_AD_P_DR_LSB 0xF7 /**< Press LSB data register addr. */
+#define BMP085_AD_P_DR_XLSB 0xF8 /**< Press XLSB data register addr.*/
+#define BMP085_AD_CC_AC1_MSB 0xAA /**< AC1 MSB calib coef reg addr. */
+#define BMP085_AD_CC_AC1_LSB 0xAB /**< AC1 LSB calib coef reg addr. */
+#define BMP085_AD_CC_AC2_MSB 0xAC /**< AC2 MSB calib coef reg addr. */
+#define BMP085_AD_CC_AC2_LSB 0xAD /**< AC2 LSB calib coef reg addr. */
+#define BMP085_AD_CC_AC3_MSB 0xAE /**< AC3 MSB calib coef reg addr. */
+#define BMP085_AD_CC_AC3_LSB 0xAF /**< AC3 LSB calib coef reg addr. */
+#define BMP085_AD_CC_AC4_MSB 0xB0 /**< AC4 MSB calib coef reg addr. */
+#define BMP085_AD_CC_AC4_LSB 0xB1 /**< AC4 LSB calib coef reg addr. */
+#define BMP085_AD_CC_AC5_MSB 0xB2 /**< AC5 MSB calib coef reg addr. */
+#define BMP085_AD_CC_AC5_LSB 0xB3 /**< AC5 LSB calib coef reg addr. */
+#define BMP085_AD_CC_AC6_MSB 0xB4 /**< AC6 MSB calib coef reg addr. */
+#define BMP085_AD_CC_AC6_LSB 0xB5 /**< AC6 LSB calib coef reg addr. */
+#define BMP085_AD_CC_B1_MSB 0xB6 /**< B1 MSB calib coef reg addr. */
+#define BMP085_AD_CC_B1_LSB 0xB7 /**< B1 LSB calib coef reg addr. */
+#define BMP085_AD_CC_B2_MSB 0xB8 /**< B2 MSB calib coef reg addr. */
+#define BMP085_AD_CC_B2_LSB 0xB9 /**< B2 LSB calib coef reg addr. */
+#define BMP085_AD_CC_MB_MSB 0xBA /**< MB MSB calib coef reg addr. */
+#define BMP085_AD_CC_MB_LSB 0xBB /**< MB LSB calib coef reg addr. */
+#define BMP085_AD_CC_MC_MSB 0xBC /**< MC MSB calib coef reg addr. */
+#define BMP085_AD_CC_MC_LSB 0xBD /**< MC LSB calib coef reg addr. */
+#define BMP085_AD_CC_MD_MSB 0xBE /**< MD MSB calib coef reg addr. */
+#define BMP085_AD_CC_MD_LSB 0xBF /**< MD LSB calib coef reg addr. */
+/** @} */
+
+/*==========================================================================*/
+/* Driver pre-compile time settings. */
+/*==========================================================================*/
+
+/**
+ * @name Configuration options
+ * @{
+ */
+
+/**
+ * @brief BMP085 I2C interface selector.
+ * @details If set to @p TRUE the support for I2C is included.
+ * @note The default is @p TRUE.
+ */
+#if !defined(BMP085_USE_I2C) || defined(__DOXYGEN__)
+#define BMP085_USE_I2C TRUE
+#endif
+
+/**
+ * @brief BMP085 barometer subsystem advanced configurations switch.
+ * @details If set to @p TRUE more configurations are available.
+ * @note The default is @p FALSE.
+ */
+#if !defined(BMP085_BARO_USE_ADVANCED) || defined(__DOXYGEN__)
+#define BMP085_BARO_USE_AVANCED FALSE
+#endif
+
+/**
+ * @brief BMP085 termomether subsystem advanced configurations switch.
+ * @details If set to @p TRUE more configurations are available.
+ * @note The default is @p FALSE.
+ */
+#if !defined(BMP085_THERMO_USE_ADVANCED) || defined(__DOXYGEN__)
+#define BMP085_THERMO_USE_AVANCED FALSE
+#endif
+
+/**
+ * @brief BMP085 shared I2C switch.
+ * @details If set to @p TRUE the device acquires I2C bus ownership
+ * on each transaction.
+ * @note The default is @p FALSE. Requires I2C_USE_MUTUAL_EXCLUSION.
+ */
+#if !defined(BMP085_SHARED_I2C) || defined(__DOXYGEN__)
+#define BMP085_SHARED_I2C FALSE
+#endif
+/** @} */
+
+/*==========================================================================*/
+/* Derived constants and error checks. */
+/*==========================================================================*/
+
+#if !HAL_USE_I2C
+#error "BMP085_USE_I2C requires HAL_USE_I2C"
+#endif
+
+#if BMP085_SHARED_I2C && !I2C_USE_MUTUAL_EXCLUSION
+#error "BMP085_SHARED_I2C requires I2C_USE_MUTUAL_EXCLUSION"
+#endif
+
+/*==========================================================================*/
+/* Driver data structures and types. */
+/*==========================================================================*/
+
+/**
+ * @name BMP085 barometer subsystem data structures and types.
+ * @{
+ */
+
+/**
+ * @brief BMP085 barometer subsystem pressure conversion time.
+ */
+typedef enum {
+ BMP085_BARO_CT_LOW = 0x05, /**< Convers time in ultra low power mode. */
+ BMP085_BARO_CT_STD = 0x18, /**< Convers time in standard mode. */
+ BMP085_BARO_CT_HR = 0x0E, /**< Convers time in high resolution mode. */
+ BMP085_BARO_CT_LUHR = 0x1A /**< Convers time in ultra high res. mode. */
+} bmp085_baro_ct_t;
+
+/**
+ * @brief BMP085 barometer subsystem mode.
+ */
+typedef enum {
+ BMP085_BARO_MODE_LOW = 0x00, /**< BMP085 ultra low power mode. */
+ BMP085_BARO_MODE_STD = 0x01, /**< BMP085 standard mode. */
+ BMP085_BARO_MODE_HR = 0x02, /**< BMP085 high resolution mode. */
+ BMP085_BARO_MODE_LUHR = 0x03 /**< BMP085 ultra high res. mode. */
+} bmp085_baro_mode_t;
+
+/**
+ * @brief BMP085 barometer oversampling setting.
+ */
+typedef enum {
+ BMP085_BARO_OSS_0 = 0x00, /**< Ultra low power sampling rate. */
+ BMP085_BARO_OSS_1 = 0x01, /**< Standard mode sampling rate. */
+ BMP085_BARO_OSS_2 = 0x02, /**< High resolution sampling rate. */
+ BMP085_BARO_OSS_3 = 0x04 /**< ultra high resolution sampling rate. */
+}bmp085_baro_oss_t;
+
+/**
+ * @brief BMP085 barometer subsystem configuration structure.
+ */
+typedef struct {
+ /**
+ * @brief BMP085 barometer subsystem pressure conversion time.
+ */
+ bmp085_baro_ct_t ct;
+
+ /**
+ * @brief BMP085 barometer subsystem mode.
+ */
+ bmp085_baro_mode_t mode;
+
+ /**
+ * @brief BMP085 barometer subsystem oversampling setting.
+ */
+ bmp085_baro_oss_t oss;
+} BMP085BaroConfig;
+/** @} */
+
+/**
+ * @name BMP085 thermometer subsystem data structures and types.
+ * @{
+ */
+
+/**
+ * @brief BMP085 thermometer subsystem temperature conversion time.
+ */
+typedef enum {
+ BMP085_THERMO_CT_LOW = 0x05, /**< Conv time in ultra low power mode. */
+ BMP085_THERMO_CT_STD = 0x18, /**< Conv time in standard mode. */
+ BMP085_THERMO_CT_HR = 0x0E, /**< Conv time in high resolution mode. */
+ BMP085_THERMO_CT_LUHR = 0x1A /**< Conv time in ultra high res. mode. */
+} bmp085_thermo_ct_t;
+
+/**
+ * @brief BMP085 thermometer subsystem configuration structure.
+ */
+typedef struct {
+ /**
+ * @brief BMP085 thermometer subsystem temperature conversion time.
+ */
+ bmp085_thermo_ct_t conversionTime;
+} BMP085ThermoConfig;
+/** @} */
+
+/**
+ * @name BMP085 main system data structures and types.
+ * @{
+ */
+
+/**
+ * @brief Driver state machine possible states.
+ */
+typedef enum {
+ BMP085_UNINIT = 0, /**< Not initialized. */
+ BMP085_STOP = 1, /**< Stopped. */
+ BMP085_READY = 2 /**< Ready. */
+} bmp085_state_t;
+
+/**
+ * @brief BMP085 configuration structure.
+ */
+typedef struct {
+ /**
+ * @brief I2C driver associated to this BMP085.
+ */
+ I2CDriver *i2cp;
+
+ /**
+ * @brief I2C configuration associated to this BMP085 subsystem.
+ */
+ const I2CConfig *i2ccfg;
+
+ /**
+ * @brief BMP085 barometer subsystem configuration structure
+ */
+ const BMP085BaroConfig *barocfg;
+
+ /**
+ * @brief BMP085 thermometer subsystem configuration structure
+ */
+ const BMP085ThermoConfig *thermocfg;
+} BMP085Config;
+
+/**
+ * @brief Structure representing a BMP085 driver.
+ */
+typedef struct BMP085Driver BMP085Driver;
+
+/**
+ * @brief @p BMP085 barometer subsystem specific methods.
+ */
+#define _bmp085_baro_methods \
+ _base_barometer_methods
+
+/**
+ * @brief @p BMP085 thermometer subsystem specific methods.
+ */
+#define _bmp085_thermo_methods \
+ _base_thermometer_methods
+
+/**
+ * @extends BaseBarometerVMT
+ *
+ * @brief @p BMP085 barometer virtual methods table.
+ */
+struct BMP085BAROVMT {
+ _bmp085_baro_methods
+};
+
+/**
+ * @extends BaseThermometerVMT
+ *
+ * @brief @p BMP085 thermometer virtual methods table.
+ */
+struct BMP085THERMOVMT {
+ _bmp085_thermo_methods
+};
+
+/**
+ * @brief @p BMP085Driver specific data.
+ */
+#define _bmp085_data \
+ _base_barometer_data \
+ _base_thermometer_data \
+ /* Driver state. */ \
+ bmp085_state_t state; \
+ /* Current configuration data. */ \
+ const BMP085Config *config; \
+ /* Current barometer sensitivity. */ \
+ float barosensitivity[BMP085_BARO_NUMBER_OF_AXES]; \
+ /* Barometer bias data. */ \
+ int32_t barobias[BMP085_BARO_NUMBER_OF_AXES]; \
+ /* Current thermometer sensitivity. */ \
+ float thermosensitivity[BMP085_THERMO_NUMBER_OF_AXES]; \
+ /* Thermometer bias data. */ \
+ int32_t thermobias[BMP085_THERMO_NUMBER_OF_AXES];
+
+struct BMP085Driver {
+ /** @brief BaseSensor Virtual Methods Table. */
+ const struct BaseSensorVMT *vmt_basesensor;
+ /** @brief BaseBarometer Virtual Methods Table. */
+ const struct BaseBarometerVMT *vmt_basebarometer;
+ /** @brief BaseThermometer Virtual Methods Table. */
+ const struct BaseThermometerVMT *vmt_basethermometer;
+ _bmp085_data
+};
+
+/** @} */
+
+/*==========================================================================*/
+/* Driver macros. */
+/*==========================================================================*/
+
+/*==========================================================================*/
+/* External declarations. */
+/*==========================================================================*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ void bmp085ObjectInit(BMP085Driver *devp);
+ void bmp085Start(BMP085Driver *devp, const BMP085Config *config);
+ void bmp085Stop(BMP085Driver *devp);
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* BMP085_H */
+
+/** @} */