Boot Linux faster!

Check our new training course

Boot Linux faster!

Check our new training course
and Creative Commons CC-BY-SA
lecture and lab materials

Bootlin logo

Elixir Cross Referencer

/*
 * 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 */