diff options
Diffstat (limited to 'os')
| -rw-r--r-- | os/ex/ST/lis302dl.c | 252 | ||||
| -rw-r--r-- | os/ex/ST/lis302dl.h | 196 | 
2 files changed, 255 insertions, 193 deletions
| diff --git a/os/ex/ST/lis302dl.c b/os/ex/ST/lis302dl.c index 32b347929..abce0f546 100644 --- a/os/ex/ST/lis302dl.c +++ b/os/ex/ST/lis302dl.c @@ -33,58 +33,6 @@  /* Driver local definitions.                                                 */
  /*===========================================================================*/
 -#define  LIS302DL_SENS_2G                   ((float)18.0f)
 -#define  LIS302DL_SENS_8G                   ((float)72.0f)
 -
 -#define  LIS302DL_DI                        ((uint8_t)0xFF)
 -#define  LIS302DL_DI_0                      ((uint8_t)0x01)
 -#define  LIS302DL_DI_1                      ((uint8_t)0x02)
 -#define  LIS302DL_DI_2                      ((uint8_t)0x04)
 -#define  LIS302DL_DI_3                      ((uint8_t)0x08)
 -#define  LIS302DL_DI_4                      ((uint8_t)0x10)
 -#define  LIS302DL_DI_5                      ((uint8_t)0x20)
 -#define  LIS302DL_DI_6                      ((uint8_t)0x40)
 -#define  LIS302DL_DI_7                      ((uint8_t)0x80)
 -
 -#define  LIS302DL_AD                        ((uint8_t)0x3F)
 -#define  LIS302DL_AD_0                      ((uint8_t)0x01)
 -#define  LIS302DL_AD_1                      ((uint8_t)0x02)
 -#define  LIS302DL_AD_2                      ((uint8_t)0x04)
 -#define  LIS302DL_AD_3                      ((uint8_t)0x08)
 -#define  LIS302DL_AD_4                      ((uint8_t)0x10)
 -#define  LIS302DL_AD_5                      ((uint8_t)0x20)
 -
 -#define  LIS302DL_MS                        ((uint8_t)0x40)
 -#define  LIS302DL_RW                        ((uint8_t)0x80)
 -
 -#define  LIS302DL_AD_WHO_AM_I               ((uint8_t)0x0F)
 -#define  LIS302DL_AD_CTRL_REG1              ((uint8_t)0x20)
 -#define  LIS302DL_AD_CTRL_REG2              ((uint8_t)0x21)
 -#define  LIS302DL_AD_CTRL_REG3              ((uint8_t)0x22)
 -#define  LIS302DL_AD_HP_FILER_RESET         ((uint8_t)0x23)
 -#define  LIS302DL_AD_STATUS_REG             ((uint8_t)0x27)
 -#define  LIS302DL_AD_OUT_X                  ((uint8_t)0x29)
 -#define  LIS302DL_AD_OUT_Y                  ((uint8_t)0x2B)
 -#define  LIS302DL_AD_OUT_Z                  ((uint8_t)0x2D)
 -#define  LIS302DL_AD_FF_WU_CFG_1            ((uint8_t)0x30)
 -#define  LIS302DL_AD_FF_WU_SRC_1            ((uint8_t)0x31)
 -#define  LIS302DL_AD_FF_WU_THS_1            ((uint8_t)0x32)
 -#define  LIS302DL_AD_FF_WU_DURATION_1       ((uint8_t)0x33)
 -#define  LIS302DL_AD_FF_WU_CFG_2            ((uint8_t)0x34)
 -#define  LIS302DL_AD_FF_WU_SRC_2            ((uint8_t)0x35)
 -#define  LIS302DL_AD_FF_WU_THS_2            ((uint8_t)0x36)
 -#define  LIS302DL_AD_FF_WU_DURATION_2       ((uint8_t)0x37)
 -#define  LIS302DL_AD_CLICK_CFG              ((uint8_t)0x38)
 -#define  LIS302DL_AD_CLICK_SRC              ((uint8_t)0x39)
 -#define  LIS302DL_AD_CLICK_THSY_X           ((uint8_t)0x3B)
 -#define  LIS302DL_AD_CLICK_THSZ             ((uint8_t)0x3C)
 -#define  LIS302DL_AD_CLICK_TIME_LIMIT       ((uint8_t)0x3D)
 -#define  LIS302DL_AD_CLICK_LATENCY          ((uint8_t)0x3E)
 -#define  LIS302DL_AD_CLICK_WINDOW           ((uint8_t)0x3F)
 -
 -#define  LIS302DL_CTRL_REG1_FS_MASK         ((uint8_t)0x20)
 -#define  TO_G                               ((float)0.001f)
 -#define  TO_SI                              ((float)0.00981f)
  /*===========================================================================*/
  /* Driver exported variables.                                                */
  /*===========================================================================*/
 @@ -93,14 +41,6 @@  /* Driver local variables and types.                                         */
  /*===========================================================================*/
 -/**
 - * @brief  LIS302DL Power Mode
 - */
 -typedef enum {
 -  LIS302DL_PM_POWER_DOWN   = 0x00,  /**< Power down enabled.                */          
 -  LIS302DL_PM_SLEEP_NORMAL = 0x40   /**< Normal operation mode.             */          
 -}lis302dl_pm_t;
 -
  /*===========================================================================*/
  /* Driver local functions.                                                   */
  /*===========================================================================*/
 @@ -111,16 +51,18 @@ typedef enum {   * @pre     The SPI interface must be initialized and the driver started.
   *
   * @param[in] spip      pointer to the SPI interface
 - * @param[in] reg       register number
 - * @return              register value.
 + * @param[in] reg       starting register address
 + * @param[in] n         number of adjacent registers to write
 + * @param[in] b         pointer to a buffer.
   */
 -static uint8_t lis302dlSPIReadRegister(SPIDriver *spip, uint8_t reg) {
 -  uint8_t txbuf[2] = {LIS302DL_RW | reg, 0xFF};
 -  uint8_t rxbuf[2] = {0x00, 0x00};
 +static void lis302dlSPIReadRegister(SPIDriver *spip, uint8_t reg,  size_t n,
 +                                    uint8_t* b) {
 +  uint8_t cmd;
 +  (n == 1) ? (cmd = reg | LIS302DL_RW) : (cmd = reg | LIS302DL_RW | LIS302DL_MS);
    spiSelect(spip);
 -  spiExchange(spip, 2, txbuf, rxbuf);
 +  spiSend(spip, 1, &cmd);
 +  spiReceive(spip, n, b);
    spiUnselect(spip);
 -  return rxbuf[1];
  }
  /**
 @@ -128,50 +70,18 @@ static uint8_t lis302dlSPIReadRegister(SPIDriver *spip, uint8_t reg) {   * @pre     The SPI interface must be initialized and the driver started.
   *
   * @param[in] spip      pointer to the SPI interface
 - * @param[in] reg       register number
 - * @param[in] value     register value.
 + * @param[in] reg       starting register address
 + * @param[in] n         number of adjacent registers to write
 + * @param[in] value     pointer to a buffer of values.
   */
 -static void lis302dlSPIWriteRegister(SPIDriver *spip, uint8_t reg,
 -                                   uint8_t value) {
 -
 -  switch (reg) {
 -    default:
 -      /* Reserved register must not be written, according to the datasheet
 -       * this could permanently damage the device.
 -       */
 -      osalDbgAssert(FALSE, "lis302dlSPIWriteRegister(), reserved register");
 -    case LIS302DL_AD_WHO_AM_I:
 -
 -    case LIS302DL_AD_HP_FILER_RESET:
 -    case LIS302DL_AD_STATUS_REG:
 -    case LIS302DL_AD_OUT_X:
 -    case LIS302DL_AD_OUT_Y:
 -    case LIS302DL_AD_OUT_Z:
 -    case LIS302DL_AD_FF_WU_SRC_1:
 -    case LIS302DL_AD_FF_WU_SRC_2:
 -    case LIS302DL_AD_CLICK_SRC:
 -    /* Read only registers cannot be written, the command is ignored.*/
 -      return;
 -    case LIS302DL_AD_CTRL_REG1:
 -    case LIS302DL_AD_CTRL_REG2:
 -    case LIS302DL_AD_CTRL_REG3:
 -    case LIS302DL_AD_FF_WU_CFG_1:
 -    case LIS302DL_AD_FF_WU_THS_1:
 -    case LIS302DL_AD_FF_WU_DURATION_1:
 -    case LIS302DL_AD_FF_WU_CFG_2:
 -    case LIS302DL_AD_FF_WU_THS_2:
 -    case LIS302DL_AD_FF_WU_DURATION_2:
 -    case LIS302DL_AD_CLICK_CFG:
 -    case LIS302DL_AD_CLICK_THSY_X:
 -    case LIS302DL_AD_CLICK_THSZ:
 -    case LIS302DL_AD_CLICK_TIME_LIMIT:
 -    case LIS302DL_AD_CLICK_LATENCY:
 -    case LIS302DL_AD_CLICK_WINDOW:
 -      spiSelect(spip);
 -      uint8_t txbuf[2] = {reg, value};
 -      spiSend(spip, 2, txbuf);
 -      spiUnselect(spip);
 -  }
 +static void lis302dlSPIWriteRegister(SPIDriver *spip, uint8_t reg, size_t n,
 +                                     uint8_t* b) {
 +  uint8_t cmd;
 +  (n == 1) ? (cmd = reg) : (cmd = reg | LIS302DL_MS);
 +  spiSelect(spip);
 +  spiSend(spip, 1, &cmd);
 +  spiSend(spip, n, b);
 +  spiUnselect(spip);
  }
  #endif /* LIS302DL_USE_SPI */
 @@ -185,9 +95,10 @@ static size_t get_axes_number(void *ip) {  }
  static msg_t read_raw(void *ip, int32_t axes[LIS302DL_NUMBER_OF_AXES]) {
 -  int8_t tmp;
 +  uint8_t i, tmp;
 +
    osalDbgCheck((ip != NULL) && (axes != NULL));
 -  
 +
    osalDbgAssert((((LIS302DLDriver *)ip)->state == LIS302DL_READY),
                "read_raw(), invalid state");
 @@ -199,21 +110,11 @@ static msg_t read_raw(void *ip, int32_t axes[LIS302DL_NUMBER_OF_AXES]) {    spiStart(((LIS302DLDriver *)ip)->config->spip,
             ((LIS302DLDriver *)ip)->config->spicfg);
  #endif /* LIS302DL_SHARED_SPI */   
 -  if(((LIS302DLDriver *)ip)->config->axesenabling & LIS302DL_AE_X){
 -    tmp = lis302dlSPIReadRegister(((LIS302DLDriver *)ip)->config->spip,
 -										LIS302DL_AD_OUT_X);
 -    axes[0] = tmp + ((LIS302DLDriver *)ip)->bias[0];
 -  }
 -  if(((LIS302DLDriver *)ip)->config->axesenabling & LIS302DL_AE_Y){
 -    tmp = lis302dlSPIReadRegister(((LIS302DLDriver *)ip)->config->spip,
 -										LIS302DL_AD_OUT_Y);
 -    axes[1] = tmp  + ((LIS302DLDriver *)ip)->bias[1];
 -  }
 -  if(((LIS302DLDriver *)ip)->config->axesenabling & LIS302DL_AE_Z){
 -    tmp = lis302dlSPIReadRegister(((LIS302DLDriver *)ip)->config->spip,
 -										LIS302DL_AD_OUT_Z);
 -    axes[2] = tmp + ((LIS302DLDriver *)ip)->bias[2];
 -  }
 +    for(i = 0; i < LIS302DL_NUMBER_OF_AXES; i++) {
 +      lis302dlSPIReadRegister(((LIS302DLDriver *)ip)->config->spip,
 +                              LIS302DL_AD_OUT_X + (i * 2), 1, &tmp);
 +      axes[i] = (int32_t)((int8_t)tmp);
 +    }
  #if	LIS302DL_SHARED_SPI
    spiReleaseBus(((LIS302DLDriver *)ip)->config->spip);
  #endif /* LIS302DL_SHARED_SPI */   
 @@ -229,17 +130,12 @@ static msg_t read_cooked(void *ip, float axes[]) {    osalDbgCheck((ip != NULL) && (axes != NULL));
    osalDbgAssert((((LIS302DLDriver *)ip)->state == LIS302DL_READY),
 -              "read_cooked(), invalid state");
 +                "read_cooked(), invalid state");
    msg = read_raw(ip, raw);
    for(i = 0; i < LIS302DL_NUMBER_OF_AXES ; i++){
 -    axes[i] = raw[i] * ((LIS302DLDriver *)ip)->sensitivity[i];
 -    if(((LIS302DLDriver *)ip)->config->unit == LIS302DL_ACC_UNIT_G){
 -      axes[i] *= TO_G;
 -    }
 -    else if(((LIS302DLDriver *)ip)->config->unit == LIS302DL_ACC_UNIT_SI){
 -      axes[i] *= TO_SI;
 -    }
 +    axes[i] = (raw[i] * ((LIS302DLDriver *)ip)->sensitivity[i]);
 +    axes[i] -= ((LIS302DLDriver *)ip)->bias[i];
    }
    return msg;
  }
 @@ -302,12 +198,47 @@ static msg_t reset_sensivity(void *ip) {  	for(i = 0; i < LIS302DL_NUMBER_OF_AXES; i++)
        ((LIS302DLDriver *)ip)->sensitivity[i] = LIS302DL_SENS_8G;
    else {
 -    osalDbgAssert(FALSE, "reset_sensivity(), accelerometer full scale issue");
 +    osalDbgAssert(FALSE, "reset_sensivity(), full scale issue");
      return MSG_RESET;
    }
    return MSG_OK;
  }
 +static msg_t set_full_scale(void *ip, lis302dl_fs_t fs) {
 +  float newfs, scale;
 +  uint8_t i, cr;
 +
 +  if(fs == LIS302DL_FS_2G) {
 +    newfs = LIS302DL_2G;
 +  }
 +  else if(fs == LIS302DL_FS_8G) {
 +    newfs = LIS302DL_8G;
 +  }
 +  else {
 +    return MSG_RESET;
 +  }
 +
 +  if(newfs != ((LIS302DLDriver *)ip)->fullscale) {
 +    scale = newfs / ((LIS302DLDriver *)ip)->fullscale;
 +    ((LIS302DLDriver *)ip)->fullscale = newfs;
 +
 +    /* Updating register.*/
 +    lis302dlSPIReadRegister(((LIS302DLDriver *)ip)->config->spip,
 +                            LIS302DL_AD_CTRL_REG1, 1, &cr);
 +    cr &= ~(LIS302DL_CTRL_REG1_FS_MASK);
 +    cr |= fs;
 +    lis302dlSPIWriteRegister(((LIS302DLDriver *)ip)->config->spip,
 +                             LIS302DL_AD_CTRL_REG1, 1, &cr);
 +
 +    /* Scaling sensitivity and bias. Re-calibration is suggested anyway. */
 +    for(i = 0; i < LIS302DL_NUMBER_OF_AXES; i++) {
 +      ((LIS302DLDriver *)ip)->sensitivity[i] *= scale;
 +      ((LIS302DLDriver *)ip)->bias[i] *= scale;
 +    }
 +  }
 +  return MSG_OK;
 +}
 +
  static const struct BaseSensorVMT vmt_basesensor = {
    get_axes_number, read_raw, read_cooked
  };
 @@ -319,7 +250,8 @@ static const struct BaseAccelerometerVMT vmt_baseaccelerometer = {  static const struct LIS302DLVMT vmt_lis302dl = {
    get_axes_number, read_raw, read_cooked,
 -  set_bias, reset_bias, set_sensivity, reset_sensivity 
 +  set_bias, reset_bias, set_sensivity, reset_sensivity,
 +  set_full_scale
  };
  /*===========================================================================*/
 @@ -354,6 +286,7 @@ void lis302dlObjectInit(LIS302DLDriver *devp) {   */
  void lis302dlStart(LIS302DLDriver *devp, const LIS302DLConfig *config) {
    uint32_t i;
 +  uint8_t cr[2] = {0, 0};
    osalDbgCheck((devp != NULL) && (config != NULL));
    osalDbgAssert((devp->state == LIS302DL_STOP) || (devp->state == LIS302DL_READY),
 @@ -367,25 +300,42 @@ void lis302dlStart(LIS302DLDriver *devp, const LIS302DLConfig *config) {  #endif /* LIS302DL_SHARED_SPI */
    spiStart((devp)->config->spip,
             (devp)->config->spicfg);
 -  lis302dlSPIWriteRegister(devp->config->spip, LIS302DL_AD_CTRL_REG1,
 -                         LIS302DL_PM_SLEEP_NORMAL |
 -                         devp->config->axesenabling |
 -						 devp->config->fullscale |
 -						 devp->config->outputdatarate);
 -  lis302dlSPIWriteRegister(devp->config->spip, LIS302DL_AD_CTRL_REG2,
 -                         devp->config->highpass);
 +           
 +  /* Control register 1 configuration block.*/
 +  {
 +    cr[0] = LIS302DL_CTRL_REG1_XEN | LIS302DL_CTRL_REG1_YEN | 
 +            LIS302DL_CTRL_REG1_ZEN | LIS302DL_CTRL_REG1_PD |
 +            devp->config->outputdatarate |
 +            devp->config->fullscale;
 +  }
 +  
 +  /* Control register 2 configuration block.*/
 +  {
 +#if LIS302DL_USE_ADVANCED || defined(__DOXYGEN__)
 +  if(devp->config->hpmode != LIS302DL_HPM_BYPASSED)
 +    cr[1] = devp->config->highpass;
 +#endif
 +  }
 +  
 +  lis302dlSPIWriteRegister(devp->config->spip, LIS302DL_AD_CTRL_REG1, 
 +                           2, cr);
 +                           
  #if	LIS302DL_SHARED_SPI
    spiReleaseBus((devp)->config->spip);
  #endif /* LIS302DL_SHARED_SPI */  
  #endif /* LIS302DL_USE_SPI */
    /* Storing sensitivity information according to full scale value */
 -  if(devp->config->fullscale == LIS302DL_FS_2G)
 +  if(devp->config->fullscale == LIS302DL_FS_2G) {
 +    devp->fullscale = LIS302DL_2G;
      for(i = 0; i < LIS302DL_NUMBER_OF_AXES; i++)
        devp->sensitivity[i] = LIS302DL_SENS_2G;
 -  else if(devp->config->fullscale == LIS302DL_FS_8G)
 -	for(i = 0; i < LIS302DL_NUMBER_OF_AXES; i++)
 -      devp->sensitivity[i] = LIS302DL_SENS_8G;
 +  }
 +  else if(devp->config->fullscale == LIS302DL_FS_8G) {
 +    devp->fullscale = LIS302DL_8G;
 +    for(i = 0; i < LIS302DL_NUMBER_OF_AXES; i++)
 +        devp->sensitivity[i] = LIS302DL_SENS_8G;
 +  }
    else {
      osalDbgAssert(FALSE, "lis302dlStart(), accelerometer full scale issue");
    }
 @@ -403,7 +353,7 @@ void lis302dlStart(LIS302DLDriver *devp, const LIS302DLConfig *config) {   * @api
   */
  void lis302dlStop(LIS302DLDriver *devp) {
 -
 +  uint8_t cr1;
    osalDbgCheck(devp != NULL);
    osalDbgAssert((devp->state == LIS302DL_STOP) || (devp->state == LIS302DL_READY),
 @@ -416,8 +366,8 @@ void lis302dlStop(LIS302DLDriver *devp) {      spiStart((devp)->config->spip,
               (devp)->config->spicfg);
  #endif /* LIS302DL_SHARED_SPI */
 -    lis302dlSPIWriteRegister(devp->config->spip, LIS302DL_AD_CTRL_REG1,
 -                           LIS302DL_PM_POWER_DOWN | LIS302DL_AE_DISABLED);
 +    cr1 = 0;
 +    lis302dlSPIWriteRegister(devp->config->spip, LIS302DL_AD_CTRL_REG1, 1, &cr1);
      spiStop((devp)->config->spip);
  #if	LIS302DL_SHARED_SPI
      spiReleaseBus((devp)->config->spip);
 diff --git a/os/ex/ST/lis302dl.h b/os/ex/ST/lis302dl.h index e4c175029..67815ba97 100644 --- a/os/ex/ST/lis302dl.h +++ b/os/ex/ST/lis302dl.h @@ -35,10 +35,130 @@  /*===========================================================================*/
  /**
 - * @brief   LIS302DL number of axes.
 + * @name    Version identification
 + * @{
 + */
 +/**
 + * @brief   LIS302DL driver version string.
 + */
 +#define EX_LIS302DL_VERSION         "1.0.0"
 +
 +/**
 + * @brief   LIS302DL driver version major number.
 + */
 +#define EX_LIS302DL_MAJOR           1
 +
 +/**
 + * @brief   LIS302DL driver version minor number.
   */
 -#define  LIS302DL_NUMBER_OF_AXES            ((size_t)   3U)
 +#define EX_LIS302DL_MINOR           0
 +/**
 + * @brief   LIS302DL driver version patch number.
 + */
 +#define EX_LIS302DL_PATCH           0
 +/** @} */
 +
 +/**
 + * @brief   LIS302DL characteristics.
 + *
 + * @{
 + */
 +#define LIS302DL_NUMBER_OF_AXES     3U
 +
 +#define LIS302DL_2G                 2.0f
 +#define LIS302DL_8G                 8.0f
 +
 +#define LIS302DL_SENS_2G            18.0f
 +#define LIS302DL_SENS_8G            72.0f
 +/** @} */
 +
 +/**
 + * @name    LIS302DL communication interfaces related bit masks
 + * @{
 + */
 +#define LIS302DL_DI_MASK            0xFF        /**< Data In mask           */
 +#define LIS302DL_DI(n)              (1 << n)    /**< Data In bit n          */
 +#define LIS302DL_AD_MASK            0x3F        /**< Address Data mask      */
 +#define LIS302DL_AD(n)              (1 << n)    /**< Address Data bit n     */
 +#define LIS302DL_MS                 (1 << 6)    /**< Multiple read write    */
 +#define LIS302DL_RW                 (1 << 7)    /**< Read Write selector    */
 +/** @} */
 +
 +/**
 + * @name    LIS302DL register addresses
 + * @{
 + */
 +#define  LIS302DL_AD_WHO_AM_I               0x0F
 +#define  LIS302DL_AD_CTRL_REG1              0x20
 +#define  LIS302DL_AD_CTRL_REG2              0x21
 +#define  LIS302DL_AD_CTRL_REG3              0x22
 +#define  LIS302DL_AD_HP_FILER_RESET         0x23
 +#define  LIS302DL_AD_STATUS_REG             0x27
 +#define  LIS302DL_AD_OUT_X                  0x29
 +#define  LIS302DL_AD_OUT_Y                  0x2B
 +#define  LIS302DL_AD_OUT_Z                  0x2D
 +#define  LIS302DL_AD_FF_WU_CFG_1            0x30
 +#define  LIS302DL_AD_FF_WU_SRC_1            0x31
 +#define  LIS302DL_AD_FF_WU_THS_1            0x32
 +#define  LIS302DL_AD_FF_WU_DURATION_1       0x33
 +#define  LIS302DL_AD_FF_WU_CFG_2            0x34
 +#define  LIS302DL_AD_FF_WU_SRC_2            0x35
 +#define  LIS302DL_AD_FF_WU_THS_2            0x36
 +#define  LIS302DL_AD_FF_WU_DURATION_2       0x37
 +#define  LIS302DL_AD_CLICK_CFG              0x38
 +#define  LIS302DL_AD_CLICK_SRC              0x39
 +#define  LIS302DL_AD_CLICK_THSY_X           0x3B
 +#define  LIS302DL_AD_CLICK_THSZ             0x3C
 +#define  LIS302DL_AD_CLICK_TIME_LIMIT       0x3D
 +#define  LIS302DL_AD_CLICK_LATENCY          0x3E
 +#define  LIS302DL_AD_CLICK_WINDOW           0x3F
 +/** @} */
 +
 +/**
 + * @name    LIS302DL_CTRL_REG1 register bits definitions
 + * @{
 + */
 +#define LIS302DL_CTRL_REG1_MASK     0xFF        /**< LIS302DL_CTRL_REG1 mask  */
 +#define LIS302DL_CTRL_REG1_FS_MASK  0x20        /**< Full scale field mask    */
 +#define LIS302DL_CTRL_REG1_XEN      (1 << 0)    /**< X axis enable            */
 +#define LIS302DL_CTRL_REG1_YEN      (1 << 1)    /**< Y axis enable            */
 +#define LIS302DL_CTRL_REG1_ZEN      (1 << 2)    /**< Z axis enable            */
 +#define LIS302DL_CTRL_REG1_STM      (1 << 3)    /**< Self test P-M            */
 +#define LIS302DL_CTRL_REG1_STP      (1 << 4)    /**< Self test P-M            */
 +#define LIS302DL_CTRL_REG1_FS       (1 << 5)    /**< Full scale               */
 +#define LIS302DL_CTRL_REG1_PD       (1 << 6)    /**< Power-down mode enable   */
 +#define LIS302DL_CTRL_REG1_DR       (1 << 7)    /**< Output data rate         */
 +/** @} */
 +
 +/**
 + * @name    LIS302DL_CTRL_REG2 register bits definitions
 + * @{
 + */                                              
 +#define LIS302DL_CTRL_REG2_MASK     0xDF        /**< LIS302DL_CTRL_REG2 mask  */
 +#define LIS302DL_CTRL_REG2_HPCF1    (1 << 0)    /**< HP filter cutoff bit 0   */
 +#define LIS302DL_CTRL_REG2_HPCF2    (1 << 1)    /**< HP filter cutoff bit 1   */
 +#define LIS302DL_CTRL_REG2_HPFFWU1  (1 << 2)    /**< HP filter cutoff bit 2   */
 +#define LIS302DL_CTRL_REG2_HPFFWU2  (1 << 3)    /**< HP filter cutoff bit 3   */
 +#define LIS302DL_CTRL_REG2_FDS      (1 << 4)    /**< HP filter mode bit 0     */
 +#define LIS302DL_CTRL_REG2_BOOT     (1 << 6)    /**< HP filter mode bit 1     */
 +#define LIS302DL_CTRL_REG2_SIM      (1 << 7)    /**< HP filter mode bit 1     */
 +/** @} */
 +
 +/**
 + * @name    LIS302DL_CTRL_REG3 register bits definitions
 + * @{
 + */                                               
 +#define LIS302DL_CTRL_REG3_MASK     0xFF        /**< LIS302DL_CTRL_REG3 mask  */
 +#define LIS302DL_CTRL_REG3_I1CFG0   (1 << 0)    /**< Interrupt 1 config bit 0 */
 +#define LIS302DL_CTRL_REG3_I1CFG1   (1 << 1)    /**< Interrupt 1 config bit 1 */
 +#define LIS302DL_CTRL_REG3_I1CFG2   (1 << 2)    /**< Interrupt 1 config bit 2 */
 +#define LIS302DL_CTRL_REG3_I2CFG0   (1 << 3)    /**< Interrupt 2 config bit 0 */
 +#define LIS302DL_CTRL_REG3_I2CFG1   (1 << 4)    /**< Interrupt 2 config bit 1 */
 +#define LIS302DL_CTRL_REG3_I2CFG2   (1 << 5)    /**< Interrupt 2 config bit 2 */
 +#define LIS302DL_CTRL_REG3_PP_OD    (1 << 6)    /**< Push-pull open-drain     */
 +#define LIS302DL_CTRL_REG3_IHL      (1 << 7)    /**< Int active high low      */
 +/** @} */
  /*===========================================================================*/
  /* Driver pre-compile time settings.                                         */
  /*===========================================================================*/
 @@ -66,6 +186,15 @@  #endif
  /**
 + * @brief   LIS302DL advanced configurations switch.
 + * @details If set to @p TRUE more configurations are available.
 + * @note    The default is @p FALSE.
 + */
 +#if !defined(LIS302DL_USE_ADVANCED) || defined(__DOXYGEN__)
 +#define LIS302DL_USE_ADVANCED               FALSE
 +#endif
 +
 +/**
   * @brief   LIS302DL shared SPI switch.
   * @details If set to @p TRUE the device acquires SPI bus ownership
   *          on each transaction.
 @@ -108,8 +237,8 @@   * @brief   LIS302DL full scale.
   */
  typedef enum {
 -  LIS302DL_FS_2G = 0x00,            /**< Full scale ±2g.                    */
 -  LIS302DL_FS_8G = 0x20             /**< Full scale ±8g.                    */
 +  LIS302DL_FS_2G = 0x00,            /**< Full scale ±2g.                    */
 +  LIS302DL_FS_8G = 0x20             /**< Full scale ±8g.                    */
  }lis302dl_fs_t;
  /**
 @@ -132,29 +261,6 @@ typedef enum {  }lis302dl_hp_t;
  /**
 - * @brief   LIS302DL axes enabling.
 - */
 -typedef enum {
 -  LIS302DL_AE_DISABLED = 0x00,      /**< All axes disabled.                 */
 -  LIS302DL_AE_X = 0x01,             /**< Only X-axis enabled.               */
 -  LIS302DL_AE_Y = 0x02,             /**< Only Y-axis enabled.               */
 -  LIS302DL_AE_XY = 0x03,            /**< X and Y axes enabled.              */
 -  LIS302DL_AE_Z = 0x04,             /**< Only Z-axis enabled.               */
 -  LIS302DL_AE_XZ = 0x05,            /**< X and Z axes enabled.              */
 -  LIS302DL_AE_YZ = 0x06,            /**< Y and Z axes enabled.              */
 -  LIS302DL_AE_XYZ = 0x07            /**< All axes enabled.                  */
 -}lis302dl_ae_t;
 -
 -/**
 - * @brief   LIS302DL accelerometer subsystem unit.
 - */
 -typedef enum {
 -  LIS302DL_ACC_UNIT_G = 0x00,       /**< Cooked data in g.                  */
 -  LIS302DL_ACC_UNIT_MG = 0x01,      /**< Cooked data in mg.                 */
 -  LIS302DL_ACC_UNIT_SI = 0x02,      /**< Cooked data in m/s^2.              */
 -} lis302dl_acc_unit_t;
 -
 -/**
   * @brief   Driver state machine possible states.
   */
  typedef enum {
 @@ -189,6 +295,14 @@ typedef struct {    const I2CConfig           *i2ccfg;
  #endif /* LIS302DL_USE_I2C */
    /**
 +   * @brief LIS302DL initial sensitivity.
 +   */
 +  float                     sensitivity[LIS302DL_NUMBER_OF_AXES];
 +  /**
 +   * @brief LIS302DL initial bias.
 +   */
 +  float                     bias[LIS302DL_NUMBER_OF_AXES];
 +  /**
     * @brief LIS302DL full scale value.
     */
    lis302dl_fs_t               fullscale;
 @@ -196,18 +310,12 @@ typedef struct {     * @brief LIS302DL output data rate selection.
     */
    lis302dl_odr_t              outputdatarate;
 +#if LIS302DL_USE_ADVANCED || defined(__DOXYGEN__)
    /**
     * @brief   LIS302DL high pass filtering
     */
    lis302dl_hp_t               highpass;
 -  /**
 -   * @brief LIS302DL axes enabling.
 -   */
 -  lis302dl_ae_t               axesenabling;
 -  /**
 -   * @brief LIS302DL unit for cooked data.
 -   */
 -  lis302dl_acc_unit_t         unit;
 +#endif
  } LIS302DLConfig;
  /**
 @@ -219,7 +327,9 @@ typedef struct LIS302DLDriver LIS302DLDriver;   * @brief   @p LIS302DL specific methods.
   */
  #define _lis302dl_methods                                                   \
 -  _base_accelerometer_methods
 +  _base_accelerometer_methods                                               \
 +  /* Change full scale value of LIS302DL .*/                                \
 +  msg_t (*set_full_scale)(void *instance, lis302dl_fs_t fs);
  /**
 @@ -243,7 +353,9 @@ struct LIS302DLVMT {    /* Current sensitivity.*/                                                 \
    float                     sensitivity[LIS302DL_NUMBER_OF_AXES];           \
    /* Bias data.*/                                                           \
 -  int32_t                   bias[LIS302DL_NUMBER_OF_AXES];
 +  int32_t                   bias[LIS302DL_NUMBER_OF_AXES];                  \
 +  /* Current full scale value.*/                                            \
 +  float                     fullscale;
  /**
   * @extends BaseAccelerometer.
 @@ -268,19 +380,19 @@ struct LIS302DLDriver {  /*===========================================================================*/
  /**
 - * @brief   Get current MEMS temperature.
 - * @detail  This information is very useful especially for high accuracy IMU.
 + * @brief   Change accelerometer fullscale value.
   *
   * @param[in] ip        pointer to a @p BaseAccelerometer class.
 - * @param[out] temp     the MEMS temperature as single precision floating.
 + * @param[in] fs        the new full scale value.
   *
   * @return              The operation status.
   * @retval MSG_OK       if the function succeeded.
   * @retval MSG_RESET    if one or more errors occurred.
   * @api
   */
 -#define accelerometerGetTemp(ip, tpp)                                           \
 -        (ip)->vmt_lis302dl->get_temperature(ip, tpp)
 +#define accelerometerSetFullScale(ip, fs)                                   \
 +        (ip)->vmt_lis302dl->set_full_scale(ip, fs)
 +        
  /*===========================================================================*/
  /* External declarations.                                                    */
 | 
