From 01ec205320b56a42f226e162595d1efc8a797cf6 Mon Sep 17 00:00:00 2001 From: Bosch Sensortec Date: Thu, 23 Nov 2017 08:20:01 +0100 Subject: [PATCH] Added selftest API based on CRC check Linux compatibility issue fixed --- README.md | 6 +- bme280.c | 4 +- bme280.h | 4 +- bme280_defs.h | 61 ++++++---------- changelog.md | 4 ++ selftest/bme280_selftest.c | 141 +++++++++++++++++++++++++++++++++++++ selftest/bme280_selftest.h | 85 ++++++++++++++++++++++ 7 files changed, 259 insertions(+), 46 deletions(-) create mode 100644 selftest/bme280_selftest.c create mode 100644 selftest/bme280_selftest.h diff --git a/README.md b/README.md index df453d2..69fbbc8 100644 --- a/README.md +++ b/README.md @@ -7,9 +7,9 @@ The sensor driver package includes bme280.c, bme280.h and bme280_defs.h files. ## Version File | Version | Date --------------|---------|------------ -bme280.c | 3.3.1 | 07 Nov 2017 -bme280.h | 3.3.1 | 07 Nov 2017 -bme280_defs.h | 3.3.1 | 07 Nov 2017 +bme280.c | 3.3.2 | 22 Nov 2017 +bme280.h | 3.3.2 | 22 Nov 2017 +bme280_defs.h | 3.3.2 | 22 Nov 2017 ## Integration details * Integrate bme280.h, bme280_defs.h and bme280.c file in to the project. diff --git a/bme280.c b/bme280.c index e4b6cbb..efc7177 100644 --- a/bme280.c +++ b/bme280.c @@ -40,8 +40,8 @@ * patent rights of the copyright holder. * * File bme280.c - * Date 07 Nov 2017 - * Version 3.3.1 + * Date 22 Nov 2017 + * Version 3.3.2 * */ diff --git a/bme280.h b/bme280.h index 77008b3..b6b698f 100644 --- a/bme280.h +++ b/bme280.h @@ -40,8 +40,8 @@ * patent rights of the copyright holder. * * @file bme280.h - * @date 07 Nov 2017 - * @version 3.3.1 + * @date 22 Nov 2017 + * @version 3.3.2 * @brief * */ diff --git a/bme280_defs.h b/bme280_defs.h index 4e35d16..ba626e4 100644 --- a/bme280_defs.h +++ b/bme280_defs.h @@ -40,8 +40,8 @@ * patent rights of the copyright holder. * * @file bme280_defs.h - * @date 07 Nov 2017 - * @version 3.3.1 + * @date 22 Nov 2017 + * @version 3.3.2 * @brief * */ @@ -59,56 +59,36 @@ /* header includes */ #ifdef __KERNEL__ #include +#include #else #include -#include +#include #endif -#ifdef __KERNEL__ -#if (LONG_MAX) > 0x7fffffff -#define __have_long64 1 -#elif (LONG_MAX) == 0x7fffffff -#define __have_long32 1 -#endif +/********************************************************/ +/*! @name Common macros */ +/********************************************************/ -#if !defined(UINT8_C) -#define INT8_C(x) x -#if (INT_MAX) > 0x7f -#define UINT8_C(x) x -#else -#define UINT8_C(x) x##U -#endif +#if !defined(UINT8_C) && !defined(INT8_C) +#define INT8_C(x) S8_C(x) +#define UINT8_C(x) U8_C(x) #endif -#if !defined(UINT16_C) -#define INT16_C(x) x -#if (INT_MAX) > 0x7fff -#define UINT16_C(x) x -#else -#define UINT16_C(x) x##U -#endif +#if !defined(UINT16_C) && !defined(INT16_C) +#define INT16_C(x) S16_C(x) +#define UINT16_C(x) U16_C(x) #endif #if !defined(INT32_C) && !defined(UINT32_C) -#if __have_long32 -#define INT32_C(x) x##L -#define UINT32_C(x) x##UL -#else -#define INT32_C(x) x -#define UINT32_C(x) x##U -#endif +#define INT32_C(x) S32_C(x) +#define UINT32_C(x) U32_C(x) #endif #if !defined(INT64_C) && !defined(UINT64_C) -#if __have_long64 -#define INT64_C(x) x##L -#define UINT64_C(x) x##UL -#else -#define INT64_C(x) x##LL -#define UINT64_C(x) x##ULL -#endif -#endif +#define INT64_C(x) S64_C(x) +#define UINT64_C(x) U64_C(x) #endif + /**@}*/ /**\name C standard macros */ @@ -119,6 +99,7 @@ #define NULL ((void *) 0) #endif #endif +/********************************************************/ #ifndef BME280_FLOAT_ENABLE /* #define BME280_FLOAT_ENABLE */ @@ -157,14 +138,16 @@ /**\name API success code */ #define BME280_OK INT8_C(0) + /**\name API error codes */ #define BME280_E_NULL_PTR INT8_C(-1) #define BME280_E_DEV_NOT_FOUND INT8_C(-2) #define BME280_E_INVALID_LEN INT8_C(-3) #define BME280_E_COMM_FAIL INT8_C(-4) #define BME280_E_SLEEP_MODE_FAIL INT8_C(-5) + /**\name API warning codes */ -#define BME280_W_INVALID_OSR_MACRO UINT8_C(1) +#define BME280_W_INVALID_OSR_MACRO INT8_C(1) /**\name Macros related to size */ #define BME280_TEMP_PRESS_CALIB_DATA_LEN UINT8_C(26) diff --git a/changelog.md b/changelog.md index 98d1671..5e19dec 100644 --- a/changelog.md +++ b/changelog.md @@ -1,6 +1,10 @@ # Change Log All notable changes to BME280 Sensor API will be documented in this file. +## v3.3.2, 22 Nov 2017 +### Changed + - Linux compatibility issue fixed + ## v3.3.1, 07 Nov 2017 ### Changed - Created the following user APIs which were previously static diff --git a/selftest/bme280_selftest.c b/selftest/bme280_selftest.c new file mode 100644 index 0000000..d9cfaef --- /dev/null +++ b/selftest/bme280_selftest.c @@ -0,0 +1,141 @@ +/**\mainpage + * Copyright (C) 2016 - 2017 Bosch Sensortec GmbH + * + * 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. + * + * File bme280_selftest.c + * Date 21 Nov 2017 + * Version 1.0.0 + * + */ + +#include "bme280_selftest.h" + +#define BME280_CRC_DATA_ADDR UINT8_C(0xE8) +#define BME280_CRC_DATA_LEN UINT8_C(1) +#define BME280_CRC_CALIB1_ADDR UINT8_C(0x88) +#define BME280_CRC_CALIB1_LEN UINT8_C(26) +#define BME280_CRC_CALIB2_ADDR UINT8_C(0xE1) +#define BME280_CRC_CALIB2_LEN UINT8_C(7) + +/*! + * @brief This API calculates the CRC + * + * @param[in] mem_values : reg_data parameter to calculate CRC + * @param[in] mem_length : Parameter to calculate CRC + * + * @return Result of API execution status + * @retval zero -> Success / +ve value -> Warning / -ve value -> Error + */ +static uint8_t crc_calculate(uint8_t *mem_values, uint8_t mem_length); + +/*! + * @brief This API reads the stored CRC and then compare with calculated CRC + * + * @param[in] dev : Structure instance of bme280_dev. + * + * @return Result of API execution status + * @retval zero -> self test success / +ve value -> warning(self test fail) + */ +int8_t bme280_crc_selftest(const struct bme280_dev *dev) +{ + int8_t rslt; + uint8_t reg_addr; + uint8_t reg_data[64]; + + uint8_t stored_crc = 0; + uint8_t calculated_crc = 0; + + /* Read stored crc value from register */ + reg_addr = BME280_CRC_DATA_ADDR; + rslt = bme280_get_regs(reg_addr, reg_data, BME280_CRC_DATA_LEN, dev); + if (rslt == BME280_OK) { + stored_crc = reg_data[0]; + /* Calculated CRC value with calibration register */ + reg_addr = BME280_CRC_CALIB1_ADDR; + rslt = bme280_get_regs(reg_addr, ®_data[0], BME280_CRC_CALIB1_LEN, dev); + if (rslt == BME280_OK) { + reg_addr = BME280_CRC_CALIB2_ADDR; + rslt = bme280_get_regs(reg_addr, ®_data[BME280_CRC_CALIB1_LEN], BME280_CRC_CALIB2_LEN, dev); + if (rslt == BME280_OK) { + calculated_crc = crc_calculate(reg_data, BME280_CRC_CALIB1_LEN + BME280_CRC_CALIB2_LEN); + /* Validate CRC */ + if (stored_crc == calculated_crc) + rslt = BME280_OK; + else + rslt = BME280_W_SELF_TEST_FAIL; + } + } + } + + return rslt; +} + +/*! + * @brief This API calculates the CRC + * + * @param[in] mem_values : reg_data parameter to calculate CRC + * @param[in] mem_length : Parameter to calculate CRC + * + * @return Result of API execution status + * @retval zero -> Success / +ve value -> Warning / -ve value -> Error + */ +static uint8_t crc_calculate(uint8_t *mem_values, uint8_t mem_length) +{ + uint32_t crc_reg = 0xFF; + uint8_t polynomial = 0x1D; + uint8_t bitNo, index; + uint8_t din = 0; + + for (index = 0; index < mem_length; index++) { + for (bitNo = 0; bitNo < 8; bitNo++) { + if (((crc_reg & 0x80) > 0) ^ ((mem_values[index] & 0x80) > 0)) + din = 1; + else + din = 0; + + /* Truncate 8th bit for crc_reg and mem_values */ + crc_reg = (uint32_t)((crc_reg & 0x7F) << 1); + mem_values[index] = (uint8_t)((mem_values[index] & 0x7F) << 1); + crc_reg = (uint32_t)(crc_reg ^ (polynomial * din)); + } + } + + return (uint8_t)(crc_reg ^ 0xFF); +} diff --git a/selftest/bme280_selftest.h b/selftest/bme280_selftest.h new file mode 100644 index 0000000..ef0b06f --- /dev/null +++ b/selftest/bme280_selftest.h @@ -0,0 +1,85 @@ +/**\mainpage + * Copyright (C) 2016 - 2017 Bosch Sensortec GmbH + * + * 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. + * + * File bme280_selftest.h + * Date 21 Nov 2017 + * Version 1.0.0 + * + */ + + /*! + * @addtogroup bme280_selftest + * @brief + * @{*/ + +#ifndef BME280_SELFTEST_H_ +#define BME280_SELFTEST_H_ + +#include "bme280.h" + +/*! CPP guard */ +#ifdef __cplusplus +extern "C" +{ +#endif + +/**\name API warning code */ +#define BME280_W_SELF_TEST_FAIL INT8_C(2) + +/*! + * @brief This API reads the stored CRC and then compare with calculated CRC + * + * @param[in] dev : Structure instance of bme280_dev. + * + * @return Result of API execution status + * @retval zero -> Success / +ve value -> Warning / -ve value -> Error + */ +int8_t bme280_crc_selftest(const struct bme280_dev *dev); + + +/*! CPP guard */ +#ifdef __cplusplus +} +#endif + +#endif /* BME280_SELFTEST_H_ */ + +/** @}*/ -- 2.45.0