/** * Copyright (c) 2020 Bosch Sensortec GmbH. All rights reserved. * * BSD-3-Clause * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. 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. * * 3. Neither the name of the copyright holder nor the names of its * 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 THE * 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. * * @file bmm150_defs.h * @date 2020-06-03 * @version v2.0.0 * */ /*! \file bmm150_defs.h */ #ifndef _BMM150_DEFS_H #define _BMM150_DEFS_H /******************************************************************************/ /*! @name Header includes */ /******************************************************************************/ #ifdef __KERNEL__ #include #else #include #include #endif /******************************************************************************/ /*! @name Common macros */ /******************************************************************************/ #ifdef __KERNEL__ #if (LONG_MAX) > 0x7fffffff #define __have_long64 1 #elif (LONG_MAX) == 0x7fffffff #define __have_long32 1 #endif #endif #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 #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 #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 #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 /*! @name C standard macros */ #ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *) 0) #endif #endif /******************************************************************************/ /*! @name Compiler switch macros Definitions */ /******************************************************************************/ #ifndef BMM150_USE_FLOATING_POINT /*< Check if floating point (using BMM150_USE_FLOATING_POINT) is enabled */ #ifndef BMM150_USE_FIXED_POINT /*< If floating point is not enabled then enable BMM150_USE_FIXED_POINT */ #define BMM150_USE_FIXED_POINT #endif #endif /******************************************************************************/ /*! @name General Macro Definitions */ /******************************************************************************/ /*! @name API success code */ #define BMM150_OK INT8_C(0) /*! @name To define TRUE or FALSE */ #define BMM150_TRUE UINT8_C(1) #define BMM150_FALSE UINT8_C(0) /*! @name API error codes */ #define BMM150_E_NULL_PTR INT8_C(-1) #define BMM150_E_DEV_NOT_FOUND INT8_C(-2) #define BMM150_E_INVALID_CONFIG INT8_C(-3) #define BMM150_E_COM_FAIL INT8_C(-4) /*! @name API warning codes */ #define BMM150_W_NORMAL_SELF_TEST_YZ_FAIL INT8_C(1) #define BMM150_W_NORMAL_SELF_TEST_XZ_FAIL INT8_C(2) #define BMM150_W_NORMAL_SELF_TEST_Z_FAIL INT8_C(3) #define BMM150_W_NORMAL_SELF_TEST_XY_FAIL INT8_C(4) #define BMM150_W_NORMAL_SELF_TEST_Y_FAIL INT8_C(5) #define BMM150_W_NORMAL_SELF_TEST_X_FAIL INT8_C(6) #define BMM150_W_NORMAL_SELF_TEST_XYZ_FAIL INT8_C(7) #define BMM150_W_ADV_SELF_TEST_FAIL INT8_C(8) /*! @name CHIP ID & SOFT RESET VALUES */ #define BMM150_CHIP_ID UINT8_C(0x32) #define BMM150_SET_SOFT_RESET UINT8_C(0x82) /*! @name POWER MODE DEFINTIONS */ #define BMM150_POWERMODE_NORMAL UINT8_C(0x00) #define BMM150_POWERMODE_FORCED UINT8_C(0x01) #define BMM150_POWERMODE_SLEEP UINT8_C(0x03) #define BMM150_POWERMODE_SUSPEND UINT8_C(0x04) /*! @name Power mode settings */ #define BMM150_POWER_CNTRL_DISABLE UINT8_C(0x00) #define BMM150_POWER_CNTRL_ENABLE UINT8_C(0x01) /*! @name Sensor delay time settings */ #define BMM150_DELAY_SOFT_RESET UINT8_C(1000) #define BMM150_DELAY_NORMAL_SELF_TEST UINT8_C(2000) #define BMM150_START_UP_TIME UINT8_C(3000) #define BMM150_DELAY_ADV_SELF_TEST UINT8_C(4000) /*! @name ENABLE/DISABLE DEFINITIONS */ #define BMM150_XYZ_CHANNEL_ENABLE UINT8_C(0x00) #define BMM150_XYZ_CHANNEL_DISABLE UINT8_C(0x07) /*! @name Register Address */ #define BMM150_REG_CHIP_ID UINT8_C(0x40) #define BMM150_REG_DATA_X_LSB UINT8_C(0x42) #define BMM150_REG_DATA_READY_STATUS UINT8_C(0x48) #define BMM150_REG_INTERRUPT_STATUS UINT8_C(0x4A) #define BMM150_REG_POWER_CONTROL UINT8_C(0x4B) #define BMM150_REG_OP_MODE UINT8_C(0x4C) #define BMM150_REG_INT_CONFIG UINT8_C(0x4D) #define BMM150_REG_AXES_ENABLE UINT8_C(0x4E) #define BMM150_REG_LOW_THRESHOLD UINT8_C(0x4F) #define BMM150_REG_HIGH_THRESHOLD UINT8_C(0x50) #define BMM150_REG_REP_XY UINT8_C(0x51) #define BMM150_REG_REP_Z UINT8_C(0x52) /*! @name Macros to select the sensor settings to be set by the user * These values are internal for API implementation. Don't relate this to * data sheet. */ #define BMM150_SEL_DATA_RATE UINT16_C(1) #define BMM150_SEL_CONTROL_MEASURE UINT16_C(1 << 1) #define BMM150_SEL_XY_REP UINT16_C(1 << 2) #define BMM150_SEL_Z_REP UINT16_C(1 << 3) #define BMM150_SEL_DRDY_PIN_EN UINT16_C(1 << 4) #define BMM150_SEL_INT_PIN_EN UINT16_C(1 << 5) #define BMM150_SEL_DRDY_POLARITY UINT16_C(1 << 6) #define BMM150_SEL_INT_LATCH UINT16_C(1 << 7) #define BMM150_SEL_INT_POLARITY UINT16_C(1 << 8) #define BMM150_SEL_DATA_OVERRUN_INT UINT16_C(1 << 9) #define BMM150_SEL_OVERFLOW_INT UINT16_C(1 << 10) #define BMM150_SEL_HIGH_THRESHOLD_INT UINT16_C(1 << 11) #define BMM150_SEL_LOW_THRESHOLD_INT UINT16_C(1 << 12) #define BMM150_SEL_LOW_THRESHOLD_SETTING UINT16_C(1 << 13) #define BMM150_SEL_HIGH_THRESHOLD_SETTING UINT16_C(1 << 14) /*! @name DATA RATE DEFINITIONS */ #define BMM150_DATA_RATE_10HZ UINT8_C(0x00) #define BMM150_DATA_RATE_02HZ UINT8_C(0x01) #define BMM150_DATA_RATE_06HZ UINT8_C(0x02) #define BMM150_DATA_RATE_08HZ UINT8_C(0x03) #define BMM150_DATA_RATE_15HZ UINT8_C(0x04) #define BMM150_DATA_RATE_20HZ UINT8_C(0x05) #define BMM150_DATA_RATE_25HZ UINT8_C(0x06) #define BMM150_DATA_RATE_30HZ UINT8_C(0x07) #define BMM150_ODR_MAX UINT8_C(0x07) #define BMM150_ODR_MSK UINT8_C(0x38) #define BMM150_ODR_POS UINT8_C(0x03) /*! @name TRIM REGISTERS */ /* Trim Extended Registers */ #define BMM150_DIG_X1 UINT8_C(0x5D) #define BMM150_DIG_Y1 UINT8_C(0x5E) #define BMM150_DIG_Z4_LSB UINT8_C(0x62) #define BMM150_DIG_Z4_MSB UINT8_C(0x63) #define BMM150_DIG_X2 UINT8_C(0x64) #define BMM150_DIG_Y2 UINT8_C(0x65) #define BMM150_DIG_Z2_LSB UINT8_C(0x68) #define BMM150_DIG_Z2_MSB UINT8_C(0x69) #define BMM150_DIG_Z1_LSB UINT8_C(0x6A) #define BMM150_DIG_Z1_MSB UINT8_C(0x6B) #define BMM150_DIG_XYZ1_LSB UINT8_C(0x6C) #define BMM150_DIG_XYZ1_MSB UINT8_C(0x6D) #define BMM150_DIG_Z3_LSB UINT8_C(0x6E) #define BMM150_DIG_Z3_MSB UINT8_C(0x6F) #define BMM150_DIG_XY2 UINT8_C(0x70) #define BMM150_DIG_XY1 UINT8_C(0x71) /*! @name Threshold interrupt setting macros for x,y,z axes selection */ #define BMM150_THRESHOLD_X UINT8_C(0x06) #define BMM150_THRESHOLD_Y UINT8_C(0x05) #define BMM150_THRESHOLD_Z UINT8_C(0x03) #define BMM150_HIGH_THRESHOLD_INT_MSK UINT8_C(0x38) #define BMM150_HIGH_THRESHOLD_INT_POS UINT8_C(0x03) #define BMM150_LOW_THRESHOLD_INT_MSK UINT8_C(0x07) /*! @name User configurable interrupt setting macros */ #define BMM150_INT_ENABLE UINT8_C(0x01) #define BMM150_INT_DISABLE UINT8_C(0x00) #define BMM150_ACTIVE_HIGH_POLARITY UINT8_C(0x01) #define BMM150_ACTIVE_LOW_POLARITY UINT8_C(0x00) #define BMM150_LATCHED UINT8_C(0x01) #define BMM150_NON_LATCHED UINT8_C(0x00) /*! @name Interrupt status */ #define BMM150_INT_THRESHOLD_X_LOW UINT16_C(0x0001) #define BMM150_INT_THRESHOLD_Y_LOW UINT16_C(0x0002) #define BMM150_INT_THRESHOLD_Z_LOW UINT16_C(0x0004) #define BMM150_INT_THRESHOLD_X_HIGH UINT16_C(0x0008) #define BMM150_INT_THRESHOLD_Y_HIGH UINT16_C(0x0010) #define BMM150_INT_THRESHOLD_Z_HIGH UINT16_C(0x0020) #define BMM150_INT_DATA_OVERFLOW UINT16_C(0x0040) #define BMM150_INT_DATA_OVERRUN UINT16_C(0x0080) #define BMM150_INT_DATA_READY UINT16_C(0x0100) #define BMM150_DRDY_EN_MSK UINT8_C(0x80) #define BMM150_DRDY_EN_POS UINT8_C(0x07) #define BMM150_DRDY_POLARITY_MSK UINT8_C(0x04) #define BMM150_DRDY_POLARITY_POS UINT8_C(0x02) #define BMM150_INT_PIN_EN_MSK UINT8_C(0x40) #define BMM150_INT_PIN_EN_POS UINT8_C(0x06) #define BMM150_INT_LATCH_MSK UINT8_C(0x02) #define BMM150_INT_LATCH_POS UINT8_C(0x01) #define BMM150_INT_POLARITY_MSK UINT8_C(0x01) #define BMM150_DRDY_STATUS_MSK UINT8_C(0x01) /*! @name Interrupt status macros */ #define BMM150_INT_ASSERTED_DRDY UINT16_C(0x0100) #define BMM150_INT_ASSERTED_LOW_THRES UINT16_C(0x0007) #define BMM150_INT_ASSERTED_HIGH_THRES UINT16_C(0x0380) /*! @name Power control bit macros */ #define BMM150_PWR_CNTRL_MSK UINT8_C(0x01) #define BMM150_CONTROL_MEASURE_MSK UINT8_C(0x38) #define BMM150_CONTROL_MEASURE_POS UINT8_C(0x03) #define BMM150_POWER_CONTROL_BIT_MSK UINT8_C(0x01) #define BMM150_POWER_CONTROL_BIT_POS UINT8_C(0x00) /*! @name Data macros */ #define BMM150_DATA_X_MSK UINT8_C(0xF8) #define BMM150_DATA_X_POS UINT8_C(0x03) #define BMM150_DATA_Y_MSK UINT8_C(0xF8) #define BMM150_DATA_Y_POS UINT8_C(0x03) #define BMM150_DATA_Z_MSK UINT8_C(0xFE) #define BMM150_DATA_Z_POS UINT8_C(0x01) #define BMM150_DATA_RHALL_MSK UINT8_C(0xFC) #define BMM150_DATA_RHALL_POS UINT8_C(0x02) #define BMM150_DATA_OVERRUN_INT_MSK UINT8_C(0x80) #define BMM150_DATA_OVERRUN_INT_POS UINT8_C(0x07) #define BMM150_OVERFLOW_INT_MSK UINT8_C(0x40) #define BMM150_OVERFLOW_INT_POS UINT8_C(0x06) /*! @name OVERFLOW DEFINITIONS */ #define BMM150_OVERFLOW_ADCVAL_XYAXES_FLIP INT16_C(-4096) #define BMM150_OVERFLOW_ADCVAL_ZAXIS_HALL INT16_C(-16384) #define BMM150_OVERFLOW_OUTPUT INT16_C(-32768) #define BMM150_NEGATIVE_SATURATION_Z INT16_C(-32767) #define BMM150_POSITIVE_SATURATION_Z INT16_C(32767) #ifdef BMM150_USE_FLOATING_POINT #define BMM150_OVERFLOW_OUTPUT_FLOAT 0.0f #endif /*! @name PRESET MODE DEFINITIONS */ #define BMM150_PRESETMODE_LOWPOWER UINT8_C(0x01) #define BMM150_PRESETMODE_REGULAR UINT8_C(0x02) #define BMM150_PRESETMODE_HIGHACCURACY UINT8_C(0x03) #define BMM150_PRESETMODE_ENHANCED UINT8_C(0x04) #define BMM150_OP_MODE_MSK UINT8_C(0x06) #define BMM150_OP_MODE_POS UINT8_C(0x01) /*! @name PRESET MODES - REPETITIONS-XY RATES */ #define BMM150_REPXY_LOWPOWER UINT8_C(0x01) #define BMM150_REPXY_REGULAR UINT8_C(0x04) #define BMM150_REPXY_ENHANCED UINT8_C(0x07) #define BMM150_REPXY_HIGHACCURACY UINT8_C(0x17) /*! @name PRESET MODES - REPETITIONS-Z RATES */ #define BMM150_REPZ_LOWPOWER UINT8_C(0x01) #define BMM150_REPZ_REGULAR UINT8_C(0x07) #define BMM150_REPZ_ENHANCED UINT8_C(0x0D) #define BMM150_REPZ_HIGHACCURACY UINT8_C(0x29) /*! @name Self test settings */ #define BMM150_DISABLE_XY_AXIS UINT8_C(0x03) #define BMM150_SELF_TEST_REP_Z UINT8_C(0x04) /*! @name Self test selection macros */ #define BMM150_SELF_TEST_NORMAL UINT8_C(0) #define BMM150_SELF_TEST_ADVANCED UINT8_C(1) /*! @name Advanced self-test current settings */ #define BMM150_DISABLE_SELF_TEST_CURRENT UINT8_C(0x00) #define BMM150_ENABLE_NEGATIVE_CURRENT UINT8_C(0x02) #define BMM150_ENABLE_POSITIVE_CURRENT UINT8_C(0x03) /*! @name Normal self-test status */ #define BMM150_SELF_TEST_STATUS_XYZ_FAIL UINT8_C(0x00) #define BMM150_SELF_TEST_STATUS_SUCCESS UINT8_C(0x07) #define BMM150_SELF_TEST_MSK UINT8_C(0x01) #define BMM150_ADV_SELF_TEST_MSK UINT8_C(0xC0) #define BMM150_ADV_SELF_TEST_POS UINT8_C(0x06) /*! @name Register read lengths */ #define BMM150_LEN_SELF_TEST UINT8_C(5) #define BMM150_LEN_SETTING_DATA UINT8_C(8) #define BMM150_LEN_XYZR_DATA UINT8_C(8) /*! @name Boundary check macros */ #define BMM150_BOUNDARY_MAXIMUM UINT8_C(0) #define BMM150_BOUNDARY_MINIMUM UINT8_C(1) /*! @name Macro to SET and GET BITS of a register*/ #define BMM150_SET_BITS(reg_data, bitname, data) \ ((reg_data & ~(bitname##_MSK)) | \ ((data << bitname##_POS) & bitname##_MSK)) #define BMM150_GET_BITS(reg_data, bitname) ((reg_data & (bitname##_MSK)) >> \ (bitname##_POS)) #define BMM150_SET_BITS_POS_0(reg_data, bitname, data) \ ((reg_data & ~(bitname##_MSK)) | \ (data & bitname##_MSK)) #define BMM150_GET_BITS_POS_0(reg_data, bitname) (reg_data & (bitname##_MSK)) /********************************************************/ /*! * @brief Interface selection Enums */ enum bmm150_intf { /*! SPI interface */ BMM150_SPI_INTF, /*! I2C interface */ BMM150_I2C_INTF }; /******************************************************************************/ /*! @name Function Pointers */ /******************************************************************************/ #ifndef BMM150_INTF_RET_TYPE #define BMM150_INTF_RET_TYPE int8_t #endif #ifndef BMM150_INTF_RET_SUCCESS #define BMM150_INTF_RET_SUCCESS INT8_C(0) #endif /*! * @brief Bus communication function pointer which should be mapped to * the platform specific read functions of the user * * @param[in] reg_addr : 8bit register address of the sensor * @param[out] reg_data : Data from the specified address * @param[in] length : Length of the reg_data array * @param[in,out] intf_ptr : Void pointer that can enable the linking of descriptors * for interface related callbacks * @retval 0 for Success * @retval Non-zero for Failure */ typedef BMM150_INTF_RET_TYPE (*bmm150_read_fptr_t)(uint8_t reg_addr, uint8_t *reg_data, uint32_t length, void *intf_ptr); /*! * @brief Bus communication function pointer which should be mapped to * the platform specific write functions of the user * * @param[in] reg_addr : 8bit register address of the sensor * @param[out] reg_data : Data to the specified address * @param[in] length : Length of the reg_data array * @param[in,out] intf_ptr : Void pointer that can enable the linking of descriptors * for interface related callbacks * @retval 0 for Success * @retval Non-zero for Failure * */ typedef BMM150_INTF_RET_TYPE (*bmm150_write_fptr_t)(uint8_t reg_addr, const uint8_t *reg_data, uint32_t length, void *intf_ptr); /*! * @brief Delay function pointer which should be mapped to * delay function of the user * * @param period : The time period in microseconds * @param[in,out] intf_ptr : Void pointer that can enable the linking of descriptors * for interface related callbacks */ typedef void (*bmm150_delay_us_fptr_t)(uint32_t period, void *intf_ptr); /******************************************************************************/ /*! @name Structure Declarations */ /******************************************************************************/ /*! * @brief bmm150 trim data structure */ struct bmm150_trim_registers { /*! trim x1 data */ int8_t dig_x1; /*! trim y1 data */ int8_t dig_y1; /*! trim x2 data */ int8_t dig_x2; /*! trim y2 data */ int8_t dig_y2; /*! trim z1 data */ uint16_t dig_z1; /*! trim z2 data */ int16_t dig_z2; /*! trim z3 data */ int16_t dig_z3; /*! trim z4 data */ int16_t dig_z4; /*! trim xy1 data */ uint8_t dig_xy1; /*! trim xy2 data */ int8_t dig_xy2; /*! trim xyz1 data */ uint16_t dig_xyz1; }; /*! * @brief bmm150 interrupt pin settings */ struct bmm150_int_ctrl_settings { /*! Data ready interrupt enable */ uint8_t drdy_pin_en; /*! Threshold and overflow interrupts enable */ uint8_t int_pin_en; /*! Data ready interrupt polarity Active high/low */ uint8_t drdy_polarity; /*! Interrupt pin - Latched or Non-latched */ uint8_t int_latch; /*! Interrupt polarity Active high/low */ uint8_t int_polarity; /*! Data overrun interrupt enable */ uint8_t data_overrun_en; /*! Overflow interrupt enable */ uint8_t overflow_int_en; /*! high interrupt enable/disable axis selection */ uint8_t high_int_en; /*! low interrupt enable/disable axis selection */ uint8_t low_int_en; /*! low threshold limit */ uint8_t low_threshold; /*! high threshold limit */ uint8_t high_threshold; }; /*! * @brief bmm150 sensor settings */ struct bmm150_settings { /*! Control measurement of XYZ axes */ uint8_t xyz_axes_control; /*! Power mode of sensor */ uint8_t pwr_mode; /*! Data rate value (ODR) */ uint8_t data_rate; /*! XY Repetitions */ uint8_t xy_rep; /*! Z Repetitions */ uint8_t z_rep; /*! Preset mode of sensor */ uint8_t preset_mode; /*! Interrupt configuration settings */ struct bmm150_int_ctrl_settings int_settings; }; /*! * @brief bmm150 un-compensated (raw) magnetometer data */ struct bmm150_raw_mag_data { /*! Raw mag X data */ int16_t raw_datax; /*! Raw mag Y data */ int16_t raw_datay; /*! Raw mag Z data */ int16_t raw_dataz; /*! Raw mag resistance value */ uint16_t raw_data_r; }; #ifdef BMM150_USE_FLOATING_POINT /*! * @brief bmm150 compensated magnetometer data in float */ struct bmm150_mag_data { /*! compensated mag X data */ float x; /*! compensated mag Y data */ float y; /*! compensated mag Z data */ float z; }; #else /*! * @brief bmm150 compensated magnetometer data in int16_t format */ struct bmm150_mag_data { /*! compensated mag X data */ int16_t x; /*! compensated mag Y data */ int16_t y; /*! compensated mag Z data */ int16_t z; }; #endif /*! * @brief bmm150 device structure */ struct bmm150_dev { /*! Chip Id */ uint8_t chip_id; /*! SPI/I2C Interface */ enum bmm150_intf intf; /*! * The interface pointer is used to enable the user * to link their interface descriptors for reference during the * implementation of the read and write interfaces to the * hardware. */ void *intf_ptr; /*! Variable that holds result of read/write function */ BMM150_INTF_RET_TYPE intf_rslt; /*! Bus read function pointer */ bmm150_read_fptr_t read; /*! Bus write function pointer */ bmm150_write_fptr_t write; /*! delay(in us) function pointer */ bmm150_delay_us_fptr_t delay_us; /*! Trim registers */ struct bmm150_trim_registers trim_data; /*! Interrupt status */ uint16_t int_status; /*! Power control bit value */ uint8_t pwr_cntrl_bit; }; #endif /* BMM150_DEFS_H_ */