Files
BLE-USB_Dongle/apps/common/device/imu_sensor/lsm6dsl/lsm6dsl.c
T

5970 lines
181 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "app_config.h"
#include "asm/clock.h"
#include "asm/cpu.h"
#include "generic/typedef.h"
#include "generic/gpio.h"
#include "typedef.h"
#include "system/includes.h"
#include "media/includes.h"
#include "asm/iic_hw.h"
#include "asm/iic_soft.h"
#include "asm/timer.h"
#include "imuSensor_manage.h"
#include "lsm6dsl.h"
// #include "spi1.h"
// #include "port_wkup.h"
#if TCFG_LSM6DSL_ENABLE
/*************Betterlife ic debug***********/
#undef LOG_TAG_CONST
#define LOG_TAG "[LSM6DSL]"
#define LOG_ERROR_ENABLE
#define LOG_INFO_ENABLE
#include "debug.h"
void delay(volatile u32 t);
void udelay(u32 us);
#define MDELAY(n) mdelay(n)
static lsm6dsl_param *lsm6dsl_info;
#if (LSM6DSL_USER_INTERFACE==LSM6DSL_USE_I2C)
#if TCFG_LSM6DSL_USER_IIC_TYPE
#define iic_init(iic) hw_iic_init(iic)
#define iic_uninit(iic) hw_iic_uninit(iic)
#define iic_start(iic) hw_iic_start(iic)
#define iic_stop(iic) hw_iic_stop(iic)
#define iic_tx_byte(iic, byte) hw_iic_tx_byte(iic, byte)
#define iic_rx_byte(iic, ack) hw_iic_rx_byte(iic, ack)
#define iic_read_buf(iic, buf, len) hw_iic_read_buf(iic, buf, len)
#define iic_write_buf(iic, buf, len) hw_iic_write_buf(iic, buf, len)
#define iic_suspend(iic) hw_iic_suspend(iic)
#define iic_resume(iic) hw_iic_resume(iic)
#else
#define iic_init(iic) soft_iic_init(iic)
#define iic_uninit(iic) soft_iic_uninit(iic)
#define iic_start(iic) soft_iic_start(iic)
#define iic_stop(iic) soft_iic_stop(iic)
#define iic_tx_byte(iic, byte) soft_iic_tx_byte(iic, byte)
#define iic_rx_byte(iic, ack) soft_iic_rx_byte(iic, ack)
#define iic_read_buf(iic, buf, len) soft_iic_read_buf(iic, buf, len)
#define iic_write_buf(iic, buf, len) soft_iic_write_buf(iic, buf, len)
#define iic_suspend(iic) soft_iic_suspend(iic)
#define iic_resume(iic) soft_iic_resume(iic)
#endif
//起止信号间隔:standard mode(100khz):4.7us; fast mode(400khz):1.3us
//return: readLen:ok, other:fail
u16 lsm6dsl_I2C_Read_NBytes(unsigned char devAddr,
unsigned char regAddr,
unsigned char *readBuf,
u16 readLen)
{
u16 i = 0;
local_irq_disable();
iic_start(lsm6dsl_info->iic_hdl);
if (0 == iic_tx_byte(lsm6dsl_info->iic_hdl, devAddr)) {
log_error("lsm6dsl iic read err1");
goto __iic_exit_r;
}
delay(lsm6dsl_info->iic_delay);
/* if (0 == iic_tx_byte(lsm6dsl_info->iic_hdl, regAddr |0x80)) {//|0x80地址自动递增 */
if (0 == iic_tx_byte(lsm6dsl_info->iic_hdl, regAddr)) {//|0x80地址自动递增
log_error("lsm6dsl iic read err2");
goto __iic_exit_r;
}
delay(lsm6dsl_info->iic_delay);
iic_start(lsm6dsl_info->iic_hdl);
if (0 == iic_tx_byte(lsm6dsl_info->iic_hdl, devAddr + 1)) {
log_error("lsm6dsl iic read err3");
goto __iic_exit_r;
}
for (i = 0; i < readLen; i++) {
delay(lsm6dsl_info->iic_delay);
if (i == (readLen - 1)) {
*readBuf++ = iic_rx_byte(lsm6dsl_info->iic_hdl, 0);
} else {
*readBuf++ = iic_rx_byte(lsm6dsl_info->iic_hdl, 1);
}
/* if(i%100==0)wdt_clear(); */
}
__iic_exit_r:
iic_stop(lsm6dsl_info->iic_hdl);
local_irq_enable();
return i;
}
//起止信号间隔:standard mode(100khz):4.7us; fast mode(400khz):1.3us
//return:writeLen:ok, other:fail
u16 lsm6dsl_I2C_Write_NBytes(unsigned char devAddr,
unsigned char regAddr,
unsigned char *writeBuf,
u16 writeLen)
{
u16 i = 0;
local_irq_disable();
iic_start(lsm6dsl_info->iic_hdl);
if (0 == iic_tx_byte(lsm6dsl_info->iic_hdl, devAddr)) {
log_error("lsm6dsl iic write err1");
goto __iic_exit_w;
}
delay(lsm6dsl_info->iic_delay);
if (0 == iic_tx_byte(lsm6dsl_info->iic_hdl, regAddr)) {
log_error("lsm6dsl iic write err2");
goto __iic_exit_w;
}
for (i = 0; i < writeLen; i++) {
delay(lsm6dsl_info->iic_delay);
if (0 == iic_tx_byte(lsm6dsl_info->iic_hdl, writeBuf[i])) {
log_error("lsm6dsl iic write err3:%d", i);
goto __iic_exit_w;
}
}
__iic_exit_w:
iic_stop(lsm6dsl_info->iic_hdl);
local_irq_enable();
return i;
}
//起止信号间隔:standard mode(100khz):4.7us; fast mode(400khz):1.3us
//return:1:ok, 0:fail
unsigned char lsm6dsl_I2C_Write_Byte(unsigned char devAddr, //芯片支持1byte写
unsigned char regAddr,
unsigned char byte)
{
u8 ret = 1;
local_irq_disable();
iic_start(lsm6dsl_info->iic_hdl);
if (0 == iic_tx_byte(lsm6dsl_info->iic_hdl, devAddr)) {
log_error("lsm6dsl iic write err1");
ret = 0;
goto __iic_exit_w;
}
delay(lsm6dsl_info->iic_delay);
if (0 == iic_tx_byte(lsm6dsl_info->iic_hdl, regAddr)) {
log_error("lsm6dsl iic write err2");
ret = 0;
goto __iic_exit_w;
}
delay(lsm6dsl_info->iic_delay);
if (0 == iic_tx_byte(lsm6dsl_info->iic_hdl, byte)) {
log_error("lsm6dsl iic write err3");
ret = 0;
goto __iic_exit_w;
}
__iic_exit_w:
iic_stop(lsm6dsl_info->iic_hdl);
local_irq_enable();
return ret;
}
IMU_read lsm6dsl_read = lsm6dsl_I2C_Read_NBytes;
IMU_write lsm6dsl_write = lsm6dsl_I2C_Write_Byte;
#elif (LSM6DSL_USER_INTERFACE==LSM6DSL_USE_SPI)
#define spi_cs_init() \
do { \
gpio_write(lsm6dsl_info->spi_cs_pin, 1); \
gpio_set_direction(lsm6dsl_info->spi_cs_pin, 0); \
gpio_set_die(lsm6dsl_info->spi_cs_pin, 1); \
} while (0)
#define spi_cs_uninit() \
do { \
gpio_set_die(lsm6dsl_info->spi_cs_pin, 0); \
gpio_set_direction(lsm6dsl_info->spi_cs_pin, 1); \
gpio_set_pull_up(lsm6dsl_info->spi_cs_pin, 0); \
gpio_set_pull_down(lsm6dsl_info->spi_cs_pin, 0); \
} while (0)
#define spi_cs_h() gpio_write(lsm6dsl_info->spi_cs_pin, 1)
#define spi_cs_l() gpio_write(lsm6dsl_info->spi_cs_pin, 0)
#define spi_read_byte() spi_recv_byte(lsm6dsl_info->spi_hdl, NULL)
#define spi_write_byte(x) spi_send_byte(lsm6dsl_info->spi_hdl, x)
#define spi_dma_read(x, y) spi_dma_recv(lsm6dsl_info->spi_hdl, x, y)
#define spi_dma_write(x, y) spi_dma_send(lsm6dsl_info->spi_hdl, x, y)
#define spi_set_width(x) spi_set_bit_mode(lsm6dsl_info->spi_hdl, x)
#define spi_init() spi_open(lsm6dsl_info->spi_hdl)
#define spi_closed() spi_close(lsm6dsl_info->spi_hdl)
#define spi_suspend() hw_spi_suspend(lsm6dsl_info->spi_hdl)
#define spi_resume() hw_spi_resume(lsm6dsl_info->spi_hdl)
u16 lsm6dsl_SPI_readNBytes(unsigned char devAddr,
unsigned char regAddr,
unsigned char *readBuf,
u16 readLen)
{
spi_cs_l();
spi_write_byte(regAddr | 0x80);//| 0x80:read mode
spi_dma_read(readBuf, readLen);
spi_cs_h();
return (readLen);
}
unsigned char lsm6dsl_SPI_writeByte(unsigned char devAddr,
unsigned char regAddr,
unsigned char writebyte)
{
spi_cs_l();
spi_write_byte(regAddr);
spi_write_byte(writebyte);
spi_cs_h();
udelay(5);//delay5us
return (1);
}
u16 lsm6dsl_SPI_writeNBytes(unsigned char devAddr,
unsigned char regAddr,
unsigned char *writeBuf,
u16 writeLen)
{
#if 1 //多字节dma写
spi_cs_l();
spi_write_byte(regAddr);
spi_dma_write(writeBuf, writeLen);
spi_cs_h();
#else
u16 i = 0;
for (; i < writeLen; i++) {
lsm6dsl_SPI_writeByte(devAddr, regAddr + i, writeBuf[i]);
}
#endif
//SPIWrite((regAddr & 0x7F), writeBuf, writeLen);
return (i);
}
IMU_read lsm6dsl_read = lsm6dsl_SPI_readNBytes;
IMU_write lsm6dsl_write = lsm6dsl_SPI_writeByte;
#endif
static int32_t platform_write(void *handle, uint8_t Reg, uint8_t *Bufp,
uint16_t len)
{
/* if(handle==iic){} */
#if (LSM6DSL_USER_INTERFACE==LSM6DSL_USE_I2C)
return lsm6dsl_I2C_Write_NBytes(LSM6DSL_IIC_SLAVE_ADDRESS, Reg, Bufp, len);
#elif (LSM6DSL_USER_INTERFACE==LSM6DSL_USE_SPI)
return lsm6dsl_SPI_writeNBytes(0, Reg, Bufp, len);
#endif
}
static int32_t platform_read(void *handle, uint8_t Reg, uint8_t *Bufp,
uint16_t len)
{
/* if(handle==iic){} */
#if (LSM6DSL_USER_INTERFACE==LSM6DSL_USE_I2C)
return lsm6dsl_I2C_Read_NBytes(LSM6DSL_IIC_SLAVE_ADDRESS, Reg, Bufp, len);
#elif (LSM6DSL_USER_INTERFACE==LSM6DSL_USE_SPI)
return lsm6dsl_SPI_readNBytes(0, Reg, Bufp, len);
#endif
}
lsm6dsl_ctx_t lsm6dsl_ctx = {
.write_reg = platform_write,
.read_reg = platform_read,
.handle = NULL//spi or iic
};
/*
******************************************************************************
* @file lsm6dsl_reg.c
* @author MEMS Software Solution Team
* @date 30-August-2017
* @brief driver file
******************************************************************************
* @attention
*
* <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of STMicroelectronics nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
/**
* @addtogroup lsm6dsl
* @brief This file provides a set of functions needed to drive the
* lsm6dsl enanced inertial module.
* @{
*/
/**
* @addtogroup interfaces_functions
* @brief This section provide a set of functions used to read and write
* a generic register of the device.
* @{
*/
/**
* @brief Read generic device register
*
* @param lsm6dsl_ctx_t* ctx: read / write interface definitions
* @param uint8_t reg: register to read
* @param uint8_t* data: pointer to buffer that store the data read
* @param uint16_t len: number of consecutive register to read
*
*/
int32_t lsm6dsl_read_reg(lsm6dsl_ctx_t *ctx, uint8_t reg, uint8_t *data,
uint16_t len)
{
return ctx->read_reg(ctx->handle, reg, data, len);
}
/**
* @brief Write generic device register
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t reg: register to write
* @param uint8_t* data: pointer to data to write in register reg
* @param uint16_t len: number of consecutive register to write
*
*/
int32_t lsm6dsl_write_reg(lsm6dsl_ctx_t *ctx, uint8_t reg, uint8_t *data,
uint16_t len)
{
return ctx->write_reg(ctx->handle, reg, data, len);
}
/**
* @}
*/
/** @addtogroup common_functions
* @brief This section provide a set of most common functions used
* to drive the device.
* @{
*/
/**
* @brief drdy_mode: [set] Define DataReady mode, pulses are 75 μs long,
* latched on outputs reads
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_drdy_pulsed_t: change the values of drdy_pulsed
* in reg DRDY_PULSE_CFG_G
*
*/
int32_t lsm6dsl_drdy_mode_set(lsm6dsl_ctx_t *ctx, lsm6dsl_drdy_pulsed_t val)
{
lsm6dsl_drdy_pulse_cfg_g_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_DRDY_PULSE_CFG_G,
(uint8_t *)&reg, 1);
reg.drdy_pulsed = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_DRDY_PULSE_CFG_G,
(uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief drdy_mode: [get] Define DataReady mode, pulses are 75 μs long,
* latched on outputs reads
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_drdy_pulsed_t: Get the values of drdy_pulsed
* in reg DRDY_PULSE_CFG_G
*
*/
int32_t lsm6dsl_drdy_mode_get(lsm6dsl_ctx_t *ctx, lsm6dsl_drdy_pulsed_t *val)
{
lsm6dsl_drdy_pulse_cfg_g_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_DRDY_PULSE_CFG_G,
(uint8_t *)&reg, 1);
*val = (lsm6dsl_drdy_pulsed_t) reg.drdy_pulsed;
return mm_error;
}
/**
* @brief xl_data_rate: [set] Accelerometer data rate selection.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_odr_xl_t: change the values of odr_xl in reg CTRL1_XL
*
*/
int32_t lsm6dsl_xl_data_rate_set(lsm6dsl_ctx_t *ctx, lsm6dsl_odr_xl_t val)
{
lsm6dsl_ctrl1_xl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL1_XL, (uint8_t *)&reg, 1);
reg.odr_xl = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL1_XL, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief xl_data_rate: [get] Accelerometer data rate selection.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_odr_xl_t: Get the values of odr_xl in reg CTRL1_XL
*
*/
int32_t lsm6dsl_xl_data_rate_get(lsm6dsl_ctx_t *ctx, lsm6dsl_odr_xl_t *val)
{
lsm6dsl_ctrl1_xl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL1_XL, (uint8_t *)&reg, 1);
*val = (lsm6dsl_odr_xl_t) reg.odr_xl;
return mm_error;
}
/**
* @brief xl_full_scale: [set] Accelerometer full-scale selection.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_fs_xl_t: change the values of fs_xl in reg CTRL1_XL
*
*/
int32_t lsm6dsl_xl_full_scale_set(lsm6dsl_ctx_t *ctx, lsm6dsl_fs_xl_t val)
{
lsm6dsl_ctrl1_xl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL1_XL, (uint8_t *)&reg, 1);
reg.fs_xl = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL1_XL, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief xl_full_scale: [get] Accelerometer full-scale selection.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_fs_xl_t: Get the values of fs_xl in reg CTRL1_XL
*
*/
int32_t lsm6dsl_xl_full_scale_get(lsm6dsl_ctx_t *ctx, lsm6dsl_fs_xl_t *val)
{
lsm6dsl_ctrl1_xl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL1_XL, (uint8_t *)&reg, 1);
*val = (lsm6dsl_fs_xl_t) reg.fs_xl;
return mm_error;
}
/**
* @brief gyro_data_rate: [set] Gyroscope data rate selection.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_odr_g_t: change the values of odr_g in reg CTRL2_G
*
*/
int32_t lsm6dsl_gyro_data_rate_set(lsm6dsl_ctx_t *ctx, lsm6dsl_odr_g_t val)
{
lsm6dsl_ctrl2_g_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL2_G, (uint8_t *)&reg, 1);
reg.odr_g = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL2_G, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief gyro_data_rate: [get] Gyroscope data rate selection.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_odr_g_t: Get the values of odr_g in reg CTRL2_G
*
*/
int32_t lsm6dsl_gyro_data_rate_get(lsm6dsl_ctx_t *ctx, lsm6dsl_odr_g_t *val)
{
lsm6dsl_ctrl2_g_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL2_G, (uint8_t *)&reg, 1);
*val = (lsm6dsl_odr_g_t) reg.odr_g;
return mm_error;
}
/**
* @brief gyro_full_scale: [set] Gyroscope full-scale selection.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_fs_g_t: change the values of fs_g in reg CTRL2_G
*
*/
int32_t lsm6dsl_gyro_full_scale_set(lsm6dsl_ctx_t *ctx, lsm6dsl_fs_g_t val)
{
lsm6dsl_ctrl2_g_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL2_G, (uint8_t *)&reg, 1);
reg.fs_g = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL2_G, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief gyro_full_scale: [get] Gyroscope full-scale selection.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_fs_g_t: Get the values of fs_g in reg CTRL2_G
*
*/
int32_t lsm6dsl_gyro_full_scale_get(lsm6dsl_ctx_t *ctx, lsm6dsl_fs_g_t *val)
{
lsm6dsl_ctrl2_g_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL2_G, (uint8_t *)&reg, 1);
*val = (lsm6dsl_fs_g_t) reg.fs_g;
return mm_error;
}
/**
* @brief reset: [set] Software reset. This bit is automatically cleared.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of sw_reset in reg CTRL3_C
*
*/
int32_t lsm6dsl_reset_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_ctrl3_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL3_C, (uint8_t *)&reg, 1);
reg.sw_reset = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL3_C, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief reset: [get] Software reset. This bit is automatically cleared.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of sw_reset in reg CTRL3_C
*
*/
int32_t lsm6dsl_reset_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_ctrl3_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL3_C, (uint8_t *)&reg, 1);
*val = reg.sw_reset;
return mm_error;
}
/**
* @brief block_data_update: [set] If enabled registers not updated
* until MSB and LSB have been read.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of bdu in reg CTRL3_C
*
*/
int32_t lsm6dsl_block_data_update_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_ctrl3_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL3_C, (uint8_t *)&reg, 1);
reg.bdu = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL3_C, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief block_data_update: [get] If enabled registers not updated
* until MSB and LSB have been read.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of bdu in reg CTRL3_C
*
*/
int32_t lsm6dsl_block_data_update_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_ctrl3_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL3_C, (uint8_t *)&reg, 1);
*val = reg.bdu;
return mm_error;
}
/**
* @brief gyro_lpf1: [set] Enable gyroscope digital LPF1. The bandwidth
* can be selected through FTYPE
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of lpf1_sel_g in reg CTRL4_C
*
*/
int32_t lsm6dsl_gyro_lpf1_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_ctrl4_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL4_C, (uint8_t *)&reg, 1);
reg.lpf1_sel_g = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL4_C, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief gyro_lpf1: [get] Enable gyroscope digital LPF1.
* The bandwidth can be selected through FTYPE
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of lpf1_sel_g in reg CTRL4_C
*
*/
int32_t lsm6dsl_gyro_lpf1_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_ctrl4_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL4_C, (uint8_t *)&reg, 1);
*val = reg.lpf1_sel_g;
return mm_error;
}
/**
* @brief device_id: [get] device_id value in DIGIT
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t : union that group together the device_id data
*
*/
int32_t lsm6dsl_device_id(lsm6dsl_ctx_t *ctx, uint8_t *buff)
{
return lsm6dsl_read_reg(ctx, LSM6DSL_WHO_AM_I, (uint8_t *) buff,
sizeof(uint8_t));
}
/**
* @brief temperature: [get] temperature value in DIGIT
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param axis1byt16_t : union that group together the temperature data
*
*/
int32_t lsm6dsl_temperature_raw(lsm6dsl_ctx_t *ctx, axis1bit16_t *buff)
{
return lsm6dsl_read_reg(ctx, LSM6DSL_OUT_TEMP_L, (uint8_t *) buff,
sizeof(axis1bit16_t));
}
float lsm6dsl_read_temperature(lsm6dsl_ctx_t *ctx)
{
axis1bit16_t buff;
lsm6dsl_read_reg(ctx, LSM6DSL_OUT_TEMP_L, (uint8_t *) &buff, sizeof(axis1bit16_t));
return (float)(buff.i16bit) / 256.0f + 25;
}
/**
* @brief angular_rate: [get] angular_rate value in DIGIT
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param axis3bit16_t : union that group together the angular_rate data
*
*/
int32_t lsm6dsl_angular_rate_raw(lsm6dsl_ctx_t *ctx, axis3bit16_t *buff)
{
return lsm6dsl_read_reg(ctx, LSM6DSL_OUTX_L_G, (uint8_t *) buff,
sizeof(axis3bit16_t));
}
/**
* @brief acceleration: [get] acceleration value in DIGIT
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param axis3bit16_t : union that group together the acceleration data
*
*/
int32_t lsm6dsl_acceleration_raw(lsm6dsl_ctx_t *ctx, axis3bit16_t *buff)
{
return lsm6dsl_read_reg(ctx, LSM6DSL_OUTX_L_XL, (uint8_t *) buff,
sizeof(axis3bit16_t));
}
void lsm6dsl_read_raw_acc_xyz(lsm6dsl_ctx_t *ctx, void *acc_data)
{
unsigned char buf_reg[8];
imu_axis_data_t *raw_acc_xyz = (imu_axis_data_t *)acc_data;
lsm6dsl_read_reg(ctx, LSM6DSL_OUTX_L_XL, buf_reg, 6);
raw_acc_xyz->x = (short)((unsigned short)(buf_reg[1] << 8) | (buf_reg[0]));
raw_acc_xyz->y = (short)((unsigned short)(buf_reg[3] << 8) | (buf_reg[2]));
raw_acc_xyz->z = (short)((unsigned short)(buf_reg[5] << 8) | (buf_reg[4]));
/* log_info("Qmi8658 acc: %d %d %d\n", raw_acc_xyz->x, raw_acc_xyz->y, raw_acc_xyz->z); */
}
void lsm6dsl_read_raw_gyro_xyz(lsm6dsl_ctx_t *ctx, void *gyro_data)
{
unsigned char buf_reg[6];
imu_axis_data_t *raw_gyro_xyz = (imu_axis_data_t *)gyro_data;
lsm6dsl_read_reg(ctx, LSM6DSL_OUTX_L_G, buf_reg, 6);
raw_gyro_xyz->x = (short)((unsigned short)(buf_reg[1] << 8) | (buf_reg[0]));
raw_gyro_xyz->y = (short)((unsigned short)(buf_reg[3] << 8) | (buf_reg[2]));
raw_gyro_xyz->z = (short)((unsigned short)(buf_reg[5] << 8) | (buf_reg[4]));
/* log_info("Qmi8658 gyro: %d %d %d\n", raw_gyro_xyz->x, raw_gyro_xyz->y, raw_gyro_xyz->z); */
}
void lsm6dsl_read_raw_acc_gyro_xyz(lsm6dsl_ctx_t *ctx, void *raw_data)
{
unsigned char buf_reg[14];
short temp = 0;
imu_sensor_data_t *raw_sensor_data = (imu_sensor_data_t *)raw_data;
/* lsm6dsl_read_reg(ctx, LSM6DSL_OUTX_L_G, (uint8_t*) buf_reg,12); */
lsm6dsl_read_reg(ctx, LSM6DSL_OUT_TEMP_L, (uint8_t *) buf_reg, 14);
temp = ((short)buf_reg[1] << 8) | buf_reg[0];
raw_sensor_data->temp_data = (float)temp / 256.0f + 25;
raw_sensor_data->gyro.x = (short)((unsigned short)(buf_reg[3] << 8) | (buf_reg[2]));
raw_sensor_data->gyro.y = (short)((unsigned short)(buf_reg[5] << 8) | (buf_reg[4]));
raw_sensor_data->gyro.z = (short)((unsigned short)(buf_reg[7] << 8) | (buf_reg[6]));
raw_sensor_data->acc.x = (short)((unsigned short)(buf_reg[9] << 8) | (buf_reg[8]));
raw_sensor_data->acc.y = (short)((unsigned short)(buf_reg[11] << 8) | (buf_reg[10]));
raw_sensor_data->acc.z = (short)((unsigned short)(buf_reg[13] << 8) | (buf_reg[12]));
/* log_info("lsm6dsl raw:acc_x:%d acc_y:%d acc_z:%d gyro_x:%d gyro_y:%d gyro_z:%d", raw_sensor_data->acc.x, raw_sensor_data->acc.y, raw_sensor_data->acc.z, raw_sensor_data->gyro.x, raw_sensor_data->gyro.y, raw_sensor_data->gyro.z); */
/* log_info("lsm6dsl temp:%d.%d\n", (u16)(raw_sensor_data->temp_data), (u16)(((u16)((raw_sensor_data->temp_data)* 100)) % 100)); */
}
/**
* @brief lsm6dsl_status: [get] read all the device status and
* source registers
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_multi_status_t: union of refisters
* from WAKE_UP_SRC to WRIST_TILT_IA
*
*/
int32_t lsm6dsl_status_get(lsm6dsl_ctx_t *ctx, lsm6dsl_multi_status_t *val)
{
int32_t mm_error;
/* WAKE_UP_SRC + TAP_SRC + D6D_SRC + STATUS_REG */
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_WAKE_UP_SRC, (uint8_t *)val, 4);
val += 4;
/* FUNC_SRC1 + FUNC_SRC2 + WRIST_TILT_IA */
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FUNC_SRC1, (uint8_t *)val, 3);
return mm_error;
}
/**
* @}
*/
/**
* @addtogroup Interrupt_functions
* @brief This section provide a set of functions used
* to manage the interrupts of the devices.
* @{
*/
/**
* @brief wrist_tilt_on_int2: [set] Wrist tilt interrupt on INT2 pad.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of int2_wrist_tilt
* in reg DRDY_PULSE_CFG_G
*
*/
int32_t lsm6dsl_wrist_tilt_on_int2_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_drdy_pulse_cfg_g_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_DRDY_PULSE_CFG_G,
(uint8_t *)&reg, 1);
reg.int2_wrist_tilt = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_DRDY_PULSE_CFG_G,
(uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief wrist_tilt_on_int2: [get] Wrist tilt interrupt on INT2 pad.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of int2_wrist_tilt
* in reg DRDY_PULSE_CFG_G
*
*/
int32_t lsm6dsl_wrist_tilt_on_int2_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_drdy_pulse_cfg_g_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_DRDY_PULSE_CFG_G,
(uint8_t *)&reg, 1);
*val = reg.int2_wrist_tilt;
return mm_error;
}
/**
* @brief xl_drdy_on_int1: [set] Accelerometer Data Ready on INT1 pad.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of int1_drdy_xl in reg INT1_CTRL
*
*/
int32_t lsm6dsl_xl_drdy_on_int1_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_int1_ctrl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)&reg, 1);
reg.int1_drdy_xl = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief xl_drdy_on_int1: [get] Accelerometer Data Ready on INT1 pad.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of int1_drdy_xl in reg INT1_CTRL
*
*/
int32_t lsm6dsl_xl_drdy_on_int1_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_int1_ctrl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)&reg, 1);
*val = reg.int1_drdy_xl;
return mm_error;
}
/**
* @brief gyro_drdy_on_int1: [set] Giroscope Data Ready on INT1 pad.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of int1_drdy_g in reg INT1_CTRL
*
*/
int32_t lsm6dsl_gyro_drdy_on_int1_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_int1_ctrl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)&reg, 1);
reg.int1_drdy_g = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief gyro_drdy_on_int1: [get] Giroscope Data Ready on INT1 pad.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of int1_drdy_g in reg INT1_CTRL
*
*/
int32_t lsm6dsl_gyro_drdy_on_int1_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_int1_ctrl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)&reg, 1);
*val = reg.int1_drdy_g;
return mm_error;
}
/**
* @brief boot_on_int1: [set] Boot signal on INT1 pad.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of int1_boot in reg INT1_CTRL
*
*/
int32_t lsm6dsl_boot_on_int1_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_int1_ctrl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)&reg, 1);
reg.int1_boot = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief boot_on_int1: [get] Boot signal on INT1 pad.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of int1_boot in reg INT1_CTRL
*
*/
int32_t lsm6dsl_boot_on_int1_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_int1_ctrl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)&reg, 1);
*val = reg.int1_boot;
return mm_error;
}
/**
* @brief fifo_threshold_on_int1: [set] FIFO threshold signal on INT1 pad.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of int1_fth in reg INT1_CTRL
*
*/
int32_t lsm6dsl_fifo_threshold_on_int1_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_int1_ctrl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)&reg, 1);
reg.int1_fth = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief fifo_threshold_on_int1: [get] FIFO threshold signal on INT1 pad.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of int1_fth in reg INT1_CTRL
*
*/
int32_t lsm6dsl_fifo_threshold_on_int1_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_int1_ctrl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)&reg, 1);
*val = reg.int1_fth;
return mm_error;
}
/**
* @brief fifo_overrun_on_int1: [set] FIFO overrun signal on INT1 pad.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of int1_fifo_ovr in reg INT1_CTRL
*
*/
int32_t lsm6dsl_fifo_overrun_on_int1_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_int1_ctrl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)&reg, 1);
reg.int1_fifo_ovr = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief fifo_overrun_on_int1: [get] FIFO overrun signal on INT1 pad.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of int1_fifo_ovr in reg INT1_CTRL
*
*/
int32_t lsm6dsl_fifo_overrun_on_int1_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_int1_ctrl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)&reg, 1);
*val = reg.int1_fifo_ovr;
return mm_error;
}
/**
* @brief fifo_full_on_int1: [set] FIFO full signal on INT1 pad.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of int1_full_flag in reg INT1_CTRL
*
*/
int32_t lsm6dsl_fifo_full_on_int1_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_int1_ctrl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)&reg, 1);
reg.int1_full_flag = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief fifo_full_on_int1: [get] FIFO full signal on INT1 pad.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of int1_full_flag in reg INT1_CTRL
*
*/
int32_t lsm6dsl_fifo_full_on_int1_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_int1_ctrl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)&reg, 1);
*val = reg.int1_full_flag;
return mm_error;
}
/**
* @brief sign_motion_on_int1: [set] Significant motion interrupt
* enable on INT1 pad.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of int1_sign_mot in reg INT1_CTRL
*
*/
int32_t lsm6dsl_sign_motion_on_int1_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_int1_ctrl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)&reg, 1);
reg.int1_sign_mot = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief sign_motion_on_int1: [get] Significant motion interrupt
* enable on INT1 pad.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of int1_sign_mot in reg INT1_CTRL
*
*/
int32_t lsm6dsl_sign_motion_on_int1_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_int1_ctrl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)&reg, 1);
*val = reg.int1_sign_mot;
return mm_error;
}
/**
* @brief step_detect_on_int1: [set] Pedometer step recognition
* interrupt enable on INT1 pad.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of int1_step_detector
* in reg INT1_CTRL
*
*/
int32_t lsm6dsl_step_detect_on_int1_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_int1_ctrl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)&reg, 1);
reg.int1_step_detector = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief step_detect_on_int1: [get] Pedometer step recognition interrupt
* enable on INT1 pad.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of int1_step_detector
* in reg INT1_CTRL
*
*/
int32_t lsm6dsl_step_detect_on_int1_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_int1_ctrl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT1_CTRL, (uint8_t *)&reg, 1);
*val = reg.int1_step_detector;
return mm_error;
}
/**
* @brief xl_drdy_on_int2: [set] Accelerometer Data Ready on INT2 pad.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of int2_drdy_xl in reg INT2_CTRL
*
*/
int32_t lsm6dsl_xl_drdy_on_int2_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_int2_ctrl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)&reg, 1);
reg.int2_drdy_xl = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief xl_drdy_on_int2: [get] Accelerometer Data Ready on INT2 pad.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of int2_drdy_xl in reg INT2_CTRL
*
*/
int32_t lsm6dsl_xl_drdy_on_int2_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_int2_ctrl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)&reg, 1);
*val = reg.int2_drdy_xl;
return mm_error;
}
/**
* @brief gyro_drdy_on_int2: [set] Giroscope Data Ready on INT2 pad.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of int2_drdy_g in reg INT2_CTRL
*
*/
int32_t lsm6dsl_gyro_drdy_on_int2_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_int2_ctrl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)&reg, 1);
reg.int2_drdy_g = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief gyro_drdy_on_int2: [get] Giroscope Data Ready on INT2 pad.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of int2_drdy_g in reg INT2_CTRL
*
*/
int32_t lsm6dsl_gyro_drdy_on_int2_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_int2_ctrl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)&reg, 1);
*val = reg.int2_drdy_g;
return mm_error;
}
/**
* @brief temperature_drdy_on_int2: [set] Temperature Data Ready
* on INT2 pad.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of int2_drdy_temp in reg INT2_CTRL
*
*/
int32_t lsm6dsl_temperature_drdy_on_int2_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_int2_ctrl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)&reg, 1);
reg.int2_drdy_temp = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief temperature_drdy_on_int2: [get] Temperature Data Ready
* on INT2 pad.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of int2_drdy_temp in reg INT2_CTRL
*
*/
int32_t lsm6dsl_temperature_drdy_on_int2_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_int2_ctrl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)&reg, 1);
*val = reg.int2_drdy_temp;
return mm_error;
}
/**
* @brief fifo_threshold_on_int2: [set] FIFO threshold signal on INT2 pad.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of int2_fth in reg INT2_CTRL
*
*/
int32_t lsm6dsl_fifo_threshold_on_int2_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_int2_ctrl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)&reg, 1);
reg.int2_fth = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief fifo_threshold_on_int2: [get] FIFO threshold signal on INT2 pad.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of int2_fth in reg INT2_CTRL
*
*/
int32_t lsm6dsl_fifo_threshold_on_int2_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_int2_ctrl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)&reg, 1);
*val = reg.int2_fth;
return mm_error;
}
/**
* @brief fifo_overrun_on_int2: [set] FIFO overrun signal on INT2 pad.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of int2_fifo_ovr in reg INT2_CTRL
*
*/
int32_t lsm6dsl_fifo_overrun_on_int2_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_int2_ctrl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)&reg, 1);
reg.int2_fifo_ovr = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief fifo_overrun_on_int2: [get] FIFO overrun signal on INT2 pad.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of int2_fifo_ovr in reg INT2_CTRL
*
*/
int32_t lsm6dsl_fifo_overrun_on_int2_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_int2_ctrl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)&reg, 1);
*val = reg.int2_fifo_ovr;
return mm_error;
}
/**
* @brief fifo_full_on_int2: [set] FIFO full signal on INT2 pad.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of int2_full_flag in reg INT2_CTRL
*
*/
int32_t lsm6dsl_fifo_full_on_int2_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_int2_ctrl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)&reg, 1);
reg.int2_full_flag = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief fifo_full_on_int2: [get] FIFO full signal on INT2 pad.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of int2_full_flag in reg INT2_CTRL
*
*/
int32_t lsm6dsl_fifo_full_on_int2_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_int2_ctrl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)&reg, 1);
*val = reg.int2_full_flag;
return mm_error;
}
/**
* @brief step_overflow_on_int2: [set] Step counter overflow
* interrupt enable on INT2 pad.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of int2_step_count_ov
* in reg INT2_CTRL
*
*/
int32_t lsm6dsl_step_overflow_on_int2_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_int2_ctrl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)&reg, 1);
reg.int2_step_count_ov = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief step_overflow_on_int2: [get] Step counter overflow
* interrupt enable on INT2 pad.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of int2_step_count_ov in reg INT2_CTRL
*
*/
int32_t lsm6dsl_step_overflow_on_int2_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_int2_ctrl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)&reg, 1);
*val = reg.int2_step_count_ov;
return mm_error;
}
/**
* @brief step_on_time_interval_on_int2: [set] Pedometer step
* recognition interrupt on
* delta time enable on INT2 pad.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of int2_step_delta in reg INT2_CTRL
*
*/
int32_t lsm6dsl_step_on_time_interval_on_int2_set(lsm6dsl_ctx_t *ctx,
uint8_t val)
{
lsm6dsl_int2_ctrl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT2_CTRL,
(uint8_t *)&reg, 1);
reg.int2_step_delta = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_INT2_CTRL,
(uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief step_on_time_interval_on_int2: [get] Pedometer step recognition
* interrupt on delta time enable
* on INT2 pad.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of int2_step_delta in reg INT2_CTRL
*
*/
int32_t lsm6dsl_step_on_time_interval_on_int2_get(lsm6dsl_ctx_t *ctx,
uint8_t *val)
{
lsm6dsl_int2_ctrl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT2_CTRL, (uint8_t *)&reg, 1);
*val = reg.int2_step_delta;
return mm_error;
}
/**
* @}
*/
/** @addtogroup FIFO_functions
* @brief This section provide a set of functions used
* to manage the FIFO of the devices.
* @{
*/
/**
* @brief fifo_temperature: [set] Enable the temperature data
* storage in FIFO.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of fifo_temp_en in reg FIFO_CTRL2
*
*/
int32_t lsm6dsl_fifo_temperature_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_fifo_ctrl2_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL2, (uint8_t *)&reg, 1);
reg.fifo_temp_en = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_FIFO_CTRL2, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief fifo_temperature: [get] Enable the temperature
* data storage in FIFO.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of fifo_temp_en in reg FIFO_CTRL2
*
*/
int32_t lsm6dsl_fifo_temperature_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_fifo_ctrl2_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL2, (uint8_t *)&reg, 1);
*val = reg.fifo_temp_en;
return mm_error;
}
/**
* @brief fifo_write_mode: [set] Enable write in FIFO on XL/Gyro
* data-ready or at every step detected by
* step counter
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_timer_pedo_fifo_drdy_t: change the values of
* timer_pedo_fifo_drdy in
* reg FIFO_CTRL2
*
*/
int32_t lsm6dsl_fifo_write_mode_set(lsm6dsl_ctx_t *ctx,
lsm6dsl_timer_pedo_fifo_drdy_t val)
{
lsm6dsl_fifo_ctrl2_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL2, (uint8_t *)&reg, 1);
reg.timer_pedo_fifo_drdy = val;
reg.not_used_01 = 0;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_FIFO_CTRL2, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief fifo_write_mode: [get] Enable write in FIFO on XL/Gyro
* data-ready or at every step detected by step counter
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_timer_pedo_fifo_drdy_t: Get the values of
* timer_pedo_fifo_drdy in
* reg FIFO_CTRL2
*
*/
int32_t lsm6dsl_fifo_write_mode_get(lsm6dsl_ctx_t *ctx,
lsm6dsl_timer_pedo_fifo_drdy_t *val)
{
lsm6dsl_fifo_ctrl2_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL2, (uint8_t *)&reg, 1);
*val = (lsm6dsl_timer_pedo_fifo_drdy_t) reg.timer_pedo_fifo_drdy;
return mm_error;
}
/**
* @brief fifo_step_timestamp: [set] Enable pedometer step
* counter and timestamp as 4th FIFO data set.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of timer_pedo_fifo_en
* in reg FIFO_CTRL2
*
*/
int32_t lsm6dsl_fifo_step_timestamp_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_fifo_ctrl2_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL2, (uint8_t *)&reg, 1);
reg.timer_pedo_fifo_en = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_FIFO_CTRL2, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief fifo_step_timestamp: [get] Enable pedometer step counter
* and timestamp as 4th FIFO data set.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of timer_pedo_fifo_en in reg FIFO_CTRL2
*
*/
int32_t lsm6dsl_fifo_step_timestamp_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_fifo_ctrl2_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL2, (uint8_t *)&reg, 1);
*val = reg.timer_pedo_fifo_en;
return mm_error;
}
/**
* @brief xl_decimation: [set] Accelerometer FIFO (second data set)
* decimation setting.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_dec_fifo_xl_t: change the values of
* dec_fifo_xl in reg FIFO_CTRL3
*
*/
int32_t lsm6dsl_xl_decimation_set(lsm6dsl_ctx_t *ctx,
lsm6dsl_dec_fifo_xl_t val)
{
lsm6dsl_fifo_ctrl3_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL3, (uint8_t *)&reg, 1);
reg.dec_fifo_xl = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_FIFO_CTRL3, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief xl_decimation: [get] Accelerometer FIFO (second data set)
* decimation setting.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_dec_fifo_xl_t: Get the values of dec_fifo_xl
* in reg FIFO_CTRL3
*
*/
int32_t lsm6dsl_xl_decimation_get(lsm6dsl_ctx_t *ctx,
lsm6dsl_dec_fifo_xl_t *val)
{
lsm6dsl_fifo_ctrl3_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL3, (uint8_t *)&reg, 1);
*val = (lsm6dsl_dec_fifo_xl_t) reg.dec_fifo_xl;
return mm_error;
}
/**
* @brief gyro_decimation: [set] Gyro FIFO (first data set)
* decimation setting.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_dec_fifo_gyro_t: change the values of
* dec_fifo_gyro in reg FIFO_CTRL3
*
*/
int32_t lsm6dsl_gyro_decimation_set(lsm6dsl_ctx_t *ctx,
lsm6dsl_dec_fifo_gyro_t val)
{
lsm6dsl_fifo_ctrl3_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL3, (uint8_t *)&reg, 1);
reg.dec_fifo_gyro = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_FIFO_CTRL3, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief gyro_decimation: [get] Gyro FIFO (first data set)
* decimation setting.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_dec_fifo_gyro_t: Get the values of dec_fifo_gyro
* in reg FIFO_CTRL3
*
*/
int32_t lsm6dsl_gyro_decimation_get(lsm6dsl_ctx_t *ctx,
lsm6dsl_dec_fifo_gyro_t *val)
{
lsm6dsl_fifo_ctrl3_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL3, (uint8_t *)&reg, 1);
*val = (lsm6dsl_dec_fifo_gyro_t) reg.dec_fifo_gyro;
return mm_error;
}
/**
* @brief dataset3_decimation: [set] Third FIFO data set
* decimation setting.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_dec_ds3_fifo_t: change the values of dec_ds3_fifo
* in reg FIFO_CTRL4
*
*/
int32_t lsm6dsl_dataset3_decimation_set(lsm6dsl_ctx_t *ctx,
lsm6dsl_dec_ds3_fifo_t val)
{
lsm6dsl_fifo_ctrl4_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL4, (uint8_t *)&reg, 1);
reg.dec_ds3_fifo = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_FIFO_CTRL4, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief dataset3_decimation: [get] Third FIFO data set
* decimation setting.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_dec_ds3_fifo_t: Get the values of dec_ds3_fifo
* in reg FIFO_CTRL4
*
*/
int32_t lsm6dsl_dataset3_decimation_get(lsm6dsl_ctx_t *ctx,
lsm6dsl_dec_ds3_fifo_t *val)
{
lsm6dsl_fifo_ctrl4_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL4, (uint8_t *)&reg, 1);
*val = (lsm6dsl_dec_ds3_fifo_t) reg.dec_ds3_fifo;
return mm_error;
}
/**
* @brief dataset4_decimation: [set] Fourth FIFO data set
* decimation setting.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_dec_ds4_fifo_t: change the values of dec_ds4_fifo
* in reg FIFO_CTRL4
*
*/
int32_t lsm6dsl_dataset4_decimation_set(lsm6dsl_ctx_t *ctx,
lsm6dsl_dec_ds4_fifo_t val)
{
lsm6dsl_fifo_ctrl4_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL4, (uint8_t *)&reg, 1);
reg.dec_ds4_fifo = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_FIFO_CTRL4, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief dataset4_decimation: [get] Fourth FIFO data set decimation
* setting.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_dec_ds4_fifo_t: Get the values of dec_ds4_fifo
* in reg FIFO_CTRL4
*
*/
int32_t lsm6dsl_dataset4_decimation_get(lsm6dsl_ctx_t *ctx,
lsm6dsl_dec_ds4_fifo_t *val)
{
lsm6dsl_fifo_ctrl4_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL4, (uint8_t *)&reg, 1);
*val = (lsm6dsl_dec_ds4_fifo_t) reg.dec_ds4_fifo;
return mm_error;
}
/**
* @brief fifo_xl_gy_8bit_data: [set] MSByte only memorization in FIFO
* for XL and Gyro in FIFO.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of only_high_data in reg FIFO_CTRL4
*
*/
int32_t lsm6dsl_fifo_xl_gy_8bit_data_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_fifo_ctrl4_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL4, (uint8_t *)&reg, 1);
reg.only_high_data = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_FIFO_CTRL4, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief fifo_xl_gy_8bit_data: [get] MSByte only memorization
* in FIFO for XL and Gyro in FIFO.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of only_high_data in reg FIFO_CTRL4
*
*/
int32_t lsm6dsl_fifo_xl_gy_8bit_data_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_fifo_ctrl4_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL4, (uint8_t *)&reg, 1);
*val = reg.only_high_data;
return mm_error;
}
/**
* @brief fifo_threshold: [set] Enable FIFO threshold level use.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of stop_on_fth in reg FIFO_CTRL4
*
*/
int32_t lsm6dsl_fifo_stop_on_thr_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_fifo_ctrl4_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL4, (uint8_t *)&reg, 1);
reg.stop_on_fth = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_FIFO_CTRL4, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief fifo_threshold: [get] Enable FIFO threshold level use.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of stop_on_fth in reg FIFO_CTRL4
*
*/
int32_t lsm6dsl_fifo_stop_on_thr_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_fifo_ctrl4_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL4, (uint8_t *)&reg, 1);
*val = reg.stop_on_fth;
return mm_error;
}
/**
* @brief fifo_mode: [set] Define FIFO working mode.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_fifo_mode_t: change the values of fifo_mode
* in reg FIFO_CTRL5
*
*/
int32_t lsm6dsl_fifo_mode_set(lsm6dsl_ctx_t *ctx, lsm6dsl_fifo_mode_t val)
{
lsm6dsl_fifo_ctrl5_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL5, (uint8_t *)&reg, 1);
reg.fifo_mode = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_FIFO_CTRL5, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief fifo_mode: [get] Define FIFO working mode.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_fifo_mode_t: Get the values of fifo_mode in reg FIFO_CTRL5
*
*/
int32_t lsm6dsl_fifo_mode_get(lsm6dsl_ctx_t *ctx, lsm6dsl_fifo_mode_t *val)
{
lsm6dsl_fifo_ctrl5_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL5, (uint8_t *)&reg, 1);
*val = (lsm6dsl_fifo_mode_t) reg.fifo_mode;
return mm_error;
}
/**
* @brief fifo_data_rate: [set] Define FIFO working data rate.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_odr_fifo_t: change the values of odr_fifo
* in reg FIFO_CTRL5
*
*/
int32_t lsm6dsl_fifo_data_rate_set(lsm6dsl_ctx_t *ctx, lsm6dsl_odr_fifo_t val)
{
lsm6dsl_fifo_ctrl5_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL5, (uint8_t *)&reg, 1);
reg.odr_fifo = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_FIFO_CTRL5, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief fifo_data_rate: [get] Define FIFO working data rate.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_odr_fifo_t: Get the values of odr_fifo in reg FIFO_CTRL5
*
*/
int32_t lsm6dsl_fifo_data_rate_get(lsm6dsl_ctx_t *ctx, lsm6dsl_odr_fifo_t *val)
{
lsm6dsl_fifo_ctrl5_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL5, (uint8_t *)&reg, 1);
*val = (lsm6dsl_odr_fifo_t) reg.odr_fifo;
return mm_error;
}
/**
* @brief fifo_data_valid: [set] Selection of FIFO data-valid signal.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_data_valid_sel_fifo_t: change the values of
* data_valid_sel_fifo in
* reg MASTER_CONFIG
*
*/
int32_t lsm6dsl_fifo_data_valid_set(lsm6dsl_ctx_t *ctx,
lsm6dsl_data_valid_sel_fifo_t val)
{
lsm6dsl_master_config_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_MASTER_CONFIG, (uint8_t *)&reg, 1);
reg.data_valid_sel_fifo = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_MASTER_CONFIG, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief fifo_data_valid: [get] Selection of FIFO data-valid signal.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_data_valid_sel_fifo_t: Get the values of
* data_valid_sel_fifo in
* reg MASTER_CONFIG
*
*/
int32_t lsm6dsl_fifo_data_valid_get(lsm6dsl_ctx_t *ctx,
lsm6dsl_data_valid_sel_fifo_t *val)
{
lsm6dsl_master_config_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_MASTER_CONFIG, (uint8_t *)&reg, 1);
*val = (lsm6dsl_data_valid_sel_fifo_t) reg.data_valid_sel_fifo;
return mm_error;
}
/**
* @brief fifo_empty: [get] FIFOemptybit.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of fifo_empty in reg FIFO_STATUS2
*
*/
int32_t lsm6dsl_fifo_empty_get(lsm6dsl_ctx_t *ctx)
{
lsm6dsl_fifo_status2_t reg;
lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_STATUS2, (uint8_t *)&reg, 1);
return reg.fifo_empty;
}
/**
* @brief fifo_full_next_cycle: [get] FSmart FIFO full status.
* FIFO will be full at the next ODR.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of fifo_full_smart in reg FIFO_STATUS2
*
*/
int32_t lsm6dsl_fifo_full_next_cycle_get(lsm6dsl_ctx_t *ctx)
{
lsm6dsl_fifo_status2_t reg;
lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_STATUS2, (uint8_t *)&reg, 1);
return reg.fifo_full_smart;
}
/**
* @brief fifo_over_run: [get] FIFO overrun status.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of over_run in reg FIFO_STATUS2
*
*/
int32_t lsm6dsl_fifo_over_run_get(lsm6dsl_ctx_t *ctx)
{
lsm6dsl_fifo_status2_t reg;
lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_STATUS2, (uint8_t *)&reg, 1);
return reg.over_run;
}
/**
* @brief fifo_watermark_level: [get] FIFO watermark status. FIFO
* filling is equal to or higher than
* the watermark level.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of waterm in reg FIFO_STATUS2
*
*/
int32_t lsm6dsl_fifo_watermark_level_get(lsm6dsl_ctx_t *ctx)
{
lsm6dsl_fifo_status2_t reg;
lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_STATUS2, (uint8_t *)&reg, 1);
return reg.waterm;
}
/**
* @brief fifo_threshold: [set] Watermark flag rises when the number
* of bytes written to FIFO after the next write
* is greater than or equal to the threshold level.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint16_t: change the values of fth
*
*/
int32_t lsm6dsl_fifo_threshold_set(lsm6dsl_ctx_t *ctx, uint16_t val)
{
int32_t mm_error;
uint16_t reg;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL1, (uint8_t *) &reg,
sizeof(uint16_t));
reg &= 0xF800;
reg |= (val & 0x07FF);
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_FIFO_CTRL1, (uint8_t *) &reg,
sizeof(uint16_t));
return mm_error;
}
/**
* @brief fifo_threshold: [get] Watermark flag rises when the number
* of bytes written to FIFO after the next write
* is greater than or equal to the threshold level.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint16_t: get the values of fth
*
*/
int32_t lsm6dsl_fifo_threshold_get(lsm6dsl_ctx_t *ctx, uint16_t *val)
{
int32_t mm_error;
uint16_t reg;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_CTRL1, (uint8_t *) &reg,
sizeof(uint16_t));
reg &= 0x07FF;
return mm_error;
}
/**
* @brief fifo_unread_words: [get] Number of unread words (16-bit axes)
* stored in FIFO.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint16_t: get the values of diff_fifo
*
*/
int32_t lsm6dsl_fifo_unread_words_get(lsm6dsl_ctx_t *ctx, uint16_t *val)
{
int32_t mm_error;
uint16_t reg;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_STATUS1, (uint8_t *) &reg,
sizeof(uint16_t));
reg &= 0x07FF;
return mm_error;
}
/**
* @brief fifo_recursive_pattern: [get] Word of recursive pattern
* read at the next reading.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint16_t: Word of recursive pattern read at the next reading.
*
*/
int32_t lsm6dsl_fifo_recursive_pattern_get(lsm6dsl_ctx_t *ctx, uint16_t *val)
{
int32_t mm_error;
uint16_t reg;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_STATUS3, (uint8_t *) &reg,
sizeof(uint16_t));
reg &= 0x03FF;
return mm_error;
}
/**
* @brief fifo_output: [get] fifo_output value in DIGIT
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param axis1bit16_t : union that group together the fifo_output data
*
*/
int32_t lsm6dsl_fifo_output_raw(lsm6dsl_ctx_t *ctx, axis1bit16_t *buff)
{
return lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_DATA_OUT_L, (uint8_t *) buff,
sizeof(axis1bit16_t));
}
lsm6dsl_fifo_mode_t fifo_mode_old = STOP_WHEN_FULL;
void lsm6dsl_fifo_mode_start()
{
lsm6dsl_fifo_mode_set(&lsm6dsl_ctx, BYPASS);
lsm6dsl_fifo_mode_set(&lsm6dsl_ctx, STOP_WHEN_FULL);
}
//data:gyro(6bytes)+acc(6bytes)+step(6bytes)+temperature(6bytes头尾补0)
int32_t lsm6dsl_read_fifo(lsm6dsl_ctx_t *ctx, u8 *buff)
{
uint16_t reg = 0;
uint16_t ret = 0;
lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_STATUS1, (uint8_t *)&reg, 2);
/* log_info("fifo status[15~12]:0x%x!",reg); */
if (reg & 0x1000) {
/* log_info("fifo empty!"); */
putchar('.');
/* } else if (reg & 0xe000) { */
} else {
/* } else if (reg & 0x8000) { */
reg &= 0x07FF;
/* log_info("fifo level:%d!",reg); */
if (reg > 0) {
#if 0
for (i = 1; i < reg; i++) {
}
#else
ret = lsm6dsl_read_reg(ctx, LSM6DSL_FIFO_DATA_OUT_L, (uint8_t *) buff, reg * 2);
if (fifo_mode_old == STOP_WHEN_FULL) {
lsm6dsl_fifo_mode_start();
}
return ret;
#endif
}
}
return 0;
}
/**
* @}
*/
/**
* @addtogroup advanced_function_functions
* @brief This section provide a set of functions used
* to manage the advanced feature of the device.
* @{
*/
/**
* @brief xl_analog_bandwidth: [set] Accelerometer analog chain bandwidth
* selection (only for accelerometer
* ODR ≥ 1.67 kHz).
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_bw0_xl_t: change the values of bw0_xl in reg CTRL1_XL
*
*/
int32_t lsm6dsl_xl_analog_bandwidth_set(lsm6dsl_ctx_t *ctx, lsm6dsl_bw0_xl_t val)
{
lsm6dsl_ctrl1_xl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL1_XL, (uint8_t *)&reg, 1);
reg.bw0_xl = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL1_XL, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief xl_analog_bandwidth: [get] Accelerometer analog chain
* bandwidth selection (only for accelerometer
* ODR ≥ 1.67 kHz).
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_bw0_xl_t: Get the values of bw0_xl in reg CTRL1_XL
*
*/
int32_t lsm6dsl_xl_analog_bandwidth_get(lsm6dsl_ctx_t *ctx,
lsm6dsl_bw0_xl_t *val)
{
lsm6dsl_ctrl1_xl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL1_XL, (uint8_t *)&reg, 1);
*val = (lsm6dsl_bw0_xl_t) reg.bw0_xl;
return mm_error;
}
/**
* @brief xl_lpf1_bandwidth: [set] Accelerometer digital LPF (LPF1)
* bandwidth selection.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_lpf1_bw_sel_t: change the values of lpf1_bw_sel
* in reg CTRL1_XL
*
*/
int32_t lsm6dsl_xl_lpf1_bandwidth_set(lsm6dsl_ctx_t *ctx,
lsm6dsl_lpf1_bw_sel_t val)
{
lsm6dsl_ctrl1_xl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL1_XL, (uint8_t *)&reg, 1);
reg.lpf1_bw_sel = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL1_XL, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief xl_lpf1_bandwidth: [get] Accelerometer digital LPF (LPF1)
* bandwidth selection.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_lpf1_bw_sel_t: Get the values of lpf1_bw_sel
* in reg CTRL1_XL
*
*/
int32_t lsm6dsl_xl_lpf1_bandwidth_get(lsm6dsl_ctx_t *ctx,
lsm6dsl_lpf1_bw_sel_t *val)
{
lsm6dsl_ctrl1_xl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL1_XL, (uint8_t *)&reg, 1);
*val = (lsm6dsl_lpf1_bw_sel_t) reg.lpf1_bw_sel;
return mm_error;
}
/**
* @brief data_format: [set] Big/Little Endian Data selection.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_ble_t: change the values of ble in reg CTRL3_C
*
*/
int32_t lsm6dsl_data_format_set(lsm6dsl_ctx_t *ctx, lsm6dsl_ble_t val)
{
lsm6dsl_ctrl3_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL3_C, (uint8_t *)&reg, 1);
reg.ble = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL3_C, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief data_format: [get] Big/Little Endian Data selection.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_ble_t: Get the values of ble in reg CTRL3_C
*
*/
int32_t lsm6dsl_data_format_get(lsm6dsl_ctx_t *ctx, lsm6dsl_ble_t *val)
{
lsm6dsl_ctrl3_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL3_C, (uint8_t *)&reg, 1);
*val = (lsm6dsl_ble_t) reg.ble;
return mm_error;
}
/** default: 1:auto_increment
* @brief auto_increment: [set] Register address automatically
* incremented during a multiple byte access with
* a serial interface (I2C or SPI).
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of if_inc in reg CTRL3_C
*
*/
int32_t lsm6dsl_auto_increment_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_ctrl3_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL3_C, (uint8_t *)&reg, 1);
reg.if_inc = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL3_C, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief auto_increment: [get] Register address automatically
* incremented during a multiple byte access with
* a serial interface (I2C or SPI).
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of if_inc in reg CTRL3_C
*
*/
int32_t lsm6dsl_auto_increment_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_ctrl3_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL3_C, (uint8_t *)&reg, 1);
*val = reg.if_inc;
return mm_error;
}
/** default: 0:4wire
* @brief spi_mode: [set] SPI Serial Interface Mode selection.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_sim_t: change the values of sim in reg CTRL3_C
*
*/
int32_t lsm6dsl_spi_mode_set(lsm6dsl_ctx_t *ctx, lsm6dsl_sim_t val)
{
lsm6dsl_ctrl3_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL3_C, (uint8_t *)&reg, 1);
reg.sim = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL3_C, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief spi_mode: [get] SPI Serial Interface Mode selection.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_sim_t: Get the values of sim in reg CTRL3_C
*
*/
int32_t lsm6dsl_spi_mode_get(lsm6dsl_ctx_t *ctx, lsm6dsl_sim_t *val)
{
lsm6dsl_ctrl3_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL3_C, (uint8_t *)&reg, 1);
*val = (lsm6dsl_sim_t) reg.sim;
return mm_error;
}
/**
* @brief pads_mode: [set] Push-pull/open-drain selection on
* INT1 and INT2 pads.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_pp_od_t: change the values of pp_od in reg CTRL3_C
*
*/
int32_t lsm6dsl_pads_mode_set(lsm6dsl_ctx_t *ctx, lsm6dsl_pp_od_t val)
{
lsm6dsl_ctrl3_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL3_C, (uint8_t *)&reg, 1);
reg.pp_od = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL3_C, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief pads_mode: [get] Push-pull/open-drain selection
* on INT1 and INT2 pads.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_pp_od_t: Get the values of pp_od in reg CTRL3_C
*
*/
int32_t lsm6dsl_pads_mode_get(lsm6dsl_ctx_t *ctx, lsm6dsl_pp_od_t *val)
{
lsm6dsl_ctrl3_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL3_C, (uint8_t *)&reg, 1);
*val = (lsm6dsl_pp_od_t) reg.pp_od;
return mm_error;
}
/**
* @brief pads_polatity: [set] Interrupt activation level.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_h_lactive_t: change the values of h_lactive
* in reg CTRL3_C
*
*/
int32_t lsm6dsl_pads_polatity_set(lsm6dsl_ctx_t *ctx, lsm6dsl_h_lactive_t val)
{
lsm6dsl_ctrl3_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL3_C, (uint8_t *)&reg, 1);
reg.h_lactive = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL3_C, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief pads_polatity: [get] Interrupt activation level.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_h_lactive_t: Get the values of h_lactive in reg CTRL3_C
*
*/
int32_t lsm6dsl_pads_polatity_get(lsm6dsl_ctx_t *ctx, lsm6dsl_h_lactive_t *val)
{
lsm6dsl_ctrl3_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL3_C, (uint8_t *)&reg, 1);
*val = (lsm6dsl_h_lactive_t) reg.h_lactive;
return mm_error;
}
/**
* @brief i2c_interface: [set] Enable / Disable I2C interface.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of i2c_disable in reg CTRL4_C
*
*/
int32_t lsm6dsl_i2c_interface_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_ctrl4_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL4_C, (uint8_t *)&reg, 1);
reg.i2c_disable = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL4_C, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief i2c_interface: [get] Enable / Disable I2C interface.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of i2c_disable in reg CTRL4_C
*
*/
int32_t lsm6dsl_i2c_interface_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_ctrl4_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL4_C, (uint8_t *)&reg, 1);
*val = reg.i2c_disable;
return mm_error;
}
/**
* @brief mask_drdy_on_settling_data: [set] Acts only on the
* accelerometer LPF1 and the gyroscope
* LPF2 digital filters settling time.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of drdy_mask in reg CTRL4_C
*
*/
int32_t lsm6dsl_mask_drdy_on_settling_data_set(lsm6dsl_ctx_t *ctx,
uint8_t val)
{
lsm6dsl_ctrl4_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL4_C, (uint8_t *)&reg, 1);
reg.drdy_mask = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL4_C, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief mask_drdy_on_settling_data: [get] Acts only on the accelerometer
* LPF1 and the gyroscope LPF2 digital
* filters settling time.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of drdy_mask in reg CTRL4_C
*
*/
int32_t lsm6dsl_mask_drdy_on_settling_data_get(lsm6dsl_ctx_t *ctx,
uint8_t *val)
{
lsm6dsl_ctrl4_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL4_C, (uint8_t *)&reg, 1);
*val = reg.drdy_mask;
return mm_error;
}
/**
* @brief all_on_int1_pad: [set] All interrupt signals available
* on INT1 pad enable.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of int2_on_int1 in reg CTRL4_C
*
*/
int32_t lsm6dsl_all_on_int1_pad_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_ctrl4_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL4_C, (uint8_t *)&reg, 1);
reg.int2_on_int1 = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL4_C, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief all_on_int1_pad: [get] All interrupt signals available
* on INT1 pad enable.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of int2_on_int1 in reg CTRL4_C
*
*/
int32_t lsm6dsl_all_on_int1_pad_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_ctrl4_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL4_C, (uint8_t *)&reg, 1);
*val = reg.int2_on_int1;
return mm_error;
}
/**
* @brief gyro_sleep_mode: [set] Gyroscope sleep mode enable.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of sleep in reg CTRL4_C
*
*/
int32_t lsm6dsl_gyro_sleep_mode_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_ctrl4_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL4_C, (uint8_t *)&reg, 1);
reg.sleep = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL4_C, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief gyro_sleep_mode: [get] Gyroscope sleep mode enable.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of sleep in reg CTRL4_C
*
*/
int32_t lsm6dsl_gyro_sleep_mode_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_ctrl4_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL4_C, (uint8_t *)&reg, 1);
*val = reg.sleep;
return mm_error;
}
/**
* @brief den_func_on_xl: [set] Extend DEN functionality to
* accelerometer sensor.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of den_xl_en in reg CTRL4_C
*
*/
int32_t lsm6dsl_den_func_on_xl_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_ctrl4_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL4_C, (uint8_t *)&reg, 1);
reg.den_xl_en = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL4_C, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief den_func_on_xl: [get] Extend DEN functionality
* to accelerometer sensor.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of den_xl_en in reg CTRL4_C
*
*/
int32_t lsm6dsl_den_func_on_xl_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_ctrl4_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL4_C, (uint8_t *)&reg, 1);
*val = reg.den_xl_en;
return mm_error;
}
/**
* @brief xl_self_test: [set] Linear acceleration sensor self-test.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_st_xl_t: change the values of st_xl in reg CTRL5_C
*
*/
int32_t lsm6dsl_xl_self_test_set(lsm6dsl_ctx_t *ctx, lsm6dsl_st_xl_t val)
{
lsm6dsl_ctrl5_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL5_C, (uint8_t *)&reg, 1);
reg.st_xl = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL5_C, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief xl_self_test: [get] Linear acceleration sensor self-test.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_st_xl_t: Get the values of st_xl in reg CTRL5_C
*
*/
int32_t lsm6dsl_xl_self_test_get(lsm6dsl_ctx_t *ctx, lsm6dsl_st_xl_t *val)
{
lsm6dsl_ctrl5_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL5_C, (uint8_t *)&reg, 1);
*val = (lsm6dsl_st_xl_t) reg.st_xl;
return mm_error;
}
/**
* @brief gyro_self_test: [set] Linear gyro sensor self-test.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_st_g_t: change the values of st_g in reg CTRL5_C
*
*/
int32_t lsm6dsl_gyro_self_test_set(lsm6dsl_ctx_t *ctx, lsm6dsl_st_g_t val)
{
lsm6dsl_ctrl5_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL5_C, (uint8_t *)&reg, 1);
reg.st_g = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL5_C, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief gyro_self_test: [get] Linear gyro sensor self-test.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_st_g_t: Get the values of st_g in reg CTRL5_C
*
*/
int32_t lsm6dsl_gyro_self_test_get(lsm6dsl_ctx_t *ctx, lsm6dsl_st_g_t *val)
{
lsm6dsl_ctrl5_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL5_C, (uint8_t *)&reg, 1);
*val = (lsm6dsl_st_g_t) reg.st_g;
return mm_error;
}
/**
* @brief den_func_polarity: [set] DEN active level configuration.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_den_lh_t: change the values of den_lh in reg CTRL5_C
*
*/
int32_t lsm6dsl_den_func_polarity_set(lsm6dsl_ctx_t *ctx,
lsm6dsl_den_lh_t val)
{
lsm6dsl_ctrl5_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL5_C, (uint8_t *)&reg, 1);
reg.den_lh = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL5_C, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief den_func_polarity: [get] DEN active level configuration.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_den_lh_t: Get the values of den_lh in reg CTRL5_C
*
*/
int32_t lsm6dsl_den_func_polarity_get(lsm6dsl_ctx_t *ctx,
lsm6dsl_den_lh_t *val)
{
lsm6dsl_ctrl5_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL5_C, (uint8_t *)&reg, 1);
*val = (lsm6dsl_den_lh_t) reg.den_lh;
return mm_error;
}
/**
* @brief rounding_mode: [set] Circular burst-mode (rounding) read
* from the output registers.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_rounding_t: change the values of rounding in reg CTRL5_C
*
*/
int32_t lsm6dsl_rounding_mode_set(lsm6dsl_ctx_t *ctx, lsm6dsl_rounding_t val)
{
lsm6dsl_ctrl5_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL5_C, (uint8_t *)&reg, 1);
reg.rounding = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL5_C, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief rounding_mode: [get] Circular burst-mode (rounding) read
* from the output registers.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_rounding_t: Get the values of rounding in reg CTRL5_C
*
*/
int32_t lsm6dsl_rounding_mode_get(lsm6dsl_ctx_t *ctx, lsm6dsl_rounding_t *val)
{
lsm6dsl_ctrl5_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL5_C, (uint8_t *)&reg, 1);
*val = (lsm6dsl_rounding_t) reg.rounding;
return mm_error;
}
/**
* @brief gyro_lpf1_bandwidth: [set] Gyroscope's low-pass filter
* (LPF1) bandwidth selection.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_ftype_t: change the values of ftype in reg CTRL6_C
*
*/
int32_t lsm6dsl_gyro_lpf1_bandwidth_set(lsm6dsl_ctx_t *ctx,
lsm6dsl_ftype_t val)
{
lsm6dsl_ctrl6_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL6_C, (uint8_t *)&reg, 1);
reg.ftype = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL6_C, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief gyro_lpf1_bandwidth: [get] Gyroscope's low-pass filter
* (LPF1) bandwidth selection.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_ftype_t: Get the values of ftype in reg CTRL6_C
*
*/
int32_t lsm6dsl_gyro_lpf1_bandwidth_get(lsm6dsl_ctx_t *ctx,
lsm6dsl_ftype_t *val)
{
lsm6dsl_ctrl6_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL6_C, (uint8_t *)&reg, 1);
*val = (lsm6dsl_ftype_t) reg.ftype;
return mm_error;
}
/**
* @brief xl_offset_weight: [set] Weight of XL user offset bits of
* registers X_OFS_USR (73h), Y_OFS_USR (74h),
* Z_OFS_USR (75h)
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_usr_off_w_t: change the values of usr_off_w in reg CTRL6_C
*
*/
int32_t lsm6dsl_xl_offset_weight_set(lsm6dsl_ctx_t *ctx,
lsm6dsl_usr_off_w_t val)
{
lsm6dsl_ctrl6_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL6_C, (uint8_t *)&reg, 1);
reg.usr_off_w = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL6_C, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief xl_offset_weight: [get] Weight of XL user offset bits of
* registers X_OFS_USR (73h), Y_OFS_USR (74h),
* Z_OFS_USR (75h)
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_usr_off_w_t: Get the values of usr_off_w in reg CTRL6_C
*
*/
int32_t lsm6dsl_xl_offset_weight_get(lsm6dsl_ctx_t *ctx,
lsm6dsl_usr_off_w_t *val)
{
lsm6dsl_ctrl6_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL6_C, (uint8_t *)&reg, 1);
*val = (lsm6dsl_usr_off_w_t) reg.usr_off_w;
return mm_error;
}
/**
* @brief xl_high_performance: [set] High-performance operating
* mode disable for accelerometer.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_xl_hm_mode_t: change the values of xl_hm_mode
* in reg CTRL6_C
*
*/
int32_t lsm6dsl_xl_high_performance_set(lsm6dsl_ctx_t *ctx,
lsm6dsl_xl_hm_mode_t val)
{
lsm6dsl_ctrl6_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL6_C, (uint8_t *)&reg, 1);
reg.xl_hm_mode = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL6_C, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief xl_high_performance: [get] High-performance operating mode
* disable for accelerometer.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_xl_hm_mode_t: Get the values of xl_hm_mode in reg CTRL6_C
*
*/
int32_t lsm6dsl_xl_high_performance_get(lsm6dsl_ctx_t *ctx,
lsm6dsl_xl_hm_mode_t *val)
{
lsm6dsl_ctrl6_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL6_C, (uint8_t *)&reg, 1);
*val = (lsm6dsl_xl_hm_mode_t) reg.xl_hm_mode;
return mm_error;
}
/**
* @brief den_func_mode: [set] DEN functionality trigger mode selection.
* (TRIG_EN & LVL_EN & LVL2_EN)
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_den_mode_t: change the values of den_mode in reg CTRL6_C
*
*/
int32_t lsm6dsl_den_func_mode_set(lsm6dsl_ctx_t *ctx, lsm6dsl_den_mode_t val)
{
lsm6dsl_ctrl6_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL6_C, (uint8_t *)&reg, 1);
reg.den_mode = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL6_C, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief den_func_mode: [get] DEN functionality trigger mode selection.
* (TRIG_EN & LVL_EN & LVL2_EN)
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_den_mode_t: Get the values of den_mode in reg CTRL6_C
*
*/
int32_t lsm6dsl_den_func_mode_get(lsm6dsl_ctx_t *ctx, lsm6dsl_den_mode_t *val)
{
lsm6dsl_ctrl6_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL6_C, (uint8_t *)&reg, 1);
*val = (lsm6dsl_den_mode_t) reg.den_mode;
return mm_error;
}
/**
* @brief rounding_on_status: [set] Source register rounding function
* on WAKE_UP_SRC (1Bh), TAP_SRC (1Ch),
* D6D_SRC (1Dh), STATUS_REG (1Eh)
* and FUNC_SRC (53h).
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_den_mode_t: change the values of rounding_status
* in reg CTRL7_G
*
*/
int32_t lsm6dsl_rounding_on_status_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_ctrl7_g_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL7_G, (uint8_t *)&reg, 1);
reg.rounding_status = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL7_G, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief rounding_on_status: [get] Source register rounding function
* on WAKE_UP_SRC (1Bh), TAP_SRC (1Ch),
* D6D_SRC (1Dh), STATUS_REG (1Eh)
* and FUNC_SRC (53h).
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of rounding_status in reg CTRL7_G
*
*/
int32_t lsm6dsl_rounding_on_status_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_ctrl7_g_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL7_G, (uint8_t *)&reg, 1);
*val = reg.rounding_status;
return mm_error;
}
/**
* @brief gyro_hp_cutoff: [set] Gyroscope digital HP filter
* cutoff selection.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_hpm_g_t: change the values of hpm_g in reg CTRL7_G
*
*/
int32_t lsm6dsl_gyro_hp_cutoff_set(lsm6dsl_ctx_t *ctx, lsm6dsl_hpm_g_t val)
{
lsm6dsl_ctrl7_g_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL7_G, (uint8_t *)&reg, 1);
reg.hpm_g = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL7_G, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief gyro_hp_cutoff: [get] Gyroscope digital HP filter
* cutoff selection.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_hpm_g_t: Get the values of hpm_g in reg CTRL7_G
*
*/
int32_t lsm6dsl_gyro_hp_cutoff_get(lsm6dsl_ctx_t *ctx, lsm6dsl_hpm_g_t *val)
{
lsm6dsl_ctrl7_g_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL7_G, (uint8_t *)&reg, 1);
*val = (lsm6dsl_hpm_g_t) reg.hpm_g;
return mm_error;
}
/**
* @brief gyro_hp_filter: [set] Gyroscope digital high-pass filter enable.
* The filter is enabled only if the gyro
* is in HP mode.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of hp_en_g in reg CTRL7_G
*
*/
int32_t lsm6dsl_gyro_hp_filter_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_ctrl7_g_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL7_G, (uint8_t *)&reg, 1);
reg.hp_en_g = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL7_G, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief gyro_hp_filter: [get] Gyroscope digital high-pass filter
* enable. The filter is enabled only if the
* gyro is in HP mode.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of hp_en_g in reg CTRL7_G
*
*/
int32_t lsm6dsl_gyro_hp_filter_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_ctrl7_g_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL7_G, (uint8_t *)&reg, 1);
*val = reg.hp_en_g;
return mm_error;
}
/**
* @brief gyro_high_performance: [set] High-performance operating
* mode disable for gyroscope.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_g_hm_mode_t: change the values of g_hm_mode
* in reg CTRL7_G
*
*/
int32_t lsm6dsl_gyro_high_performance_set(lsm6dsl_ctx_t *ctx,
lsm6dsl_g_hm_mode_t val)
{
lsm6dsl_ctrl7_g_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL7_G, (uint8_t *)&reg, 1);
reg.g_hm_mode = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL7_G, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief gyro_high_performance: [get] High-performance operating
* mode disable for gyroscope.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_g_hm_mode_t: Get the values of g_hm_mode in reg CTRL7_G
*
*/
int32_t lsm6dsl_gyro_high_performance_get(lsm6dsl_ctx_t *ctx,
lsm6dsl_g_hm_mode_t *val)
{
lsm6dsl_ctrl7_g_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL7_G, (uint8_t *)&reg, 1);
*val = (lsm6dsl_g_hm_mode_t) reg.g_hm_mode;
return mm_error;
}
/**
* @brief data_on_6d: [set] Select data for 6d function.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_low_pass_on_6d_t: change the values of low_pass_on_6d
* in reg CTRL8_XL
*
*/
int32_t lsm6dsl_data_on_6d_set(lsm6dsl_ctx_t *ctx,
lsm6dsl_low_pass_on_6d_t val)
{
lsm6dsl_ctrl8_xl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL8_XL, (uint8_t *)&reg, 1);
reg.low_pass_on_6d = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL8_XL, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief data_on_6d: [get] Select data for 6d function.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_low_pass_on_6d_t: Get the values of low_pass_on_6d
* in reg CTRL8_XL
*
*/
int32_t lsm6dsl_data_on_6d_get(lsm6dsl_ctx_t *ctx,
lsm6dsl_low_pass_on_6d_t *val)
{
lsm6dsl_ctrl8_xl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL8_XL, (uint8_t *)&reg, 1);
*val = (lsm6dsl_low_pass_on_6d_t) reg.low_pass_on_6d;
return mm_error;
}
/**
* @brief xl_out_data: [set] Accelerometer slope filter / high-pass
* filter selection on outputs.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_hp_slope_xl_en_t: change the values of
* hp_slope_xl_en in reg CTRL8_XL
*
*/
int32_t lsm6dsl_xl_out_data_set(lsm6dsl_ctx_t *ctx,
lsm6dsl_hp_slope_xl_en_t val)
{
lsm6dsl_ctrl8_xl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL8_XL, (uint8_t *)&reg, 1);
reg.hp_slope_xl_en = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL8_XL, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief xl_out_data: [get] Accelerometer slope filter / high-pass
* filter selection on outputs.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_hp_slope_xl_en_t: Get the values of hp_slope_xl_en
* in reg CTRL8_XL
*
*/
int32_t lsm6dsl_xl_out_data_get(lsm6dsl_ctx_t *ctx,
lsm6dsl_hp_slope_xl_en_t *val)
{
lsm6dsl_ctrl8_xl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL8_XL, (uint8_t *)&reg, 1);
*val = (lsm6dsl_hp_slope_xl_en_t) reg.hp_slope_xl_en;
return mm_error;
}
/**
* @brief xl_composite_filter_input: [set] Accelerometer composite
* filter input selection.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_input_composite_t: change the values of input_composite
* in reg CTRL8_XL
*
*/
int32_t lsm6dsl_xl_composite_filter_input_set(lsm6dsl_ctx_t *ctx,
lsm6dsl_input_composite_t val)
{
lsm6dsl_ctrl8_xl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL8_XL, (uint8_t *)&reg, 1);
reg.input_composite = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL8_XL, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief xl_composite_filter_input: [get] Accelerometer composite
* filter input selection.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_input_composite_t: Get the values of input_composite
* in reg CTRL8_XL
*
*/
int32_t lsm6dsl_xl_composite_filter_input_get(lsm6dsl_ctx_t *ctx,
lsm6dsl_input_composite_t *val)
{
lsm6dsl_ctrl8_xl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL8_XL, (uint8_t *)&reg, 1);
*val = (lsm6dsl_input_composite_t) reg.input_composite;
return mm_error;
}
/**
* @brief xl_hp_ref_mode: [set] Enable accelerometer HP filter
* reference mode.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of hp_ref_mode in reg CTRL8_XL
*
*/
int32_t lsm6dsl_xl_hp_ref_mode_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_ctrl8_xl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL8_XL, (uint8_t *)&reg, 1);
reg.hp_ref_mode = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL8_XL, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief xl_hp_ref_mode: [get] Enable accelerometer HP filter
* reference mode.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of hp_ref_mode in reg CTRL8_XL
*
*/
int32_t lsm6dsl_xl_hp_ref_mode_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_ctrl8_xl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL8_XL, (uint8_t *)&reg, 1);
*val = reg.hp_ref_mode;
return mm_error;
}
/**
* @brief xl_cutoff: [set] Accelerometer LPF2 and high-pass filter
* configuration and cutoff setting.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_hpcf_xl_t: change the values of hpcf_xl in reg CTRL8_XL
*
*/
int32_t lsm6dsl_xl_cutoff_set(lsm6dsl_ctx_t *ctx, lsm6dsl_hpcf_xl_t val)
{
lsm6dsl_ctrl8_xl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL8_XL, (uint8_t *)&reg, 1);
reg.hpcf_xl = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL8_XL, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief xl_cutoff: [get] Accelerometer LPF2 and high-pass filter
* configuration and cutoff setting.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_hpcf_xl_t: Get the values of hpcf_xl in reg CTRL8_XL
*
*/
int32_t lsm6dsl_xl_cutoff_get(lsm6dsl_ctx_t *ctx, lsm6dsl_hpcf_xl_t *val)
{
lsm6dsl_ctrl8_xl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL8_XL, (uint8_t *)&reg, 1);
*val = (lsm6dsl_hpcf_xl_t) reg.hpcf_xl;
return mm_error;
}
/**
* @brief xl_lpf2: [set] Accelerometer low-pass filter LPF2 selection.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of lpf2_xl_en in reg CTRL8_XL
*
*/
int32_t lsm6dsl_xl_lpf2_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_ctrl8_xl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL8_XL, (uint8_t *)&reg, 1);
reg.lpf2_xl_en = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL8_XL, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief xl_lpf2: [get] Accelerometer low-pass filter LPF2 selection.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of lpf2_xl_en in reg CTRL8_XL
*
*/
int32_t lsm6dsl_xl_lpf2_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_ctrl8_xl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL8_XL, (uint8_t *)&reg, 1);
*val = reg.lpf2_xl_en;
return mm_error;
}
/**
* @brief soft_iron_correction: [set] Accelerometer composite
* filter input selection.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of soft_en in reg CTRL9_XL
*
*/
int32_t lsm6dsl_soft_iron_correction_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_ctrl9_xl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL9_XL, (uint8_t *)&reg, 1);
reg.soft_en = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL9_XL, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief soft_iron_correction: [get] Accelerometer composite
* filter input selection.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of soft_en in reg CTRL9_XL
*
*/
int32_t lsm6dsl_soft_iron_correction_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_ctrl9_xl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL9_XL, (uint8_t *)&reg, 1);
*val = reg.soft_en;
return mm_error;
}
/**
* @brief den_stamping_selection: [set] DEN stamping sensor selection.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_den_xl_g_t: change the values of den_xl_g in reg CTRL9_XL
*
*/
int32_t lsm6dsl_den_stamping_selection_set(lsm6dsl_ctx_t *ctx,
lsm6dsl_den_xl_g_t val)
{
lsm6dsl_ctrl9_xl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL9_XL, (uint8_t *)&reg, 1);
reg.den_xl_g = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL9_XL, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief den_stamping_selection: [get] DEN stamping sensor selection.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_den_xl_g_t: Get the values of den_xl_g in reg CTRL9_XL
*
*/
int32_t lsm6dsl_den_stamping_selection_get(lsm6dsl_ctx_t *ctx,
lsm6dsl_den_xl_g_t *val)
{
lsm6dsl_ctrl9_xl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL9_XL, (uint8_t *)&reg, 1);
*val = (lsm6dsl_den_xl_g_t) reg.den_xl_g;
return mm_error;
}
/**
* @brief den_store_on_x_axis: [set] DEN value stored in LSB of X-axis.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of den_x in reg CTRL9_XL
*
*/
int32_t lsm6dsl_den_store_on_x_axis_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_ctrl9_xl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL9_XL, (uint8_t *)&reg, 1);
reg.den_x = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL9_XL, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief den_store_on_x_axis: [get] DEN value stored in LSB of X-axis.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of den_x in reg CTRL9_XL
*
*/
int32_t lsm6dsl_den_store_on_x_axis_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_ctrl9_xl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL9_XL, (uint8_t *)&reg, 1);
*val = reg.den_x;
return mm_error;
}
/**
* @brief den_store_on_y_axis: [set] DEN value stored in LSB of Y-axis.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of den_y in reg CTRL9_XL
*
*/
int32_t lsm6dsl_den_store_on_y_axis_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_ctrl9_xl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL9_XL, (uint8_t *)&reg, 1);
reg.den_y = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL9_XL, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief den_store_on_y_axis: [get] DEN value stored in LSB of Y-axis.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of den_y in reg CTRL9_XL
*
*/
int32_t lsm6dsl_den_store_on_y_axis_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_ctrl9_xl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL9_XL, (uint8_t *)&reg, 1);
*val = reg.den_y;
return mm_error;
}
/**
* @brief den_store_on_z_axis: [set] DEN value stored in LSB of Z-axis.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of den_z in reg CTRL9_XL
*
*/
int32_t lsm6dsl_den_store_on_z_axis_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_ctrl9_xl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL9_XL, (uint8_t *)&reg, 1);
reg.den_z = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL9_XL, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief den_store_on_z_axis: [get] DEN value stored in LSB of Z-axis.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of den_z in reg CTRL9_XL
*
*/
int32_t lsm6dsl_den_store_on_z_axis_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_ctrl9_xl_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL9_XL, (uint8_t *)&reg, 1);
*val = reg.den_z;
return mm_error;
}
/**
* @brief significant_motion: [set] Enable significant motion detection
* function.This is effective if the FUNC_EN
* bit is set to '1'.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of sign_motion_en in reg CTRL10_C
*
*/
int32_t lsm6dsl_significant_motion_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_ctrl10_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL10_C, (uint8_t *)&reg, 1);
reg.sign_motion_en = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL10_C, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief significant_motion: [get] Enable significant motion detection
* function.This is effective if the FUNC_EN bit
* is set to '1'.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of sign_motion_en in reg CTRL10_C
*
*/
int32_t lsm6dsl_significant_motion_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_ctrl10_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL10_C, (uint8_t *)&reg, 1);
*val = reg.sign_motion_en;
return mm_error;
}
/**
* @brief rst_step_counter: [set] Reset pedometer step counter.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of pedo_rst_step in
* reg CTRL10_C
*
*/
int32_t lsm6dsl_rst_step_counter_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_ctrl10_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL10_C, (uint8_t *)&reg, 1);
reg.pedo_rst_step = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL10_C, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief rst_step_counter: [get] Reset pedometer step counter.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of pedo_rst_step in reg CTRL10_C
*
*/
int32_t lsm6dsl_rst_step_counter_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_ctrl10_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL10_C, (uint8_t *)&reg, 1);
*val = reg.pedo_rst_step;
return mm_error;
}
/**
* @brief embedded_functions: [set] Enable embedded functionalities
* (pedometer, tilt, significant motion
* detection, sensor hub and ironing).
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of func_en in reg CTRL10_C
*
*/
int32_t lsm6dsl_embedded_functions_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_ctrl10_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL10_C, (uint8_t *)&reg, 1);
reg.func_en = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL10_C, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief embedded_functions: [get] Enable embedded functionalities
* (pedometer, tilt, significant motion
* detection, sensor hub and ironing).
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of func_en in reg CTRL10_C
*
*/
int32_t lsm6dsl_embedded_functions_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_ctrl10_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL10_C, (uint8_t *)&reg, 1);
*val = reg.func_en;
return mm_error;
}
/**
* @brief tilt_calculation: [set] Enable tilt calculation.This is
* effective if the FUNC_EN bit is set to '1'.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of tilt_en in reg CTRL10_C
*
*/
int32_t lsm6dsl_tilt_calculation_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_ctrl10_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL10_C, (uint8_t *)&reg, 1);
reg.tilt_en = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL10_C, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief tilt_calculation: [get] Enable tilt calculation.This is
* effective if the FUNC_EN bit is set to '1'.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of tilt_en in reg CTRL10_C
*
*/
int32_t lsm6dsl_tilt_calculation_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_ctrl10_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL10_C, (uint8_t *)&reg, 1);
*val = reg.tilt_en;
return mm_error;
}
/**
* @brief pedometer: [set] Enable pedometer algorithm.This is effective
* if the FUNC_EN bit is set to '1'.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of pedo_en in reg CTRL10_C
*
*/
int32_t lsm6dsl_pedometer_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_ctrl10_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL10_C, (uint8_t *)&reg, 1);
reg.pedo_en = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL10_C, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief pedometer: [get] Enable pedometer algorithm.This is effective
* if the FUNC_EN bit is set to '1'.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of pedo_en in reg CTRL10_C
*
*/
int32_t lsm6dsl_pedometer_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_ctrl10_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL10_C, (uint8_t *)&reg, 1);
*val = reg.pedo_en;
return mm_error;
}
/**
* @brief timestamp_count: [set] Enable timestamp count. The count is
* saved in TIMESTAMP0_REG (40h),
* TIMESTAMP1_REG (41h) and TIMESTAMP2_REG (42h).
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of timer_en in reg CTRL10_C
*
*/
int32_t lsm6dsl_timestamp_count_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_ctrl10_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL10_C, (uint8_t *)&reg, 1);
reg.timer_en = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL10_C, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief timestamp_count: [get] Enable timestamp count. The count is
* saved in TIMESTAMP0_REG (40h),
* TIMESTAMP1_REG (41h) and TIMESTAMP2_REG (42h).
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of timer_en in reg CTRL10_C
*
*/
int32_t lsm6dsl_timestamp_count_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_ctrl10_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL10_C, (uint8_t *)&reg, 1);
*val = reg.timer_en;
return mm_error;
}
/**
* @brief wrist_tilt: [set] Enable wrist tilt algorithm. This is
* effective if the FUNC_EN bit is set to '1'.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of wrist_tilt_en in reg CTRL10_C
*
*/
int32_t lsm6dsl_wrist_tilt_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_ctrl10_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL10_C, (uint8_t *)&reg, 1);
reg.wrist_tilt_en = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_CTRL10_C, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief wrist_tilt: [get] Enable wrist tilt algorithm. This is effective
* if the FUNC_EN bit is set to '1'.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of wrist_tilt_en in reg CTRL10_C
*
*/
int32_t lsm6dsl_wrist_tilt_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_ctrl10_c_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_CTRL10_C, (uint8_t *)&reg, 1);
*val = reg.wrist_tilt_en;
return mm_error;
}
/**
* @brief hard_iron: [set] Enable hard-iron correction algorithm
* for magnetometer.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of iron_en in reg MASTER_CONFIG
*
*/
int32_t lsm6dsl_hard_iron_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_master_config_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_MASTER_CONFIG, (uint8_t *)&reg, 1);
reg.iron_en = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_MASTER_CONFIG, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief hard_iron: [get] Enable hard-iron correction algorithm
* for magnetometer.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of iron_en in reg MASTER_CONFIG
*
*/
int32_t lsm6dsl_hard_iron_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_master_config_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_MASTER_CONFIG, (uint8_t *)&reg, 1);
*val = reg.iron_en;
return mm_error;
}
/**
* @brief letched_interrupts: [set] Latched/pulsed interrupt.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of lir in reg TAP_CFG
*
*/
int32_t lsm6dsl_letched_interrupts_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_tap_cfg_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_TAP_CFG, (uint8_t *)&reg, 1);
reg.lir = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_TAP_CFG, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief letched_interrupts: [get] Latched/pulsed interrupt.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of lir in reg TAP_CFG
*
*/
int32_t lsm6dsl_letched_interrupts_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_tap_cfg_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_TAP_CFG, (uint8_t *)&reg, 1);
*val = reg.lir;
return mm_error;
}
/**
* @brief tap_on_z_axis: [set] Enable Z direction in tap recognition.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of tap_z_en in reg TAP_CFG
*
*/
int32_t lsm6dsl_tap_on_z_axis_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_tap_cfg_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_TAP_CFG, (uint8_t *)&reg, 1);
reg.tap_z_en = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_TAP_CFG, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief tap_on_z_axis: [get] Enable Z direction in tap recognition.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of tap_z_en in reg TAP_CFG
*
*/
int32_t lsm6dsl_tap_on_z_axis_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_tap_cfg_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_TAP_CFG, (uint8_t *)&reg, 1);
*val = reg.tap_z_en;
return mm_error;
}
/**
* @brief tap_on_y_axis: [set] Enable Y direction in tap recognition.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of tap_y_en in reg TAP_CFG
*
*/
int32_t lsm6dsl_tap_on_y_axis_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_tap_cfg_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_TAP_CFG, (uint8_t *)&reg, 1);
reg.tap_y_en = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_TAP_CFG, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief tap_on_y_axis: [get] Enable Y direction in tap recognition.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of tap_y_en in reg TAP_CFG
*
*/
int32_t lsm6dsl_tap_on_y_axis_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_tap_cfg_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_TAP_CFG, (uint8_t *)&reg, 1);
*val = reg.tap_y_en;
return mm_error;
}
/**
* @brief tap_on_x_axis: [set] Enable X direction in tap recognition.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of tap_x_en in reg TAP_CFG
*
*/
int32_t lsm6dsl_tap_on_x_axis_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_tap_cfg_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_TAP_CFG, (uint8_t *)&reg, 1);
reg.tap_x_en = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_TAP_CFG, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief tap_on_x_axis: [get] Enable X direction in tap recognition.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of tap_x_en in reg TAP_CFG
*
*/
int32_t lsm6dsl_tap_on_x_axis_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_tap_cfg_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_TAP_CFG, (uint8_t *)&reg, 1);
*val = reg.tap_x_en;
return mm_error;
}
/**
* @brief inactivity_mode: [set] Enable inactivity function.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_inact_en_t: change the values of inact_en in reg TAP_CFG
*
*/
int32_t lsm6dsl_inactivity_mode_set(lsm6dsl_ctx_t *ctx,
lsm6dsl_inact_en_t val)
{
lsm6dsl_tap_cfg_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_TAP_CFG, (uint8_t *)&reg, 1);
reg.inact_en = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_TAP_CFG, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief inactivity_mode: [get] Enable inactivity function.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_inact_en_t: Get the values of inact_en in reg TAP_CFG
*
*/
int32_t lsm6dsl_inactivity_mode_get(lsm6dsl_ctx_t *ctx,
lsm6dsl_inact_en_t *val)
{
lsm6dsl_tap_cfg_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_TAP_CFG, (uint8_t *)&reg, 1);
*val = (lsm6dsl_inact_en_t) reg.inact_en;
return mm_error;
}
/**
* @brief enable_basic_interrupts: [set] Enable basic interrupts
* (6D/4D, free-fall, wake-up, tap,
* inactivity).
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of interrupts_enable in reg TAP_CFG
*
*/
int32_t lsm6dsl_enable_basic_interrupts_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_tap_cfg_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_TAP_CFG, (uint8_t *)&reg, 1);
reg.interrupts_enable = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_TAP_CFG, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief enable_basic_interrupts: [get] Enable basic interrupts (6D/4D,
* free-fall, wake-up, tap, inactivity).
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of interrupts_enable in reg TAP_CFG
*
*/
int32_t lsm6dsl_enable_basic_interrupts_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_tap_cfg_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_TAP_CFG, (uint8_t *)&reg, 1);
*val = reg.interrupts_enable;
return mm_error;
}
/**
* @brief threshold_6d_3d: [set] Threshold for 4D/6D function.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_sixd_ths_t: change the values of sixd_ths in
* reg TAP_THS_6D
*
*/
int32_t lsm6dsl_threshold_6d_3d_set(lsm6dsl_ctx_t *ctx,
lsm6dsl_sixd_ths_t val)
{
lsm6dsl_tap_ths_6d_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_TAP_THS_6D, (uint8_t *)&reg, 1);
reg.sixd_ths = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_TAP_THS_6D, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief threshold_6d_3d: [get] Threshold for 4D/6D function.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_sixd_ths_t: Get the values of sixd_ths in reg TAP_THS_6D
*
*/
int32_t lsm6dsl_threshold_6d_3d_get(lsm6dsl_ctx_t *ctx,
lsm6dsl_sixd_ths_t *val)
{
lsm6dsl_tap_ths_6d_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_TAP_THS_6D, (uint8_t *)&reg, 1);
*val = (lsm6dsl_sixd_ths_t) reg.sixd_ths;
return mm_error;
}
/**
* @brief reduce_6d_to_4d: [set] 4D orientation detection enable.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of d4d_en in reg TAP_THS_6D
*
*/
int32_t lsm6dsl_reduce_6d_to_4d_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_tap_ths_6d_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_TAP_THS_6D, (uint8_t *)&reg, 1);
reg.d4d_en = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_TAP_THS_6D, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief reduce_6d_to_4d: [get] 4D orientation detection enable.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of d4d_en in reg TAP_THS_6D
*
*/
int32_t lsm6dsl_reduce_6d_to_4d_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_tap_ths_6d_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_TAP_THS_6D, (uint8_t *)&reg, 1);
*val = reg.d4d_en;
return mm_error;
}
/**
* @brief tap_mode: [set] Single/double-tap event enable.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_single_double_tap_t: change the values of
* single_double_tap in
* reg WAKE_UP_THS
*
*/
int32_t lsm6dsl_tap_mode_set(lsm6dsl_ctx_t *ctx,
lsm6dsl_single_double_tap_t val)
{
lsm6dsl_wake_up_ths_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_WAKE_UP_THS, (uint8_t *)&reg, 1);
reg.single_double_tap = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_WAKE_UP_THS, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief tap_mode: [get] Single/double-tap event enable.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_single_double_tap_t: Get the values of single_double_tap
* in reg WAKE_UP_THS
*
*/
int32_t lsm6dsl_tap_mode_get(lsm6dsl_ctx_t *ctx,
lsm6dsl_single_double_tap_t *val)
{
lsm6dsl_wake_up_ths_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_WAKE_UP_THS, (uint8_t *)&reg, 1);
*val = (lsm6dsl_single_double_tap_t) reg.single_double_tap;
return mm_error;
}
/**
* @brief timestamp_resolution: [set] Timestamp register resolution
* setting.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_timer_hr_t: change the values of timer_hr
* in reg WAKE_UP_DUR
*
*/
int32_t lsm6dsl_timestamp_resolution_set(lsm6dsl_ctx_t *ctx,
lsm6dsl_timer_hr_t val)
{
lsm6dsl_wake_up_dur_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_WAKE_UP_DUR, (uint8_t *)&reg, 1);
reg.timer_hr = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_WAKE_UP_DUR, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief timestamp_resolution: [get] Timestamp register
* resolution setting.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_timer_hr_t: Get the values of timer_hr in
* reg WAKE_UP_DUR
*
*/
int32_t lsm6dsl_timestamp_resolution_get(lsm6dsl_ctx_t *ctx,
lsm6dsl_timer_hr_t *val)
{
lsm6dsl_wake_up_dur_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_WAKE_UP_DUR, (uint8_t *)&reg, 1);
*val = (lsm6dsl_timer_hr_t) reg.timer_hr;
return mm_error;
}
/**
* @brief free_fall_threshold: [set] Free fall threshold setting.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_ff_ths_t: change the values of ff_ths in reg FREE_FALL
*
*/
int32_t lsm6dsl_free_fall_threshold_set(lsm6dsl_ctx_t *ctx,
lsm6dsl_ff_ths_t val)
{
lsm6dsl_free_fall_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FREE_FALL, (uint8_t *)&reg, 1);
reg.ff_ths = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_FREE_FALL, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief free_fall_threshold: [get] Free fall threshold setting.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_ff_ths_t: Get the values of ff_ths in reg FREE_FALL
*
*/
int32_t lsm6dsl_free_fall_threshold_get(lsm6dsl_ctx_t *ctx,
lsm6dsl_ff_ths_t *val)
{
lsm6dsl_free_fall_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FREE_FALL, (uint8_t *)&reg, 1);
*val = (lsm6dsl_ff_ths_t) reg.ff_ths;
return mm_error;
}
/**
* @brief int1_routing: [set] Functions routing on INT1 pad
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_md1_cfg_t: change the values of reg MD1_CFG
*
*/
int32_t lsm6dsl_int1_routing_set(lsm6dsl_ctx_t *ctx, lsm6dsl_md1_cfg_t val)
{
int32_t mm_error;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_MD1_CFG, (uint8_t *)&val, 1);
return mm_error;
}
/**
* @brief int1_routing: [get] Functions routing on INT1 pad
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_md1_cfg_t: change the values of reg MD1_CFG
*
*/
int32_t lsm6dsl_int1_routing_get(lsm6dsl_ctx_t *ctx, lsm6dsl_md1_cfg_t *val)
{
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_MD1_CFG, (uint8_t *)val, 1);
return mm_error;
}
/**
* @brief int2_routing: [set] Functions routing on INT2 pad
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_md2_cfg_t: change the values of reg MD2_CFG
*
*/
int32_t lsm6dsl_int2_routing_set(lsm6dsl_ctx_t *ctx, lsm6dsl_md2_cfg_t val)
{
int32_t mm_error;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_MD2_CFG, (uint8_t *)&val, 1);
return mm_error;
}
/**
* @brief int2_routing: [get] Functions routing on INT2 pad
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_md2_cfg_t: change the values of reg MD2_CFG
*
*/
int32_t lsm6dsl_int2_routing_get(lsm6dsl_ctx_t *ctx, lsm6dsl_md2_cfg_t *val)
{
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_MD2_CFG, (uint8_t *)val, 1);
return mm_error;
}
/**
* @brief sincro_time_frame: [set] sensor_synchronization time frame
* with the step of 500 ms and full range of 5 s.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of tph
*
*/
int32_t lsm6dsl_sincro_time_frame_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
int32_t mm_error;
uint8_t reg;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_SENSOR_SYNC_TIME_FRAME,
(uint8_t *)&reg, sizeof(uint8_t));
reg &= 0xF0;
reg |= (val & 0x0F);
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_SENSOR_SYNC_TIME_FRAME,
(uint8_t *)&reg, sizeof(uint8_t));
return mm_error;
}
/**
* @brief sincro_time_frame: [get] sensor_synchronization time frame
* with the step of 500 ms and full range of 5 s.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: get the values of tph
*
*/
int32_t lsm6dsl_sincro_time_frame_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_SENSOR_SYNC_TIME_FRAME, val,
sizeof(uint8_t));
*val &= 0x0F;
return mm_error;
}
/**
* @brief timestamp: [get] timestamp value in DIGIT
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param axis1bit32_t : union that group together the timestamp data
*
*/
int32_t lsm6dsl_timestamp_raw(lsm6dsl_ctx_t *ctx, axis1bit32_t *buff)
{
return lsm6dsl_read_reg(ctx, LSM6DSL_TIMESTAMP0_REG, (uint8_t *) buff,
sizeof(axis1bit32_t));
}
/**
* @brief step_timestamp: [get] step_timestamp value in DIGIT
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param axis1bit16_t : union that group together the step_timestamp data
*
*/
int32_t lsm6dsl_step_timestamp_raw(lsm6dsl_ctx_t *ctx, axis1bit16_t *buff)
{
return lsm6dsl_read_reg(ctx, LSM6DSL_STEP_TIMESTAMP_L, (uint8_t *) buff,
sizeof(axis1bit16_t));
}
/**
* @brief step_counter: [get] step_counter value in DIGIT
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param axis1bit16_t : union that group together the step_counter data
*
*/
int32_t lsm6dsl_step_counter_raw(lsm6dsl_ctx_t *ctx, axis1bit16_t *buff)
{
return lsm6dsl_read_reg(ctx, LSM6DSL_STEP_COUNTER_L, (uint8_t *) buff,
sizeof(axis1bit16_t));
}
/**
* @brief tap_treshold: [set] Threshold for tap recognition. 1 LSb
* corresponds to FS_XL/32.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of tap_ths
*
*/
int32_t lsm6dsl_tap_treshold_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
int32_t mm_error;
uint8_t reg;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_TAP_THS_6D, (uint8_t *)&reg,
sizeof(uint8_t));
reg &= 0xE0;
reg |= (val & 0x1F);
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_TAP_THS_6D, (uint8_t *)&reg,
sizeof(uint8_t));
return mm_error;
}
/**
* @brief tap_treshold: [get] Threshold for tap recognition.
* 1 LSb corresponds to FS_XL/32.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: get the values of tap_ths
*
*/
int32_t lsm6dsl_tap_treshold_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_TAP_THS_6D, val,
sizeof(uint8_t));
*val &= 0x1F;
return mm_error;
}
/**
* @brief gap_double_tap: [set] Duration of maximum time gap for double
* tap recognition. The default value of these bits
* is 0000b which corresponds to 16*ODR_XL time.
* If the DUR[3:0] bits are set to a different value,
* 1LSB corresponds to 32*ODR_XL time.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of dur
*
*/
int32_t lsm6dsl_gap_double_tap_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
int32_t mm_error;
uint8_t reg;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT_DUR2, (uint8_t *)&reg,
sizeof(uint8_t));
reg &= 0x0F;
reg |= ((val << 4) & 0xF0);
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_INT_DUR2, (uint8_t *)&reg,
sizeof(uint8_t));
return mm_error;
}
/**
* @brief gap_double_tap: [get] Duration of maximum time gap for double
* tap recognition. The default value of these
* bits is 0000b which corresponds to 16*ODR_XL time.
* If the DUR[3:0] bits are set to a different value,
* 1LSB corresponds to 32*ODR_XL time.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: get the values of dur
*
*/
int32_t lsm6dsl_gap_double_tap_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT_DUR2, val,
sizeof(uint8_t));
*val &= 0xF0 >> 4;
return mm_error;
}
/**
* @brief quiet_after_tap: [set] Quiet time is the time after the first
* detected tap in which there must not be any
* overthreshold event. The default value of these
* bits is 00b which corresponds to 2*ODR_XL time.
* If the QUIET[1:0] bits are set to a different
* value, 1LSB corresponds to 4*ODR_XL time.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of quiet
*
*/
int32_t lsm6dsl_quiet_after_tap_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
int32_t mm_error;
uint8_t reg;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT_DUR2, (uint8_t *)&reg,
sizeof(uint8_t));
reg &= ~0x0C;
reg |= ((val << 2) & 0x0C);
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_INT_DUR2, (uint8_t *)&reg,
sizeof(uint8_t));
return mm_error;
}
/**
* @brief quiet_after_tap: [get] Quiet time is the time after the first
* detected tap in which there must not be any
* overthreshold event. The default value of these
* bits is 00b which corresponds to 2*ODR_XL time.
* If the QUIET[1:0] bits are set to a different
* value, 1LSB corresponds to 4*ODR_XL time.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: get the values of quiet
*
*/
int32_t lsm6dsl_quiet_after_tap_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT_DUR2, val,
sizeof(uint8_t));
*val &= 0x0C >> 2;
return mm_error;
}
/**
* @brief duration_tap_overthreshold: [set] Maximum duration is the
* maximum time of an overthreshold
* signal detection to be recognized as
* a tap event. The default value of
* these bits is 00b which corresponds
* to 4*ODR_XL time. If the SHOCK[1:0]
* bits are set to a different value,
* 1LSB corresponds to 8*ODR_XL time.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of shock
*
*/
int32_t lsm6dsl_duration_tap_overthreshold_set(lsm6dsl_ctx_t *ctx,
uint8_t val)
{
int32_t mm_error;
uint8_t reg;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT_DUR2, (uint8_t *)&reg,
sizeof(uint8_t));
reg &= ~0x03;
reg |= (val & 0x03);
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_INT_DUR2, (uint8_t *)&reg,
sizeof(uint8_t));
return mm_error;
}
/**
* @brief duration_tap_overthreshold: [get] Maximum duration is the
* maximum time of an overthreshold
* signal detection to be recognized as
* a tap event. The default value of
* these bits is 00b which correspondsto
* 4*ODR_XL time. If the SHOCK[1:0] bits
* are set to a different value,
* 1LSB corresponds to 8*ODR_XL time.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: get the values of shock
*
*/
int32_t lsm6dsl_duration_tap_overthreshold_get(lsm6dsl_ctx_t *ctx,
uint8_t *val)
{
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_INT_DUR2, val,
sizeof(uint8_t));
*val &= 0x03 >> 2;
return mm_error;
}
/**
* @brief threshold_wakeup: [set] Threshold for wake-up. 1 LSb corresponds
* to FS_XL/64
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of wk_ths
*
*/
int32_t lsm6dsl_threshold_wakeup_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
int32_t mm_error;
uint8_t reg;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_WAKE_UP_THS, (uint8_t *)&reg,
sizeof(uint8_t));
reg &= ~0x3F;
reg |= (val & 0x3F);
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_WAKE_UP_THS, (uint8_t *)&reg,
sizeof(uint8_t));
return mm_error;
}
/**
* @brief threshold_wakeup: [get] Threshold for wake-up. 1 LSb corresponds
* to FS_XL/64
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: get the values of wk_ths
*
*/
int32_t lsm6dsl_threshold_wakeup_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_WAKE_UP_THS, val,
sizeof(uint8_t));
*val &= 0x3F >> 2;
return mm_error;
}
/**
* @brief wait_before_sleep: [set] Duration to go in sleep mode. Default
* value: 0000 (this corresponds to 16 ODR)
* 1 LSB = 512 ODR
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of sleep_dur
*
*/
int32_t lsm6dsl_wait_before_sleep_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
int32_t mm_error;
lsm6dsl_wake_up_dur_t reg;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_WAKE_UP_DUR, (uint8_t *)&reg,
sizeof(uint8_t));
reg.sleep_dur = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_WAKE_UP_DUR, (uint8_t *)&reg,
sizeof(uint8_t));
return mm_error;
}
/**
* @brief wait_before_sleep: [get] Duration to go in sleep mode.
* Default value: 0000 (this corresponds
* to 16 ODR) 1 LSB = 512 ODR
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: get the values of sleep_dur
*
*/
int32_t lsm6dsl_wait_before_sleep_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_WAKE_UP_DUR, val,
sizeof(uint8_t));
*val &= 0x0F >> 2;
return mm_error;
}
/**
* @brief lsm6dsl_wakeup_dur: [set] Wake-up duration event.
* 1LSB = 1 ODR_time
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of wake_dur
*
*/
int32_t lsm6dsl_wakeup_dur_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
int32_t mm_error;
lsm6dsl_wake_up_dur_t reg;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_WAKE_UP_DUR, (uint8_t *)&reg,
sizeof(uint8_t));
reg.wake_dur = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_WAKE_UP_DUR, (uint8_t *)&reg,
sizeof(uint8_t));
return mm_error;
}
/**
* @brief lsm6dsl_wakeup_dur: [get] Wake-up duration event.
* 1LSB = 1 ODR_time
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: get the values of wake_dur
*
*/
int32_t lsm6dsl_wakeup_dur_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_WAKE_UP_DUR, val,
sizeof(uint8_t));
*val &= 0x60 >> 5;
return mm_error;
}
/**
* @brief free_fall_duration: [set] For the complete configuration of
* the free fall duration, refer to FF_DUR5 in
* WAKE_UP_DUR (5Ch) configuration.
* Value is expressed in number of samples
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of ff_dur
*
*/
int32_t lsm6dsl_free_fall_duration_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
int32_t mm_error;
uint8_t reg;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FREE_FALL, (uint8_t *)&reg,
sizeof(uint8_t));
reg &= ~0xF8;
reg |= ((val << 3) & 0xF8);
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_FREE_FALL, (uint8_t *)&reg,
sizeof(uint8_t));
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_WAKE_UP_DUR, (uint8_t *)&reg,
sizeof(uint8_t));
reg &= ~0x80;
reg |= ((val << 7) & 0x80);
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_WAKE_UP_DUR, (uint8_t *)&reg,
sizeof(uint8_t));
return mm_error;
}
/**
* @brief free_fall_duration: [get] For the complete configuration of
* the free fall duration, refer to FF_DUR5
* in WAKE_UP_DUR (5Ch) configuration.
* Value is expressed in number of samples
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: get the values of ff_dur
*
*/
int32_t lsm6dsl_free_fall_duration_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
int32_t mm_error;
uint8_t reg;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FREE_FALL, &reg,
sizeof(uint8_t));
*val = (reg & 0xF8) >> 3;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_WAKE_UP_DUR, &reg,
sizeof(uint8_t));
*val |= (reg & 0x80) >> 2;
return mm_error;
}
/**
* @brief master_error_code: [get] master_error_code value in DIGIT
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t : union that group together the master_error_code data
*
*/
int32_t lsm6dsl_master_error_code_raw(lsm6dsl_ctx_t *ctx, uint8_t *buff)
{
return lsm6dsl_read_reg(ctx, LSM6DSL_MASTER_CMD_CODE, (uint8_t *) buff,
sizeof(uint8_t));
}
/**
* @brief synchro_error_code: [get] synchro_error_code value in DIGIT
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t : union that group together the synchro_error_code data
*
*/
int32_t lsm6dsl_synchro_error_code_raw(lsm6dsl_ctx_t *ctx, uint8_t *buff)
{
return lsm6dsl_read_reg(ctx, LSM6DSL_SENS_SYNC_SPI_ERROR_CODE,
(uint8_t *) buff, sizeof(uint8_t));
}
/**
* @brief ext_magnetometer: [get] ext_magnetometer value in DIGIT
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param axis3bit16_t : union that group together the ext_magnetometer data
*
*/
int32_t lsm6dsl_ext_magnetometer_raw(lsm6dsl_ctx_t *ctx, axis3bit16_t *buff)
{
return lsm6dsl_read_reg(ctx, LSM6DSL_OUT_MAG_RAW_X_L,
(uint8_t *) buff, sizeof(axis3bit16_t));
}
/**
* @brief xl_x_axis_offset: [set] Accelerometer X-axis user offset
* correction expressed in twos complement,
* weight depends on CTRL6_C(4) bit.
* The value must be in the range [-127 127].
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of x_ofs_usr
*
*/
int32_t lsm6dsl_xl_x_axis_offset_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
int32_t mm_error;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_X_OFS_USR, &val, sizeof(uint8_t));
return mm_error;
}
/**
* @brief xl_x_axis_offset: [get] Accelerometer X-axis user offset
* correction expressed in twos complement,
* weight depends on CTRL6_C(4) bit.
* The value must be in the range [-127 127].
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: get the values of x_ofs_usr
*
*/
int32_t lsm6dsl_xl_x_axis_offset_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_X_OFS_USR, val, sizeof(uint8_t));
return mm_error;
}
/**
* @brief xl_y_axis_offset: [set] Accelerometer Y-axis user offset
* correction expressed in twos complement,
* weight depends on CTRL6_C(4) bit.
* The value must be in the range [-127 127].
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of y_ofs_usr
*
*/
int32_t lsm6dsl_xl_y_axis_offset_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
int32_t mm_error;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_Y_OFS_USR, &val, sizeof(uint8_t));
return mm_error;
}
/**
* @brief xl_y_axis_offset: [get] Accelerometer Y-axis user offset
* correction expressed in twos complement,
* weight depends on CTRL6_C(4) bit.
* The value must be in the range [-127 127].
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: get the values of y_ofs_usr
*
*/
int32_t lsm6dsl_xl_y_axis_offset_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_Y_OFS_USR, val,
sizeof(uint8_t));
return mm_error;
}
/**
* @brief xl_z_axis_offset: [set] Accelerometer Z-axis user offset
* correction expressed in twos complement,
* weight depends on CTRL6_C(4) bit.
* The value must be in the range [-127 127].
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of y_ofs_usr
*
*/
int32_t lsm6dsl_xl_z_axis_offset_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
int32_t mm_error;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_Z_OFS_USR, &val,
sizeof(uint8_t));
return mm_error;
}
/**
* @brief xl_z_axis_offset: [get] Accelerometer Z-axis user offset
* correction expressed in twos complement,
* weight depends on CTRL6_C(4) bit.
* The value must be in the range [-127 127].
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: get the values of y_ofs_usr
*
*/
int32_t lsm6dsl_xl_z_axis_offset_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_Z_OFS_USR, val, sizeof(uint8_t));
return mm_error;
}
/**
* @brief sensor_hub_i2c: [set] Sensor hub I2C master enable.
* This is effective if the FUNC_EN bit
* is set to '1'.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of master_on in reg MASTER_CONFIG
*
*/
int32_t lsm6dsl_sensor_hub_i2c_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_master_config_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_MASTER_CONFIG,
(uint8_t *)&reg, 1);
reg.master_on = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_MASTER_CONFIG,
(uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief sensor_hub_i2c: [get] Sensor hub I2C master enable. This
* is effective if the FUNC_EN bit is set to '1'.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of master_on in reg MASTER_CONFIG
*
*/
int32_t lsm6dsl_sensor_hub_i2c_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_master_config_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_MASTER_CONFIG,
(uint8_t *)&reg, 1);
*val = reg.master_on;
return mm_error;
}
/**
* @brief sensor_hub_pass_through: [set] Sensor hub I2C interface act
* as pass-through.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of pass_through_mode
* in reg MASTER_CONFIG
*
*/
int32_t lsm6dsl_sensor_hub_pass_through_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_master_config_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_MASTER_CONFIG,
(uint8_t *)&reg, 1);
reg.pass_through_mode = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_MASTER_CONFIG,
(uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief sensor_hub_pass_through: [get] Sensor hub I2C interface act
* as pass-through.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of pass_through_mode
* in reg MASTER_CONFIG
*
*/
int32_t lsm6dsl_sensor_hub_pass_through_get(lsm6dsl_ctx_t *ctx, uint8_t *val)
{
lsm6dsl_master_config_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_MASTER_CONFIG,
(uint8_t *)&reg, 1);
*val = reg.pass_through_mode;
return mm_error;
}
/**
* @brief sensor_hub_pull_up: [set] Auxiliary I2C pull-up.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_pull_up_en_t: change the values of pull_up_en
* in reg MASTER_CONFIG
*
*/
int32_t lsm6dsl_sensor_hub_pull_up_set(lsm6dsl_ctx_t *ctx,
lsm6dsl_pull_up_en_t val)
{
lsm6dsl_master_config_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_MASTER_CONFIG,
(uint8_t *)&reg, 1);
reg.pull_up_en = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_MASTER_CONFIG,
(uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief sensor_hub_pull_up: [get] Auxiliary I2C pull-up.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_pull_up_en_t: Get the values of pull_up_en
* in reg MASTER_CONFIG
*
*/
int32_t lsm6dsl_sensor_hub_pull_up_get(lsm6dsl_ctx_t *ctx,
lsm6dsl_pull_up_en_t *val)
{
lsm6dsl_master_config_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_MASTER_CONFIG, (uint8_t *)&reg, 1);
*val = (lsm6dsl_pull_up_en_t) reg.pull_up_en;
return mm_error;
}
/**
* @brief sensor_hub_op_trigger: [set] Sensor Hub trigger signal selection.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_start_config_t: change the values of start_config
* in reg MASTER_CONFIG
*
*/
int32_t lsm6dsl_sensor_hub_op_trigger_set(lsm6dsl_ctx_t *ctx,
lsm6dsl_start_config_t val)
{
lsm6dsl_master_config_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_MASTER_CONFIG,
(uint8_t *)&reg, 1);
reg.start_config = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_MASTER_CONFIG,
(uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief sensor_hub_op_trigger: [get] Sensor Hub trigger signal selection.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_start_config_t: Get the values of start_config
* in reg MASTER_CONFIG
*
*/
int32_t lsm6dsl_sensor_hub_op_trigger_get(lsm6dsl_ctx_t *ctx,
lsm6dsl_start_config_t *val)
{
lsm6dsl_master_config_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_MASTER_CONFIG, (uint8_t *)&reg, 1);
*val = (lsm6dsl_start_config_t) reg.start_config;
return mm_error;
}
/**
* @brief sensor_hub_drdy_on_int1: [set] Manage the Master DRDY
* signal on INT1 pad.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t val: change the values of drdy_on_int1
* in reg MASTER_CONFIG
*
*/
int32_t lsm6dsl_sensor_hub_drdy_on_int1_set(lsm6dsl_ctx_t *ctx, uint8_t val)
{
lsm6dsl_master_config_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_MASTER_CONFIG,
(uint8_t *)&reg, 1);
reg.drdy_on_int1 = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_MASTER_CONFIG,
(uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief sensor_hub_drdy_on_int1: [get] Manage the Master DRDY
* signal on INT1 pad.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t: change the values of drdy_on_int1 in
* reg MASTER_CONFIG
*
*/
int32_t lsm6dsl_sensor_hub_drdy_on_int1_get(lsm6dsl_ctx_t *ctx,
uint8_t *val)
{
lsm6dsl_master_config_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_MASTER_CONFIG,
(uint8_t *)&reg, 1);
*val = reg.drdy_on_int1;
return mm_error;
}
/**
* @brief res_ratio: [set] Resolution ratio of error code for
* sensor_synchronization
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_rr_t: change the values of rr in
* reg SENSOR_SYNC_RES_RATIO
*
*/
int32_t lsm6dsl_res_ratio_set(lsm6dsl_ctx_t *ctx, lsm6dsl_rr_t val)
{
lsm6dsl_sensor_sync_res_ratio_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_SENSOR_SYNC_RES_RATIO,
(uint8_t *)&reg, 1);
reg.rr = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_SENSOR_SYNC_RES_RATIO,
(uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief res_ratio: [get] Resolution ratio of error code for
* sensor_synchronization
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_rr_t: Get the values of rr in
* reg SENSOR_SYNC_RES_RATIO
*
*/
int32_t lsm6dsl_res_ratio_get(lsm6dsl_ctx_t *ctx, lsm6dsl_rr_t *val)
{
lsm6dsl_sensor_sync_res_ratio_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_SENSOR_SYNC_RES_RATIO,
(uint8_t *)&reg, 1);
*val = (lsm6dsl_rr_t) reg.rr;
return mm_error;
}
/**
* @brief sensorhub_set1_out: [get] sensorhub_set1_out value in DIGIT
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t : union that group together the sensorhub_set1_out data
*
*/
int32_t lsm6dsl_sensorhub_set1_out_raw(lsm6dsl_ctx_t *ctx, uint8_t *buff)
{
return lsm6dsl_read_reg(ctx, LSM6DSL_SENSORHUB1_REG, (uint8_t *) buff,
sizeof(uint8_t));
}
/**
* @brief sensorhub_set2_out: [get] sensorhub_set2_out value in DIGIT
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param uint8_t : union that group together the sensorhub_set2_out data
*
*/
int32_t lsm6dsl_sensorhub_set2_out_raw(lsm6dsl_ctx_t *ctx, uint8_t *buff)
{
return lsm6dsl_read_reg(ctx, LSM6DSL_SENSORHUB13_REG, (uint8_t *) buff,
sizeof(uint8_t));
}
/**
* @brief change_bank: [set] Enable access to the embedded_functions
* configuration registers bank A and B
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_func_cfg_en_t: change the values of func_cfg_en
* in reg FUNC_CFG_EN
*
*/
int32_t lsm6dsl_change_bank_set(lsm6dsl_ctx_t *ctx, lsm6dsl_func_cfg_en_t val)
{
lsm6dsl_func_cfg_access_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FUNC_CFG_ACCESS,
(uint8_t *)&reg, 1);
reg.func_cfg_en = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_FUNC_CFG_ACCESS,
(uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief change_bank: [get] Enable access to the embedded_functions
* configuration registers bank A and B
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_func_cfg_en_t: Get the values of func_cfg_en
* in reg FUNC_CFG_EN
*
*/
int32_t lsm6dsl_change_bank_get(lsm6dsl_ctx_t *ctx, lsm6dsl_func_cfg_en_t *val)
{
lsm6dsl_func_cfg_access_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_FUNC_CFG_ACCESS,
(uint8_t *)&reg, 1);
*val = (lsm6dsl_func_cfg_en_t) reg.func_cfg_en;
return mm_error;
}
/**
* @brief data_for_wake_up: [set] HPF or SLOPE filter selection on
* wake-up and Activity/Inactivity functions.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_slope_fds_t: change the values of slope_fds in reg TAP_CFG
*
*/
int32_t lsm6dsl_data_for_wake_up_set(lsm6dsl_ctx_t *ctx,
lsm6dsl_slope_fds_t val)
{
lsm6dsl_tap_cfg_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_TAP_CFG, (uint8_t *)&reg, 1);
reg.slope_fds = val;
mm_error = lsm6dsl_write_reg(ctx, LSM6DSL_TAP_CFG, (uint8_t *)&reg, 1);
return mm_error;
}
/**
* @brief data_for_wake_up: [get] HPF or SLOPE filter selection
* on wake-up and Activity/Inactivity functions.
*
* @param lsm6dsl_ctx_t *ctx: read / write interface definitions
* @param lsm6dsl_slope_fds_t: Get the values of slope_fds in reg TAP_CFG
*
*/
int32_t lsm6dsl_data_for_wake_up_get(lsm6dsl_ctx_t *ctx,
lsm6dsl_slope_fds_t *val)
{
lsm6dsl_tap_cfg_t reg;
int32_t mm_error;
mm_error = lsm6dsl_read_reg(ctx, LSM6DSL_TAP_CFG, (uint8_t *)&reg, 1);
*val = (lsm6dsl_slope_fds_t) reg.slope_fds;
return mm_error;
}
/**
* @}
*/
/**
* @}
*/
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
lsm6dsl_odr_xl_t xl_odr_temp = XL_104Hz;
u8 lsm6dsl_xl_power_down()
{
int32_t mm_error;
mm_error = lsm6dsl_xl_data_rate_get(&lsm6dsl_ctx, &xl_odr_temp);
if (mm_error != 1) {
xl_odr_temp = XL_OFF;
log_error("lsm6dsl acc power down fail!");
return 0;
}
log_info("xl_odr:%d", xl_odr_temp);
mm_error = lsm6dsl_xl_data_rate_set(&lsm6dsl_ctx, XL_OFF);
if (mm_error == 1) {
log_info("lsm6dsl acc power down ok!");
return 1;
} else {
log_error("lsm6dsl acc power down fail!");
return 0;
}
}
u8 lsm6dsl_xl_wake_up()
{
int32_t mm_error;
if (xl_odr_temp == XL_OFF) {
log_error("lsm6dsl acc wake up fail!");
return 0;
}
mm_error = lsm6dsl_xl_data_rate_set(&lsm6dsl_ctx, xl_odr_temp);
if (mm_error == 1) {
log_info("lsm6dsl acc wake up ok!");
return 1;
} else {
log_error("lsm6dsl acc wake up fail!");
return 0;
}
}
lsm6dsl_odr_g_t g_odr_temp = GY_104Hz;
u8 lsm6dsl_g_power_down()
{
int32_t mm_error;
mm_error = lsm6dsl_gyro_data_rate_get(&lsm6dsl_ctx, &g_odr_temp);
if (mm_error != 1) {
g_odr_temp = GY_OFF;
log_error("lsm6dsl gyro power down fail!");
return 0;
}
log_info("g_odr:%d", g_odr_temp);
mm_error = lsm6dsl_gyro_data_rate_set(&lsm6dsl_ctx, GY_OFF);
if (mm_error == 1) {
log_info("lsm6dsl gyro power down ok!");
return 1;
} else {
log_error("lsm6dsl gyro power down fail!");
return 0;
}
}
u8 lsm6dsl_g_wake_up()
{
int32_t mm_error;
if (g_odr_temp == GY_OFF) {
log_error("lsm6dsl gyro wake up fail!");
return 0;
}
mm_error = lsm6dsl_gyro_data_rate_set(&lsm6dsl_ctx, g_odr_temp);
if (mm_error == 1) {
log_info("lsm6dsl gyro wake up ok!");
return 1;
} else {
log_error("lsm6dsl gyro wake up fail!");
return 0;
}
}
unsigned char lsm6dsl_init()
{
unsigned char lsm6dsl_chip_id = 0x00, rst;
unsigned char lsm6dsl_revision_id = 0x00;
unsigned char iCount = 0;
unsigned char fw_version[3] = {0};
unsigned char usid_version[6] = {0};
#if (LSM6DSL_USER_INTERFACE==LSM6DSL_USE_SPI)
if (lsm6dsl_info->spi_work_mode) {
lsm6dsl_spi_mode_set(&lsm6dsl_ctx, 1);//使能spi_3_wire
} else {
lsm6dsl_spi_mode_set(&lsm6dsl_ctx, 0);//使能spi_4_wire
}
#endif
/* Check device ID */
while ((lsm6dsl_chip_id != LSM6DSL_ID) && (iCount < 10)) {
lsm6dsl_device_id(&lsm6dsl_ctx, &lsm6dsl_chip_id);
if (lsm6dsl_chip_id == LSM6DSL_ID) {
break;
}
iCount++;
mdelay(1);
}
if (lsm6dsl_chip_id == LSM6DSL_ID) {
/* Restore default configuration */
lsm6dsl_reset_set(&lsm6dsl_ctx, PROPERTY_ENABLE);
do {
lsm6dsl_reset_get(&lsm6dsl_ctx, &rst);
} while (rst);
log_info("lsm6dsl_init slave=0x%x lsm6dslRegister_WhoAmI=0x%x\n", LSM6DSL_IIC_SLAVE_ADDRESS, lsm6dsl_chip_id);
#if (LSM6DSL_USE_TAP_EN)
/* tap_enable(); */
#endif
#if (LSM6DSL_USE_ANYMOTION_EN)
/* anymotion_lowpwr_config(); */
#endif
#if (LSM6DSL_USE_FIFO_EN)
lsm6dsl_fifo_write_mode_set(&lsm6dsl_ctx, ON_DRDY);
lsm6dsl_fifo_temperature_set(&lsm6dsl_ctx, 0);//0: temperature not included in FIFO; 1: temperature included in FIFO //1:DS4_NO_DEC
lsm6dsl_fifo_step_timestamp_set(&lsm6dsl_ctx, 0);//0: disable step counter and timestamp data as 3rd FIFO data set; 1:enable //1:DS3_NO_DEC
lsm6dsl_xl_decimation_set(&lsm6dsl_ctx, XL_NO_DEC);//抽样XL_DEC_4
lsm6dsl_gyro_decimation_set(&lsm6dsl_ctx, GY_NO_DEC);//抽样GY_DEC_4
lsm6dsl_dataset3_decimation_set(&lsm6dsl_ctx, DS3_NO_FILL);//DS3_NO_DEC:step=1
lsm6dsl_dataset4_decimation_set(&lsm6dsl_ctx, DS4_NO_FILL);//DS4_NO_DEC:tmeperature=1
lsm6dsl_fifo_xl_gy_8bit_data_set(&lsm6dsl_ctx, 0);//
lsm6dsl_fifo_stop_on_thr_set(&lsm6dsl_ctx, 1);//0: FIFO depth is not limited; 1: FIFO depth is limited to threshold level
lsm6dsl_fifo_threshold_set(&lsm6dsl_ctx, 504);//0~2047(word).stop_on_thr=1
lsm6dsl_fifo_data_rate_set(&lsm6dsl_ctx, FIFO_104Hz);//be effective only fifo write mode=ON_DRDY. fifo_rate<=acc&gyro rate
/* lsm6dsl_fifo_mode_set(&lsm6dsl_ctx, CONTINUOS);fifo_mode_old = CONTINUOS; */
lsm6dsl_fifo_mode_set(&lsm6dsl_ctx, STOP_WHEN_FULL);
fifo_mode_old = STOP_WHEN_FULL;
//fifo int:
#if LSM6DSL_FIFO_INT_OMAP_INT1
/* lsm6dsl_fifo_threshold_on_int1_set(&lsm6dsl_ctx, 1); */
/* lsm6dsl_fifo_overrun_on_int1_set(&lsm6dsl_ctx, 1);// */
lsm6dsl_fifo_full_on_int1_set(&lsm6dsl_ctx, 1);
#else
/* lsm6dsl_fifo_threshold_on_int2_set(&lsm6dsl_ctx, 1); */
/* lsm6dsl_fifo_overrun_on_int2_set(&lsm6dsl_ctx, 1);// */
lsm6dsl_fifo_full_on_int2_set(&lsm6dsl_ctx, 1);
#endif
#endif
#if (LSM6DSL_USE_STEP_EN)
/* qmi8658_config.inputSelection = QMI8658_CONFIG_ACC_ENABLE; */
/* qmi8658_config.accRange = Qmi8658AccRange_8g; */
/* qmi8658_config.accOdr = Qmi8658AccOdr_LowPower_21Hz;//Qmi8658AccOdr_62_5Hz;//Qmi8658AccOdr_LowPower_21Hz; */
/* qmi8658_config.gyrRange = Qmi8658GyrRange_1024dps; //Qmi8658GyrRange_2048dps Qmi8658GyrRange_1024dps */
/* qmi8658_config.gyrOdr = Qmi8658GyrOdr_500Hz; */
/* */
/* Qmi8658_write(QMI8658_SLAVE_ADDRESS, Qmi8658Register_Ctrl7, 0x00); // */
/* Qmi8658_write(QMI8658_SLAVE_ADDRESS, Qmi8658Register_Ctrl8, 0xD0); */
/* stepConfig(21); //ODR = 21hz */
#endif
/* Set xl Full Scale */
lsm6dsl_xl_full_scale_set(&lsm6dsl_ctx, FS_16g);
/* Set gyro Full Scale */
lsm6dsl_gyro_full_scale_set(&lsm6dsl_ctx, FS_2000dps);
/* Enable Acc Block Data Update */
lsm6dsl_block_data_update_set(&lsm6dsl_ctx, PROPERTY_ENABLE);//fifo mode:updata=1
/* Set AXL bandwith: ODR/100 */
lsm6dsl_xl_lpf2_set(&lsm6dsl_ctx, 1);
lsm6dsl_xl_cutoff_set(&lsm6dsl_ctx, XL_ODR_DIV_100);
//lsm6dsl_xl_cutoff_set(&lsm6dsl_ctx, XL_ODR_DIV_400);
/* Set GYR bandwith:121HZ */
lsm6dsl_gyro_lpf1_set(&lsm6dsl_ctx, 1);
lsm6dsl_gyro_lpf1_bandwidth_set(&lsm6dsl_ctx, GY_LPF1_VERY_AGGRESSIVE);
/* Set xl Output Data Rate */
lsm6dsl_xl_data_rate_set(&lsm6dsl_ctx, XL_104Hz);
/* Set gyro Output Data Rate */
lsm6dsl_gyro_data_rate_set(&lsm6dsl_ctx, GY_104Hz);
//int:
#if LSM6DSL_USE_INT_EN
/* lsm6dsl_xl_drdy_on_int2_set(&lsm6dsl_ctx, 1); */
lsm6dsl_gyro_drdy_on_int2_set(&lsm6dsl_ctx, 1);
/* lsm6dsl_temperature_drdy_on_int2_set(&lsm6dsl_ctx, 1); */
#endif
/* Read samples in polling mode (no int) */
#if 0
unsigned char read_data[10];
lsm6dsl_read_reg(&lsm6dsl_ctx, LSM6DSL_CTRL1_XL, (uint8_t *)&read_data, 10);
log_info("LSM6DSL_CTRL1_XL, CTRL2_G,CTRL3_C,CTRL4_C,CTRL5_C,CTRL6_C,CTRL7_G,CTRL8_XL,CTRL9_XL,CTRL10_C\n");
log_info_hexdump(read_data, 10);
lsm6dsl_read_reg(&lsm6dsl_ctx, LSM6DSL_FIFO_CTRL1, (uint8_t *)&read_data, 5);
log_info("LSM6DSL_fifo_CTRL1~5\n");
log_info_hexdump(read_data, 5);
lsm6dsl_read_reg(&lsm6dsl_ctx, LSM6DSL_INT1_CTRL, (uint8_t *)&read_data, 2);
log_info("LSM6DSL_int_CTRL1~2\n");
log_info_hexdump(read_data, 2);
#endif
return 1;
} else {
log_error("lsm6dsl_init fail(id:0x%x)\n", lsm6dsl_chip_id);
lsm6dsl_chip_id = 0;
return 0;
}
}
static u8 lsm6dsl_int_pin1 = IO_PORTB_04;
static u8 lsm6dsl_int_pin2 = IO_PORTB_03;
//return:0:fail, 1:ok
u8 lsm6dsl_sensor_init(void *priv)
{
if (priv == NULL) {
log_error("lsm6dsl init fail(no param)\n");
return 0;
}
lsm6dsl_info = (lsm6dsl_param *)priv;
#if (LSM6DSL_USER_INTERFACE==LSM6DSL_USE_I2C) //iic interface
iic_init(lsm6dsl_info->iic_hdl);
#elif (LSM6DSL_USER_INTERFACE==LSM6DSL_USE_SPI)//spi interface
spi_cs_init();
spi_init();
#else
#endif
gpio_set_die(lsm6dsl_int_pin1, 1);
gpio_set_direction(lsm6dsl_int_pin1, 1);
// gpio_set_pull_up(lsm6dsl_int_pin1,1);
gpio_set_die(lsm6dsl_int_pin2, 1);
gpio_set_direction(lsm6dsl_int_pin2, 1);
// gpio_set_pull_up(lsm6dsl_int_pin2,1);
return lsm6dsl_init();
}
static volatile u32 lsm6dsl_init_flag ;
static u8 imu_busy = 0;
static lsm6dsl_param lsm6dsl_info_data;
/* #define SENSORS_MPU_BUFF_LEN 14 */
/* u8 read_lsm6dsl_buf[SENSORS_MPU_BUFF_LEN]; */
#if (LSM6DSL_USE_FIFO_EN)
static u8 lsm6dsl_fifo_data[1024 * 4]; //size:n*6 * Number_of_enabled_sensors<4kbytes
#endif
void lsm6dsl_int_callback()
{
if (lsm6dsl_init_flag == 0) {
log_error("lsm6dsl init fail!");
return ;
}
if (imu_busy) {
log_error("lsm6dsl busy!");
return ;
}
imu_busy = 1;
imu_sensor_data_t raw_sensor_datas;
float TempData = 0.0;
#if (LSM6DSL_USE_FIFO_EN)
u16 fifo_level = 0;//fifo cnt(bytes)
fifo_level = lsm6dsl_read_fifo(&lsm6dsl_ctx, lsm6dsl_fifo_data);
TempData = lsm6dsl_read_temperature(&lsm6dsl_ctx);
/* log_info("lsm6dsl raw:gyro_x:%d gyro_y:%d gyro_z:%d, acc_x:%d acc_y:%d acc_z:%d tim_count:%d", (s16)(lsm6dsl_fifo_data[1]<<8|lsm6dsl_fifo_data[0]), (s16)(lsm6dsl_fifo_data[3]<<8|lsm6dsl_fifo_data[2]), (s16)(lsm6dsl_fifo_data[5]<<8|lsm6dsl_fifo_data[4]), (s16)(lsm6dsl_fifo_data[7]<<8|lsm6dsl_fifo_data[6]), (s16)(lsm6dsl_fifo_data[9]<<8|lsm6dsl_fifo_data[8]), (s16)(lsm6dsl_fifo_data[11]<<8|lsm6dsl_fifo_data[10]),fifo_level);//共fifo_level组数据, 只打印第一组数据 */
#else
/* lsm6dsl_status_reg_t status_reg; */
u8 status_reg;
lsm6dsl_read_reg(&lsm6dsl_ctx, LSM6DSL_STATUS_REG, (uint8_t *)&status_reg, 1);
/* log_info("status:0x%x", status_reg); */
if (status_reg & 0x03) {
lsm6dsl_read_raw_acc_gyro_xyz(&lsm6dsl_ctx, &raw_sensor_datas);//获取原始值
/* TempData = lsm6dsl_read_temperature(&lsm6dsl_ctx); */
TempData = raw_sensor_datas.temp_data;
/* log_info("lsm6dsl raw:acc_x:%d acc_y:%d acc_z:%d gyro_x:%d gyro_y:%d gyro_z:%d", raw_sensor_datas.acc.x, raw_sensor_datas.acc.y, raw_sensor_datas.acc.z, raw_sensor_datas.gyro.x, raw_sensor_datas.gyro.y, raw_sensor_datas.gyro.z); */
}
#endif
/* log_info("lsm6dsl temp:%d.%d\n", (u16)TempData, (u16)(((u16)(TempData * 100)) % 100)); */
imu_busy = 0;
}
s8 lsm6dsl_dev_init(void *arg)
{
if (arg == NULL) {
log_error("lsm6dsl init fail(no arg)\n");
return -1;
}
#if (LSM6DSL_USER_INTERFACE==LSM6DSL_USE_I2C)
lsm6dsl_info_data.iic_hdl = ((struct imusensor_platform_data *)arg)->peripheral_hdl;
lsm6dsl_info_data.iic_delay = ((struct imusensor_platform_data *)arg)->peripheral_param0; //这个延时并非影响iic的时钟频率,而是2Byte数据之间的延时
// u8 iic_clk; //iic_clk: <=400kHz
#elif (LSM6DSL_USER_INTERFACE==LSM6DSL_USE_SPI)
lsm6dsl_info_data.spi_hdl = ((struct imusensor_platform_data *)arg)->peripheral_hdl, //SPIx (role:master)
lsm6dsl_info_data.spi_cs_pin = ((struct imusensor_platform_data *)arg)->peripheral_param0; //IO_PORTA_05
lsm6dsl_info_data.spi_work_mode = ((struct imusensor_platform_data *)arg)->peripheral_param1; //1:3wire(SPI_MODE_UNIDIR_1BIT) or 0:4wire(SPI_MODE_BIDIR_1BIT) (与spi结构体一样)
// u8 port; //SPIx group:A,B,C,D (spi结构体)
// U8 spi_clk; //spi_clk: <=15MHz (spi结构体)
#else
#endif
lsm6dsl_int_pin2 = ((struct imusensor_platform_data *)arg)->imu_sensor_int_io;
lsm6dsl_int_pin1 = lsm6dsl_int_pin2;
if (imu_busy) {
log_error("lsm6dsl busy!");
return -1;
}
imu_busy = 1;
if (lsm6dsl_sensor_init(&lsm6dsl_info_data)) {
#if (LSM6DSL_USE_INT_EN) //中断模式,暂不支持
log_info("int mode en!");
/* port_wkup_enable(lsm6dsl_int_pin2, 1, lsm6dsl_int_callback); //PA08-IO中断,1:下降沿触发,回调函数lsm6dsl_int_callback*/
#ifdef CONFIG_CPU_BR23
io_ext_interrupt_init(lsm6dsl_int_pin2, 1, lsm6dsl_int_callback);
#elif defined(CONFIG_CPU_BR28)
// br28外部中断回调函数,按照现在的外部中断注册方式
// io配置在板级,定义在板级头文件,这里只是注册回调函数
/* port_edge_wkup_set_callback_by_index(3, lsm6dsl_int_callback); // 序号需要和板级配置中的wk_param对应上 */
port_edge_wkup_set_callback(lsm6dsl_int_callback);
#elif defined(CONFIG_CPU_BR27)
port_edge_wkup_set_callback(lsm6dsl_int_callback);
#endif
#else //定时
#endif
lsm6dsl_init_flag = 1;
imu_busy = 0;
log_info("lsm6dsl Device init success!%d\n", lsm6dsl_init_flag);
return 0;
} else {
log_info("lsm6dsl Device init fail!\n");
imu_busy = 0;
return -1;
}
}
int lsm6dsl_dev_ctl(u8 cmd, void *arg);
REGISTER_IMU_SENSOR(lsm6dsl_sensor) = {
.logo = "lsm6dsl",
.imu_sensor_init = lsm6dsl_dev_init,
.imu_sensor_check = NULL,
.imu_sensor_ctl = lsm6dsl_dev_ctl,
};
int lsm6dsl_dev_ctl(u8 cmd, void *arg)
{
int ret = -1;
u8 status_temp = 0;
/* lsm6dsl_status_reg_t status_temp; */
if (lsm6dsl_init_flag == 0) {
log_error("lsm6dsl init fail!");
return ret;//0:ok,,<0:err
}
if (imu_busy) {
log_error("lsm6dsl busy!");
return ret;//0:ok,,<0:err
}
imu_busy = 1;
switch (cmd) {
case IMU_GET_SENSOR_NAME:
memcpy((u8 *)arg, &(lsm6dsl_sensor.logo), 20);
ret = 0;
break;
case IMU_SENSOR_ENABLE: //enable demand cali
/* cbuf_init(&hrsensor_cbuf, hrsensorcbuf, 24 * sizeof(int)); */
lsm6dsl_init();
ret = 0;
break;
case IMU_SENSOR_DISABLE:
/* cbuf_clear(&hrsensor_cbuf); */
//close power
lsm6dsl_xl_power_down();
lsm6dsl_g_power_down();
ret = 0;
break;
case IMU_SENSOR_RESET://reset后必须enable
/* Restore default configuration */
u8 rst;
lsm6dsl_reset_set(&lsm6dsl_ctx, PROPERTY_ENABLE);
do {
lsm6dsl_reset_get(&lsm6dsl_ctx, &rst);
} while (rst);
ret = 0;
break;
case IMU_SENSOR_SLEEP:
if ((lsm6dsl_xl_power_down()) && (lsm6dsl_g_power_down())) {
log_info("lsm6dsl enter sleep ok!");
ret = 0;
} else {
log_error("lsm6dsl enter sleep fail!");
}
break;
case IMU_SENSOR_WAKEUP: //disable demand cali
if ((lsm6dsl_xl_wake_up()) && (lsm6dsl_g_wake_up())) {
log_info("lsm6dsl wakeup ok!");
ret = 0;
} else {
log_error("lsm6dsl wakeup fail!");
}
break;
case IMU_SENSOR_INT_DET://传感器中断状态检查
break;
case IMU_SENSOR_DATA_READY://传感器数据准备就绪待读
break;
case IMU_SENSOR_CHECK_DATA://检查传感器缓存buf是否存满
break;
case IMU_SENSOR_READ_DATA://默认读传感器所有数据
lsm6dsl_read_reg(&lsm6dsl_ctx, LSM6DSL_STATUS_REG, (uint8_t *)&status_temp, 1);
/* log_info("status:0x%x", status_temp); */
if (status_temp & 0x03) {
lsm6dsl_read_raw_acc_gyro_xyz(&lsm6dsl_ctx, arg);//获取原始值
ret = 0;
}
break;
case IMU_GET_ACCEL_DATA://加速度数据
/* float TempData = 0.0; */
lsm6dsl_read_reg(&lsm6dsl_ctx, LSM6DSL_STATUS_REG, (uint8_t *)&status_temp, 1);
/* log_info("status:0x%x", status_temp); */
if (status_temp & 0x01) {
lsm6dsl_read_raw_acc_xyz(&lsm6dsl_ctx, arg);//获取原始值
ret = 0;
/* TempData = lsm6dsl_read_temperature(&lsm6dsl_ctx); */
}
break;
case IMU_GET_GYRO_DATA://陀螺仪数据
lsm6dsl_read_reg(&lsm6dsl_ctx, LSM6DSL_STATUS_REG, (uint8_t *)&status_temp, 1);
/* log_info("status:0x%x", status_temp); */
if (status_temp & 0x02) {
lsm6dsl_read_raw_gyro_xyz(&lsm6dsl_ctx, arg);//获取原始值
ret = 0;
}
break;
case IMU_GET_MAG_DATA://磁力计数据
log_error("lsm6dsl have no mag!\n");
break;
case IMU_SENSOR_SEARCH://检查传感器id
lsm6dsl_device_id(&lsm6dsl_ctx, (u8 *)arg);
if (*(u8 *)arg == LSM6DSL_ID) {
ret = 0;
log_info("lsm6dsl online!\n");
} else {
log_error("lsm6dsl offline!\n");
}
break;
case IMU_GET_SENSOR_STATUS://获取传感器状态
lsm6dsl_read_reg(&lsm6dsl_ctx, LSM6DSL_STATUS_REG, (uint8_t *)&status_temp, 1);
*(u8 *)arg = status_temp;
ret = 0;
break;
case IMU_SET_SENSOR_FIFO_CONFIG://配置传感器FIFO
#if (LSM6DSL_USE_FIFO_EN)
/* u8 *tmp = (u8 *)arg; */
/* u8 wm_th = tmp[0]; */
/* u8 fifo_size = tmp[1];//Qmi8658_Fifo_64 */
/* u8 fifo_mode = tmp[2];//Qmi8658_Fifo_Stream */
/* u8 fifo_format = tmp[3];//QMI8658_FORMAT_12_BYTES */
/* Qmi8658_config_fifo(wm_th, fifo_size, fifo_mode, fifo_format); */
ret = 0;
#endif
break;
case IMU_GET_SENSOR_READ_FIFO://读取传感器FIFO数据
#if (LSM6DSL_USE_FIFO_EN)
ret = lsm6dsl_read_fifo(&lsm6dsl_ctx, (u8 *)arg);
#endif
break;
case IMU_SET_SENSOR_TEMP_DISABLE://温度传感器无法控制
u8 temp = *(u8 *)arg;
ret = 0;
break;
default:
log_error("--cmd err!\n");
break;
}
imu_busy = 0;
return ret;//0:ok,,<0:err
}
/***************************lsm6dsl test*******************************/
#if 0 //测试
static lsm6dsl_param lsm6dsl_info_test = {
#if (LSM6DSL_USER_INTERFACE==LSM6DSL_USE_I2C)
.iic_hdl = 0,
.iic_delay = 0, //这个延时并非影响iic的时钟频率,而是2Byte数据之间的延时
#elif (LSM6DSL_USER_INTERFACE==LSM6DSL_USE_SPI)
.spi_hdl = 1, //SPIx (role:master)
.spi_cs_pin = IO_PORTA_05, //
.spi_work_mode = 0; //4wire
#endif
};
/* Main Example --------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
static axis3bit16_t data_raw;
static axis3bit32_t acceleration_mg;
static axis3bit32_t angular_rate_mdps;
static axis1bit16_t temperature_deg_c;
static uint8_t USBbuffer[5000];
int example_main(void)
{
if (lsm6dsl_sensor_init(&lsm6dsl_info_test)) {
//ok
}
/*
* Read samples in polling mode (no int)
*/
u16 fifo_cnt = 0;
static axis3bit16_t data_raw_acc;
local_irq_disable();
while (1) {
#if (LSM6DSL_USE_FIFO_EN)
fifo_cnt = lsm6dsl_read_fifo(&lsm6dsl_ctx, USBbuffer);
if (fifo_cnt > 0) {
for (u16 i = 0; i < 84; i++) {
memcpy((u8 *)&data_raw, USBbuffer + i * 12, 6);
memcpy((u8 *)&data_raw_acc, USBbuffer + i * 12 + 6, 6);
printf("gy:%6d\t%6d\t%6d\t\txl:%6d\t%6d\t%6d, %d", data_raw.i16bit[0], data_raw.i16bit[1], data_raw.i16bit[2], data_raw_acc.i16bit[0], data_raw_acc.i16bit[1], data_raw_acc.i16bit[2], i);
}
memset(USBbuffer, 0, 1024);
}
#else
/*
* Read output only if new value is available
*/
lsm6dsl_status_reg_t status_reg;
lsm6dsl_read_reg(&lsm6dsl_ctx, LSM6DSL_STATUS_REG, (uint8_t *)&status_reg, 1);
log_info("status reg:0x%x", *((u8 *)&status_reg));
lsm6dsl_read_reg(&lsm6dsl_ctx, LSM6DSL_STATUS_REG, (uint8_t *)&status_reg, 1);
log_info("status reg:0x%x", *((u8 *)&status_reg));
if (status_reg.gda) {
lsm6dsl_angular_rate_raw(&lsm6dsl_ctx, &data_raw);
angular_rate_mdps.i32bit[0] = FROM_FS_1000dps_TO_mdps(data_raw.i16bit[0]);
angular_rate_mdps.i32bit[1] = FROM_FS_1000dps_TO_mdps(data_raw.i16bit[1]);
angular_rate_mdps.i32bit[2] = FROM_FS_1000dps_TO_mdps(data_raw.i16bit[2]);
printf("gy:%6d\t%6d\t%6d\t\t", data_raw.i16bit[0], data_raw.i16bit[1], data_raw.i16bit[2]);
printf("gy:%6d\t%6d\t%6d\r\n", angular_rate_mdps.i32bit[0], angular_rate_mdps.i32bit[1], angular_rate_mdps.i32bit[2]);
}
if (status_reg.xlda) {
lsm6dsl_acceleration_raw(&lsm6dsl_ctx, &data_raw);
acceleration_mg.i32bit[0] = FROM_FS_4g_TO_mg(data_raw.i16bit[0]);
acceleration_mg.i32bit[1] = FROM_FS_4g_TO_mg(data_raw.i16bit[1]);
acceleration_mg.i32bit[2] = FROM_FS_4g_TO_mg(data_raw.i16bit[2]);
printf("xl:%6d\t%6d\t%6d\t\t", data_raw.i16bit[0], data_raw.i16bit[1], data_raw.i16bit[2]);
printf("xl:%6d\t%6d\t%6d\r\n", acceleration_mg.i32bit[0],
acceleration_mg.i32bit[1], acceleration_mg.i32bit[2]);
}
/*
* If the gyroscope is not in Power-Down mode, the temperature data rate
* is equal to 52Hz, regardless of the accelerometer and gyroscope
* configuration. (Ref AN5040)
*/
if (status_reg.tda) {
lsm6dsl_temperature_raw(&lsm6dsl_ctx, &temperature_deg_c);
printf("temp:%3d\t\t", temperature_deg_c.i16bit);
temperature_deg_c.i16bit = FROM_LSB_TO_degC(temperature_deg_c.i16bit);
printf("temp:%3d\r\n", temperature_deg_c.i16bit);
}
#endif
mdelay(100);
wdt_clear();
}
return 0;
}
#endif
#endif