sensor: add lsm6dsl sensor driver
Support for LSM6DSL accelerometer and gyroscpe sensor with bare minimum features. For more info on this sensor: http://www.st.com/en/mems-and-sensors/lsm6dsl.html Change-Id: I9b100a3e030faa8a70a5015a881025c876b81be4 Signed-off-by: Erwan Gouriou <erwan.gouriou@linaro.org>
This commit is contained in:
parent
411919661e
commit
e015c00300
6 changed files with 1254 additions and 0 deletions
|
@ -82,6 +82,8 @@ source "drivers/sensor/lps25hb/Kconfig"
|
|||
|
||||
source "drivers/sensor/lsm6ds0/Kconfig"
|
||||
|
||||
source "drivers/sensor/lsm6dsl/Kconfig"
|
||||
|
||||
source "drivers/sensor/lsm9ds0_gyro/Kconfig"
|
||||
|
||||
source "drivers/sensor/lsm9ds0_mfd/Kconfig"
|
||||
|
|
|
@ -21,6 +21,7 @@ obj-$(CONFIG_LIS3MDL) += lis3mdl/
|
|||
obj-$(CONFIG_LPS22HB) += lps22hb/
|
||||
obj-$(CONFIG_LPS25HB) += lps25hb/
|
||||
obj-$(CONFIG_LSM6DS0) += lsm6ds0/
|
||||
obj-$(CONFIG_LSM6DSL) += lsm6dsl/
|
||||
obj-$(CONFIG_LSM9DS0_GYRO) += lsm9ds0_gyro/
|
||||
obj-$(CONFIG_LSM9DS0_MFD) += lsm9ds0_mfd/
|
||||
obj-$(CONFIG_MAX30101) += max30101/
|
||||
|
|
94
drivers/sensor/lsm6dsl/Kconfig
Normal file
94
drivers/sensor/lsm6dsl/Kconfig
Normal file
|
@ -0,0 +1,94 @@
|
|||
# Kconfig - LSM6DSL accelerometer and gyroscope sensor configuration
|
||||
# options
|
||||
|
||||
#
|
||||
# Copyright (c) 2017 Linaro Limited
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
menuconfig LSM6DSL
|
||||
bool "LSM6DSL I2C accelerometer and gyroscope Chip"
|
||||
depends on SENSOR && I2C
|
||||
default n
|
||||
help
|
||||
Enable driver for LSM6DSL I2C-based accelerometer and gyroscope
|
||||
sensor.
|
||||
|
||||
config LSM6DSL_DEV_NAME
|
||||
string "LSM6DSL device name"
|
||||
depends on LSM6DSL
|
||||
default "LSM6DSL"
|
||||
|
||||
config LSM6DSL_I2C_ADDR
|
||||
hex
|
||||
prompt "LSM6DSL I2C address"
|
||||
depends on LSM6DSL
|
||||
default 0x6A
|
||||
range 0x6A 0x6B
|
||||
help
|
||||
I2C address of the LSM6DSL sensor.
|
||||
Use 0x6A if the SA0 pin is pulled to GND or 0x6B if the SA0 pin
|
||||
is pulled to VCC.
|
||||
|
||||
config LSM6DSL_I2C_MASTER_DEV_NAME
|
||||
string "I2C master where LSM6DSL chip is connected"
|
||||
depends on LSM6DSL
|
||||
default I2C_0_NAME
|
||||
help
|
||||
Specify the device name of the I2C master device to which LSM6DSL is
|
||||
connected.
|
||||
|
||||
config LSM6DSL_ENABLE_TEMP
|
||||
bool "Enable temperature"
|
||||
depends on LSM6DSL
|
||||
default n
|
||||
help
|
||||
Enable/disable temperature
|
||||
|
||||
menu "Attributes"
|
||||
depends on LSM6DSL
|
||||
|
||||
config LSM6DSL_GYRO_FULLSCALE
|
||||
int
|
||||
prompt "Gyroscope full-scale range"
|
||||
depends on LSM6DSL
|
||||
default 2000
|
||||
help
|
||||
Specify the default gyroscope full-scale range.
|
||||
An X value for the config represents a range of +/- X degree per
|
||||
second. Valid values are 125, 245, 500, 1000 and 2000.
|
||||
|
||||
config LSM6DSL_GYRO_SAMPLING_RATE
|
||||
int
|
||||
prompt "Output data rate"
|
||||
depends on LSM6DSL
|
||||
default 26
|
||||
help
|
||||
Specify the default gyroscope output data rate expressed in samples
|
||||
per second (Hz).
|
||||
Data rates supported by the chip are 0, 13, 26, 52, 104, 208, 416,
|
||||
833, 1660, 3330, 6660.
|
||||
|
||||
config LSM6DSL_ACCEL_FULLSCALE
|
||||
int
|
||||
prompt "Accelerometer full-scale range"
|
||||
depends on LSM6DSL
|
||||
default 2
|
||||
help
|
||||
Specify the default accelerometer full-scale range.
|
||||
An X value for the config represents a range of +/- X G. Valid values
|
||||
are 2, 4, 8 and 16.
|
||||
|
||||
config LSM6DSL_ACCEL_SAMPLING_RATE
|
||||
int
|
||||
prompt "Output data rate"
|
||||
depends on LSM6DSL
|
||||
default 26
|
||||
help
|
||||
Specify the default accelerometer output data rate expressed in
|
||||
samples per second (Hz).
|
||||
Data rates supported by the chip are 0, 2, 13, 26, 52, 104, 208,
|
||||
416, 833, 1660, 3330, 6660.
|
||||
|
||||
endmenu
|
1
drivers/sensor/lsm6dsl/Makefile
Normal file
1
drivers/sensor/lsm6dsl/Makefile
Normal file
|
@ -0,0 +1 @@
|
|||
obj-$(CONFIG_LSM6DSL) += lsm6dsl.o
|
444
drivers/sensor/lsm6dsl/lsm6dsl.c
Normal file
444
drivers/sensor/lsm6dsl/lsm6dsl.c
Normal file
|
@ -0,0 +1,444 @@
|
|||
/* lsm6dsl.c - Driver for LSM6DSL accelerometer, gyroscope and
|
||||
* temperature sensor
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2017 Linaro Limited
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#include <sensor.h>
|
||||
#include <kernel.h>
|
||||
#include <device.h>
|
||||
#include <init.h>
|
||||
#include <misc/byteorder.h>
|
||||
#include <misc/__assert.h>
|
||||
|
||||
#include "lsm6dsl.h"
|
||||
|
||||
static inline int lsm6dsl_reboot(struct device *dev)
|
||||
{
|
||||
struct lsm6dsl_data *data = dev->driver_data;
|
||||
const struct lsm6dsl_config *config = dev->config->config_info;
|
||||
|
||||
if (i2c_reg_update_byte(data->i2c_master, config->i2c_slave_addr,
|
||||
LSM6DSL_REG_CTRL3_C,
|
||||
LSM6DSL_MASK_CTRL3_C_BOOT,
|
||||
1 << LSM6DSL_SHIFT_CTRL3_C_BOOT) < 0) {
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
/* Wait sensor turn-on time as per datasheet */
|
||||
k_busy_wait(35 * USEC_PER_MSEC);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int lsm6dsl_accel_set_fs_raw(struct device *dev, u8_t fs)
|
||||
{
|
||||
struct lsm6dsl_data *data = dev->driver_data;
|
||||
const struct lsm6dsl_config *config = dev->config->config_info;
|
||||
|
||||
if (i2c_reg_update_byte(data->i2c_master, config->i2c_slave_addr,
|
||||
LSM6DSL_REG_CTRL1_XL,
|
||||
LSM6DSL_MASK_CTRL1_XL_FS_XL,
|
||||
fs << LSM6DSL_SHIFT_CTRL1_XL_FS_XL) < 0) {
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int lsm6dsl_accel_set_odr_raw(struct device *dev, u8_t odr)
|
||||
{
|
||||
struct lsm6dsl_data *data = dev->driver_data;
|
||||
const struct lsm6dsl_config *config = dev->config->config_info;
|
||||
|
||||
if (i2c_reg_update_byte(data->i2c_master, config->i2c_slave_addr,
|
||||
LSM6DSL_REG_CTRL1_XL,
|
||||
LSM6DSL_MASK_CTRL1_XL_ODR_XL,
|
||||
odr << LSM6DSL_SHIFT_CTRL1_XL_ODR_XL) < 0) {
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int lsm6dsl_gyro_set_fs_raw(struct device *dev, u8_t fs)
|
||||
{
|
||||
struct lsm6dsl_data *data = dev->driver_data;
|
||||
const struct lsm6dsl_config *config = dev->config->config_info;
|
||||
|
||||
if (fs == GYRO_FULLSCALE_125) {
|
||||
if (i2c_reg_update_byte(data->i2c_master,
|
||||
config->i2c_slave_addr,
|
||||
LSM6DSL_REG_CTRL2_G,
|
||||
LSM6DSL_MASK_CTRL2_FS125,
|
||||
1 << LSM6DSL_SHIFT_CTRL2_FS125) < 0) {
|
||||
return -EIO;
|
||||
}
|
||||
} else {
|
||||
if (i2c_reg_update_byte(data->i2c_master,
|
||||
config->i2c_slave_addr,
|
||||
LSM6DSL_REG_CTRL2_G,
|
||||
LSM6DSL_MASK_CTRL2_G_FS_G,
|
||||
fs << LSM6DSL_SHIFT_CTRL2_G_FS_G) < 0) {
|
||||
return -EIO;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int lsm6dsl_gyro_set_odr_raw(struct device *dev, u8_t odr)
|
||||
{
|
||||
struct lsm6dsl_data *data = dev->driver_data;
|
||||
const struct lsm6dsl_config *config = dev->config->config_info;
|
||||
|
||||
if (i2c_reg_update_byte(data->i2c_master, config->i2c_slave_addr,
|
||||
LSM6DSL_REG_CTRL2_G,
|
||||
LSM6DSL_MASK_CTRL2_G_ODR_G,
|
||||
odr << LSM6DSL_SHIFT_CTRL2_G_ODR_G) < 0) {
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int lsm6dsl_sample_fetch_accel(struct device *dev)
|
||||
{
|
||||
struct lsm6dsl_data *data = dev->driver_data;
|
||||
const struct lsm6dsl_config *config = dev->config->config_info;
|
||||
u8_t buf[6];
|
||||
|
||||
if (i2c_burst_read(data->i2c_master, config->i2c_slave_addr,
|
||||
LSM6DSL_REG_OUTX_L_XL, buf, sizeof(buf)) < 0) {
|
||||
SYS_LOG_DBG("failed to read sample");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
data->accel_sample_x = (s16_t)((u16_t)(buf[0]) |
|
||||
((u16_t)(buf[1]) << 8));
|
||||
data->accel_sample_y = (s16_t)((u16_t)(buf[2]) |
|
||||
((u16_t)(buf[3]) << 8));
|
||||
data->accel_sample_z = (s16_t)((u16_t)(buf[4]) |
|
||||
((u16_t)(buf[5]) << 8));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int lsm6dsl_sample_fetch_gyro(struct device *dev)
|
||||
{
|
||||
struct lsm6dsl_data *data = dev->driver_data;
|
||||
const struct lsm6dsl_config *config = dev->config->config_info;
|
||||
u8_t buf[6];
|
||||
|
||||
if (i2c_burst_read(data->i2c_master, config->i2c_slave_addr,
|
||||
LSM6DSL_REG_OUTX_L_G, buf, sizeof(buf)) < 0) {
|
||||
SYS_LOG_DBG("failed to read sample");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
data->gyro_sample_x = (s16_t)((u16_t)(buf[0]) |
|
||||
((u16_t)(buf[1]) << 8));
|
||||
data->gyro_sample_y = (s16_t)((u16_t)(buf[2]) |
|
||||
((u16_t)(buf[3]) << 8));
|
||||
data->gyro_sample_z = (s16_t)((u16_t)(buf[4]) |
|
||||
((u16_t)(buf[5]) << 8));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_LSM6DSL_ENABLE_TEMP)
|
||||
static int lsm6dsl_sample_fetch_temp(struct device *dev)
|
||||
{
|
||||
struct lsm6dsl_data *data = dev->driver_data;
|
||||
const struct lsm6dsl_config *config = dev->config->config_info;
|
||||
u8_t buf[2];
|
||||
|
||||
if (i2c_burst_read(data->i2c_master, config->i2c_slave_addr,
|
||||
LSM6DSL_REG_OUT_TEMP_L, buf, sizeof(buf)) < 0) {
|
||||
SYS_LOG_DBG("failed to read sample");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
data->temp_sample = (s16_t)((u16_t)(buf[0]) |
|
||||
((u16_t)(buf[1]) << 8));
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int lsm6dsl_sample_fetch(struct device *dev, enum sensor_channel chan)
|
||||
{
|
||||
switch (chan) {
|
||||
case SENSOR_CHAN_ACCEL_XYZ:
|
||||
lsm6dsl_sample_fetch_accel(dev);
|
||||
break;
|
||||
case SENSOR_CHAN_GYRO_XYZ:
|
||||
lsm6dsl_sample_fetch_gyro(dev);
|
||||
break;
|
||||
#if defined(CONFIG_LSM6DSL_ENABLE_TEMP)
|
||||
case SENSOR_CHAN_TEMP:
|
||||
lsm6dsl_sample_fetch_temp(dev);
|
||||
break;
|
||||
#endif
|
||||
case SENSOR_CHAN_ALL:
|
||||
lsm6dsl_sample_fetch_accel(dev);
|
||||
lsm6dsl_sample_fetch_gyro(dev);
|
||||
#if defined(CONFIG_LSM6DSL_ENABLE_TEMP)
|
||||
lsm6dsl_sample_fetch_temp(dev);
|
||||
#endif
|
||||
break;
|
||||
default:
|
||||
return -ENOTSUP;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void lsm6dsl_accel_convert(struct sensor_value *val, int raw_val,
|
||||
float sensitivity)
|
||||
{
|
||||
double dval;
|
||||
|
||||
/* Sensitivity is exposed in mg/LSB */
|
||||
/* Convert to m/s^2 */
|
||||
dval = (double)(raw_val) * sensitivity * SENSOR_G_DOUBLE / 1000;
|
||||
val->val1 = (s32_t)dval;
|
||||
val->val2 = (((s32_t)(dval * 1000)) % 1000) * 1000;
|
||||
|
||||
}
|
||||
|
||||
static inline int lsm6dsl_accel_get_channel(enum sensor_channel chan,
|
||||
struct sensor_value *val,
|
||||
struct lsm6dsl_data *data,
|
||||
float sensitivity)
|
||||
{
|
||||
switch (chan) {
|
||||
case SENSOR_CHAN_ACCEL_X:
|
||||
lsm6dsl_accel_convert(val, data->accel_sample_x, sensitivity);
|
||||
break;
|
||||
case SENSOR_CHAN_ACCEL_Y:
|
||||
lsm6dsl_accel_convert(val, data->accel_sample_y, sensitivity);
|
||||
break;
|
||||
case SENSOR_CHAN_ACCEL_Z:
|
||||
lsm6dsl_accel_convert(val, data->accel_sample_z, sensitivity);
|
||||
break;
|
||||
case SENSOR_CHAN_ACCEL_XYZ:
|
||||
lsm6dsl_accel_convert(val, data->accel_sample_x, sensitivity);
|
||||
lsm6dsl_accel_convert(val + 1, data->accel_sample_y,
|
||||
sensitivity);
|
||||
lsm6dsl_accel_convert(val + 2, data->accel_sample_z,
|
||||
sensitivity);
|
||||
break;
|
||||
default:
|
||||
return -ENOTSUP;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int lsm6dsl_accel_channel_get(enum sensor_channel chan,
|
||||
struct sensor_value *val,
|
||||
struct lsm6dsl_data *data)
|
||||
{
|
||||
return lsm6dsl_accel_get_channel(chan, val, data,
|
||||
LSM6DSL_DEFAULT_ACCEL_SENSITIVITY);
|
||||
}
|
||||
|
||||
static inline void lsm6dsl_gyro_convert(struct sensor_value *val, int raw_val,
|
||||
float sensitivity)
|
||||
{
|
||||
double dval;
|
||||
|
||||
/* Sensitivity is exposed in mdps/LSB */
|
||||
/* Convert to rad/s */
|
||||
dval = (double)(raw_val * sensitivity * SENSOR_DEG2RAD_DOUBLE / 1000);
|
||||
val->val1 = (s32_t)dval;
|
||||
val->val2 = (((s32_t)(dval * 1000)) % 1000) * 1000;
|
||||
}
|
||||
|
||||
static inline int lsm6dsl_gyro_get_channel(enum sensor_channel chan,
|
||||
struct sensor_value *val,
|
||||
struct lsm6dsl_data *data,
|
||||
float sensitivity)
|
||||
{
|
||||
switch (chan) {
|
||||
case SENSOR_CHAN_GYRO_X:
|
||||
lsm6dsl_gyro_convert(val, data->gyro_sample_x, sensitivity);
|
||||
break;
|
||||
case SENSOR_CHAN_GYRO_Y:
|
||||
lsm6dsl_gyro_convert(val, data->gyro_sample_y, sensitivity);
|
||||
break;
|
||||
case SENSOR_CHAN_GYRO_Z:
|
||||
lsm6dsl_gyro_convert(val, data->gyro_sample_z, sensitivity);
|
||||
break;
|
||||
case SENSOR_CHAN_GYRO_XYZ:
|
||||
lsm6dsl_gyro_convert(val, data->gyro_sample_x, sensitivity);
|
||||
lsm6dsl_gyro_convert(val + 1, data->gyro_sample_y, sensitivity);
|
||||
lsm6dsl_gyro_convert(val + 2, data->gyro_sample_z, sensitivity);
|
||||
break;
|
||||
default:
|
||||
return -ENOTSUP;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int lsm6dsl_gyro_channel_get(enum sensor_channel chan,
|
||||
struct sensor_value *val,
|
||||
struct lsm6dsl_data *data)
|
||||
{
|
||||
return lsm6dsl_gyro_get_channel(chan, val, data,
|
||||
LSM6DSL_DEFAULT_GYRO_SENSITIVITY);
|
||||
}
|
||||
|
||||
#if defined(CONFIG_LSM6DSL_ENABLE_TEMP)
|
||||
static void lsm6dsl_gyro_channel_get_temp(struct sensor_value *val,
|
||||
struct lsm6dsl_data *data)
|
||||
{
|
||||
/* val = temp_sample / 256 + 25 */
|
||||
val->val1 = data->temp_sample / 256 + 25;
|
||||
val->val2 = (data->temp_sample % 256) * (1000000 / 256);
|
||||
}
|
||||
#endif
|
||||
|
||||
static int lsm6dsl_channel_get(struct device *dev,
|
||||
enum sensor_channel chan,
|
||||
struct sensor_value *val)
|
||||
{
|
||||
struct lsm6dsl_data *data = dev->driver_data;
|
||||
|
||||
switch (chan) {
|
||||
case SENSOR_CHAN_ACCEL_X:
|
||||
case SENSOR_CHAN_ACCEL_Y:
|
||||
case SENSOR_CHAN_ACCEL_Z:
|
||||
case SENSOR_CHAN_ACCEL_XYZ:
|
||||
lsm6dsl_accel_channel_get(chan, val, data);
|
||||
break;
|
||||
case SENSOR_CHAN_GYRO_X:
|
||||
case SENSOR_CHAN_GYRO_Y:
|
||||
case SENSOR_CHAN_GYRO_Z:
|
||||
case SENSOR_CHAN_GYRO_XYZ:
|
||||
lsm6dsl_gyro_channel_get(chan, val, data);
|
||||
break;
|
||||
#if defined(CONFIG_LSM6DSL_ENABLE_TEMP)
|
||||
case SENSOR_CHAN_TEMP:
|
||||
lsm6dsl_gyro_channel_get_temp(val, data);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
return -ENOTSUP;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct sensor_driver_api lsm6dsl_api_funcs = {
|
||||
.sample_fetch = lsm6dsl_sample_fetch,
|
||||
.channel_get = lsm6dsl_channel_get,
|
||||
};
|
||||
|
||||
static int lsm6dsl_init_chip(struct device *dev)
|
||||
{
|
||||
struct lsm6dsl_data *data = dev->driver_data;
|
||||
const struct lsm6dsl_config *config = dev->config->config_info;
|
||||
u8_t chip_id;
|
||||
|
||||
if (lsm6dsl_reboot(dev) < 0) {
|
||||
SYS_LOG_DBG("failed to reboot device");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
if (i2c_reg_read_byte(data->i2c_master, config->i2c_slave_addr,
|
||||
LSM6DSL_REG_WHO_AM_I, &chip_id) < 0) {
|
||||
SYS_LOG_DBG("failed reading chip id");
|
||||
return -EIO;
|
||||
}
|
||||
if (chip_id != LSM6DSL_VAL_WHO_AM_I) {
|
||||
SYS_LOG_DBG("invalid chip id 0x%x", chip_id);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
SYS_LOG_DBG("chip id 0x%x", chip_id);
|
||||
|
||||
if (lsm6dsl_accel_set_fs_raw(dev, LSM6DSL_DEFAULT_ACCEL_FULLSCALE)
|
||||
< 0) {
|
||||
SYS_LOG_DBG("failed to set accelerometer full-scale");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
if (lsm6dsl_accel_set_odr_raw(dev, LSM6DSL_DEFAULT_ACCEL_SAMPLING_RATE)
|
||||
< 0) {
|
||||
SYS_LOG_DBG("failed to set accelerometer sampling rate");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
if (lsm6dsl_gyro_set_fs_raw(dev, LSM6DSL_DEFAULT_GYRO_FULLSCALE)
|
||||
< 0) {
|
||||
SYS_LOG_DBG("failed to set gyroscope full-scale");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
if (lsm6dsl_gyro_set_odr_raw(dev, LSM6DSL_DEFAULT_GYRO_SAMPLING_RATE)
|
||||
< 0) {
|
||||
SYS_LOG_DBG("failed to set gyroscope sampling rate");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
if (i2c_reg_update_byte(data->i2c_master, config->i2c_slave_addr,
|
||||
LSM6DSL_REG_FIFO_CTRL5,
|
||||
LSM6DSL_MASK_FIFO_CTRL5_FIFO_MODE,
|
||||
0 << LSM6DSL_SHIFT_FIFO_CTRL5_FIFO_MODE) < 0) {
|
||||
SYS_LOG_DBG("failed to set FIFO mode");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
if (i2c_reg_update_byte(data->i2c_master, config->i2c_slave_addr,
|
||||
LSM6DSL_REG_CTRL3_C,
|
||||
LSM6DSL_MASK_CTRL3_C_BDU |
|
||||
LSM6DSL_MASK_CTRL3_C_BLE |
|
||||
LSM6DSL_MASK_CTRL3_C_IF_INC,
|
||||
(1 << LSM6DSL_SHIFT_CTRL3_C_BDU) |
|
||||
(0 << LSM6DSL_SHIFT_CTRL3_C_BLE) |
|
||||
(1 << LSM6DSL_SHIFT_CTRL3_C_IF_INC))
|
||||
< 0) {
|
||||
SYS_LOG_DBG("failed to set BDU, BLE and burst");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int lsm6dsl_init(struct device *dev)
|
||||
{
|
||||
const struct lsm6dsl_config * const config = dev->config->config_info;
|
||||
struct lsm6dsl_data *data = dev->driver_data;
|
||||
|
||||
data->i2c_master = device_get_binding(config->i2c_master_dev_name);
|
||||
if (!data->i2c_master) {
|
||||
SYS_LOG_DBG("i2c master not found: %s",
|
||||
config->i2c_master_dev_name);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (lsm6dsl_init_chip(dev) < 0) {
|
||||
SYS_LOG_DBG("failed to initialize chip");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct lsm6dsl_config lsm6dsl_config = {
|
||||
.i2c_master_dev_name = CONFIG_LSM6DSL_I2C_MASTER_DEV_NAME,
|
||||
.i2c_slave_addr = CONFIG_LSM6DSL_I2C_ADDR,
|
||||
};
|
||||
|
||||
static struct lsm6dsl_data lsm6dsl_data;
|
||||
|
||||
DEVICE_AND_API_INIT(lsm6dsl, CONFIG_LSM6DSL_DEV_NAME, lsm6dsl_init,
|
||||
&lsm6dsl_data, &lsm6dsl_config, POST_KERNEL,
|
||||
CONFIG_SENSOR_INIT_PRIORITY, &lsm6dsl_api_funcs);
|
712
drivers/sensor/lsm6dsl/lsm6dsl.h
Normal file
712
drivers/sensor/lsm6dsl/lsm6dsl.h
Normal file
|
@ -0,0 +1,712 @@
|
|||
/* sensor_lsm6dsl.h - header file for LSM6DSL accelerometer, gyroscope and
|
||||
* temperature sensor driver
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2017 Linaro Limited
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#ifndef __SENSOR_LSM6DSL_H__
|
||||
#define __SENSOR_LSM6DSL_H__
|
||||
|
||||
#include <zephyr/types.h>
|
||||
#include <i2c.h>
|
||||
#include <misc/util.h>
|
||||
|
||||
|
||||
#define LSM6DSL_REG_FUNC_CFG_ACCESS 0x01
|
||||
#define LSM6DSL_MASK_FUNC_CFG_EN BIT(7)
|
||||
#define LSM6DSL_SHIFT_FUNC_CFG_EN 7
|
||||
#define LSM6DSL_MASK_FUNC_CFG_EN_B BIT(5)
|
||||
#define LSM6DSL_SHIFT_FUNC_CFG_EN_B 5
|
||||
|
||||
#define LSM6DSL_REG_SENSOR_SYNC_TIME_FRAME 0x04
|
||||
#define LSM6DSL_MASK_SENSOR_SYNC_TIME_FRAME_TPH (BIT(3) | BIT(2) | \
|
||||
BIT(1) | BIT(0))
|
||||
#define LSM6DSL_SHIFT_SENSOR_SYNC_TIME_FRAME_TPH 0
|
||||
|
||||
#define LSM6DSL_REG_SENSOR_SYNC_RES_RATIO 0x05
|
||||
#define LSM6DSL_MASK_SENSOR_SYNC_RES_RATIO (BIT(1) | BIT(0))
|
||||
#define LSM6DSL_SHIFT_SENSOR_SYNC_RES_RATIO 0
|
||||
|
||||
#define LSM6DSL_REG_FIFO_CTRL1 0x06
|
||||
#define LSM6DSL_MASK_FIFO_CTRL1_FTH (BIT(7) | BIT(6) | \
|
||||
BIT(5) | BIT(4) | \
|
||||
BIT(3) | BIT(2) | \
|
||||
BIT(1) | BIT(0))
|
||||
#define LSM6DSL_SHIFT_FIFO_CTRL1_FTH 0
|
||||
|
||||
#define LSM6DSL_REG_FIFO_CTRL2 0x07
|
||||
#define LSM6DSL_MASK_FIFO_CTRL2_TIMER_PEDO_FIFO_EN BIT(7)
|
||||
#define LSM6DSL_SHIFT_FIFO_CTRL2_TIMER_PEDO_FIFO_EN 7
|
||||
#define LSM6DSL_MASK_FIFO_CTRL2_TIMER_PEDO_FIFO_DRDY BIT(6)
|
||||
#define LSM6DSL_SHIFT_FIFO_CTRL2_TIMER_PEDO_FIFO_DRDY 6
|
||||
#define LSM6DSL_MASK_FIFO_CTRL2_FIFO_TEMP_EN BIT(3)
|
||||
#define LSM6DSL_SHIFT_FIFO_CTRL2_FIFO_TEMP_EN 3
|
||||
#define LSM6DSL_MASK_FIFO_CTRL2_FTH (BIT(2) | BIT(1) | \
|
||||
BIT(0))
|
||||
#define LSM6DSL_SHIFT_FIFO_CTRL2_FTH 0
|
||||
|
||||
#define LSM6DSL_REG_FIFO_CTRL3 0x08
|
||||
#define LSM6DSL_MASK_FIFO_CTRL3_DEC_FIFO_GYRO (BIT(5) | BIT(4) | \
|
||||
BIT(3))
|
||||
#define LSM6DSL_SHIFT_FIFO_CTRL3_DEC_FIFO_GYRO 3
|
||||
#define LSM6DSL_MASK_FIFO_CTRL3_DEC_FIFO_XL (BIT(2) | BIT(1) | \
|
||||
BIT(0))
|
||||
#define LSM6DSL_SHIFT_FIFO_CTRL3_DEC_FIFO_XL 0
|
||||
|
||||
#define LSM6DSL_REG_FIFO_CTRL4 0x09
|
||||
#define LSM6DSL_MASK_FIFO_CTRL4_STOP_ON_FTH BIT(7)
|
||||
#define LSM6DSL_SHIFT_FIFO_CTRL4_STOP_ON_FTH 7
|
||||
#define LSM6DSL_MASK_FIFO_CTRL4_ONLY_HIGH_DATA BIT(6)
|
||||
#define LSM6DSL_SHIFT_FIFO_CTRL4_ONLY_HIGH_DATA 6
|
||||
#define LSM6DSL_MASK_FIFO_CTRL4_DEC_DS4_FIFO (BIT(5) | BIT(4) | \
|
||||
BIT(3))
|
||||
#define LSM6DSL_SHIFT_FIFO_CTRL4_DEC_DS4_FIFO 3
|
||||
#define LSM6DSL_MASK_FIFO_CTRL4_DEC_DS3_FIFO (BIT(2) | BIT(1) | \
|
||||
BIT(0))
|
||||
#define LSM6DSL_SHIFT_FIFO_CTRL4_DEC_DS3_FIFO 0
|
||||
|
||||
#define LSM6DSL_REG_FIFO_CTRL5 0x0A
|
||||
#define LSM6DSL_MASK_FIFO_CTRL5_ODR_FIFO (BIT(5) | BIT(4) | \
|
||||
BIT(3))
|
||||
#define LSM6DSL_SHIFT_FIFO_CTRL5_ODR_FIFO 3
|
||||
#define LSM6DSL_MASK_FIFO_CTRL5_FIFO_MODE (BIT(2) | BIT(1) | \
|
||||
BIT(0))
|
||||
#define LSM6DSL_SHIFT_FIFO_CTRL5_FIFO_MODE 0
|
||||
|
||||
#define LSM6DSL_REG_DRDY_PULSE_CFG_G 0x0B
|
||||
#define LSM6DSL_MASK_DRDY_PULSE_CFG_G_DRDY_PULSED BIT(7)
|
||||
#define LSM6DSL_SHIFT_DRDY_PULSE_CFG_G_DRDY_PULSED 7
|
||||
#define LSM6DSL_MASK_DRDY_PULSE_CFG_G_INT2_WRIST_TILT BIT(0)
|
||||
#define LSM6DSL_SHIFT_DRDY_PULSE_CFG_G_INT2_WRIST_TILT 0
|
||||
|
||||
#define LSM6DSL_REG_INT1_CTRL 0x0D
|
||||
#define LSM6DSL_MASK_INT1_CTRL_STEP_DETECTOR BIT(7)
|
||||
#define LSM6DSL_SHIFT_INT1_CTRL_STEP_DETECTOR 7
|
||||
#define LSM6DSL_MASK_INT1_CTRL_SIGN_MOT BIT(6)
|
||||
#define LSM6DSL_SHIFT_INT1_CTRL_SIGN_MOT 6
|
||||
#define LSM6DSL_MASK_INT1_CTRL_FULL_FLAG BIT(5)
|
||||
#define LSM6DSL_SHIFT_INT1_CTRL_FULL_FLAG 5
|
||||
#define LSM6DSL_MASK_INT1_CTRL_FIFO_OVR BIT(4)
|
||||
#define LSM6DSL_SHIFT_INT1_CTRL_FIFO_OVR 4
|
||||
#define LSM6DSL_MASK_INT1_FTH BIT(3)
|
||||
#define LSM6DSL_SHIFT_INT1_FTH 3
|
||||
#define LSM6DSL_MASK_INT1_CTRL_BOOT BIT(2)
|
||||
#define LSM6DSL_SHIFT_INT1_CTRL_BOOT 2
|
||||
#define LSM6DSL_MASK_INT1_CTRL_DRDY_G BIT(1)
|
||||
#define LSM6DSL_SHIFT_INT1_CTRL_DRDY_G 1
|
||||
#define LSM6DSL_MASK_INT1_CTRL_DRDY_XL BIT(0)
|
||||
#define LSM6DSL_SHIFT_INT1_CTRL_DRDY_XL 0
|
||||
|
||||
#define LSM6DSL_REG_INT2_CTRL 0x0E
|
||||
#define LSM6DSL_MASK_INT2_CTRL_STEP_DELTA BIT(7)
|
||||
#define LSM6DSL_SHIFT_INT2_CTRL_STEP_DELTA 7
|
||||
#define LSM6DSL_MASK_INT2_CTRL_STEP_COUNT_OV BIT(6)
|
||||
#define LSM6DSL_SHIFT_INT2_CTRL_STEP_COUNT_OV 6
|
||||
#define LSM6DSL_MASK_INT2_CTRL_FULL_FLAG BIT(5)
|
||||
#define LSM6DSL_SHIFT_INT2_CTRL_FULL_FLAG 5
|
||||
#define LSM6DSL_MASK_INT2_CTRL_FIFO_OVR BIT(4)
|
||||
#define LSM6DSL_SHIFT_INT2_CTRL_FIFO_OVR 4
|
||||
#define LSM6DSL_MASK_INT2_FTH BIT(3)
|
||||
#define LSM6DSL_SHIFT_INT2_FTH 3
|
||||
#define LSM6DSL_MASK_INT2_DRDY_TEMP BIT(2)
|
||||
#define LSM6DSL_SHIFT_INT2_DRDY_TEMP 2
|
||||
#define LSM6DSL_MASK_INT2_CTRL_DRDY_G BIT(1)
|
||||
#define LSM6DSL_SHIFT_INT2_CTRL_DRDY_G 1
|
||||
#define LSM6DSL_MASK_INT2_CTRL_DRDY_XL BIT(0)
|
||||
#define LSM6DSL_SHIFT_INT2_CTRL_DRDY_XL 0
|
||||
|
||||
#define LSM6DSL_REG_WHO_AM_I 0x0F
|
||||
#define LSM6DSL_VAL_WHO_AM_I 0x6A
|
||||
|
||||
#define LSM6DSL_REG_CTRL1_XL 0x10
|
||||
#define LSM6DSL_MASK_CTRL1_XL_ODR_XL (BIT(7) | BIT(6) | \
|
||||
BIT(5) | BIT(4))
|
||||
#define LSM6DSL_SHIFT_CTRL1_XL_ODR_XL 4
|
||||
#define LSM6DSL_MASK_CTRL1_XL_FS_XL (BIT(3) | BIT(2))
|
||||
#define LSM6DSL_SHIFT_CTRL1_XL_FS_XL 2
|
||||
#define LSM6DSL_MASK_CTRL1_XL_LPF1_BW_SEL BIT(1)
|
||||
#define LSM6DSL_SHIFT_CTRL1_XL_LPF1_BW_SEL 1
|
||||
|
||||
#define LSM6DSL_REG_CTRL2_G 0x11
|
||||
#define LSM6DSL_MASK_CTRL2_G_ODR_G (BIT(7) | BIT(6) | \
|
||||
BIT(5) | BIT(4))
|
||||
#define LSM6DSL_SHIFT_CTRL2_G_ODR_G 4
|
||||
#define LSM6DSL_MASK_CTRL2_G_FS_G (BIT(3) | BIT(2))
|
||||
#define LSM6DSL_SHIFT_CTRL2_G_FS_G 2
|
||||
#define LSM6DSL_MASK_CTRL2_FS125 BIT(1)
|
||||
#define LSM6DSL_SHIFT_CTRL2_FS125 1
|
||||
|
||||
#define LSM6DSL_REG_CTRL3_C 0x12
|
||||
#define LSM6DSL_MASK_CTRL3_C_BOOT BIT(7)
|
||||
#define LSM6DSL_SHIFT_CTRL3_C_BOOT 7
|
||||
#define LSM6DSL_MASK_CTRL3_C_BDU BIT(6)
|
||||
#define LSM6DSL_SHIFT_CTRL3_C_BDU 6
|
||||
#define LSM6DSL_MASK_CTRL3_C_H_LACTIVE BIT(5)
|
||||
#define LSM6DSL_SHIFT_CTRL3_C_H_LACTIVE 5
|
||||
#define LSM6DSL_MASK_CTRL3_C_PP_OD BIT(4)
|
||||
#define LSM6DSL_SHIFT_CTRL3_C_PP_OD 4
|
||||
#define LSM6DSL_MASK_CTRL3_C_SIM BIT(3)
|
||||
#define LSM6DSL_SHIFT_CTRL3_C_SIM 3
|
||||
#define LSM6DSL_MASK_CTRL3_C_IF_INC BIT(2)
|
||||
#define LSM6DSL_SHIFT_CTRL3_C_IF_INC 2
|
||||
#define LSM6DSL_MASK_CTRL3_C_BLE BIT(1)
|
||||
#define LSM6DSL_SHIFT_CTRL3_C_BLE 1
|
||||
#define LSM6DSL_MASK_CTRL3_C_SW_RESET BIT(0)
|
||||
#define LSM6DSL_SHIFT_CTRL3_C_SW_RESET 0
|
||||
|
||||
#define LSM6DSL_REG_CTRL3_C 0x12
|
||||
#define LSM6DSL_MASK_CTRL3_C_BOOT BIT(7)
|
||||
#define LSM6DSL_SHIFT_CTRL3_C_BOOT 7
|
||||
#define LSM6DSL_MASK_CTRL3_C_BDU BIT(6)
|
||||
#define LSM6DSL_SHIFT_CTRL3_C_BDU 6
|
||||
#define LSM6DSL_MASK_CTRL3_C_H_LACTIVE BIT(5)
|
||||
#define LSM6DSL_SHIFT_CTRL3_C_H_LACTIVE 5
|
||||
#define LSM6DSL_MASK_CTRL3_C_PP_OD BIT(4)
|
||||
#define LSM6DSL_SHIFT_CTRL3_C_PP_OD 4
|
||||
#define LSM6DSL_MASK_CTRL3_C_SIM BIT(3)
|
||||
#define LSM6DSL_SHIFT_CTRL3_C_SIM 3
|
||||
#define LSM6DSL_MASK_CTRL3_C_IF_INC BIT(2)
|
||||
#define LSM6DSL_SHIFT_CTRL3_C_IF_INC 2
|
||||
#define LSM6DSL_MASK_CTRL3_C_BLE BIT(1)
|
||||
#define LSM6DSL_SHIFT_CTRL3_C_BLE 1
|
||||
#define LSM6DSL_MASK_CTRL3_C_SW_RESET BIT(0)
|
||||
#define LSM6DSL_SHIFT_CTRL3_C_SW_RESET 0
|
||||
|
||||
#define LSM6DSL_REG_CTRL4_C 0x13
|
||||
#define LSM6DSL_MASK_CTRL4_C_DEN_XL_EN BIT(7)
|
||||
#define LSM6DSL_SHIFT_CTRL4_C_DEN_XL_EN 7
|
||||
#define LSM6DSL_MASK_CTRL4_C_SLEEP BIT(6)
|
||||
#define LSM6DSL_SHIFT_CTRL4_C_SLEEP 6
|
||||
#define LSM6DSL_MASK_CTRL4_C_INT2_ON_INT1 BIT(5)
|
||||
#define LSM6DSL_SHIFT_CTRL4_C_INT2_ON_INT1 5
|
||||
#define LSM6DSL_MASK_CTRL4_C_DEN_DRDY_INT1 BIT(4)
|
||||
#define LSM6DSL_SHIFT_CTRL4_C_DEN_DRDY_INT1 4
|
||||
#define LSM6DSL_MASK_CTRL4_C_DRDY_MASK BIT(3)
|
||||
#define LSM6DSL_SHIFT_CTRL4_C_DRDY_MASK 3
|
||||
#define LSM6DSL_MASK_CTRL4_C_I2C_DISABLE BIT(2)
|
||||
#define LSM6DSL_SHIFT_CTRL4_C_I2C_DISABLE 2
|
||||
#define LSM6DSL_MASK_CTRL4_C_LPF1_SEL_G BIT(1)
|
||||
#define LSM6DSL_SHIFT_CTRL4_C_LPF1_SEL_G 1
|
||||
|
||||
#define LSM6DSL_REG_CTRL5_C 0x14
|
||||
#define LSM6DSL_MASK_CTRL5_C_ROUNDING (BIT(7) | BIT(6) \
|
||||
BIT(5))
|
||||
#define LSM6DSL_SHIFT_CTRL5_C_ROUNDING 5
|
||||
#define LSM6DSL_MASK_CTRL5_C_DEN_LH BIT(4)
|
||||
#define LSM6DSL_SHIFT_CTRL5_C_DEN_LH 4
|
||||
#define LSM6DSL_MASK_CTRL5_C_ST_G (BIT(3) | BIT(2))
|
||||
#define LSM6DSL_SHIFT_CTRL5_C_ST_G 2
|
||||
#define LSM6DSL_MASK_CTRL5_C_ST_XL (BIT(1) | BIT(0))
|
||||
#define LSM6DSL_SHIFT_CTRL5_C_ST_XL 0
|
||||
|
||||
#define LSM6DSL_REG_CTRL6_C 0x14
|
||||
#define LSM6DSL_MASK_CTRL6_C_TRIG_EN BIT(7)
|
||||
#define LSM6DSL_SHIFT_CTRL6_C_TRIG_EN 7
|
||||
#define LSM6DSL_MASK_CTRL6_C_LVL_EN BIT(6)
|
||||
#define LSM6DSL_SHIFT_CTRL6_C_LVL_EN 6
|
||||
#define LSM6DSL_MASK_CTRL6_C_LVL2_EN BIT(5)
|
||||
#define LSM6DSL_SHIFT_CTRL6_C_LVL2_EN 5
|
||||
#define LSM6DSL_MASK_CTRL6_C_XL_HM_MODE BIT(4)
|
||||
#define LSM6DSL_SHIFT_CTRL6_C_XL_HM_MODE 4
|
||||
#define LSM6DSL_MASK_CTRL6_C_USR_OFF_W BIT(3)
|
||||
#define LSM6DSL_SHIFT_CTRL6_C_USR_OFF_W 3
|
||||
#define LSM6DSL_MASK_CTRL6_C_FTYPE (BIT(0) | BIT(1))
|
||||
#define LSM6DSL_SHIFT_CTRL6_C_FTYPE 0
|
||||
|
||||
#define LSM6DSL_REG_CTRL7_G 0x16
|
||||
#define LSM6DSL_MASK_CTRL7_G_HM_MODE BIT(7)
|
||||
#define LSM6DSL_SHIFT_CTRL7_G_HM_MODE 7
|
||||
#define LSM6DSL_MASK_CTRL7_HP_EN_G BIT(6)
|
||||
#define LSM6DSL_SHIFT_CTRL7_HP_EN_G 6
|
||||
#define LSM6DSL_MASK_CTRL7_HPM_G (BIT(5) | BIT(4))
|
||||
#define LSM6DSL_SHIFT_CTRL7_HPM_G 4
|
||||
#define LSM6DSL_MASK_CTRL7_ROUNDING_STATUS BIT(2)
|
||||
#define LSM6DSL_SHIFT_CTRL7_ROUNDING_STATUS 2
|
||||
|
||||
#define LSM6DSL_REG_CTRL8_XL 0x17
|
||||
#define LSM6DSL_MASK_CTRL8_LPF2_XL_EN BIT(7)
|
||||
#define LSM6DSL_SHIFT_CTRL8_LPF2_XL_EN 7
|
||||
#define LSM6DSL_MASK_CTRL8_HPCF_XL (BIT(6) | BIT(5))
|
||||
#define LSM6DSL_SHIFT_CTRL8_HPCF_XL 5
|
||||
#define LSM6DSL_MASK_CTRL8_HP_REF_MODE BIT(4)
|
||||
#define LSM6DSL_SHIFT_CTRL8_HP_REF_MODE 4
|
||||
#define LSM6DSL_MASK_CTRL8_INPUT_COMPOSITE BIT(3)
|
||||
#define LSM6DSL_SHIFT_CTRL8_INPUT_COMPOSITE 3
|
||||
#define LSM6DSL_MASK_CTRL8_HP_SLOPE_XL_EN BIT(2)
|
||||
#define LSM6DSL_SHIFT_CTRL8_HP_SLOPE_XL_EN 2
|
||||
#define LSM6DSL_MASK_CTRL8_LOW_PASS_ON_6D BIT(0)
|
||||
#define LSM6DSL_SHIFT_CTRL8_LOW_PASS_ON_6D 0
|
||||
|
||||
#define LSM6DSL_REG_CTRL9_XL 0x18
|
||||
#define LSM6DSL_MASK_CTRL9_XL_DEN_X BIT(7)
|
||||
#define LSM6DSL_SHIFT_CTRL9_XL_DEN_X 7
|
||||
#define LSM6DSL_MASK_CTRL9_XL_DEN_Y BIT(6)
|
||||
#define LSM6DSL_SHIFT_CTRL9_XL_DEN_Y 6
|
||||
#define LSM6DSL_MASK_CTRL9_XL_DEN_Z BIT(5)
|
||||
#define LSM6DSL_SHIFT_CTRL9_XL_DEN_Z 5
|
||||
#define LSM6DSL_MASK_CTRL9_XL_DEN_G BIT(4)
|
||||
#define LSM6DSL_SHIFT_CTRL9_XL_DEN_G 4
|
||||
#define LSM6DSL_MASK_CTRL9_XL_SOFT_EN BIT(2)
|
||||
#define LSM6DSL_SHIFT_CTRL9_XL_SOFT_EN 2
|
||||
|
||||
#define LSM6DSL_REG_CTRL9_XL 0x18
|
||||
#define LSM6DSL_MASK_CTRL9_XL_DEN_X BIT(7)
|
||||
#define LSM6DSL_SHIFT_CTRL9_XL_DEN_X 7
|
||||
#define LSM6DSL_MASK_CTRL9_XL_DEN_Y BIT(6)
|
||||
#define LSM6DSL_SHIFT_CTRL9_XL_DEN_Y 6
|
||||
#define LSM6DSL_MASK_CTRL9_XL_DEN_Z BIT(5)
|
||||
#define LSM6DSL_SHIFT_CTRL9_XL_DEN_Z 5
|
||||
#define LSM6DSL_MASK_CTRL9_XL_DEN_G BIT(4)
|
||||
#define LSM6DSL_SHIFT_CTRL9_XL_DEN_G 4
|
||||
#define LSM6DSL_MASK_CTRL9_XL_SOFT_EN BIT(2)
|
||||
#define LSM6DSL_SHIFT_CTRL9_XL_SOFT_EN 2
|
||||
|
||||
#define LSM6DSL_REG_CTRL10_C 0x19
|
||||
#define LSM6DSL_MASK_CTRL10_C_WRIST_TILT_EN BIT(7)
|
||||
#define LSM6DSL_SHIFT_CTRL10_C_WRIST_TILT_EN 7
|
||||
#define LSM6DSL_MASK_CTRL10_C_TIMER_EN BIT(5)
|
||||
#define LSM6DSL_SHIFT_CTRL10_C_TIMER_EN 5
|
||||
#define LSM6DSL_MASK_CTRL10_C_PEDO_EN BIT(4)
|
||||
#define LSM6DSL_SHIFT_CTRL10_C_PEDO_EN 4
|
||||
#define LSM6DSL_MASK_CTRL10_C_TILT_EN BIT(3)
|
||||
#define LSM6DSL_SHIFT_CTRL10_C_TILT_EN 3
|
||||
#define LSM6DSL_MASK_CTRL10_C_FUNC_EN BIT(2)
|
||||
#define LSM6DSL_SHIFT_CTRL10_C_FUNC_EN 2
|
||||
#define LSM6DSL_MASK_CTRL10_C_PEDO_RST_STEP BIT(1)
|
||||
#define LSM6DSL_SHIFT_CTRL10_C_PEDO_RST_STEP 1
|
||||
#define LSM6DSL_MASK_CTRL10_C_SIGN_MOTION_EN BIT(0)
|
||||
#define LSM6DSL_SHIFT_CTRL10_C_SIGN_MOTION_EN 0
|
||||
|
||||
#define LSM6DSL_REG_MASTER_CONFIG 0x1A
|
||||
#define LSM6DSL_MASK_MASTER_CONFIG_DRDY_ON_INT1 BIT(7)
|
||||
#define LSM6DSL_SHIFT_MASTER_CONFIG_DRDY_ON_INT1 7
|
||||
#define LSM6DSL_MASK_MASTER_CONFIG_DATA_VALID_SEL_FIFO BIT(6)
|
||||
#define LSM6DSL_SHIFT_MASTER_CONFIG_DATA_VALID_SEL_FIFO 6
|
||||
#define LSM6DSL_MASK_MASTER_CONFIG_START_CONFIG BIT(4)
|
||||
#define LSM6DSL_SHIFT_MASTER_CONFIG_START_CONFIG 4
|
||||
#define LSM6DSL_MASK_MASTER_CONFIG_PULL_UP_EN BIT(3)
|
||||
#define LSM6DSL_SHIFT_MASTER_CONFIG_PULL_UP_EN 3
|
||||
#define LSM6DSL_MASK_MASTER_CONFIG_PASS_THROUGH_MODE BIT(2)
|
||||
#define LSM6DSL_SHIFT_MASTER_CONFIG_PASS_THROUGH_MODE 2
|
||||
#define LSM6DSL_MASK_MASTER_CONFIG_IRON_EN BIT(1)
|
||||
#define LSM6DSL_SHIFT_MASTER_CONFIG_IRON_EN 1
|
||||
#define LSM6DSL_MASK_MASTER_CONFIG_MASTER_ON BIT(0)
|
||||
#define LSM6DSL_SHIFT_MASTER_CONFIG_MASTER_ON 0
|
||||
|
||||
#define LSM6DSL_REG_WAKE_UP_SRC 0x1B
|
||||
#define LSM6DSL_MASK_WAKE_UP_SRC_FF_IA BIT(5)
|
||||
#define LSM6DSL_SHIFT_WAKE_UP_SRC_FF_IA 5
|
||||
#define LSM6DSL_MASK_WAKE_UP_SRC_SLEEP_STATE_IA BIT(4)
|
||||
#define LSM6DSL_SHIFT_WAKE_UP_SRC_SLEEP_STATE_IA 4
|
||||
#define LSM6DSL_MASK_WAKE_UP_SRC_WU_IA BIT(3)
|
||||
#define LSM6DSL_SHIFT_WAKE_UP_SRC_WU_IA 3
|
||||
#define LSM6DSL_MASK_WAKE_UP_SRC_X_WU BIT(2)
|
||||
#define LSM6DSL_SHIFT_WAKE_UP_SRC_X_WU 2
|
||||
#define LSM6DSL_MASK_WAKE_UP_SRC_Y_WU BIT(1)
|
||||
#define LSM6DSL_SHIFT_WAKE_UP_SRC_Y_WU 1
|
||||
#define LSM6DSL_MASK_WAKE_UP_SRC_Z_WU BIT(0)
|
||||
#define LSM6DSL_SHIFT_WAKE_UP_SRC_Z_WU 0
|
||||
|
||||
#define LSM6DSL_REG_TAP_SRC 0x1C
|
||||
#define LSM6DSL_MASK_TAP_SRC_TAP_IA BIT(6)
|
||||
#define LSM6DSL_SHIFT_TAP_SRC_TAP_IA 6
|
||||
#define LSM6DSL_MASK_TAP_SRC_SINGLE_TAP BIT(5)
|
||||
#define LSM6DSL_SHIFT_TAP_SRC_SINGLE_TAP 5
|
||||
#define LSM6DSL_MASK_TAP_SRC_DOUBLE_TAP BIT(4)
|
||||
#define LSM6DSL_SHIFT_TAP_SRC_DOUBLE_TAP 4
|
||||
#define LSM6DSL_MASK_TAP_SRC_TAP_SIGN BIT(3)
|
||||
#define LSM6DSL_SHIFT_TAP_SRC_TAP_SIGN 3
|
||||
#define LSM6DSL_MASK_TAP_SRC_X_TAP BIT(2)
|
||||
#define LSM6DSL_SHIFT_TAP_SRC_X_TAP 2
|
||||
#define LSM6DSL_MASK_TAP_SRC_Y_TAP BIT(1)
|
||||
#define LSM6DSL_SHIFT_TAP_SRC_Y_TAP 1
|
||||
#define LSM6DSL_MASK_TAP_SRC_Z_TAP BIT(0)
|
||||
#define LSM6DSL_SHIFT_TAP_SRC_Z_TAP 0
|
||||
|
||||
#define LSM6DSL_REG_D6D_SRC 0x1D
|
||||
#define LSM6DSL_MASK_D6D_SRC_DEN_DRDY BIT(7)
|
||||
#define LSM6DSL_SHIFT_D6D_SRC_DEN_DRDY 7
|
||||
#define LSM6DSL_MASK_D6D_SRC_D6D_IA BIT(6)
|
||||
#define LSM6DSL_SHIFT_D6D_SRC_D6D_IA 6
|
||||
#define LSM6DSL_MASK_D6D_SRC_ZH BIT(5)
|
||||
#define LSM6DSL_SHIFT_D6D_SRC_ZH 5
|
||||
#define LSM6DSL_MASK_D6D_SRC_ZL BIT(4)
|
||||
#define LSM6DSL_SHIFT_D6D_SRC_ZL 4
|
||||
#define LSM6DSL_MASK_D6D_SRC_YH BIT(3)
|
||||
#define LSM6DSL_SHIFT_D6D_SRC_YH 3
|
||||
#define LSM6DSL_MASK_D6D_SRC_YL BIT(2)
|
||||
#define LSM6DSL_SHIFT_D6D_SRC_YL 2
|
||||
#define LSM6DSL_MASK_D6D_SRC_XH BIT(1)
|
||||
#define LSM6DSL_SHIFT_D6D_SRC_XH 1
|
||||
#define LSM6DSL_MASK_D6D_SRC_XL BIT(0)
|
||||
#define LSM6DSL_SHIFT_D6D_SRC_XL 0
|
||||
|
||||
#define LSM6DSL_REG_STATUS_REG 0x1E
|
||||
#define LSM6DSL_MASK_STATUS_REG_TDA BIT(2)
|
||||
#define LSM6DSL_SHIFT_STATUS_REG_TDA 2
|
||||
#define LSM6DSL_MASK_STATUS_REG_GDA BIT(1)
|
||||
#define LSM6DSL_SHIFT_STATUS_REG_GDA 1
|
||||
#define LSM6DSL_MASK_STATUS_REG_XLDA BIT(0)
|
||||
#define LSM6DSL_SHIFT_STATUS_REG_XLDA 0
|
||||
|
||||
#define LSM6DSL_REG_OUT_TEMP_L 0x20
|
||||
#define LSM6DSL_REG_OUT_TEMP_H 0x21
|
||||
#define LSM6DSL_REG_OUTX_L_G 0x22
|
||||
#define LSM6DSL_REG_OUTX_H_G 0x23
|
||||
#define LSM6DSL_REG_OUTY_L_G 0x24
|
||||
#define LSM6DSL_REG_OUTY_H_G 0x25
|
||||
#define LSM6DSL_REG_OUTZ_L_G 0x26
|
||||
#define LSM6DSL_REG_OUTZ_H_G 0x27
|
||||
#define LSM6DSL_REG_OUTX_L_XL 0x28
|
||||
#define LSM6DSL_REG_OUTX_H_XL 0x29
|
||||
#define LSM6DSL_REG_OUTY_L_XL 0x2A
|
||||
#define LSM6DSL_REG_OUTY_H_XL 0x2B
|
||||
#define LSM6DSL_REG_OUTZ_L_XL 0x2C
|
||||
#define LSM6DSL_REG_OUTZ_H_XL 0x2D
|
||||
#define LSM6DSL_REG_SENSORHUB1 0x2E
|
||||
#define LSM6DSL_REG_SENSORHUB2 0x2F
|
||||
#define LSM6DSL_REG_SENSORHUB3 0x30
|
||||
#define LSM6DSL_REG_SENSORHUB4 0x31
|
||||
#define LSM6DSL_REG_SENSORHUB5 0x32
|
||||
#define LSM6DSL_REG_SENSORHUB6 0x33
|
||||
#define LSM6DSL_REG_SENSORHUB7 0x34
|
||||
#define LSM6DSL_REG_SENSORHUB8 0x35
|
||||
#define LSM6DSL_REG_SENSORHUB9 0x36
|
||||
#define LSM6DSL_REG_SENSORHUB10 0x37
|
||||
#define LSM6DSL_REG_SENSORHUB11 0x38
|
||||
#define LSM6DSL_REG_SENSORHUB12 0x39
|
||||
#define LSM6DSL_REG_FIFO_STATUS1 0x3A
|
||||
|
||||
#define LSM6DSL_REG_FIFO_STATUS2 0x3B
|
||||
#define LSM6DSL_MASK_FIFO_STATUS2_WATERM BIT(7)
|
||||
#define LSM6DSL_SHIFT_FIFO_STATUS2_WATERM 7
|
||||
#define LSM6DSL_MASK_FIFO_STATUS2_OVER_RUN BIT(6)
|
||||
#define LSM6DSL_SHIFT_FIFO_STATUS2_OVER_RUN 6
|
||||
#define LSM6DSL_MASK_FIFO_STATUS2_FIFO_FULL_SMART BIT(5)
|
||||
#define LSM6DSL_SHIFT_FIFO_STATUS2_FIFO_FULL_SMART 5
|
||||
#define LSM6DSL_MASK_FIFO_STATUS2_FIFO_EMPTY BIT(4)
|
||||
#define LSM6DSL_SHIFT_FIFO_STATUS2_FIFO_EMPTY 4
|
||||
#define LSM6DSL_MASK_FIFO_STATUS2_DIFF_FIFO (BIT(2) | BIT(1) | \
|
||||
BIT(0))
|
||||
#define LSM6DSL_SHIFT_FIFO_STATUS2_DIFF_FIFO 0
|
||||
|
||||
#define LSM6DSL_REG_FIFO_STATUS3 0x3C
|
||||
#define LSM6DSL_MASK_FIFO_STATUS3_FIFO_PATTERN 0x0F
|
||||
#define LSM6DSL_SHIFT_FIFO_STATUS3_FIFO_PATTERN 0
|
||||
|
||||
#define LSM6DSL_REG_FIFO_STATUS4 0x3C
|
||||
#define LSM6DSL_MASK_FIFO_STATUS4_FIFO_PATTERN (BIT(1) | BIT(0))
|
||||
#define LSM6DSL_SHIFT_FIFO_STATUS4_FIFO_PATTERN 0
|
||||
|
||||
#define LSM6DSL_REG_FIFO_DATA_OUT_L 0x3E
|
||||
#define LSM6DSL_REG_FIFO_DATA_OUT_H 0x3F
|
||||
#define LSM6DSL_REG_TIMESTAMP0 0x40
|
||||
#define LSM6DSL_REG_TIMESTAMP1 0x41
|
||||
#define LSM6DSL_REG_TIMESTAMP2 0x42
|
||||
#define LSM6DSL_REG_STEP_TIMESTAMP_L 0x49
|
||||
#define LSM6DSL_REG_STEP_TIMESTAMP_H 0x4A
|
||||
#define LSM6DSL_REG_STEP_COUNTER_L 0x4B
|
||||
#define LSM6DSL_REG_STEP_COUNTER_H 0x4C
|
||||
#define LSM6DSL_REG_SENSORHUB13 0x4D
|
||||
#define LSM6DSL_REG_SENSORHUB14 0x4E
|
||||
#define LSM6DSL_REG_SENSORHUB15 0x4F
|
||||
#define LSM6DSL_REG_SENSORHUB16 0x50
|
||||
#define LSM6DSL_REG_SENSORHUB17 0x51
|
||||
#define LSM6DSL_REG_SENSORHUB18 0x52
|
||||
|
||||
#define LSM6DSL_REG_FUNC_SRC1 0x53
|
||||
#define LSM6DSL_MASK_FUNC_SRC1_STEP_COUNT_DELTA_IA BIT(7)
|
||||
#define LSM6DSL_SHIFT_FUNC_SRC1_STEP_COUNT_DELTA_IA 7
|
||||
#define LSM6DSL_MASK_FUNC_SRC1_SIGN_MOTION_IA BIT(6)
|
||||
#define LSM6DSL_SHIFT_FUNC_SRC1_SIGN_MOTION_IA 6
|
||||
#define LSM6DSL_MASK_FUNC_SRC1_TILT_IA BIT(5)
|
||||
#define LSM6DSL_SHIFT_FUNC_SRC1_TILT_IA 5
|
||||
#define LSM6DSL_MASK_FUNC_SRC1_STEP_DETECTED BIT(4)
|
||||
#define LSM6DSL_SHIFT_FUNC_SRC1_STEP_DETECTED 4
|
||||
#define LSM6DSL_MASK_FUNC_SRC1_STEP_OVERFLOW BIT(3)
|
||||
#define LSM6DSL_SHIFT_FUNC_SRC1_STEP_OVERFLOW 3
|
||||
#define LSM6DSL_MASK_FUNC_SRC1_HI_FAIL BIT(2)
|
||||
#define LSM6DSL_SHIFT_FUNC_SRC1_HI_FAIL 2
|
||||
#define LSM6DSL_MASK_FUNC_SRC1_SI_SEND_OP BIT(1)
|
||||
#define LSM6DSL_SHIFT_FUNC_SRC1_SI_SEND_OP 1
|
||||
#define LSM6DSL_MASK_FUNC_SRC1_SENSORHUB_END_OP BIT(0)
|
||||
#define LSM6DSL_SHIFT_FUNC_SRC1_SENSORHUB_END_OP 0
|
||||
|
||||
#define LSM6DSL_REG_FUNC_SRC2 0x54
|
||||
#define LSM6DSL_MASK_FUNC_SRC2_SLAVE3_NACK BIT(6)
|
||||
#define LSM6DSL_SHIFT_FUNC_SRC2_SLAVE3_NACK 6
|
||||
#define LSM6DSL_MASK_FUNC_SRC2_SLAVE2_NACK BIT(5)
|
||||
#define LSM6DSL_SHIFT_FUNC_SRC2_SLAVE2_NACK 5
|
||||
#define LSM6DSL_MASK_FUNC_SRC2_SLAVE1_NACK BIT(4)
|
||||
#define LSM6DSL_SHIFT_FUNC_SRC2_SLAVE1_NACK 4
|
||||
#define LSM6DSL_MASK_FUNC_SRC2_SLAVE0_NACK BIT(3)
|
||||
#define LSM6DSL_SHIFT_FUNC_SRC2_SLAVE0_NACK 3
|
||||
#define LSM6DSL_MASK_FUNC_SRC2_WRIST_TILT_IA BIT(0)
|
||||
#define LSM6DSL_SHIFT_FUNC_SRC2_WRIST_TILT_IA 0
|
||||
|
||||
#define LSM6DSL_REG_WRIST_TILT_IA 0x55
|
||||
#define LSM6DSL_MASK_WRIST_TILT_IA_XPOS BIT(7)
|
||||
#define LSM6DSL_SHIFT_WRIST_TILT_IA_XPOS 7
|
||||
#define LSM6DSL_MASK_WRIST_TILT_IA_XNEG BIT(6)
|
||||
#define LSM6DSL_SHIFT_WRIST_TILT_IA_XNEG 6
|
||||
#define LSM6DSL_MASK_WRIST_TILT_IA_YPOS BIT(5)
|
||||
#define LSM6DSL_SHIFT_WRIST_TILT_IA_YPOS 5
|
||||
#define LSM6DSL_MASK_WRIST_TILT_IA_YNEG BIT(4)
|
||||
#define LSM6DSL_SHIFT_WRIST_TILT_IA_YNEG 4
|
||||
#define LSM6DSL_MASK_WRIST_TILT_IA_ZPOS BIT(3)
|
||||
#define LSM6DSL_SHIFT_WRIST_TILT_IA_ZPOS 3
|
||||
#define LSM6DSL_MASK_WRIST_TILT_IA_ZNEG BIT(2)
|
||||
#define LSM6DSL_SHIFT_WRIST_TILT_IA_ZNEG 2
|
||||
|
||||
#define LSM6DSL_REG_TAP_CFG 0x58
|
||||
#define LSM6DSL_MASK_TAP_CFG_INTERRPUTS_ENABLE BIT(7)
|
||||
#define LSM6DSL_SHIFT_TAP_CFG_INTERRPUTS_ENABLE 7
|
||||
#define LSM6DSL_MASK_TAP_CFG_INACT_EN (BIT(6) | BIT(5))
|
||||
#define LSM6DSL_SHIFT_TAP_CFG_INACT_EN 5
|
||||
#define LSM6DSL_MASK_TAP_CFG_SLOPE_FDS BIT(4)
|
||||
#define LSM6DSL_SHIFT_TAP_CFG_SLOPE_FDS 4
|
||||
#define LSM6DSL_MASK_TAP_CFG_X_EN BIT(3)
|
||||
#define LSM6DSL_SHIFT_TAP_CFG_X_EN 3
|
||||
#define LSM6DSL_MASK_TAP_CFG_Y_EN BIT(2)
|
||||
#define LSM6DSL_SHIFT_TAP_CFG_Y_EN 2
|
||||
#define LSM6DSL_MASK_TAP_CFG_Z_EN BIT(1)
|
||||
#define LSM6DSL_SHIFT_TAP_CFG_Z_EN 1
|
||||
#define LSM6DSL_MASK_TAP_CFG_LIR BIT(0)
|
||||
#define LSM6DSL_SHIFT_TAP_CFG_LIR 0
|
||||
|
||||
#define LSM6DSL_REG_TAP_THS_6D 0x59
|
||||
#define LSM6DSL_MASK_TAP_THS_6D_D4D_EN BIT(7)
|
||||
#define LSM6DSL_SHIFT_TAP_THS_6D_D4D_EN 7
|
||||
#define LSM6DSL_MASK_TAP_THS_6D_SIXD_THS (BIT(6) | BIT(5))
|
||||
#define LSM6DSL_SHIFT_TAP_THS_6D_SIXD_THS 5
|
||||
#define LSM6DSL_MASK_TAP_THS_6D_TAP_THS (BIT(4) | BIT(3) | \
|
||||
BIT(2) | BIT(1) | \
|
||||
BIT(0))
|
||||
#define LSM6DSL_SHIFT_TAP_THS_6D_TAP_THS 0
|
||||
|
||||
#define LSM6DSL_REG_INT_DUR2 0x5A
|
||||
#define LSM6DSL_MASK_INT_DUR2_DUR (BIT(7) | BIT(6) | \
|
||||
BIT(5) | BIT(4))
|
||||
#define LSM6DSL_SHIFT_INT_DUR2_DUR 4
|
||||
#define LSM6DSL_MASK_INT_DUR2_QUIET (BIT(3) | BIT(2))
|
||||
#define LSM6DSL_SHIFT_INT_QUIET 2
|
||||
#define LSM6DSL_MASK_INT_DUR2_SHOCK (BIT(1) | BIT(0))
|
||||
#define LSM6DSL_SHIFT_INT_SHOCK 0
|
||||
|
||||
#define LSM6DSL_REG_WAKE_UP_THS 0x5B
|
||||
#define LSM6DSL_MASK_WAKE_UP_THS_SINGLE_DOUBLE_TAP BIT(7)
|
||||
#define LSM6DSL_SHIFT_WAKE_UP_THS_SINGLE_DOUBLE_TAP 7
|
||||
#define LSM6DSL_MASK_WAKE_UP_THS_WK_THS (BIT(5) | BIT(4) | \
|
||||
BIT(3) | BIT(2) | \
|
||||
BIT(1) | BIT(0))
|
||||
#define LSM6DSL_SHIFT_WAKE_UP_THS_WK_THS 0
|
||||
|
||||
#define LSM6DSL_REG_WAKE_UP_DUR 0x5C
|
||||
#define LSM6DSL_MASK_WAKE_UP_DUR_FF_DUR5 BIT(7)
|
||||
#define LSM6DSL_SHIFT_WAKE_UP_DUR_FF_DUR5 7
|
||||
#define LSM6DSL_MASK_WAKE_UP_DUR_WAKE_DUR (BIT(6) | BIT(5))
|
||||
#define LSM6DSL_SHIFT_WAKE_UP_DUAR_WAKE_DUR 5
|
||||
#define LSM6DSL_MASK_WAKE_UP_DUR_TIMER_HR BIT(4)
|
||||
#define LSM6DSL_SHIFT_WAKE_UP_DUR_TIMER_HR 4
|
||||
#define LSM6DSL_MASK_WAKE_UP_DUR_SLEEP_DUR (BIT(3) | BIT(2) | \
|
||||
BIT(1) | BIT(0))
|
||||
#define LSM6DSL_SHIFT_WAKE_UP_DUR_SLEEP_DUR 0
|
||||
|
||||
#define LSM6DSL_REG_FREE_FALL 0x5D
|
||||
#define LSM6DSL_MASK_FREE_FALL_DUR (BIT(7) | BIT(6) | \
|
||||
BIT(5) | BIT(4) | \
|
||||
BIT(3))
|
||||
#define LSM6DSL_SHIFT_FREE_FALL_DUR 4
|
||||
#define LSM6DSL_MASK_FREE_FALL_THS (BIT(2) | BIT(1) | \
|
||||
BIT(0))
|
||||
#define LSM6DSL_SHIFT_FREE_FALL_THS 0
|
||||
|
||||
#define LSM6DSL_REG_MD1_CFG 0x5E
|
||||
#define LSM6DSL_MASK_MD1_CFG_INT1_INACT_STATE BIT(7)
|
||||
#define LSM6DSL_SHIFT_MD1_CFG_INT1_INACT_STATE 7
|
||||
#define LSM6DSL_MASK_MD1_CFG_INT1_SINGLE_TAP BIT(6)
|
||||
#define LSM6DSL_SHIFT_MD1_CFG_INT1_SINGLE_TAP 6
|
||||
#define LSM6DSL_MASK_MD1_CFG_INT1_WU BIT(5)
|
||||
#define LSM6DSL_SHIFT_MD1_CFG_INT1_WU 5
|
||||
#define LSM6DSL_MASK_MD1_CFG_INT1_FF BIT(4)
|
||||
#define LSM6DSL_SHIFT_MD1_CFG_INT1_FF 4
|
||||
#define LSM6DSL_MASK_MD1_CFG_INT1_DOUBLE_TAP BIT(3)
|
||||
#define LSM6DSL_SHIFT_MD1_CFG_INT1_DOUBLE_TAP 3
|
||||
#define LSM6DSL_MASK_MD1_CFG_INT1_6D BIT(2)
|
||||
#define LSM6DSL_SHIFT_MD1_CFG_INT1_6D 2
|
||||
#define LSM6DSL_MASK_MD1_CFG_INT1_TILT BIT(1)
|
||||
#define LSM6DSL_SHIFT_MD1_CFG_INT1_TILT 1
|
||||
#define LSM6DSL_MASK_MD1_CFG_INT1_TIMER BIT(0)
|
||||
#define LSM6DSL_SHIFT_MD1_CFG_INT1_TIMER 0
|
||||
|
||||
#define LSM6DSL_REG_MD2_CFG 0x5F
|
||||
#define LSM6DSL_MASK_MD2_CFG_INT2_INACT_STATE BIT(7)
|
||||
#define LSM6DSL_SHIFT_MD2_CFG_INT2_INACT_STATE 7
|
||||
#define LSM6DSL_MASK_MD2_CFG_INT2_SINGLE_TAP BIT(6)
|
||||
#define LSM6DSL_SHIFT_MD2_CFG_INT2_SINGLE_TAP 6
|
||||
#define LSM6DSL_MASK_MD2_CFG_INT2_WU BIT(5)
|
||||
#define LSM6DSL_SHIFT_MD2_CFG_INT1_WU 5
|
||||
#define LSM6DSL_MASK_MD2_CFG_INT2_FF BIT(4)
|
||||
#define LSM6DSL_SHIFT_MD2_CFG_INT2_FF 4
|
||||
#define LSM6DSL_MASK_MD2_CFG_INT2_DOUBLE_TAP BIT(3)
|
||||
#define LSM6DSL_SHIFT_MD2_CFG_INT2_DOUBLE_TAP 3
|
||||
#define LSM6DSL_MASK_MD2_CFG_INT2_6D BIT(2)
|
||||
#define LSM6DSL_SHIFT_MD2_CFG_INT2_6D 2
|
||||
#define LSM6DSL_MASK_MD2_CFG_INT2_TILT BIT(1)
|
||||
#define LSM6DSL_SHIFT_MD2_CFG_INT2_TILT 1
|
||||
#define LSM6DSL_MASK_MD2_CFG_INT2_IRON BIT(0)
|
||||
#define LSM6DSL_SHIFT_MD2_CFG_INT2_IRON 0
|
||||
|
||||
#define LSM6DSL_REG_MASTER_CMD_CODE 0x60
|
||||
#define LSM6DSL_REG_SENS_SYNC_SPI_ERROR_CODE 0x61
|
||||
#define LSM6DSL_REG_OUT_MAG_RAW_X_L 0x66
|
||||
#define LSM6DSL_REG_OUT_MAG_RAW_X_H 0x67
|
||||
#define LSM6DSL_REG_OUT_MAG_RAW_Y_L 0x68
|
||||
#define LSM6DSL_REG_OUT_MAG_RAW_Y_H 0x69
|
||||
#define LSM6DSL_REG_OUT_MAG_RAW_Z_L 0x6A
|
||||
#define LSM6DSL_REG_OUT_MAG_RAW_Z_H 0x6B
|
||||
#define LSM6DSL_REG_X_OFS_USR 0x73
|
||||
#define LSM6DSL_REG_Y_OFS_USR 0x74
|
||||
#define LSM6DSL_REG_Z_OFS_USR 0x75
|
||||
|
||||
|
||||
/* Accel sensor sensitivity grain is 0.061 mg/LSB */
|
||||
#define SENSI_GRAIN_XL (61LL / 1000.0)
|
||||
|
||||
/* Gyro sensor sensitivity grain is 4.375 mdps/LSB */
|
||||
#define SENSI_GRAIN_G (4375LL / 1000.0)
|
||||
#define SENSOR_PI_DOUBLE (SENSOR_PI / 1000000.0)
|
||||
#define SENSOR_DEG2RAD_DOUBLE (SENSOR_PI_DOUBLE / 180)
|
||||
#define SENSOR_G_DOUBLE (SENSOR_G / 1000000.0)
|
||||
|
||||
#if CONFIG_LSM6DSL_ACCEL_FULLSCALE == 2
|
||||
#define LSM6DSL_ACCEL_FULLSCALE_2G
|
||||
#elif CONFIG_LSM6DSL_ACCEL_FULLSCALE == 4
|
||||
#define LSM6DSL_ACCEL_FULLSCALE_4G
|
||||
#elif CONFIG_LSM6DSL_ACCEL_FULLSCALE == 8
|
||||
#define LSM6DSL_ACCEL_FULLSCALE_8G
|
||||
#elif CONFIG_LSM6DSL_ACCEL_FULLSCALE == 16
|
||||
#define LSM6DSL_ACCEL_FULLSCALE_16G
|
||||
#endif
|
||||
|
||||
#if defined(LSM6DSL_ACCEL_FULLSCALE_2G)
|
||||
#define LSM6DSL_DEFAULT_ACCEL_FULLSCALE 0
|
||||
#define LSM6DSL_DEFAULT_ACCEL_SENSITIVITY SENSI_GRAIN_XL
|
||||
#elif defined(LSM6DSL_ACCEL_FULLSCALE_4G)
|
||||
#define LSM6DSL_DEFAULT_ACCEL_FULLSCALE 2
|
||||
#define LSM6DSL_DEFAULT_ACCEL_SENSITIVITY (2.0 * SENSI_GRAIN_XL)
|
||||
#elif defined(LSM6DSL_ACCEL_FULLSCALE_8G)
|
||||
#define LSM6DSL_DEFAULT_ACCEL_FULLSCALE 3
|
||||
#define LSM6DSL_DEFAULT_ACCEL_SENSITIVITY (4.0 * SENSI_GRAIN_XL)
|
||||
#elif defined(LSM6DSL_ACCEL_FULLSCALE_16G)
|
||||
#define LSM6DSL_DEFALUT_ACCEL_FULLSCALE 1
|
||||
#define LSM6DSL_DEFAULT_ACCEL_SENSITIVITY (8.0 * SENSI_GRAIN_XL)
|
||||
#endif
|
||||
|
||||
#if CONFIG_LSM6DSL_ACCEL_SAMPLING_RATE == 0
|
||||
#define LSM6DSL_DEFAULT_ACCEL_SAMPLING_RATE 0
|
||||
#elif CONFIG_LSM6DSL_ACCEL_SAMPLING_RATE == 2
|
||||
#define LSM6DSL_DEFAULT_ACCEL_SAMPLING_RATE 11
|
||||
#elif CONFIG_LSM6DSL_ACCEL_SAMPLING_RATE == 13
|
||||
#define LSM6DSL_DEFAULT_ACCEL_SAMPLING_RATE 1
|
||||
#elif CONFIG_LSM6DSL_ACCEL_SAMPLING_RATE == 26
|
||||
#define LSM6DSL_DEFAULT_ACCEL_SAMPLING_RATE 2
|
||||
#elif CONFIG_LSM6DSL_ACCEL_SAMPLING_RATE == 52
|
||||
#define LSM6DSL_DEFAULT_ACCEL_SAMPLING_RATE 3
|
||||
#elif CONFIG_LSM6DSL_ACCEL_SAMPLING_RATE == 104
|
||||
#define LSM6DSL_DEFAULT_ACCEL_SAMPLING_RATE 4
|
||||
#elif CONFIG_LSM6DSL_ACCEL_SAMPLING_RATE == 208
|
||||
#define LSM6DSL_DEFAULT_ACCEL_SAMPLING_RATE 5
|
||||
#elif CONFIG_LSM6DSL_ACCEL_SAMPLING_RATE == 416
|
||||
#define LSM6DSL_DEFAULT_ACCEL_SAMPLING_RATE 6
|
||||
#elif CONFIG_LSM6DSL_ACCEL_SAMPLING_RATE == 833
|
||||
#define LSM6DSL_DEFAULT_ACCEL_SAMPLING_RATE 7
|
||||
#elif CONFIG_LSM6DSL_ACCEL_SAMPLING_RATE == 1660
|
||||
#define LSM6DSL_DEFAULT_ACCEL_SAMPLING_RATE 8
|
||||
#elif CONFIG_LSM6DSL_ACCEL_SAMPLING_RATE == 3330
|
||||
#define LSM6DSL_DEFAULT_ACCEL_SAMPLING_RATE 9
|
||||
#elif CONFIG_LSM6DSL_ACCEL_SAMPLING_RATE == 6660
|
||||
#define LSM6DSL_DEFAULT_ACCEL_SAMPLING_RATE 10
|
||||
#endif
|
||||
|
||||
#if CONFIG_LSM6DSL_GYRO_FULLSCALE == 125
|
||||
#define LSM6DSL_GYRO_FULLSCALE_125
|
||||
#elif CONFIG_LSM6DSL_GYRO_FULLSCALE == 245
|
||||
#define LSM6DSL_GYRO_FULLSCALE_245
|
||||
#elif CONFIG_LSM6DSL_GYRO_FULLSCALE == 500
|
||||
#define LSM6DSL_GYRO_FULLSCALE_500
|
||||
#elif CONFIG_LSM6DSL_GYRO_FULLSCALE == 1000
|
||||
#define LSM6DSL_GYRO_FULLSCALE_1000
|
||||
#elif CONFIG_LSM6DSL_GYRO_FULLSCALE == 2000
|
||||
#define LSM6DSL_GYRO_FULLSCALE_2000
|
||||
#endif
|
||||
|
||||
#if defined(LSM6DSL_GYRO_FULLSCALE_125)
|
||||
#define LSM6DSL_DEFAULT_GYRO_FULLSCALE 4
|
||||
#define LSM6DSL_DEFAULT_GYRO_SENSITIVITY SENSI_GRAIN_G
|
||||
#elif defined(LSM6DSL_GYRO_FULLSCALE_245)
|
||||
#define LSM6DSL_DEFAULT_GYRO_FULLSCALE 0
|
||||
#define LSM6DSL_DEFAULT_GYRO_SENSITIVITY (2.0 * SENSI_GRAIN_G)
|
||||
#elif defined(LSM6DSL_GYRO_FULLSCALE_500)
|
||||
#define LSM6DSL_DEFAULT_GYRO_FULLSCALE 1
|
||||
#define LSM6DSL_DEFAULT_GYRO_SENSITIVITY (4.0 * SENSI_GRAIN_G)
|
||||
#elif defined(LSM6DSL_GYRO_FULLSCALE_1000)
|
||||
#define LSM6DSL_DEFAULT_GYRO_FULLSCALE 2
|
||||
#define LSM6DSL_DEFAULT_GYRO_SENSITIVITY (8.0 * SENSI_GRAIN_G)
|
||||
#elif defined(LSM6DSL_GYRO_FULLSCALE_2000)
|
||||
#define LSM6DSL_DEFAULT_GYRO_FULLSCALE 3
|
||||
#define LSM6DSL_DEFAULT_GYRO_SENSITIVITY (16.0 * SENSI_GRAIN_G)
|
||||
#endif
|
||||
|
||||
#define GYRO_FULLSCALE_125 4
|
||||
|
||||
#if CONFIG_LSM6DSL_GYRO_SAMPLING_RATE == 0
|
||||
#define LSM6DSL_DEFAULT_GYRO_SAMPLING_RATE 0
|
||||
#elif CONFIG_LSM6DSL_GYRO_SAMPLING_RATE == 13
|
||||
#define LSM6DSL_DEFAULT_GYRO_SAMPLING_RATE 1
|
||||
#elif CONFIG_LSM6DSL_GYRO_SAMPLING_RATE == 26
|
||||
#define LSM6DSL_DEFAULT_GYRO_SAMPLING_RATE 2
|
||||
#elif CONFIG_LSM6DSL_GYRO_SAMPLING_RATE == 52
|
||||
#define LSM6DSL_DEFAULT_GYRO_SAMPLING_RATE 3
|
||||
#elif CONFIG_LSM6DSL_GYRO_SAMPLING_RATE == 104
|
||||
#define LSM6DSL_DEFAULT_GYRO_SAMPLING_RATE 4
|
||||
#elif CONFIG_LSM6DSL_GYRO_SAMPLING_RATE == 208
|
||||
#define LSM6DSL_DEFAULT_GYRO_SAMPLING_RATE 5
|
||||
#elif CONFIG_LSM6DSL_GYRO_SAMPLING_RATE == 416
|
||||
#define LSM6DSL_DEFAULT_GYRO_SAMPLING_RATE 6
|
||||
#elif CONFIG_LSM6DSL_GYRO_SAMPLING_RATE == 833
|
||||
#define LSM6DSL_DEFAULT_GYRO_SAMPLING_RATE 7
|
||||
#elif CONFIG_LSM6DSL_GYRO_SAMPLING_RATE == 1660
|
||||
#define LSM6DSL_DEFAULT_GYRO_SAMPLING_RATE 8
|
||||
#elif CONFIG_LSM6DSL_GYRO_SAMPLING_RATE == 3330
|
||||
#define LSM6DSL_DEFAULT_GYRO_SAMPLING_RATE 9
|
||||
#elif CONFIG_LSM6DSL_GYRO_SAMPLING_RATE == 6660
|
||||
#define LSM6DSL_DEFAULT_GYRO_SAMPLING_RATE 10
|
||||
#endif
|
||||
|
||||
struct lsm6dsl_config {
|
||||
char *i2c_master_dev_name;
|
||||
u16_t i2c_slave_addr;
|
||||
};
|
||||
|
||||
struct lsm6dsl_data {
|
||||
struct device *i2c_master;
|
||||
int accel_sample_x;
|
||||
int accel_sample_y;
|
||||
int accel_sample_z;
|
||||
int gyro_sample_x;
|
||||
int gyro_sample_y;
|
||||
int gyro_sample_z;
|
||||
#if defined(CONFIG_LSM6DSL_ENABLE_TEMP)
|
||||
int temp_sample;
|
||||
#endif
|
||||
};
|
||||
|
||||
#define SYS_LOG_DOMAIN "LSM6DSL"
|
||||
#define SYS_LOG_LEVEL CONFIG_SYS_LOG_SENSOR_LEVEL
|
||||
#include <logging/sys_log.h>
|
||||
#endif /* __SENSOR_LSM6DSL_H__ */
|
Loading…
Add table
Add a link
Reference in a new issue