138 lines
4.1 KiB
C
138 lines
4.1 KiB
C
/*
|
|
* Copyright (c) 2018 STMicroelectronics
|
|
*
|
|
* LIS2MDL mag header file
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#ifndef __MAG_LIS2MDL_H
|
|
#define __MAG_LIS2MDL_H
|
|
|
|
#include <gpio.h>
|
|
#include <misc/util.h>
|
|
#include <i2c.h>
|
|
|
|
#define LIS2MDL_EN_BIT 1
|
|
#define LIS2MDL_DIS_BIT 0
|
|
#define LIS2MDL_I2C_ADDR(__x) (__x << 1)
|
|
|
|
#define LIS2MDL_AUTO_INCREMENT 0x80
|
|
|
|
/* Registers */
|
|
#define LIS2MDL_WHO_AM_I_REG 0x4f
|
|
#define LIS2MDL_WHOAMI_VAL 0x40
|
|
|
|
#define LIS2MDL_CFG_REG_A 0x60
|
|
/* Device supported modes */
|
|
#define LIS2MDL_MD_CONT_MODE 0x00
|
|
#define LIS2MDL_MD_SINGLE_MODE 0x01
|
|
#define LIS2MDL_MD_IDLE1_MODE 0x02
|
|
#define LIS2MDL_MD_IDLE2_MODE 0x03
|
|
#define LIS2MDL_MAG_MODE_MASK 0x03
|
|
/* Device supported ODRs */
|
|
#define LIS2MDL_ODR10_HZ 0x00
|
|
#define LIS2MDL_ODR20_HZ 0x04
|
|
#define LIS2MDL_ODR50_HZ 0x08
|
|
#define LIS2MDL_ODR100_HZ 0x0c
|
|
#define LIS2MDL_ODR_MASK 0x0c
|
|
|
|
#if defined(CONFIG_LIS2MDL_MAG_ODR_10) || \
|
|
defined(CONFIG_LIS2MDL_MAG_ODR_RUNTIME)
|
|
#define LIS2MDL_DEFAULT_ODR LIS2MDL_ODR10_HZ
|
|
#elif defined(CONFIG_LIS2MDL_MAG_ODR_20)
|
|
#define LIS2MDL_DEFAULT_ODR LIS2MDL_ODR20_HZ
|
|
#elif defined(CONFIG_LIS2MDL_MAG_ODR_50)
|
|
#define LIS2MDL_DEFAULT_ODR LIS2MDL_ODR50_HZ
|
|
#elif defined(CONFIG_LIS2MDL_MAG_ODR_100)
|
|
#define LIS2MDL_DEFAULT_ODR LIS2MDL_ODR100_HZ
|
|
#endif
|
|
|
|
/* Sensors registers */
|
|
#define LIS2MDL_OFFSET_X_REG_L 0x45
|
|
#define LIS2MDL_OFFSET_X_REG_H 0x46
|
|
#define LIS2MDL_OFFSET_Y_REG_L 0x47
|
|
#define LIS2MDL_OFFSET_Y_REG_H 0x48
|
|
#define LIS2MDL_OFFSET_Z_REG_L 0x49
|
|
#define LIS2MDL_OFFSET_Z_REG_H 0x4A
|
|
#define LIS2MDL_CFG_REG_B 0x61
|
|
#define LIS2MDL_CFG_REG_C 0x62
|
|
#define LIS2MDL_INT_CTRL_REG 0x63
|
|
#define LIS2MDL_STATUS_REG 0x67
|
|
#define LIS2MDL_OUT_REG 0x68
|
|
#define LIS2MDL_TEMP_OUT_L_REG 0x6E
|
|
#define LIS2MDL_TEMP_OUT_H_REG 0x6F
|
|
|
|
/* Registers bitmask */
|
|
#define LIS2MDL_STS_MDA_UP 0x08
|
|
#define LIS2MDL_REBOOT 0x40
|
|
#define LIS2MDL_SOFT_RST 0x20
|
|
#define LIS2MDL_BDU_MASK 0x10
|
|
#define LIS2MDL_BDU_BIT 0x10
|
|
#define LIS2MDL_INT_MAG_PIN 0x40
|
|
#define LIS2MDL_INT_MAG_PIN_MASK 0x40
|
|
#define LIS2MDL_INT_MAG 0x01
|
|
#define LIS2MDL_INT_MAG_MASK 0x01
|
|
#define LIS2MDL_MODE_MASK 0x03
|
|
#define LIS2MDL_LP_MASK 0x10
|
|
#define LIS2MDL_IEA 0x04
|
|
#define LIS2MDL_IEL 0x02
|
|
#define LIS2MDL_IEN 0x01
|
|
#define LIS2MDL_COMP_TEMP_MASK 0x80
|
|
|
|
/* Output data size */
|
|
#define LIS2MDL_OUT_REG_SIZE 6
|
|
#define LIS2MDL_NUM_AXIS 3
|
|
|
|
/* Define ODR supported range */
|
|
#define LIS2MDL_MAX_ODR 100
|
|
#define LIS2MDL_MIN_ODR 10
|
|
|
|
/* Sensor sensitivity in uGa/LSB */
|
|
#define LIS2MDL_SENSITIVITY 1500
|
|
|
|
struct lis2mdl_device_config {
|
|
char *master_dev_name;
|
|
#ifdef CONFIG_LIS2MDL_TRIGGER
|
|
char *gpio_name;
|
|
u32_t gpio_pin;
|
|
#endif /* CONFIG_LIS2MDL_TRIGGER */
|
|
u16_t i2c_addr_config;
|
|
};
|
|
|
|
/* Sensor data */
|
|
struct lis2mdl_data {
|
|
struct device *i2c;
|
|
u16_t i2c_addr;
|
|
s16_t mag[3];
|
|
s32_t temp_sample;
|
|
|
|
/* save sensitivity */
|
|
u16_t mag_fs_sensitivity;
|
|
|
|
#ifdef CONFIG_LIS2MDL_TRIGGER
|
|
struct device *gpio;
|
|
struct gpio_callback gpio_cb;
|
|
|
|
sensor_trigger_handler_t handler_drdy;
|
|
|
|
#if defined(CONFIG_LIS2MDL_TRIGGER_OWN_THREAD)
|
|
K_THREAD_STACK_MEMBER(thread_stack, CONFIG_LIS2MDL_THREAD_STACK_SIZE);
|
|
struct k_thread thread;
|
|
struct k_sem gpio_sem;
|
|
#elif defined(CONFIG_LIS2MDL_TRIGGER_GLOBAL_THREAD)
|
|
struct k_work work;
|
|
struct device *dev;
|
|
#endif /* CONFIG_LIS2MDL_TRIGGER_GLOBAL_THREAD */
|
|
#endif /* CONFIG_LIS2MDL_TRIGGER */
|
|
};
|
|
|
|
#ifdef CONFIG_LIS2MDL_TRIGGER
|
|
int lis2mdl_init_interrupt(struct device *dev);
|
|
int lis2mdl_trigger_set(struct device *dev,
|
|
const struct sensor_trigger *trig,
|
|
sensor_trigger_handler_t handler);
|
|
#endif /* CONFIG_LIS2MDL_TRIGGER */
|
|
|
|
#endif /* __MAG_LIS2MDL_H */
|