blob: cf878a7aa6687e7e4277906bc77d266c380b795c [file] [log] [blame]
/*
* Copyright (c) 2023 deveritec GmbH
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_DRIVERS_SENSOR_TMAG5273_H_
#define ZEPHYR_DRIVERS_SENSOR_TMAG5273_H_
#include <zephyr/sys/util.h>
/* --- Register definitions --- */
#define TMAG5273_REG_DEVICE_CONFIG_1 0x00
#define TMAG5273_REG_DEVICE_CONFIG_2 0x01
#define TMAG5273_REG_SENSOR_CONFIG_1 0x02
#define TMAG5273_REG_SENSOR_CONFIG_2 0x03
#define TMAG5273_REG_X_THR_CONFIG 0x04
#define TMAG5273_REG_Y_THR_CONFIG 0x05
#define TMAG5273_REG_Z_THR_CONFIG 0x06
#define TMAG5273_REG_T_CONFIG 0x07
#define TMAG5273_REG_INT_CONFIG_1 0x08
#define TMAG5273_REG_MAG_GAIN_CONFIG 0x09
#define TMAG5273_REG_MAG_OFFSET_CONFIG_1 0x0A
#define TMAG5273_REG_MAG_OFFSET_CONFIG_2 0x0B
#define TMAG5273_REG_I2C_ADDRESS 0x0C
#define TMAG5273_REG_DEVICE_ID 0x0D
#define TMAG5273_REG_MANUFACTURER_ID_LSB 0x0E
#define TMAG5273_REG_MANUFACTURER_ID_MSB 0x0F
#define TMAG5273_REG_T_MSB_RESULT 0x10
#define TMAG5273_REG_T_LSB_RESULT 0x11
#define TMAG5273_REG_X_MSB_RESULT 0x12
#define TMAG5273_REG_X_LSB_RESULT 0x13
#define TMAG5273_REG_Y_MSB_RESULT 0x14
#define TMAG5273_REG_Y_LSB_RESULT 0x15
#define TMAG5273_REG_Z_MSB_RESULT 0x16
#define TMAG5273_REG_Z_LSB_RESULT 0x17
#define TMAG5273_REG_CONV_STATUS 0x18
#define TMAG5273_REG_ANGLE_MSB_RESULT 0x19
#define TMAG5273_REG_ANGLE_LSB_RESULT 0x1A
#define TMAG5273_REG_MAGNITUDE_RESULT 0x1B
#define TMAG5273_REG_DEVICE_STATUS 0x1C
#define TMAG5273_REG_RESULT_BEGIN (TMAG5273_REG_T_MSB_RESULT)
#define TMAG5273_REG_RESULT_END (TMAG5273_REG_MAGNITUDE_RESULT)
/* Register DEVICE_CONFIG_1 */
#define TMAG5273_CRC_EN_POS 7
#define TMAG5273_MAG_TEMPCO_POS 5
#define TMAG5273_CONV_AVG_POS 2
#define TMAG5273_I2C_READ_POS 0
#define TMAG5273_CONV_AVB_MSK GENMASK(4, 2)
#define TMAG5273_CRC_DISABLE (0 << TMAG5273_CRC_EN_POS)
#define TMAG5273_CRC_ENABLE (1 << TMAG5273_CRC_EN_POS)
#define TMAG5273_MAGNET_TEMP_COEFF_NONE (0 << TMAG5273_MAG_TEMPCO_POS)
#define TMAG5273_MAGNET_TEMP_COEFF_NDBFE (1 << TMAG5273_MAG_TEMPCO_POS)
#define TMAG5273_MAGNET_TEMP_COEFF_CERAMIC (3 << TMAG5273_MAG_TEMPCO_POS)
#define TMAG5273_CONV_AVG_1 (0 << TMAG5273_CONV_AVG_POS)
#define TMAG5273_CONV_AVG_2 (1 << TMAG5273_CONV_AVG_POS)
#define TMAG5273_CONV_AVG_4 (2 << TMAG5273_CONV_AVG_POS)
#define TMAG5273_CONV_AVG_8 (3 << TMAG5273_CONV_AVG_POS)
#define TMAG5273_CONV_AVG_16 (4 << TMAG5273_CONV_AVG_POS)
#define TMAG5273_CONV_AVG_32 (5 << TMAG5273_CONV_AVG_POS)
#define TMAG5273_I2C_READ_MODE_STANDARD (0 << TMAG5273_I2C_READ_POS)
#define TMAG5273_I2C_READ_MODE_16BIT_SENSOR (1 << TMAG5273_I2C_READ_POS)
#define TMAG5273_I2C_READ_MODE_8BIT_MSB_DATA (2 << TMAG5273_I2C_READ_POS)
/* Register DEVICE_CONFIG_2 */
#define TMAG5273_THR_HYST_POS 5
#define TMAG5273_LP_LN_POS 4
#define TMAG5273_I2C_GLITCH_FILTER_POS 3
#define TMAG5273_TRIGGER_MODE_POS 2
#define TMAG5273_OPERATING_MODE_POS 0
#define TMAG5273_OPERATING_MODE_MSK GENMASK(1, 0)
#define TMAG5273_THR_HYST_COMPLEMENT (0 << TMAG5273_THR_HYST_POS)
#define TMAG5273_THR_HYST_LSB (1 << TMAG5273_THR_HYST_POS)
#define TMAG5273_LP_LOWPOWER (0 << TMAG5273_LP_LN_POS)
#define TMAG5273_LP_LOWNOISE (1 << TMAG5273_LP_LN_POS)
#define TMAG5273_I2C_GLITCH_FILTER_ON (0 << TMAG5273_I2C_GLITCH_FILTER_POS)
#define TMAG5273_I2C_GLITCH_FILTER_OFF (1 << TMAG5273_I2C_GLITCH_FILTER_POS)
#define TMAG5273_TRIGGER_MODE_I2C (0 << TMAG5273_TRIGGER_MODE_POS)
#define TMAG5273_TRIGGER_MODE_INT (1 << TMAG5273_TRIGGER_MODE_POS)
#define TMAG5273_OPERATING_MODE_STANDBY (0 << TMAG5273_OPERATING_MODE_POS)
#define TMAG5273_OPERATING_MODE_SLEEP (1 << TMAG5273_OPERATING_MODE_POS)
#define TMAG5273_OPERATING_MODE_CONTINUOUS (2 << TMAG5273_OPERATING_MODE_POS)
#define TMAG5273_OPERATING_MODE_WAKEUP_SLEEP (3 << TMAG5273_OPERATING_MODE_POS)
/* Register SENSOR_CONFIG_1 */
#define TMAG5273_MAG_CH_EN_POS 4
#define TMAG5273_SLEEPTIME_POS 0
#define TMAG5273_MAG_CH_EN_NONE (0x0 << TMAG5273_MAG_CH_EN_POS)
#define TMAG5273_MAG_CH_EN_X (0x1 << TMAG5273_MAG_CH_EN_POS)
#define TMAG5273_MAG_CH_EN_Y (0x2 << TMAG5273_MAG_CH_EN_POS)
#define TMAG5273_MAG_CH_EN_Z (0x4 << TMAG5273_MAG_CH_EN_POS)
#define TMAG5273_WS_SLEEPTIME_1MS (0x0 << TMAG5273_SLEEPTIME_POS)
#define TMAG5273_WS_SLEEPTIME_5MS (0x1 << TMAG5273_SLEEPTIME_POS)
#define TMAG5273_WS_SLEEPTIME_10MS (0x2 << TMAG5273_SLEEPTIME_POS)
#define TMAG5273_WS_SLEEPTIME_15MS (0x3 << TMAG5273_SLEEPTIME_POS)
#define TMAG5273_WS_SLEEPTIME_20MS (0x4 << TMAG5273_SLEEPTIME_POS)
#define TMAG5273_WS_SLEEPTIME_30MS (0x5 << TMAG5273_SLEEPTIME_POS)
#define TMAG5273_WS_SLEEPTIME_50MS (0x6 << TMAG5273_SLEEPTIME_POS)
#define TMAG5273_WS_SLEEPTIME_100MS (0x7 << TMAG5273_SLEEPTIME_POS)
#define TMAG5273_WS_SLEEPTIME_500MS (0x8 << TMAG5273_SLEEPTIME_POS)
#define TMAG5273_WS_SLEEPTIME_1000MS (0x9 << TMAG5273_SLEEPTIME_POS)
#define TMAG5273_WS_SLEEPTIME_2000MS (0xA << TMAG5273_SLEEPTIME_POS)
#define TMAG5273_WS_SLEEPTIME_5000MS (0xB << TMAG5273_SLEEPTIME_POS)
#define TMAG5273_WS_SLEEPTIME_20000MS (0xC << TMAG5273_SLEEPTIME_POS)
/* Register SENSOR_CONFIG_2 */
#define TMAG5273_INT_THRX_COUNT_POS 6
#define TMAG5273_INT_MAG_THR_DIR_POS 5
#define TMAG5273_GAIN_CORRECTION_CH_POS 4
#define TMAG5273_ANGLE_EN_POS 2
#define TMAG5273_X_Y_RANGE_POS 1
#define TMAG5273_Z_RANGE_POS 0
#define TMAG5273_ANGLE_EN_MSK GENMASK(3, 2)
#define TMAG5273_MEAS_RANGE_X_Y_MSK GENMASK(1, 1)
#define TMAG5273_MEAS_RANGE_Z_MSK GENMASK(0, 0)
#define TMAG5273_MEAS_RANGE_XYZ_MSK (TMAG5273_MEAS_RANGE_X_Y_MSK | TMAG5273_MEAS_RANGE_Z_MSK)
#define TMAG5273_INT_THRX_COUNT_1 (0 << TMAG5273_INT_THRX_COUNT_POS)
#define TMAG5273_INT_THRX_COUNT_4 (1 << TMAG5273_INT_THRX_COUNT_POS)
#define TMAG5273_MAG_THR_DIRECTION_ABOVE (0 << TMAG5273_INT_MAG_THR_DIR_POS)
#define TMAG5273_MAG_THR_DIRECTION_BELOW (1 << TMAG5273_INT_MAG_THR_DIR_POS)
#define TMAG5273_MAG_GAIN_CORRECTION_CH_1 (0 << TMAG5273_GAIN_CORRECTION_CH_POS)
#define TMAG5273_MAG_GAIN_CORRECTION_CH_2 (1 << TMAG5273_GAIN_CORRECTION_CH_POS)
#define TMAG5273_ANGLE_EN_NONE (0 << TMAG5273_ANGLE_EN_POS)
#define TMAG5273_ANGLE_EN_XY (1 << TMAG5273_ANGLE_EN_POS)
#define TMAG5273_ANGLE_EN_YZ (2 << TMAG5273_ANGLE_EN_POS)
#define TMAG5273_ANGLE_EN_XZ (3 << TMAG5273_ANGLE_EN_POS)
#define TMAG5273_X_Y_MEAS_RANGE_LOW (0 << TMAG5273_X_Y_RANGE_POS)
#define TMAG5273_X_Y_MEAS_RANGE_HIGH (1 << TMAG5273_X_Y_RANGE_POS)
#define TMAG5273_Z_MEAS_RANGE_LOW (0 << TMAG5273_Z_RANGE_POS)
#define TMAG5273_Z_MEAS_RANGE_HIGH (1 << TMAG5273_Z_RANGE_POS)
#define TMAG5273_XYZ_MEAS_RANGE_LOW (TMAG5273_X_Y_MEAS_RANGE_LOW | TMAG5273_Z_MEAS_RANGE_LOW)
#define TMAG5273_XYZ_MEAS_RANGE_HIGH (TMAG5273_X_Y_MEAS_RANGE_HIGH | TMAG5273_Z_MEAS_RANGE_HIGH)
/* Register T_CONFIG */
#define TMAG5273_T_THR_CONFIG_POS 1
#define TMAG5273_T_CH_EN_POS 0
#define TMAG5273_T_CH_EN_DISABLED (0 << TMAG5273_T_CH_EN_POS)
#define TMAG5273_T_CH_EN_ENABLED (1 << TMAG5273_T_CH_EN_POS)
/* Register INT_CONFIG_1 */
#define TMAG5273_INT_RSLT_INT_POS 7
#define TMAG5273_INT_THRSLD_INT_POS 6
#define TMAG5273_INT_STATE_POS 5
#define TMAG5273_INT_MODE_POS 2
#define TMAG5273_INT_MASK_INTB_POS 0
#define TMAG5273_INT_RSLT_INT_DISABLED (0 << TMAG5273_INT_RSLT_INT_POS)
#define TMAG5273_INT_RSLT_INT_ENABLED (1 << TMAG5273_INT_RSLT_INT_POS)
#define TMAG5273_INT_THRSLD_INT_DISABLED (0 << TMAG5273_INT_THRSLD_INT_POS)
#define TMAG5273_INT_THRSLD_INT_ENABLED (1 << TMAG5273_INT_THRSLD_INT_POS)
#define TMAG5273_INT_STATE_LATCHED (0 << TMAG5273_INT_STATE_POS)
#define TMAG5273_INT_STATE_PULSE (1 << TMAG5273_INT_STATE_POS)
#define TMAG5273_INT_MODE_NONE (0 << TMAG5273_INT_MODE_POS)
#define TMAG5273_INT_MODE_INT (1 << TMAG5273_INT_MODE_POS)
#define TMAG5273_INT_MODE_INT_EXC_I2C (2 << TMAG5273_INT_MODE_POS)
#define TMAG5273_INT_MODE_SCL (3 << TMAG5273_INT_MODE_POS)
#define TMAG5273_INT_MODE_SCL_EXC_I2C (4 << TMAG5273_INT_MODE_POS)
#define TMAG5273_INT_MASK_INTB_PIN_ENABLED (0 << TMAG5273_INT_MASK_INTB_POS)
#define TMAG5273_INT_MASK_INTB_PIN_MASKED (1 << TMAG5273_INT_MASK_INTB_POS)
/* Register I2C_ADDRESS */
#define TMAG5273_I2C_ADDRESS_POS 1
#define TMAG5273_I2C_ADDRESS_UPDATE_EN_POS 0
#define TMAG5273_I2C_ADDRESS_UPDATE_DISABLE (0 << TMAG5273_I2C_ADDRESS_UPDATE_EN_POS)
#define TMAG5273_I2C_ADDRESS_UPDATE_ENABLE (1 << TMAG5273_I2C_ADDRESS_UPDATE_EN_POS)
/* Register DEVICE_ID */
#define TMAG5273_VER_POS 0
#define TMAG5273_VER_MSK GENMASK(1, 0)
#define TMAG5273_VER_TMAG5273X1 (1 << TMAG5273_VER_POS)
#define TMAG5273_VER_TMAG5273X2 (2 << TMAG5273_VER_POS)
/* Register CONV_STATUS */
#define TMAG5273_SET_COUNT_POS 5
#define TMAG5273_POR_POS 4
#define TMAG5273_DIAG_STATUS_POS 1
#define TMAG5273_RESULT_STATUS_POS 0
#define TMAG5273_DIAG_STATUS_MSK GENMASK(1, 1)
#define TMAG5273_RESULT_STATUS_MSK GENMASK(0, 0)
#define TMAG5273_POR_OCCURRED (1 << TMAG5273_POR_POS)
#define TMAG5273_DIAG_FAIL (1 << TMAG5273_DIAG_STATUS_POS)
#define TMAG5273_CONVERSION_COMPLETE (1 << TMAG5273_RESULT_STATUS_POS)
/* Register DEVICE_STATUS */
#define TMAG5273_INTB_RB_POS 4
#define TMAG5273_OSC_ER_POS 3
#define TMAG5273_INT_ER_POS 2
#define TMAG5273_OTP_CRC_ER_POS 1
#define TMAG5273_VCC_UV_ER_POS 0
#define TMAG5273_INTB_RB_MSK GENMASK(4, 4)
#define TMAG5273_OSC_ER_MSK GENMASK(3, 3)
#define TMAG5273_INT_ER_MSK GENMASK(2, 2)
#define TMAG5273_OTP_CRC_ER_MSK GENMASK(1, 1)
#define TMAG5273_VCC_UV_ER_MSK GENMASK(0, 0)
#define TMAG5273_INTB_PIN_HIGH (1 << TMAG5273_INTB_RB_POS)
#define TMAG5273_OSC_ERR (1 << TMAG5273_OSC_ER_POS)
#define TMAG5273_INT_ERR (1 << TMAG5273_INT_ER_POS)
#define TMAG5273_OTP_CRC_ERR (1 << TMAG5273_OTP_CRC_ER_POS)
#define TMAG5273_VCC_UV_ERR (1 << TMAG5273_VCC_UV_ER_POS)
#define TMAG5273_RESET_DEVICE_STATUS 0xF
/* additional values */
#define TMAG5273_MANUFACTURER_ID_MSB 0x54
#define TMAG5273_MANUFACTURER_ID_LSB 0x49
#define TMAG5273_MEAS_RANGE_LOW_MT_VER1 40
#define TMAG5273_MEAS_RANGE_HIGH_MT_VER1 80
#define TMAG5273_MEAS_RANGE_LOW_MT_VER2 133
#define TMAG5273_MEAS_RANGE_HIGH_MT_VER2 266
#define TMAG5273_TEMPERATURE_T_SENS_T0 25
#define TMAG5273_TEMPERATURE_T_ADC_T0 17508
#define TMAG5273_TEMPERATURE_T_ADC_RES 60.1
#define TMAG5273_T_START_SLEEP_US 50
#define TMAG5273_T_GO_SLEEP_US 20
/**
* @brief calculate conversion time as defined in the datasheet
* @param avg set averaging value
* @param nb_channels number of captured channels
*/
#define TMAG5273_T_CONVERSION_US(avg, nb_channels) (((1 << avg) * 25) * nb_channels + 25)
/** OR this bit to any register address to trigger a conversion in standby mode */
#define TMAG5273_CONVERSION_START_BIT 0x80
#endif /* ZEPHYR_DRIVERS_SENSOR_TMAG5273_H_ */