225 lines
8.2 KiB
C
225 lines
8.2 KiB
C
|
/* Copyright 2016 The Chromium OS Authors. All rights reserved.
|
||
|
* Use of this source code is governed by a BSD-style license that can be
|
||
|
* found in the LICENSE file.
|
||
|
*/
|
||
|
/** \mainpage
|
||
|
*
|
||
|
****************************************************************************
|
||
|
* Copyright (C) 2012 - 2015 Bosch Sensortec GmbH
|
||
|
*
|
||
|
* File : bmp280.h
|
||
|
*
|
||
|
* Date : 2015/03/27
|
||
|
*
|
||
|
* Revision : 2.0.4(Pressure and Temperature compensation code revision is 1.1)
|
||
|
*
|
||
|
* Usage: Sensor Driver for BMP280 sensor
|
||
|
*
|
||
|
****************************************************************************
|
||
|
*
|
||
|
* \section License
|
||
|
*
|
||
|
* Redistribution and use in source and binary forms, with or without
|
||
|
* modification, are permitted provided that the following conditions are met:
|
||
|
*
|
||
|
* Redistributions of source code must retain the above copyright
|
||
|
* notice, this list of conditions and the following disclaimer.
|
||
|
*
|
||
|
* Redistributions in binary form must reproduce the above copyright
|
||
|
* notice, this list of conditions and the following disclaimer in the
|
||
|
* documentation and/or other materials provided with the distribution.
|
||
|
*
|
||
|
* Neither the name of the copyright holder nor the names of the
|
||
|
* contributors may be used to endorse or promote products derived from
|
||
|
* this software without specific prior written permission.
|
||
|
*
|
||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||
|
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
|
||
|
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||
|
* DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER
|
||
|
* OR CONTRIBUTORS BE LIABLE FOR ANY
|
||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
||
|
* OR CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT LIMITED TO,
|
||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||
|
* ANY WAY OUT OF THE USE OF THIS
|
||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
|
||
|
*
|
||
|
* The information provided is believed to be accurate and reliable.
|
||
|
* The copyright holder assumes no responsibility
|
||
|
* for the consequences of use
|
||
|
* of such information nor for any infringement of patents or
|
||
|
* other rights of third parties which may result from its use.
|
||
|
* No license is granted by implication or otherwise under any patent or
|
||
|
* patent rights of the copyright holder.
|
||
|
**************************************************************************/
|
||
|
/* BMP280 pressure and temperature module for Chrome EC */
|
||
|
|
||
|
#ifndef __CROS_EC_BARO_BMP280_H
|
||
|
#define __CROS_EC_BARO_BMP280_H
|
||
|
|
||
|
/*
|
||
|
* The addr field of barometer_sensor for I2C:
|
||
|
*
|
||
|
* +-------------------------------+---+
|
||
|
* | 7 bit i2c address | 0 |
|
||
|
* +-------------------------------+---+
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* Bit 1 of 7-bit address: 0 - If SDO is connected to GND
|
||
|
* Bit 1 of 7-bit address: 1 - If SDO is connected to Vddio
|
||
|
*/
|
||
|
#define BMP280_I2C_ADDRESS1_FLAGS 0x76
|
||
|
#define BMP280_I2C_ADDRESS2_FLAGS 0x77
|
||
|
|
||
|
/*
|
||
|
* CHIP ID
|
||
|
*/
|
||
|
#define BMP280_CHIP_ID 0x58
|
||
|
/************************************************/
|
||
|
/* CALIBRATION PARAMETERS DEFINITION */
|
||
|
/************************************************/
|
||
|
|
||
|
#define BMP280_TEMPERATURE_CALIB_DIG_T1_LSB_REG 0x88
|
||
|
|
||
|
/************************************************/
|
||
|
/* REGISTER ADDRESS DEFINITION */
|
||
|
/************************************************/
|
||
|
#define BMP280_CHIP_ID_REG 0xD0
|
||
|
#define BMP280_RST_REG 0xE0 /*Softreset Register */
|
||
|
#define BMP280_STAT_REG 0xF3 /*Status Register */
|
||
|
#define BMP280_CTRL_MEAS_REG 0xF4 /*Ctrl Measure Register */
|
||
|
#define BMP280_CONFIG_REG 0xF5 /*Configuration Register */
|
||
|
#define BMP280_PRESSURE_MSB_REG 0xF7 /*Pressure MSB Register */
|
||
|
#define BMP280_PRESSURE_LSB_REG 0xF8 /*Pressure LSB Register */
|
||
|
#define BMP280_PRESSURE_XLSB_REG 0xF9 /*Pressure XLSB Register */
|
||
|
/************************************************/
|
||
|
/* POWER MODE DEFINITION */
|
||
|
/************************************************/
|
||
|
/* Sensor Specific constants */
|
||
|
#define BMP280_SLEEP_MODE 0x00
|
||
|
#define BMP280_FORCED_MODE 0x01
|
||
|
#define BMP280_NORMAL_MODE 0x03
|
||
|
#define BMP280_SOFT_RESET_CODE 0xB6
|
||
|
/************************************************/
|
||
|
/* STANDBY TIME DEFINITION */
|
||
|
/************************************************/
|
||
|
#define BMP280_STANDBY_TIME_1_MS 0x00
|
||
|
#define BMP280_STANDBY_TIME_63_MS 0x01
|
||
|
#define BMP280_STANDBY_TIME_125_MS 0x02
|
||
|
#define BMP280_STANDBY_TIME_250_MS 0x03
|
||
|
#define BMP280_STANDBY_TIME_500_MS 0x04
|
||
|
#define BMP280_STANDBY_TIME_1000_MS 0x05
|
||
|
#define BMP280_STANDBY_TIME_2000_MS 0x06
|
||
|
#define BMP280_STANDBY_TIME_4000_MS 0x07
|
||
|
/************************************************/
|
||
|
/* OVERSAMPLING DEFINITION */
|
||
|
/************************************************/
|
||
|
#define BMP280_OVERSAMP_SKIPPED 0x00
|
||
|
#define BMP280_OVERSAMP_1X 0x01
|
||
|
#define BMP280_OVERSAMP_2X 0x02
|
||
|
#define BMP280_OVERSAMP_4X 0x03
|
||
|
#define BMP280_OVERSAMP_8X 0x04
|
||
|
#define BMP280_OVERSAMP_16X 0x05
|
||
|
/************************************************/
|
||
|
/* DEFINITIONS FOR ARRAY SIZE OF DATA */
|
||
|
/************************************************/
|
||
|
#define BMP280_PRESSURE_DATA_SIZE 3
|
||
|
#define BMP280_DATA_FRAME_SIZE 6
|
||
|
#define BMP280_CALIB_DATA_SIZE 24
|
||
|
/*******************************************************/
|
||
|
/* SAMPLING PERIOD COMPUTATION CONSTANT */
|
||
|
/*******************************************************/
|
||
|
#define BMP280_STANDBY_CNT 8
|
||
|
#define T_INIT_MAX (20) /* (20/16 = 1.25ms) */
|
||
|
#define T_MEASURE_PER_OSRS_MAX (37) /* (37/16 = 2.31ms) */
|
||
|
#define T_SETUP_PRESSURE_MAX (10) /* (10/16 = 0.62ms) */
|
||
|
|
||
|
/*
|
||
|
* This is the measurement time required for pressure and temp
|
||
|
*/
|
||
|
#define BMP280_COMPUTE_TIME \
|
||
|
((T_INIT_MAX + T_MEASURE_PER_OSRS_MAX * \
|
||
|
((BIT(BMP280_OVERSAMP_TEMP) >> 1) + \
|
||
|
(BIT(BMP280_OVERSAMP_PRES) >> 1)) + \
|
||
|
(BMP280_OVERSAMP_PRES ? T_SETUP_PRESSURE_MAX : 0) + 15) / 16)
|
||
|
|
||
|
/*
|
||
|
* These values are selected as per Bosch recommendation for
|
||
|
* standard handheld devices, with temp sensor not being used
|
||
|
*/
|
||
|
#define BMP280_OVERSAMP_PRES BMP280_OVERSAMP_4X
|
||
|
#define BMP280_OVERSAMP_TEMP BMP280_OVERSAMP_SKIPPED
|
||
|
/*******************************************************/
|
||
|
/* GET DRIVER DATA */
|
||
|
/*******************************************************/
|
||
|
#define BMP280_GET_DATA(_s) \
|
||
|
((struct bmp280_drv_data_t *)(_s)->drv_data)
|
||
|
|
||
|
/* Min and Max sampling frequency in mHz based on x4 oversampling used */
|
||
|
/* FIXME - verify how chip is setup to make sure MAX is correct, manual says
|
||
|
* "Typical", not Max.
|
||
|
*/
|
||
|
#define BMP280_BARO_MIN_FREQ 75000
|
||
|
#define BMP280_BARO_MAX_FREQ 87000
|
||
|
#if (CONFIG_EC_MAX_SENSOR_FREQ_MILLIHZ <= BMP280_BARO_MAX_FREQ)
|
||
|
#error "EC too slow for accelerometer"
|
||
|
#endif
|
||
|
|
||
|
/**************************************************************/
|
||
|
/* STRUCTURE and ENUM DEFINITIONS */
|
||
|
/**************************************************************/
|
||
|
|
||
|
/*
|
||
|
* struct bmp280_calib_param_t - Holds all device specific
|
||
|
* calibration parameters
|
||
|
*
|
||
|
* @dig_T1 to dig_T3: calibration Temp data
|
||
|
* @dig_P1 to dig_P9: calibration Pressure data
|
||
|
* @t_fine: calibration t_fine data
|
||
|
*
|
||
|
*/
|
||
|
struct bmp280_calib_param_t {
|
||
|
uint16_t dig_T1;
|
||
|
int16_t dig_T2;
|
||
|
int16_t dig_T3;
|
||
|
uint16_t dig_P1;
|
||
|
int16_t dig_P2;
|
||
|
int16_t dig_P3;
|
||
|
int16_t dig_P4;
|
||
|
int16_t dig_P5;
|
||
|
int16_t dig_P6;
|
||
|
int16_t dig_P7;
|
||
|
int16_t dig_P8;
|
||
|
int16_t dig_P9;
|
||
|
|
||
|
int32_t t_fine;
|
||
|
};
|
||
|
|
||
|
/*
|
||
|
* struct bmp280_t - This structure holds BMP280 initialization parameters
|
||
|
* @calib_param: calibration data
|
||
|
* @rate: frequency, in mHz.
|
||
|
* @range: bit offset to fit data in 16 bit or less.
|
||
|
*/
|
||
|
struct bmp280_drv_data_t {
|
||
|
|
||
|
struct bmp280_calib_param_t calib_param;
|
||
|
uint16_t rate;
|
||
|
uint16_t range;
|
||
|
};
|
||
|
#define BMP280_RATE_SHIFT 1
|
||
|
|
||
|
extern const struct accelgyro_drv bmp280_drv;
|
||
|
|
||
|
#ifdef CONFIG_CMD_I2C_STRESS_TEST_ACCEL
|
||
|
extern struct i2c_stress_test_dev bmp280_i2c_stress_test_dev;
|
||
|
#endif
|
||
|
|
||
|
#endif
|