drivers: Add support for TI TMAG5273 3D Hall sensor

Product Homepage:
https://www.ti.com/product/TMAG5273

Datasheet:
https://www.ti.com/lit/ds/symlink/tmag5273.pdf

Tested on a custom hardware with nRF52840.

Signed-off-by: Juliane Schulze <juliane.schulze@deveritec.com>
This commit is contained in:
Juliane Schulze 2023-01-03 09:44:50 +01:00 committed by Maureen Helm
commit 1683f1913b
10 changed files with 1842 additions and 0 deletions

View file

@ -149,6 +149,7 @@ add_subdirectory_ifdef(CONFIG_TH02 th02)
add_subdirectory_ifdef(CONFIG_TI_HDC ti_hdc)
add_subdirectory_ifdef(CONFIG_TI_HDC20XX ti_hdc20xx)
add_subdirectory_ifdef(CONFIG_TMAG5170 tmag5170)
add_subdirectory_ifdef(CONFIG_TMAG5273 tmag5273)
add_subdirectory_ifdef(CONFIG_TMD2620 tmd2620)
add_subdirectory_ifdef(CONFIG_TMP007 tmp007)
add_subdirectory_ifdef(CONFIG_TMP108 tmp108)

View file

@ -229,6 +229,7 @@ source "drivers/sensor/th02/Kconfig"
source "drivers/sensor/ti_hdc/Kconfig"
source "drivers/sensor/ti_hdc20xx/Kconfig"
source "drivers/sensor/tmag5170/Kconfig"
source "drivers/sensor/tmag5273/Kconfig"
source "drivers/sensor/tmd2620/Kconfig"
source "drivers/sensor/tmp007/Kconfig"
source "drivers/sensor/tmp108/Kconfig"

View file

@ -0,0 +1,5 @@
# SPDX-License-Identifier: Apache-2.0
zephyr_library()
zephyr_library_sources(tmag5273.c)

View file

@ -0,0 +1,14 @@
# TMAG5273 Low-Power Linear 3D Hall-Effect Sensor configuration options
# Copyright (c) 2023 deveritec GmbH
# SPDX-License-Identifier: Apache-2.0
config TMAG5273
bool "TMAG5273 3D Hall-Effect Sensor"
default y
depends on DT_HAS_TI_TMAG5273_ENABLED
select I2C
select GPIO
imply CRC
help
Enable driver for TMAG5273 I2C-based 3d Hall-Effect sensor.

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,262 @@
/*
* 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_ */

View file

@ -0,0 +1,169 @@
# Copyright (c) 2023, deveritec GmbH
# SPDX-License-Identifier: Apache-2.0
description: |
Texas Instruments TMAG5273 Low-Power Linear 3D Hall-Effect Sensor with an I2C interface.
See the specification for the default I2C address.
The specification of the sensor can be found at:
https://www.ti.com/lit/ds/symlink/tmag5273.pdf
When setting the enum properties in a .dts or .dtsi file you may
include tmag5273.h and use the macros defined there.
Example:
#include <zephyr/dt-bindings/sensor/tmag5273.h>
tmag5273: tmag5273@0 {
...
axis = <TMAG5273_DT_AXIS_XYZ>;
range = <TMAG5273_DT_AXIS_RANGE_HIGH>;
};
compatible: "ti,tmag5273"
include: [sensor-device.yaml, i2c-device.yaml]
properties:
operation-mode:
type: int
default: 0
enum: [0, 1]
description: |
Sensor mode used if set to "active".
Defaults to continuous sampling (TMAG5273_DT_OPER_MODE_CONTINUOUS).
- 0 # TMAG5273_DT_OPER_MODE_CONTINUOUS (continuous)
- 1 # TMAG5273_DT_OPER_MODE_STANDBY (standby)
axis:
type: int
default: 7
enum: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
description: |
Magnet axis channel inputs.
Defaults to measure all axis (TMAG5273_DT_AXIS_XYZ).
- 0 # TMAG5273_DT_AXIS_NONE
- 1 # TMAG5273_DT_AXIS_X
- 2 # TMAG5273_DT_AXIS_Y
- 3 # TMAG5273_DT_AXIS_Z
- 4 # TMAG5273_DT_AXIS_XY
- 5 # TMAG5273_DT_AXIS_XZ
- 6 # TMAG5273_DT_AXIS_YZ
- 7 # TMAG5273_DT_AXIS_XYZ
- 8 # TMAG5273_DT_AXIS_XYX (pseudo-simultaneous sampling)
- 9 # TMAG5273_DT_AXIS_YXY (pseudo-simultaneous sampling)
- 10 # TMAG5273_DT_AXIS_YZY (pseudo-simultaneous sampling)
- 11 # TMAG5273_DT_AXIS_XZX (pseudo-simultaneous sampling)
temperature:
type: boolean
description: |
Select for temperature measurement.
range:
type: int
default: 1
enum: [0, 1, 2]
description: |
XYZ-measurement range for magnetic-field value.
Defaults to lower range (higher resolution; TMAG5273_DT_AXIS_RANGE_LOW).
- 0 # TMAG5273_DT_AXIS_RANGE_LOW (+/-40 mT (TMAG5273A1) or +/-133 mT (TMAG5273A2))
- 1 # TMAG5273_DT_AXIS_RANGE_HIGH (+/-80 mT (TMAG5273A1) or +/-266 mT (TMAG5273A2))
- 2 # TMAG5273_DT_AXIS_RANGE_RUNTIME (@runtime (initial value is: "high"))
int-gpios:
type: phandle-array
description: |
The INT signal connection.
The signal is active-low as produced by the sensor.
Either used for interrupt signaling, or triggering a conversion.
temperature-coefficient:
type: int
default: 0
enum: [0, 1, 2]
description: |
Selects the magnet temperature coefficient.
Defaults to none (TMAG5273_DT_TEMP_COEFF_NONE).
- 0 # TMAG5273_DT_TEMP_COEFF_NONE (none)
- 1 # TMAG5273_DT_TEMP_COEFF_NDBFE (0.12 %/deg C (NdBFe))
- 2 # TMAG5273_DT_TEMP_COEFF_CERAMIC (0.2 %/deg C (Ceramic))
Ignored if temperature is not measured.
trigger-conversion-via-int:
type: boolean
description: |
Selects initiation of a single conversion based on a trigger via
the INT-pin if enabled, and via I2C-command if disabled.
Used in "standby"-, "wakeup-and-sleep"- and "sleep"-mode.
Using I2C-conversion trigger may result in (handled) I2C-errors.
angle-magnitude-axis:
type: int
default: 0
enum: [0, 1, 2, 3, 4]
description: |
Enables angle calculation, magnetic gain, and offset corrections
between two selected magnetic channels.
Defaults to no additional calculations (TMAG5273_DT_ANGLE_MAG_NONE).
- 0 # TMAG5273_DT_ANGLE_MAG_NONE (deactivated)
- 1 # TMAG5273_DT_ANGLE_MAG_XY (x/y)
- 2 # TMAG5273_DT_ANGLE_MAG_YZ (y/z)
- 3 # TMAG5273_DT_ANGLE_MAG_XZ (x/z)
- 4 # TMAG5273_DT_ANGLE_MAG_RUNTIME (@runtime (initial value is: "deactivated"))
ch-mag-gain-correction:
type: int
default: 0
enum: [0, 1]
description: |
Channel for the magnitude gain correction.
Defaults to 1st channel.
- 0 # TMAG5273_DT_CORRECTION_CH_1 (1st channel)
- 1 # TMAG5273_DT_CORRECTION_CH_2 (2nd channel)
Only active if angle-magnitude-calculation is active.
average-mode:
type: int
default: 1
enum: [0, 1, 2, 3, 4, 5]
description: |
Enables additional sampling of the sensor data to reduce the noise effect
(or to increase resolution).
Note that averaging will influence the output data rate.
Defaults to 2x averaging (TMAG5273_DT_AVERAGING_2X).
- 0 # TMAG5273_DT_AVERAGING_NONE (10.0-kSPS (3-axes) or 20-kSPS (1 axis))
- 1 # TMAG5273_DT_AVERAGING_2X (5.7-kSPS (3-axes) or 13.3-kSPS (1 axis))
- 2 # TMAG5273_DT_AVERAGING_4X (3.1-kSPS (3-axes) or 8.0-kSPS (1 axis))
- 3 # TMAG5273_DT_AVERAGING_8X (1.6-kSPS (3-axes) or 4.4-kSPS (1 axis))
- 4 # TMAG5273_DT_AVERAGING_16X (0.8-kSPS (3-axes) or 2.4-kSPS (1 axis))
- 5 # TMAG5273_DT_AVERAGING_32X (0.4-kSPS (3-axes) or 1.2-kSPS (1 axis))
crc-enabled:
type: boolean
description: |
Activate I2C CRC byte to be sent.
low-noise:
type: boolean
description: |
Select low-noise mode when enabled, and low-power mode when disabled.
ignore-diag-fail:
type: boolean
description: |
Ignore detected diagnostic fail.
According to the manual, this should be done if VCC < 2.3V.

View file

@ -0,0 +1,64 @@
/*
* Copyright (c) 2016 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_INCLUDE_DRIVERS_SENSOR_TMAG5273_H_
#define ZEPHYR_INCLUDE_DRIVERS_SENSOR_TMAG5273_H_
#ifdef __cplusplus
extern "C" {
#endif
#include <zephyr/drivers/sensor.h>
/* --- Additional TMAG5273 definitions */
/** Additional channels supported by the TMAG5273 */
enum tmag5273_sensor_channel {
/**
* Magnitude measurement result between two axis in Gs.
*/
TMAG5273_CHAN_MAGNITUDE = SENSOR_CHAN_PRIV_START,
/**
* Magnitude measurement MSB as returned by the sensor.
*/
TMAG5273_CHAN_MAGNITUDE_MSB,
/**
* Angle result in deg, magnitude result in Gs and magnitude MSB between two axis.
*/
TMAG5273_CHAN_ANGLE_MAGNITUDE,
};
/** Additional attributes supported by the TMAG5273 */
enum tmag5273_attribute {
/**
* Define axis relation measurements.
* Supported values are:
* - \c TMAG5273_DT_ANGLE_MAG_NONE (0)
* - \c TMAG5273_DT_ANGLE_MAG_XY (1)
* - \c TMAG5273_DT_ANGLE_MAG_YZ (2)
* - \c TMAG5273_DT_ANGLE_MAG_XZ (3)
*
* Only available if calculation source can be changed during runtime.
*/
TMAG5273_ATTR_ANGLE_MAG_AXIS = SENSOR_ATTR_PRIV_START,
};
/**
* Supported values
*/
#define TMAG5273_ANGLE_CALC_NONE 0
#define TMAG5273_ANGLE_CALC_XY 1
#define TMAG5273_ANGLE_CALC_YZ 2
#define TMAG5273_ANGLE_CALC_XZ 3
#ifdef __cplusplus
}
#endif
#endif /* ZEPHYR_INCLUDE_DRIVERS_SENSOR_TMAG5273_H_ */

View file

@ -0,0 +1,89 @@
/*
* Copyright (c) 2023 deveritec GmbH
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_INCLUDE_DT_BINDINGS_TMAG5273_H_
#define ZEPHYR_INCLUDE_DT_BINDINGS_TMAG5273_H_
#include <zephyr/dt-bindings/dt-util.h>
/* Operating Mode */
#define TMAG5273_DT_OPER_MODE_CONTINUOUS 0
#define TMAG5273_DT_OPER_MODE_STANDBY 1
/* Axis */
#define TMAG5273_DT_AXIS_NONE 0x0
#define TMAG5273_DT_AXIS_X 0x1
#define TMAG5273_DT_AXIS_Y 0x2
#define TMAG5273_DT_AXIS_Z 0x4
#define TMAG5273_DT_AXIS_XY (TMAG5273_DT_AXIS_X | TMAG5273_DT_AXIS_Y)
#define TMAG5273_DT_AXIS_XZ (TMAG5273_DT_AXIS_X | TMAG5273_DT_AXIS_Z)
#define TMAG5273_DT_AXIS_YZ (TMAG5273_DT_AXIS_Y | TMAG5273_DT_AXIS_Z)
#define TMAG5273_DT_AXIS_XYZ (TMAG5273_DT_AXIS_X | TMAG5273_DT_AXIS_Y | TMAG5273_DT_AXIS_Z)
#define TMAG5273_DT_AXIS_XYX 0x8
#define TMAG5273_DT_AXIS_YXY 0x9
#define TMAG5273_DT_AXIS_YZY 0xA
#define TMAG5273_DT_AXIS_XZX 0xB
/* Range */
#define TMAG5273_DT_AXIS_RANGE_LOW 0
#define TMAG5273_DT_AXIS_RANGE_HIGH 1
#define TMAG5273_DT_AXIS_RANGE_RUNTIME 2
/* Interrupt-Mode */
#define TMAG5273_DT_INT_THROUGH_INT 0
#define TMAG5273_DT_INT_THROUGH_INT_EXC_I2C 1
#define TMAG5273_DT_INT_THROUGH_SCL 2
#define TMAG5273_DT_INT_THROUGH_SCL_EXC_I2C 3
/* Threshold crossings */
#define TMAG5273_DT_THRX_COUNT_1 0
#define TMAG5273_DT_THRX_COUNT_4 1
/* Threshold direction */
#define TMAG5273_DT_THRX_ABOVE 0
#define TMAG5273_DT_THRX_BELOW 1
#define TMAG5273_DT_THRX_OUTSIDE 2
#define TMAG5273_DT_THRX_INSIDE 3
/* Temperature coefficient */
#define TMAG5273_DT_TEMP_COEFF_NONE 0
#define TMAG5273_DT_TEMP_COEFF_NDBFE 1
#define TMAG5273_DT_TEMP_COEFF_CERAMIC 2
/* Angle/Magnitude calculation */
#define TMAG5273_DT_ANGLE_MAG_NONE 0
#define TMAG5273_DT_ANGLE_MAG_XY 1
#define TMAG5273_DT_ANGLE_MAG_YZ 2
#define TMAG5273_DT_ANGLE_MAG_XZ 3
#define TMAG5273_DT_ANGLE_MAG_RUNTIME 4
/* Channel Magnitude Gain Correction */
#define TMAG5273_DT_CORRECTION_CH_1 0
#define TMAG5273_DT_CORRECTION_CH_2 1
/* Averaging */
#define TMAG5273_DT_AVERAGING_NONE 0
#define TMAG5273_DT_AVERAGING_2X 1
#define TMAG5273_DT_AVERAGING_4X 2
#define TMAG5273_DT_AVERAGING_8X 3
#define TMAG5273_DT_AVERAGING_16X 4
#define TMAG5273_DT_AVERAGING_32X 5
/* Sleeptime */
#define TMAG5273_DT_SLEEPTIME_1MS 0
#define TMAG5273_DT_SLEEPTIME_5MS 1
#define TMAG5273_DT_SLEEPTIME_10MS 2
#define TMAG5273_DT_SLEEPTIME_15MS 3
#define TMAG5273_DT_SLEEPTIME_20MS 4
#define TMAG5273_DT_SLEEPTIME_30MS 5
#define TMAG5273_DT_SLEEPTIME_50MS 6
#define TMAG5273_DT_SLEEPTIME_100MS 7
#define TMAG5273_DT_SLEEPTIME_500MS 8
#define TMAG5273_DT_SLEEPTIME_1000MS 9
#define TMAG5273_DT_SLEEPTIME_2000MS 10
#define TMAG5273_DT_SLEEPTIME_5000MS 11
#define TMAG5273_DT_SLEEPTIME_20000MS 12
#endif /* ZEPHYR_INCLUDE_DT_BINDINGS_TMAG5273_H_ */

View file

@ -19,6 +19,7 @@
#include <zephyr/dt-bindings/sensor/iis2iclx.h>
#include <zephyr/dt-bindings/sensor/lis2du12.h>
#include <zephyr/dt-bindings/sensor/lis2de12.h>
#include <zephyr/dt-bindings/sensor/tmag5273.h>
/****************************************
* PLEASE KEEP REG ADDRESSES SEQUENTIAL *
@ -915,3 +916,13 @@ test_i2c_vishay_vcnl36825t: vcnl36825t@81 {
low-power;
};
test_i2c_tmag5273: tmag5273@82 {
compatible = "ti,tmag5273";
status = "okay";
reg = <0x82>;
int-gpios = <&test_gpio 15 1>;
operation-mode = <TMAG5273_DT_OPER_MODE_CONTINUOUS>;
angle-magnitude-axis = <TMAG5273_DT_ANGLE_MAG_XY>;
};