aboutsummaryrefslogtreecommitdiffstats
path: root/os/ex/ST/lps25h.c
blob: f038e78f73b5ab01da86ea49ce0557ef6b0fe373 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# Change Log
All notable changes to this project will be documented in this file.
This project adheres to [Semantic Versioning](http://semver.org/).

## [Unreleased][unreleased]
### Fixed
- Pubkeys now have the correct strength listed in the pubkey list.
- EC key operations would fail on some devices.
- Connecting to a host from the host list no longer asks which
  app you want to use.
- The text in the entropy gathering dialog is now scaled correctly.

### Changed
- Default RSA key size is now 2048 bits.

## [1.8.4][1.8.4] - 2015-04-19
### Fixed
- Key exchange and host key algorithm preference order was not being
  respected.
- ECDH would sometimes fail because the shared secret would be encoded
  as a negative integer.
- DSA host key support was broken from the beginning of the v1.8 series.
- Connections would sometimes close when leaving ConnectBot.
- Telnet port range too high will no longer cause crashes.

### Added
- More context is given for failures to connect via SSH which should
  reveal why a host might be incompatible with ConnectBot.
- SSH key exchange algorithm will now be printed upon connection.
- All addresses for a particular host will be tried when connecting
  (including IPv6).

## [1.8.3][1.8.3] - 2015-04-02
### Fixed
- Only enable EC support when the device supports it.
- Default font size scales with the device display density.
- Color picker scales correctly depending on device density.
- Color picker color numbers are now localized


[unreleased]: https://github.com/connectbot/connectbot/compare/v1.8.4...HEAD
[1.8.4]: https://github.com/connectbot/connectbot/compare/v1.8.3...v1.8.4
[1.8.3]: https://github.com/connectbot/connectbot/compare/v1.8.2...v1.8.3
5'>285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696
/*
    ChibiOS - Copyright (C) 2016..2018 Rocco Marco Guglielmi

    This file is part of ChibiOS.

    ChibiOS is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.

    ChibiOS is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

*/

/**
 * @file    lps25h.c
 * @brief   LPS25H MEMS interface module code.
 *
 * @addtogroup LPS25H
 * @ingroup EX_ST
 * @{
 */

#include "hal.h"
#include "lps25h.h"

/*===========================================================================*/
/* Driver local definitions.                                                 */
/*===========================================================================*/

/*===========================================================================*/
/* Driver exported variables.                                                */
/*===========================================================================*/

/*===========================================================================*/
/* Driver local variables and types.                                         */
/*===========================================================================*/

/*===========================================================================*/
/* Driver local functions.                                                   */
/*===========================================================================*/

#if (LPS25H_USE_I2C) || defined(__DOXYGEN__)
/**
 * @brief   Reads registers value using I2C.
 * @pre     The I2C interface must be initialized and the driver started.
 *
 * @param[in]  i2cp      pointer to the I2C interface
 * @param[in]  sad       slave address without R bit
 * @param[in]  reg       first sub-register address
 * @param[out] rxbuf     pointer to an output buffer
 * @param[in]  n         number of consecutive register to read
 * @return               the operation status.
 *
 * @notapi
 */
static msg_t lps25hI2CReadRegister(I2CDriver *i2cp, lps25h_sad_t sad,
                                   uint8_t reg, uint8_t* rxbuf, size_t n) {
  uint8_t txbuf = reg;
  if(n > 1)
    txbuf |= LPS25H_SUB_MS;

  return i2cMasterTransmitTimeout(i2cp, sad, &txbuf, 1, rxbuf, n,
                                  TIME_INFINITE);
}

/**
 * @brief   Writes a value into a register using I2C.
 * @pre     The I2C interface must be initialized and the driver started.
 *
 * @param[in] i2cp       pointer to the I2C interface
 * @param[in] sad        slave address without R bit
 * @param[in] txbuf      buffer containing sub-address value in first position
 *                       and values to write
 * @param[in] n          size of txbuf less one (not considering the first
 *                       element)
 * @return               the operation status.
 *
 * @notapi
 */
static msg_t lps25hI2CWriteRegister(I2CDriver *i2cp, lps25h_sad_t sad,
                                    uint8_t* txbuf, size_t n) {
  if (n > 1)
    (*txbuf) |= LPS25H_SUB_MS;
  return i2cMasterTransmitTimeout(i2cp, sad, txbuf, n + 1, NULL, 0,
                                  TIME_INFINITE);
}
#endif /* LPS25H_USE_I2C */

/**
 * @brief   Return the number of axes of the BaseBarometer.
 *
 * @param[in] ip        pointer to @p BaseBarometer interface.
 *
 * @return              the number of axes.
 */
static size_t baro_get_axes_number(void *ip) {
  (void)ip;

  return LPS25H_BARO_NUMBER_OF_AXES;
}

/**
 * @brief   Retrieves raw data from the BaseBarometer.
 * @note    This data is retrieved from MEMS register without any algebraical
 *          manipulation.
 * @note    The axes array must be at least the same size of the
 *          BaseBarometer axes number.
 *
 * @param[in] ip        pointer to @p BaseBarometer interface.
 * @param[out] axes     a buffer which would be filled with raw data.
 *
 * @return              The operation status.
 * @retval MSG_OK       if the function succeeded.
 * @retval MSG_RESET    if one or more I2C errors occurred, the errors can
 *                      be retrieved using @p i2cGetErrors().
 * @retval MSG_TIMEOUT  if a timeout occurred before operation end.
 */
static msg_t baro_read_raw(void *ip, int32_t axes[]) {
  LPS25HDriver* devp;
  uint8_t buff[3];
  msg_t msg;

  osalDbgCheck((ip != NULL) && (axes != NULL));

  /* Getting parent instance pointer.*/
  devp = objGetInstance(LPS25HDriver*, (BaseBarometer*)ip);

  osalDbgAssert((devp->state == LPS25H_READY),
                "baro_read_raw(), invalid state");

  osalDbgAssert((devp->config->i2cp->state == I2C_READY),
                "baro_read_raw(), channel not ready");

#if LPS25H_SHARED_I2C
  i2cAcquireBus(devp->config->i2cp);
  i2cStart(devp->config->i2cp,
           devp->config->i2ccfg);
#endif /* LPS25H_SHARED_I2C */

  msg = lps25hI2CReadRegister(devp->config->i2cp, devp->config->slaveaddress,
                              LPS25H_AD_PRESS_OUT_XL, buff, 3);

#if LPS25H_SHARED_I2C
  i2cReleaseBus(devp->config->i2cp);
#endif /* LPS25H_SHARED_I2C */

  if(msg == MSG_OK) {
    *axes = buff[0] + (buff[1] << 8) + (buff[2] << 16);
  }
  return msg;
}

/**
 * @brief   Retrieves cooked data from the BaseBarometer.
 * @note    This data is manipulated according to the formula
 *          cooked = (raw * sensitivity) - bias.
 * @note    Final data is expressed as hPa.
 * @note    The axes array must be at least the same size of the
 *          BaseBarometer axes number.
 *
 * @param[in] ip        pointer to @p BaseBarometer interface.
 * @param[out] axes     a buffer which would be filled with cooked data.
 *
 * @return              The operation status.
 * @retval MSG_OK       if the function succeeded.
 * @retval MSG_RESET    if one or more I2C errors occurred, the errors can
 *                      be retrieved using @p i2cGetErrors().
 * @retval MSG_TIMEOUT  if a timeout occurred before operation end.
 */
static msg_t baro_read_cooked(void *ip, float axes[]) {
  LPS25HDriver* devp;
  int32_t raw;
  msg_t msg;

  osalDbgCheck((ip != NULL) && (axes != NULL));

  /* Getting parent instance pointer.*/
  devp = objGetInstance(LPS25HDriver*, (BaseBarometer*)ip);

  osalDbgAssert((devp->state == LPS25H_READY),
                "baro_read_cooked(), invalid state");

  msg = baro_read_raw(ip, &raw);

  *axes = (raw * devp->barosensitivity) - devp->barobias;

  return msg;
}

/**
 * @brief   Set bias values for the BaseBarometer.
 * @note    Bias must be expressed as hPa.
 * @note    The bias buffer must be at least the same size of the
 *          BaseBarometer axes number.
 *
 * @param[in] ip        pointer to @p BaseBarometer interface.
 * @param[in] bp        a buffer which contains biases.
 *
 * @return              The operation status.
 * @retval MSG_OK       if the function succeeded.
 * @retval MSG_RESET    if one or more I2C errors occurred, the errors can
 *                      be retrieved using @p i2cGetErrors().
 * @retval MSG_TIMEOUT  if a timeout occurred before operation end.
 */
static msg_t baro_set_bias(void *ip, float *bp) {
  LPS25HDriver* devp;
  msg_t msg = MSG_OK;

  osalDbgCheck((ip != NULL) && (bp != NULL));

  /* Getting parent instance pointer.*/
  devp = objGetInstance(LPS25HDriver*, (BaseBarometer*)ip);

  osalDbgAssert((devp->state == LPS25H_READY),
                "baro_set_bias(), invalid state");

  devp->barobias = *bp;
  return msg;
}

/**
 * @brief   Reset bias values for the BaseBarometer.
 * @note    Default biases value are obtained from device datasheet when
 *          available otherwise they are considered zero.
 *
 * @param[in] ip        pointer to @p BaseBarometer interface.
 *
 * @return              The operation status.
 * @retval MSG_OK       if the function succeeded.
 */
static msg_t baro_reset_bias(void *ip) {
  LPS25HDriver* devp;
  msg_t msg = MSG_OK;

  osalDbgCheck(ip != NULL);

  /* Getting parent instance pointer.*/
  devp = objGetInstance(LPS25HDriver*, (BaseBarometer*)ip);

  osalDbgAssert((devp->state == LPS25H_READY),
                "baro_reset_bias(), invalid state");

  devp->barobias = LPS25H_BARO_SENS;
  return msg;
}

/**
 * @brief   Set sensitivity values for the BaseBarometer.
 * @note    Sensitivity must be expressed as hPa/LSB.
 * @note    The sensitivity buffer must be at least the same size of the
 *          BaseBarometer axes number.
 *
 * @param[in] ip        pointer to @p BaseBarometer interface.
 * @param[in] sp        a buffer which contains sensitivities.
 *
 * @return              The operation status.
 * @retval MSG_OK       if the function succeeded.
 */
static msg_t baro_set_sensitivity(void *ip, float *sp) {
  LPS25HDriver* devp;
  msg_t msg = MSG_OK;

  osalDbgCheck((ip != NULL) && (sp != NULL));

  /* Getting parent instance pointer.*/
  devp = objGetInstance(LPS25HDriver*, (BaseBarometer*)ip);

  osalDbgAssert((devp->state == LPS25H_READY),
                "baro_set_sensitivity(), invalid state");

  devp->barosensitivity = *sp;
  return msg;
}

/**
 * @brief   Reset sensitivity values for the BaseBarometer.
 * @note    Default sensitivities value are obtained from device datasheet.
 *
 * @param[in] ip        pointer to @p BaseBarometer interface.
 *
 * @return              The operation status.
 * @retval MSG_OK       if the function succeeded.
 */
static msg_t baro_reset_sensitivity(void *ip) {
  LPS25HDriver* devp;
  msg_t msg = MSG_OK;

  osalDbgCheck(ip != NULL);

    /* Getting parent instance pointer.*/
  devp = objGetInstance(LPS25HDriver*, (BaseBarometer*)ip);

  osalDbgAssert((devp->state == LPS25H_READY),
                "baro_reset_sensitivity(), invalid state");

  devp->barosensitivity = LPS25H_BARO_SENS;
  return msg;
}

/**
 * @brief   Return the number of axes of the BaseThermometer.
 *
 * @param[in] ip        pointer to @p BaseThermometer interface.
 *
 * @return              the number of axes.
 */
static size_t thermo_get_axes_number(void *ip) {
  (void)ip;

  return LPS25H_THERMO_NUMBER_OF_AXES;
}

/**
 * @brief   Retrieves raw data from the BaseThermometer.
 * @note    This data is retrieved from MEMS register without any algebraical
 *          manipulation.
 * @note    The axes array must be at least the same size of the
 *          BaseThermometer axes number.
 *
 * @param[in] ip        pointer to @p BaseThermometer interface.
 * @param[out] axes     a buffer which would be filled with raw data.
 *
 * @return              The operation status.
 * @retval MSG_OK       if the function succeeded.
 * @retval MSG_RESET    if one or more I2C errors occurred, the errors can
 *                      be retrieved using @p i2cGetErrors().
 * @retval MSG_TIMEOUT  if a timeout occurred before operation end.
 */
static msg_t thermo_read_raw(void *ip, int32_t axes[]) {
  LPS25HDriver* devp;
  int16_t tmp;
  uint8_t buff[2];
  msg_t msg;

  osalDbgCheck((ip != NULL) && (axes != NULL));

  /* Getting parent instance pointer.*/
  devp = objGetInstance(LPS25HDriver*, (BaseThermometer*)ip);

  osalDbgAssert((devp->state == LPS25H_READY),
                "thermo_read_raw(), invalid state");

  osalDbgAssert((devp->config->i2cp->state == I2C_READY),
                "thermo_read_raw(), channel not ready");

#if LPS25H_SHARED_I2C
  i2cAcquireBus(devp->config->i2cp);
  i2cStart(devp->config->i2cp,
           devp->config->i2ccfg);
#endif /* LPS25H_SHARED_I2C */

  msg = lps25hI2CReadRegister(devp->config->i2cp, devp->config->slaveaddress,
                              LPS25H_AD_TEMP_OUT_L, buff, 2);

#if LPS25H_SHARED_I2C
  i2cReleaseBus(devp->config->i2cp);
#endif /* LPS25H_SHARED_I2C */

  if (msg == MSG_OK) {
    tmp = buff[0] + (buff[1] << 8);
    *axes = (int32_t)tmp;
  }
  return msg;
}

/**
 * @brief   Retrieves cooked data from the BaseThermometer.
 * @note    This data is manipulated according to the formula
 *          cooked = (raw * sensitivity) - bias.
 * @note    Final data is expressed as °C.
 * @note    The axes array must be at least the same size of the
 *          BaseThermometer axes number.
 *
 * @param[in] ip        pointer to @p BaseThermometer interface.
 * @param[out] axes     a buffer which would be filled with cooked data.
 *
 * @return              The operation status.
 * @retval MSG_OK       if the function succeeded.
 * @retval MSG_RESET    if one or more I2C errors occurred, the errors can
 *                      be retrieved using @p i2cGetErrors().
 * @retval MSG_TIMEOUT  if a timeout occurred before operation end.
 */
static msg_t thermo_read_cooked(void *ip, float* axis) {
  LPS25HDriver* devp;
  int32_t raw;
  msg_t msg;

  osalDbgCheck((ip != NULL) && (axis != NULL));

  /* Getting parent instance pointer.*/
  devp = objGetInstance(LPS25HDriver*, (BaseThermometer*)ip);

  osalDbgAssert((devp->state == LPS25H_READY),
                "thermo_read_cooked(), invalid state");

  msg = thermo_read_raw(devp, &raw);

  *axis = (raw * devp->thermosensitivity) - devp->thermobias;

  return msg;
}

/**
 * @brief   Set bias values for the BaseThermometer.
 * @note    Bias must be expressed as °C.
 * @note    The bias buffer must be at least the same size of the
 *          BaseThermometer axes number.
 *
 * @param[in] ip        pointer to @p BaseThermometer interface.
 * @param[in] bp        a buffer which contains biases.
 *
 * @return              The operation status.
 * @retval MSG_OK       if the function succeeded.
 */
static msg_t thermo_set_bias(void *ip, float *bp) {
  LPS25HDriver* devp;
  msg_t msg = MSG_OK;

  osalDbgCheck((ip != NULL) && (bp != NULL));

  /* Getting parent instance pointer.*/
  devp = objGetInstance(LPS25HDriver*, (BaseThermometer*)ip);

  osalDbgAssert((devp->state == LPS25H_READY),
                "thermo_set_bias(), invalid state");

  devp->thermobias = *bp;

  return msg;
}

/**
 * @brief   Reset bias values for the BaseThermometer.
 * @note    Default biases value are obtained from device datasheet when
 *          available otherwise they are considered zero.
 *
 * @param[in] ip        pointer to @p BaseThermometer interface.
 *
 * @return              The operation status.
 * @retval MSG_OK       if the function succeeded.
 */
static msg_t thermo_reset_bias(void *ip) {
  LPS25HDriver* devp;
  msg_t msg = MSG_OK;

  osalDbgCheck(ip != NULL);

  /* Getting parent instance pointer.*/
  devp = objGetInstance(LPS25HDriver*, (BaseThermometer*)ip);

  osalDbgAssert((devp->state == LPS25H_READY),
                "thermo_reset_bias(), invalid state");

  devp->thermobias = LPS25H_THERMO_BIAS;

  return msg;
}

/**
 * @brief   Set sensitivity values for the BaseThermometer.
 * @note    Sensitivity must be expressed as °C/LSB.
 * @note    The sensitivity buffer must be at least the same size of the
 *          BaseThermometer axes number.
 *
 * @param[in] ip        pointer to @p BaseThermometer interface.
 * @param[in] sp        a buffer which contains sensitivities.
 *
 * @return              The operation status.
 * @retval MSG_OK       if the function succeeded.
 */
static msg_t thermo_set_sensitivity(void *ip, float *sp) {
  LPS25HDriver* devp;
  msg_t msg = MSG_OK;

  osalDbgCheck((ip != NULL) && (sp != NULL));

  /* Getting parent instance pointer.*/
  devp = objGetInstance(LPS25HDriver*, (BaseThermometer*)ip);

  osalDbgAssert((devp->state == LPS25H_READY),
                "thermo_set_sensitivity(), invalid state");

  devp->thermosensitivity = *sp;

  return msg;
}

/**
 * @brief   Reset sensitivity values for the BaseThermometer.
 * @note    Default sensitivities value are obtained from device datasheet.
 *
 * @param[in] ip        pointer to @p BaseThermometer interface.
 *
 * @return              The operation status.
 * @retval MSG_OK       if the function succeeded.
 */
static msg_t thermo_reset_sensitivity(void *ip) {
  LPS25HDriver* devp;
  msg_t msg = MSG_OK;

  osalDbgCheck(ip != NULL);

  /* Getting parent instance pointer.*/
  devp = objGetInstance(LPS25HDriver*, (BaseThermometer*)ip);

  osalDbgAssert((devp->state == LPS25H_READY),
                "thermo_reset_sensitivity(), invalid state");

  devp->thermosensitivity = LPS25H_THERMO_SENS;

  return msg;
}

static const struct LPS25HVMT vmt_device = {
  (size_t)0
};

static const struct BaseBarometerVMT vmt_barometer = {
  sizeof(struct LPS25HVMT*),
  baro_get_axes_number, baro_read_raw, baro_read_cooked,
  baro_set_bias, baro_reset_bias, baro_set_sensitivity,
  baro_reset_sensitivity
};

static const struct BaseThermometerVMT vmt_thermometer = {
  sizeof(struct LPS25HVMT*) + sizeof(BaseBarometer),
  thermo_get_axes_number, thermo_read_raw, thermo_read_cooked,
  thermo_set_bias, thermo_reset_bias, thermo_set_sensitivity,
  thermo_reset_sensitivity
};

/*===========================================================================*/
/* Driver exported functions.                                                */
/*===========================================================================*/

/**
 * @brief   Initializes an instance.
 *
 * @param[out] devp     pointer to the @p LPS25HDriver object
 *
 * @init
 */
void lps25hObjectInit(LPS25HDriver *devp) {

  devp->vmt = &vmt_device;
  devp->baro_if.vmt = &vmt_barometer;
  devp->thermo_if.vmt = &vmt_thermometer;

  devp->config = NULL;

  devp->baroaxes = LPS25H_BARO_NUMBER_OF_AXES;
  devp->thermoaxes = LPS25H_THERMO_NUMBER_OF_AXES;

  devp->state = LPS25H_STOP;
}

/**
 * @brief   Configures and activates LPS25H Complex Driver peripheral.
 *
 * @param[in] devp      pointer to the @p LPS25HDriver object
 * @param[in] config    pointer to the @p LPS25HConfig object
 *
 * @api
 */
void lps25hStart(LPS25HDriver *devp, const LPS25HConfig *config) {
  uint8_t cr[2];
  osalDbgCheck((devp != NULL) && (config != NULL));

  osalDbgAssert((devp->state == LPS25H_STOP) || (devp->state == LPS25H_READY),
                "lps25hStart(), invalid state");

  devp->config = config;

  /* Control register 1 configuration block.*/
  {
    cr[0] = LPS25H_AD_CTRL_REG1;
    cr[1] = devp->config->outputdatarate | LPS25H_CTRL_REG1_PD;
#if LPS25H_USE_ADVANCED || defined(__DOXYGEN__)
    cr[1] |= devp->config->blockdataupdate;
#endif
  }

#if  LPS25H_SHARED_I2C
  i2cAcquireBus((devp)->config->i2cp);
#endif /* LPS25H_SHARED_I2C */
  i2cStart((devp)->config->i2cp,
           (devp)->config->i2ccfg);

  lps25hI2CWriteRegister(devp->config->i2cp, devp->config->slaveaddress, cr, 1);

#if  LPS25H_SHARED_I2C
  i2cReleaseBus((devp)->config->i2cp);
#endif /* LPS25H_SHARED_I2C */

  /* Resolution configuration block.*/
  {
    cr[0] = LPS25H_AD_RES_CONF;
    cr[1] = 0x05;
#if LPS25H_USE_ADVANCED || defined(__DOXYGEN__)
    cr[1] = devp->config->baroresolution | devp->config->thermoresolution;
#endif

  }
#if  LPS25H_SHARED_I2C
  i2cAcquireBus((devp)->config->i2cp);
  i2cStart((devp)->config->i2cp,
           (devp)->config->i2ccfg);
#endif /* LPS25H_SHARED_I2C */

  lps25hI2CWriteRegister(devp->config->i2cp, devp->config->slaveaddress,
                         cr, 1);

#if  LPS25H_SHARED_I2C
  i2cReleaseBus((devp)->config->i2cp);
#endif /* LPS25H_SHARED_I2C */

  if(devp->config->barosensitivity == NULL) {
    devp->barosensitivity = LPS25H_BARO_SENS;
  }
  else{
    /* Taking barometer sensitivity from user configurations */
    devp->barosensitivity = *(devp->config->barosensitivity);
  }

  if(devp->config->barobias == NULL) {
    devp->barobias = LPS25H_BARO_BIAS;
  }
  else{
    /* Taking barometer bias from user configurations */
    devp->barobias = *(devp->config->barobias);
  }

  if(devp->config->thermosensitivity == NULL) {
    devp->thermosensitivity = LPS25H_THERMO_SENS;
  }
  else{
    /* Taking thermometer sensitivity from user configurations */
    devp->thermosensitivity = *(devp->config->thermosensitivity);
  }

  if(devp->config->thermobias == NULL) {
    devp->thermobias = LPS25H_THERMO_BIAS;
  }
  else{
    /* Taking thermometer bias from user configurations */
    devp->thermobias = *(devp->config->thermobias);
  }

  /* This is the Barometer transient recovery time */
  osalThreadSleepMilliseconds(5);

  devp->state = LPS25H_READY;
}

/**
 * @brief   Deactivates the LPS25H Complex Driver peripheral.
 *
 * @param[in] devp       pointer to the @p LPS25HDriver object
 *
 * @api
 */
void lps25hStop(LPS25HDriver *devp) {
  uint8_t cr[2];

  osalDbgCheck(devp != NULL);

  osalDbgAssert((devp->state == LPS25H_STOP) || (devp->state == LPS25H_READY),
                "lps25hStop(), invalid state");

  if (devp->state == LPS25H_READY) {
#if  LPS25H_SHARED_I2C
    i2cAcquireBus((devp)->config->i2cp);
    i2cStart((devp)->config->i2cp,
             (devp)->config->i2ccfg);
#endif /* LPS25H_SHARED_I2C */

    cr[0] = LPS25H_AD_CTRL_REG1;
    cr[1] = 0;
    lps25hI2CWriteRegister(devp->config->i2cp, devp->config->slaveaddress,
                           cr, 1);

    i2cStop((devp)->config->i2cp);
#if  LPS25H_SHARED_I2C
    i2cReleaseBus((devp)->config->i2cp);
#endif /* LPS25H_SHARED_I2C */
  }
  devp->state = LPS25H_STOP;
}
/** @} */