/** * Copyright (c) 2025 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 bmm350_oor.h * @date 2025-10-30 * @version v1.10.0 * */ #ifndef _BMM350_OOR_H #define _BMM350_OOR_H #ifdef __KERNEL__ #include #include #else #include #ifdef BMM350_USE_FIXED_POINT #include #endif #endif #include "bmm350.h" /*! CPP guard */ #ifdef __cplusplus extern "C" { #endif /******************************************************************************/ /*! @name General Macro Definitions */ /******************************************************************************/ /*! Macro to define half self-test for out of range * NOTE: Comment this to use generic self test */ /*#define BMM350_OOR_HALF_SELF_TEST */ /*! Macro to synchronize the reset window with the measurement window */ #define BMM350_OOR_WINDOW_SYNC_DELAY UINT16_C(9000) /*! Macro to define mag data minimum and maximum range in uT */ #ifdef BMM350_USE_FIXED_POINT #define BMM350_HALF_ST_THRESHOLD (130 << F16_FRAC_BITS) #define BMM350_FULL_ST_THRESHOLD (300 << F16_FRAC_BITS) #else #define BMM350_HALF_ST_THRESHOLD (130.0f) #define BMM350_FULL_ST_THRESHOLD (300.0f) #endif /*! Macro to define threshold values of in range, out of range and self-test */ #ifdef BMM350_USE_FIXED_POINT #define BMM350_IN_RANGE_THRESHOLD (2000 << F16_FRAC_BITS) #define BMM350_OUT_OF_RANGE_THRESHOLD (2400 << F16_FRAC_BITS) #define BMM350_SELF_TEST_THRESHOLD (2600 << F16_FRAC_BITS) #else #define BMM350_IN_RANGE_THRESHOLD (2000.0f) #define BMM350_OUT_OF_RANGE_THRESHOLD (2400.0f) #define BMM350_SELF_TEST_THRESHOLD (2600.0f) #endif /************************* Structure definitions *************************/ /*! * @brief Structure to define bmm350 out of range parameters */ struct bmm350_oor_params { /*! Field Strength */ #ifdef BMM350_USE_FIXED_POINT uint32_t field_strength; #else float field_strength; #endif /*! Flags to enable Out of Range */ bool out_of_range; /*! Counter to track what self test to trigger */ uint8_t st_counter; /*! Current self-test command */ uint8_t st_cmd; /*! Stores the last applied self test configuration */ uint8_t last_st_cmd; /*! Self test enabled/disabled measurements for X and Y */ #ifdef BMM350_USE_FIXED_POINT fixed_t mag_x_st_en, mag_x_st_dis, mag_y_st_en, mag_y_st_dis, mag_x_st_dis_avg, mag_y_st_dis_avg; #else float mag_x_st_en, mag_x_st_dis, mag_y_st_en, mag_y_st_dis, mag_x_st_dis_avg, mag_y_st_dis_avg; #endif /*! Flags to track if the test failed to redo it */ bool x_failed, y_failed; /*! Flags to enable self-test */ bool enable_selftest; /*! Flags to trigger reset */ bool trigger_reset; /*! Variable to store reset counter value */ uint8_t reset_counter; }; /*! * @brief Structure to define bmm350 out of range reset delay parameters */ struct bmm350_oor_reset_delay { uint32_t delay_step; uint32_t br_delay; uint32_t fgr_delay; }; /******************* Function prototype declarations ********************/ /*! * @brief Function to read data and validate if the sensor is out of range * * @param[in] rdelay : Structure that stores the delay settings for the various magnetic reset sequences * @param[out] data : Sensor data * @param[out] oor : Structure that stores the state of the out of range detector * @param[in,out] dev : Device structure of the BMM350 * * @return Result of API execution status * @retval = 0 -> Success * @retval < 0 -> Error */ int8_t bmm350_oor_read(const struct bmm350_oor_reset_delay *rdelay, struct bmm350_mag_temp_data *data, struct bmm350_oor_params *oor, struct bmm350_dev *dev); /*! * @brief Function to perform reset sequence in forced mode. * * @param[in] rdelay : Structure that stores the delay settings for the various magnetic reset sequences * @param[in,out] oor : Structure that stores the state of the out of range detector * @param[in,out] dev : Structure instance of bmm350_dev. * * @return Result of API execution status * @retval = 0 -> Success * @retval < 0 -> Error */ int8_t bmm350_oor_perform_reset_sequence(const struct bmm350_oor_reset_delay *rdelay, struct bmm350_oor_params *oor, struct bmm350_dev *dev); /*! * @brief Function to compute the delay settings for the magnetic reset sequence. * * @param[in] odr_config : Configured Output Data Rate * @param[in] rdelay : Structure that stores the delay settings for the various magnetic reset sequences * @param[in,out] dev : Structure instance of bmm350_dev. */ void bmm350_oor_compute_delay_setting(uint8_t odr_config, struct bmm350_oor_reset_delay *rdelay); /*! * @brief Function to check for the Out of Range condition. * * @param[out] data : Sensor data * @param[in,out] oor : Structure that stores the state of the out of range detector */ void bmm350_oor_validate_out_of_range(const struct bmm350_mag_temp_data *data, struct bmm350_oor_params *oor); #ifdef __cplusplus } #endif /* End of CPP guard */ #endif /* _BMM350_OOR_H */