diff --git a/drivers/sensor/Kconfig b/drivers/sensor/Kconfig index 27725ac9f83..197152ba947 100644 --- a/drivers/sensor/Kconfig +++ b/drivers/sensor/Kconfig @@ -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" diff --git a/drivers/sensor/Makefile b/drivers/sensor/Makefile index 60b4b0b2c7a..e1a191993f2 100644 --- a/drivers/sensor/Makefile +++ b/drivers/sensor/Makefile @@ -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/ diff --git a/drivers/sensor/lsm6dsl/Kconfig b/drivers/sensor/lsm6dsl/Kconfig new file mode 100644 index 00000000000..8e7aa1f97d6 --- /dev/null +++ b/drivers/sensor/lsm6dsl/Kconfig @@ -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 diff --git a/drivers/sensor/lsm6dsl/Makefile b/drivers/sensor/lsm6dsl/Makefile new file mode 100644 index 00000000000..d34d83c4560 --- /dev/null +++ b/drivers/sensor/lsm6dsl/Makefile @@ -0,0 +1 @@ +obj-$(CONFIG_LSM6DSL) += lsm6dsl.o diff --git a/drivers/sensor/lsm6dsl/lsm6dsl.c b/drivers/sensor/lsm6dsl/lsm6dsl.c new file mode 100644 index 00000000000..d1fafc9074c --- /dev/null +++ b/drivers/sensor/lsm6dsl/lsm6dsl.c @@ -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 +#include +#include +#include +#include +#include + +#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); diff --git a/drivers/sensor/lsm6dsl/lsm6dsl.h b/drivers/sensor/lsm6dsl/lsm6dsl.h new file mode 100644 index 00000000000..51da7540ecb --- /dev/null +++ b/drivers/sensor/lsm6dsl/lsm6dsl.h @@ -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 +#include +#include + + +#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 +#endif /* __SENSOR_LSM6DSL_H__ */