/*
******************************************************************************
* @file lsm6dsox_reg.c
* @author Sensors Software Solution Team
* @brief LSM6DSOX driver file
******************************************************************************
* @attention
*
* <h2><center>© Copyright (c) 2019 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under BSD 3-Clause license,
* the "License"; You may not use this file except in compliance with the
* License. You may obtain a copy of the License at:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/
#include "lsm6dsox_reg.h"
/**
* @defgroup LSM6DSOX
* @brief This file provides a set of functions needed to drive the
* lsm6dsox enhanced inertial module.
* @{
*
*/
/**
* @defgroup LSM6DSOX_Interfaces_Functions
* @brief This section provide a set of functions used to read and
* write a generic register of the device.
* MANDATORY: return 0 -> no Error.
* @{
*
*/
/**
* @brief Read generic device register
*
* @param ctx communication interface handler.(ptr)
* @param reg first register address to read.
* @param data buffer for data read.(ptr)
* @param len number of consecutive register to read.
* @retval interface status (MANDATORY: return 0 -> no Error).
*
*/
int32_t lsm6dsox_read_reg(stmdev_ctx_t* ctx, uint8_t reg, uint8_t* data,
uint16_t len)
{
int32_t ret;
ret = ctx->read_reg(ctx->handle, reg, data, len);
return ret;
}
/**
* @brief Write generic device register
*
* @param ctx communication interface handler.(ptr)
* @param reg first register address to write.
* @param data the buffer contains data to be written.(ptr)
* @param len number of consecutive register to write.
* @retval interface status (MANDATORY: return 0 -> no Error).
*
*/
int32_t lsm6dsox_write_reg(stmdev_ctx_t* ctx, uint8_t reg, uint8_t* data,
uint16_t len)
{
int32_t ret;
ret = ctx->write_reg(ctx->handle, reg, data, len);
return ret;
}
/**
* @}
*
*/
/**
* @defgroup LSM6DSOX_Private_functions
* @brief Section collect all the utility functions needed by APIs.
* @{
*
*/
static void bytecpy(uint8_t *target, uint8_t *source)
{
if ( (target != NULL) && (source != NULL) ) {
*target = *source;
}
}
/**
* @}
*
*/
/**
* @defgroup LSM6DSOX_Sensitivity
* @brief These functions convert raw-data into engineering units.
* @{
*
*/
float_t lsm6dsox_from_fs2_to_mg(int16_t lsb)
{
return ((float_t)lsb) * 0.061f;
}
float_t lsm6dsox_from_fs4_to_mg(int16_t lsb)
{
return ((float_t)lsb) * 0.122f;
}
float_t lsm6dsox_from_fs8_to_mg(int16_t lsb)
{
return ((float_t)lsb) * 0.244f;
}
float_t lsm6dsox_from_fs16_to_mg(int16_t lsb)
{
return ((float_t)lsb) *0.488f;
}
float_t lsm6dsox_from_fs125_to_mdps(int16_t lsb)
{
return ((float_t)lsb) *4.375f;
}
float_t lsm6dsox_from_fs500_to_mdps(int16_t lsb)
{
return ((float_t)lsb) *17.50f;
}
float_t lsm6dsox_from_fs250_to_mdps(int16_t lsb)
{
return ((float_t)lsb) *8.750f;
}
float_t lsm6dsox_from_fs1000_to_mdps(int16_t lsb)
{
return ((float_t)lsb) *35.0f;
}
float_t lsm6dsox_from_fs2000_to_mdps(int16_t lsb)
{
return ((float_t)lsb) *70.0f;
}
float_t lsm6dsox_from_lsb_to_celsius(int16_t lsb)
{
return (((float_t)lsb / 256.0f) + 25.0f);
}
float_t lsm6dsox_from_lsb_to_nsec(int16_t lsb)
{
return ((float_t)lsb * 25000.0f);
}
/**
* @}
*
*/
/**
* @defgroup LSM6DSOX_Data_Generation
* @brief This section groups all the functions concerning
* data generation.
*
*/
/**
* @brief Accelerometer full-scale selection.[set]
*
* @param ctx read / write interface definitions
* @param val change the values of fs_xl in reg CTRL1_XL
*
*/
int32_t lsm6dsox_xl_full_scale_set(stmdev_ctx_t *ctx,
lsm6dsox_fs_xl_t val)
{
lsm6dsox_ctrl1_xl_t reg;
int32_t ret;
ret = lsm6dsox_read_reg(ctx, LSM6DSOX_CTRL1_XL, (uint8_t*)®, 1);
if (ret == 0) {
reg.fs_xl = (uint8_t) val;
ret = lsm6dsox_write_reg(ctx, LSM6DSOX_CTRL1_XL, (uint8_t*)®, 1);
}
return ret;
}
/**
* @brief Accelerometer full-scale selection.[get]
*
* @param ctx read / write interface definitions
* @param val Get the values of fs_xl in reg CTRL1_XL
*
*/
int32_t lsm6dsox_xl_full_scale_get(stmdev_ctx_t *ctx, lsm6dsox_fs_xl_t *val)
{
lsm6dsox_ctrl1_xl_t reg;
int32_t ret;
ret = lsm6dsox_read_reg(ctx, LSM6DSOX_CTRL1_XL, (uint8_t*)®, 1);
switch (reg.fs_xl) {
case LSM6DSOX_2g:
*val = LSM6DSOX_2g;
break;
case LSM6DSOX_16g:
*val = LSM6DSOX_16g;
break;
case LSM6DSOX_4g:
*val = LSM6DSOX_4g;
break;
case LSM6DSOX_8g:
*val = LSM6DSOX_8g;
break;
default:
*val = LSM6DSOX_2g;
break;
}
return ret;
}
/**
* @brief Accelerometer UI data rate selection.[set]
*
* @param ctx read / write interface definitions
* @param val change the values of odr_xl in reg CTRL1_XL
*
*/
int32_t lsm6dsox_xl_data_rate_set(stmdev_ctx_t *ctx, lsm6dsox_odr_xl_t val)
{
lsm6dsox_odr_xl_t odr_xl = val;
lsm6dsox_emb_fsm_enable_t fsm_enable;
lsm6dsox_fsm_odr_t fsm_odr;
uint8_t mlc_enable;
lsm6dsox_mlc_odr_t mlc_odr;
lsm6dsox_ctrl1_xl_t reg;
int32_t ret;
/* Check the Finite State Machine data rate constraints */
ret = lsm6dsox_fsm_enable_get(ctx, &fsm_enable);
if (ret == 0) {
if ( (fsm_enable.fsm_enable_a.fsm1_en |
fsm_enable.fsm_enable_a.fsm2_en |
fsm_enable.fsm_enable_a.fsm3_en |
fsm_enable.fsm_enable_a.fsm4_en |
fsm_enable.fsm_enable_a.fsm5_en |
fsm_enable.fsm_enable_a.fsm6_en |
fsm_enable.fsm_enable_a.fsm7_en |
fsm_enable.fsm_enable_a.fsm8_en |
fsm_enable.fsm_enable_b.fsm9_en |
fsm_enable.fsm_enable_b.fsm10_en |
fsm_enable.fsm_enable_b.fsm11_en |
fsm_enable.fsm_enable_b.fsm12_en |
fsm_enable.fsm_enable_b.fsm13_en |
fsm_enable.fsm_enable_b.fsm14_en |
fsm_enable.fsm_enable_b.fsm15_en |
fsm_enable.fsm_enable_b.fsm16_en ) == PROPERTY_ENABLE ){
ret = lsm6dsox_fsm_data_rate_get(ctx, &fsm_odr);
if (ret == 0) {
switch (fsm_odr) {
case LSM6DSOX_ODR_FSM_12Hz5:
if (val == LSM6DSOX_XL_ODR_OFF){
odr_xl = LSM6DSOX_XL_ODR_12Hz5;
} else {
odr_xl = val;
}
break;
case LSM6DSOX_ODR_FSM_26Hz:
if (val == LSM6DSOX_XL_ODR_OFF){
odr_xl = LSM6DSOX_XL_ODR_26Hz;
} else if (val == LSM6DSOX_XL_ODR_12Hz5){
odr_xl = LSM6DSOX_XL_ODR_26Hz;
} else {
odr_xl = val;
}
break;
case LSM6DSOX_ODR_FSM_52Hz:
if (val == LSM6DSOX_XL_ODR_OFF){
odr_xl = LSM6DSOX_XL_ODR_52Hz;
} else if (val == LSM6DSOX_XL_ODR_12Hz5){
odr_xl = LSM6DSOX_XL_ODR_52Hz;
} else if (val == LSM6DSOX_XL_ODR_26Hz){
odr_xl = LSM6DSOX_XL_ODR_52Hz;
} else {
odr_xl = val;
}
break;
case LSM6DSOX_ODR_FSM_104Hz:
if (val == LSM6DSOX_XL_ODR_OFF){
odr_xl = LSM6DSOX_XL_ODR_104Hz;
} else if (val == LSM6DSOX_XL_ODR_12Hz5){
odr_xl = LSM6DSOX_XL_ODR_104Hz;
} else if (val == LSM6DSOX_XL_ODR_26Hz){
odr_xl = LSM6DSOX_XL_ODR_104Hz;
} else if (val == LSM6DSOX_XL_ODR_52Hz){
odr_xl = LSM6DSOX_XL_ODR_104Hz;
} else {
odr_xl = val;
}