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:
parent
ba85dac6ff
commit
1683f1913b
10 changed files with 1842 additions and 0 deletions
|
@ -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)
|
||||
|
|
|
@ -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"
|
||||
|
|
5
drivers/sensor/tmag5273/CMakeLists.txt
Normal file
5
drivers/sensor/tmag5273/CMakeLists.txt
Normal file
|
@ -0,0 +1,5 @@
|
|||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
zephyr_library()
|
||||
|
||||
zephyr_library_sources(tmag5273.c)
|
14
drivers/sensor/tmag5273/Kconfig
Normal file
14
drivers/sensor/tmag5273/Kconfig
Normal 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.
|
1226
drivers/sensor/tmag5273/tmag5273.c
Normal file
1226
drivers/sensor/tmag5273/tmag5273.c
Normal file
File diff suppressed because it is too large
Load diff
262
drivers/sensor/tmag5273/tmag5273.h
Normal file
262
drivers/sensor/tmag5273/tmag5273.h
Normal 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_ */
|
169
dts/bindings/sensor/ti,tmag5273.yaml
Normal file
169
dts/bindings/sensor/ti,tmag5273.yaml
Normal 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.
|
64
include/zephyr/drivers/sensor/tmag5273.h
Normal file
64
include/zephyr/drivers/sensor/tmag5273.h
Normal 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_ */
|
89
include/zephyr/dt-bindings/sensor/tmag5273.h
Normal file
89
include/zephyr/dt-bindings/sensor/tmag5273.h
Normal 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_ */
|
|
@ -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>;
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue