You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by vi...@apache.org on 2019/05/17 02:07:33 UTC

[mynewt-core] branch master updated: sensors/dps368: fix multiple instances of stats (#1825)

This is an automated email from the ASF dual-hosted git repository.

vipulrahane pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-core.git


The following commit(s) were added to refs/heads/master by this push:
     new 6acbbe7  sensors/dps368: fix multiple instances of stats (#1825)
6acbbe7 is described below

commit 6acbbe728e013aa6f786f8721be29af888de9a81
Author: Vipul Rahane <vi...@apache.org>
AuthorDate: Thu May 16 19:07:28 2019 -0700

    sensors/dps368: fix multiple instances of stats (#1825)
    
    - Move stats to the header inside the driver structure
    - Make the driver filetypes unix instead of dos
---
 hw/drivers/sensors/dps368/include/dps368/dps368.h  |   15 +-
 hw/drivers/sensors/dps368/src/dps368.c             | 2079 ++++++++++----------
 .../sensors/dps368/src/dps368_comm_interface.c     |  599 +++---
 hw/drivers/sensors/dps368/src/dps368_priv.h        |   12 -
 hw/drivers/sensors/dps368/src/dps368_shell.c       |  240 +--
 5 files changed, 1461 insertions(+), 1484 deletions(-)

diff --git a/hw/drivers/sensors/dps368/include/dps368/dps368.h b/hw/drivers/sensors/dps368/include/dps368/dps368.h
index b6dda27..08d46fe 100644
--- a/hw/drivers/sensors/dps368/include/dps368/dps368.h
+++ b/hw/drivers/sensors/dps368/include/dps368/dps368.h
@@ -26,6 +26,7 @@
 #include "bus/drivers/i2c_common.h"
 #include "bus/drivers/spi_common.h"
 #endif
+#include <stats/stats.h>
 
 #include "sensor/sensor.h"
 
@@ -33,7 +34,7 @@
 #define    IFX_DPS368_TRIM_FINISH_TIME_MS   12
 #define    IFX_DPS368_DEV_PROD_REVID        0x10
 
-#define    IFX_DPS368_CONFIG_TIME_MS        1 //1 ms config time
+#define    IFX_DPS368_CONFIG_TIME_MS        1 /* 1 ms config time */
 
 #define    IFX_DPS368_FAC_TEST_RUN_PRS_ODR  DPS368_ODR_8
 #define    IFX_DPS368_FAC_TEST_RUN_TMP_ODR  DPS368_ODR_4
@@ -53,7 +54,7 @@
 #define    IFX_DPS368_SOFT_RESET_VERIFY_REG_ADDR       0x06
 
 #define    IFX_DPS368_COEF_REG_ADDR                    0x10
-#define    IFX_DPS368_COEF_LEN                         18    // Length in bytes
+#define    IFX_DPS368_COEF_LEN                         18    /* Length in bytes */
 
 #define    IFX_DPS368_TMP_COEF_SRCE_REG_ADDR           0x28
 #define    IFX_DPS368_TMP_COEF_SRCE_REG_LEN            1
@@ -250,7 +251,13 @@ struct dps368_cfg_s {
     sensor_type_t chosen_type;
 };
 
-struct dps368{
+/* Define the stats section and records */
+STATS_SECT_START(dps368_stat_section)
+    STATS_SECT_ENTRY(read_errors)
+    STATS_SECT_ENTRY(write_errors)
+STATS_SECT_END
+
+struct dps368 {
 #if MYNEWT_VAL(BUS_DRIVER_PRESENT)
     union {
         struct bus_i2c_node i2c_node;
@@ -270,6 +277,8 @@ struct dps368{
     dps3xx_temperature_src_e temp_src;
     dps_cfg cfg_word;
     uint8_t validated;
+    /* Variable used to hold stats data */
+    STATS_SECT_DECL(dps368_stat_section) stats;
 };
 
 
diff --git a/hw/drivers/sensors/dps368/src/dps368.c b/hw/drivers/sensors/dps368/src/dps368.c
index 7be1b27..bac6f7c 100644
--- a/hw/drivers/sensors/dps368/src/dps368.c
+++ b/hw/drivers/sensors/dps368/src/dps368.c
@@ -1,1026 +1,1053 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#include <assert.h>
-#include <stdio.h>
-#include <errno.h>
-#include <string.h>
-#include <stdint.h>
-#include <syscfg/syscfg.h>
-#include <math.h>
-
-#include "sensor/sensor.h"
-#include "sensor/temperature.h"
-#include "sensor/pressure.h"
-
-
-#include "dps368/dps368.h"
-#include "dps368_priv.h"
-
-
-#if !MYNEWT_VAL(BUS_DRIVER_PRESENT)
-static struct hal_spi_settings spi_dps368_settings_s = {
-    .data_order = HAL_SPI_MSB_FIRST,
-    .data_mode  = HAL_SPI_MODE3,
-    .baudrate   = 4000,
-    .word_size  = HAL_SPI_WORD_SIZE_8BIT,
-};
-#endif
-
-/* Exports for the sensor API */
-static int dps368_sensor_read(struct sensor *, sensor_type_t,
-        sensor_data_func_t, void *, uint32_t);
-static int dps368_sensor_get_config(struct sensor *, sensor_type_t,
-        struct sensor_cfg *);
-static int dps368_sensor_set_config(struct sensor *, void *);
-
-static const struct sensor_driver dps368_sensor_driver_s = {
-    .sd_read = dps368_sensor_read,
-    .sd_get_config = dps368_sensor_get_config,
-    .sd_set_config = dps368_sensor_set_config,
-    .sd_reset = dps368_soft_reset,
-};
-
-
-
-/*Local helper functions implementations*/
-/**
- * Verify sensor on bus
- *
- * @param The sensor interface
- * @param ptr to indicate if sensor hw is ready
- * @return 0 on success, non-zero on failure
- */
-static int
-dps368_verify_sensor(struct sensor_itf *itf, uint8_t *sensor_exist)
-{
-    int rc;
-    uint8_t hwid;
-
-    rc = dps368_get_hwid(itf,&hwid);
-
-    if (rc) {
-        *sensor_exist = 0;
-        return rc;
-    }
-
-    if (hwid == IFX_DPS368_DEV_PROD_REVID) {
-        *sensor_exist = 1;
-    } else {
-        *sensor_exist = 0;
-    }
-
-    return 0;
-
-}
-
-/**
- * Check status to see if the sensor is ready finishing self init after boot/soft-reset
- * typical time is 40 ms after reboot/soft-reset
- * access/use sensor after this
- * @param The sensor interface
- * @param ptr to indicate if sensor hw is ready after initialization
- * @return 0 on success, non-zero on failure
- */
-static int
-dps368_is_init_complete(struct sensor_itf *itf, uint8_t *ready)
-{
-    uint8_t status;
-    int rc;
-
-    rc = dps368_read_regs(itf, IFX_DPS368_MEAS_CFG_REG_ADDR, &status,
-            IFX_DPS368_MEAS_CFG_REG_LEN);
-
-    if (rc) {
-        return rc;
-    }
-
-    if (status & IFX_DPS368_MEAS_CFG_REG_SEN_RDY_VAL) {
-        *ready = 1;
-    } else {
-        *ready = 0;
-    }
-
-    return 0;
-
-}
-
-/**
- * Check status to see if the sensor is ready trim
- * typical time is 12ms after reboot/soft-reset
- * read calib data after this
- * @param The sensor interface
- * @param ptr to indicate if sensor hw is ready after initialization
- * @return 0 on success, non-zero on failure
- */
-static int
-dps368_is_trim_complete(struct sensor_itf *itf, uint8_t *ready)
-{
-    uint8_t status;
-    int rc;
-
-    rc = dps368_read_regs(itf, IFX_DPS368_MEAS_CFG_REG_ADDR, &status,
-            IFX_DPS368_MEAS_CFG_REG_LEN);
-
-    if (rc) {
-        *ready = 0;
-        return rc;
-    }
-
-    if (status & IFX_DPS368_MEAS_CFG_REG_COEF_RDY_VAL) {
-        *ready = 1;
-    } else {
-        *ready = 0;
-    }
-
-    return 0;
-}
-
-/**
- * Prepare calibration coefficients once sensor is ready
- *
- * @param The sensor interface
- * @param ptr read calib reg data
- * @return 0 on success, non-zero on failure
- */
-static int
-dps368_prepare_calib_coeff(struct sensor_itf *itf,
-        dps3xx_cal_coeff_regs_s *coeffs, dps3xx_temperature_src_e *src_t)
-{
-     uint8_t read_buffer[IFX_DPS368_COEF_LEN] = {0};
-     int rc;
-
-     rc = dps368_read_regs(itf, IFX_DPS368_COEF_REG_ADDR, read_buffer,
-             IFX_DPS368_COEF_LEN);
-
-     if (rc) {
-         return rc;
-     }
-
-     coeffs->C0 = (read_buffer[0] << 4) + ((read_buffer[1] >>4) & 0x0F);
-     if(coeffs->C0 > POW_2_11_MINUS_1)
-         coeffs->C0 = coeffs->C0 - POW_2_12;
-
-     coeffs->C1 = (read_buffer[2] + ((read_buffer[1] & 0x0F)<<8));
-     if(coeffs->C1 > POW_2_11_MINUS_1)
-         coeffs->C1 = coeffs->C1 - POW_2_12;
-
-     coeffs->C00 = ((read_buffer[4]<<4) + (read_buffer[3]<<12)) + ((read_buffer[5]>>4) & 0x0F);
-     if(coeffs->C00 > POW_2_19_MINUS_1)
-         coeffs->C00 = coeffs->C00 -POW_2_20;
-
-     coeffs->C10 = ((read_buffer[5] & 0x0F)<<16) + read_buffer[7] + (read_buffer[6]<<8);
-     if(coeffs->C10 > POW_2_19_MINUS_1)
-         coeffs->C10 = coeffs->C10 - POW_2_20;
-
-     coeffs->C01 = (read_buffer[9] + (read_buffer[8]<<8));
-     if(coeffs->C01 > ((POW_2_15_MINUS_1)))
-         coeffs->C01 = coeffs->C01 - POW_2_16;
-
-     coeffs->C11 = (read_buffer[11] + (read_buffer[10]<<8));
-     if(coeffs->C11 > ((POW_2_15_MINUS_1)))
-         coeffs->C11 = coeffs->C11 - POW_2_16;
-
-     coeffs->C20 = (read_buffer[13] + (read_buffer[12]<<8));
-     if(coeffs->C20 > ((POW_2_15_MINUS_1)))
-         coeffs->C20 = coeffs->C20 - POW_2_16;
-
-     coeffs->C21 = (read_buffer[15] + (read_buffer[14]<<8));
-     if(coeffs->C21 > ((POW_2_15_MINUS_1)))
-         coeffs->C21 = coeffs->C21 - POW_2_16;
-
-     coeffs->C30 = (read_buffer[17] + (read_buffer[16]<<8));
-     if(coeffs->C30 > ((POW_2_15_MINUS_1)))
-         coeffs->C30 = coeffs->C30 - POW_2_16;
-
-     memset(read_buffer, 0, sizeof(IFX_DPS368_COEF_LEN));
-
-     rc = dps368_read_regs(itf, IFX_DPS368_TMP_COEF_SRCE_REG_ADDR, read_buffer,
-             IFX_DPS368_TMP_CFG_REG_LEN);
-
-     if (rc) {
-         return rc;
-     }
-
-    if ((read_buffer[0] >> IFX_DPS368_TMP_COEF_SRCE_REG_POS) & 1) {
-        *src_t = TMP_EXT_MEMS;
-    } else {
-        *src_t = TMP_EXT_ASIC;
-    }
-
-     return 0;
-}
-
-/**
- * Choose appropriate scalling factor for given OSR
- *
- * @param selected osr
- * @return chosen scaling coefficient for given osr
- */
-static dps3xx_scaling_coeffs_e
-dps368_get_scaling_coef (dps3xx_osr_e osr)
-{
-    dps3xx_scaling_coeffs_e scaling_coeff;
-
-    switch (osr){
-
-    case OSR_1:
-        scaling_coeff = OSR_SF_1;
-        break;
-    case OSR_2:
-        scaling_coeff = OSR_SF_2;
-        break;
-    case OSR_4:
-        scaling_coeff = OSR_SF_4;
-        break;
-    case OSR_8:
-        scaling_coeff = OSR_SF_8;
-        break;
-    case OSR_16:
-        scaling_coeff = OSR_SF_16;
-        break;
-    case OSR_32:
-        scaling_coeff = OSR_SF_32;
-        break;
-    case OSR_64:
-        scaling_coeff = OSR_SF_64;
-        break;
-    case OSR_128:
-        scaling_coeff = OSR_SF_128;
-        break;
-    default:
-        scaling_coeff = OSR_SF_1;
-        break;
-    }
-
-    return scaling_coeff;
-}
-
-/**
- * post init sequence
- *
- * @param ptr sensor interface
- * @return 0 on success else non 0 val
- */
-static int
-dps368_set_oem_parameters(struct sensor_itf *itf)
-{
-    int rc;
-
-    if ((rc = dps368_write_reg(itf, (uint8_t) 0x0E, (uint8_t) 0xA5))) {
-        return rc;
-    }
-
-    if ((rc = dps368_write_reg(itf, (uint8_t) 0x0F, (uint8_t) 0x96))) {
-        return rc;
-    }
-
-    if ((rc = dps368_write_reg(itf, (uint8_t) 0x62, (uint8_t) 0x02))) {
-        return rc;
-    }
-
-    if ((rc = dps368_write_reg(itf, (uint8_t) 0x0E, (uint8_t) 0x00))) {
-        return rc;
-    }
-
-    if ((rc = dps368_write_reg(itf, (uint8_t) 0x0F, (uint8_t) 0x00))) {
-        return rc;
-    }
-
-    DPS368_LOG(INFO,"DPS368:OEM Parameters are set\n");
-
-    return 0;
-
-}
-
-/**
- * Choose maximum possible OSR given ODR
- *
- * @param selected odr
- * @return chosen OSR for given odr
- */
-static dps3xx_osr_e
-dps368_get_best_osr (dps3xx_odr_e odr)
-{
-    dps3xx_osr_e chosen_osr;
-    switch (odr)
-        {
-        case ODR_1:
-            chosen_osr = OSR_128;
-            break;
-        case ODR_2:
-            chosen_osr = OSR_128;
-            break;
-        case ODR_4:
-            chosen_osr = OSR_128;
-            break;
-        case ODR_8:
-            chosen_osr = OSR_64;
-            break;
-        case ODR_16:
-            chosen_osr = OSR_32;
-            break;
-        case ODR_32:
-            chosen_osr = OSR_16;
-            break;
-        case ODR_64:
-            chosen_osr = OSR_8;
-            break;
-        case ODR_128:
-            chosen_osr = OSR_2;
-            break;
-        default:
-            chosen_osr = OSR_2;
-            break;
-        }
-
-    return chosen_osr;
-
-}
-
-/**
- * Internal Function:sets sensor to specific predefine operating mode
- *
- * @param Instance of sensor specific driver state
- * @param Instance of enumerated constants defining predefined
-*         modes of operation
- * @return 0 on success, non-zero on failure
- */
-static int
-dps368_set_mode(struct dps368 *dps368, dps3xx_operating_modes_e mode)
-{
-    int rc;
-
-    uint8_t md = (uint8_t)mode;
-    struct sensor_itf *itf;
-
-    itf = SENSOR_GET_ITF(&(dps368->sensor));
-
-    if (dps368->mode == mode) {
-        return 0;
-        DPS368_LOG(INFO, "Sensor is already in requested mode\n");
-    }
-
-
-    rc = dps368_write_reg(itf, IFX_DPS368_MEAS_CFG_REG_ADDR, md);
-
-    if (rc) {
-        return rc;
-    }
-
-    dps368->mode = mode;
-
-    dps368->validated = 0;
-
-    /*wait till config is complete*/
-    os_time_delay((OS_TICKS_PER_SEC * IFX_DPS368_CONFIG_TIME_MS)/1000+1);
-
-    return 0;
-
-}
-
-/**
-* Configures the sensor to operate in given
-* oversampling and streaming rates for both temperature and pressure
-*
-* @param Instance of sensor specific driver state
-* @param Enumerated constants defining oversampling rate for
-*        temperature measurements
-* @param Enumerated constants defining oversampling rate for
-*        pressure measurements
-* @param Enumerated constants defining streaming rate (ODR) for
-*        temperature measurements
-* @param Enumerated constants defining streaming rate (ODR) for
-*        pressure measurements
-* @return 0 on success, non-zero on failure
-*/
-static int
-dps368_reconfig(struct dps368 *dps368, dps3xx_osr_e osr_t,dps3xx_osr_e osr_p,
-            dps3xx_odr_e odr_t,dps3xx_odr_e odr_p)
-{
-    int rc;
-
-    struct sensor_itf *itf;
-
-    uint8_t config_val_tmp = 0;
-    uint8_t config_val_prs = 0;
-    uint8_t config_val;
-
-
-    dps3xx_operating_modes_e current_mode = dps368->mode;
-
-    rc = dps368_set_mode(dps368, DPS3xx_MODE_IDLE);
-
-    if (rc) {
-        return rc;
-    }
-
-    itf = SENSOR_GET_ITF(&(dps368->sensor));
-
-    /*Prepare a configuration word for TMP_CFG register*/
-    config_val_tmp = (uint8_t) dps368->temp_src;
-
-    /*First Set the TMP_RATE[2:0] -> 6:4 */
-    config_val_tmp |= ((uint8_t)odr_t);
-
-    /*Set the TMP_PRC[3:0] -> 2:0 */
-    config_val_tmp |= ((uint8_t)osr_t);
-
-    /*Prepare a configuration word for PRS_CFG register*/
-    config_val_prs = (uint8_t) 0x00;
-    /*First Set the PM_RATE[2:0] -> 6:4 */
-    config_val_prs |= ((uint8_t)odr_p);
-    /*Set the PM_PRC[3:0] -> 3:0 */
-    config_val_prs |= ((uint8_t)osr_p);
-
-    /*write register to set temperature measurement and oversampling rate.*/
-    rc = dps368_write_reg(itf, IFX_DPS368_TMP_CFG_REG_ADDR, config_val_tmp);
-
-    if (rc) {
-        return rc;
-    }
-
-    rc = dps368_write_reg(itf, IFX_DPS368_PRS_CFG_REG_ADDR, config_val_prs);
-
-    if (rc) {
-        return rc;
-    }
-
-
-    config_val = dps368->cfg_word;
-
-    /*If oversampling rate for temperature is greater than 8 times, then set TMP_SHIFT bit in CFG_REG */
-    if ((uint8_t) osr_t > (uint8_t) OSR_8) {
-        config_val |= (uint8_t) IFX_DPS368_CFG_TMP_SHIFT_EN_SET_VAL;
-    }
-
-    /*If oversampling rate for pressure is greater than 8 times, then set P_SHIFT bit in CFG_REG */
-    if ((uint8_t) osr_p > (uint8_t) OSR_8) {
-        config_val |= (uint8_t) IFX_DPS368_CFG_PRS_SHIFT_EN_SET_VAL;
-    }
-
-    rc = dps368_write_reg(itf,IFX_DPS368_CFG_REG_ADDR,config_val);
-
-    if (rc){
-        return rc;
-    }
-
-    /*Update state accordingly with proper scaling factors based on oversampling rates*/
-    dps368->osr_scale_t = dps368_get_scaling_coef(osr_t);
-    dps368->osr_scale_p =  dps368_get_scaling_coef(osr_p);
-
-    dps368->validated = 0;
-
-    /*restore mode*/
-    rc = dps368_set_mode(dps368, current_mode);
-
-    if (rc) {
-        return rc;
-    }
-
-    return 0;
-}
-
-/**
- * Check and set the validity of sample in driver state
- *
- * @param  Instance of specific driver state
- * @return  0 on success, non-zero on failure
- */
-static int
-dps368_validate_sample_accuracy(struct dps368 *dps368)
-{
-
-    int rc;
-    uint8_t read_buffer;
-    struct sensor_itf *itf;
-    uint8_t CHEK_MSK = 0;
-    uint8_t CHEK_WORD =0;
-
-    itf = SENSOR_GET_ITF(&(dps368->sensor));
-
-    if ((rc = dps368_read_regs(itf, IFX_DPS368_MEAS_CFG_REG_ADDR, &read_buffer,
-            IFX_DPS368_MEAS_CFG_REG_LEN))) {
-        return rc;
-    }
-
-    if (DPS3xx_MODE_BACKGROUND_ALL == dps368->mode ||
-            DPS3xx_MODE_BACKGROUND_PRESSURE == dps368->mode ||
-            DPS3xx_MODE_COMMAND_PRESSURE == dps368->mode) {
-        CHEK_MSK = 0b00110000;
-        CHEK_WORD = 0x30; //BOTH P And T should be ready
-    }
-    else if (DPS3xx_MODE_BACKGROUND_TEMPERATURE == dps368->mode ||
-                DPS3xx_MODE_COMMAND_TEMPERATURE == dps368->mode) {
-        CHEK_MSK = 0b00100000;
-        CHEK_WORD = 0x20; //ONLY T should be ready
-    }
-
-
-    if ((read_buffer & CHEK_MSK) == CHEK_WORD) {
-        dps368->validated = 1;
-
-    } else {
-        dps368->validated = 0;
-
-    }
-
-    return 0;
-}
-
-/**
- * Gets compensated pressure in hecto Pascal
- *
- * @param Instance of sensor specific driver state
- * @param ptr computed and temperature compensated pressure in hPa
- *
- * @return 0 on success, and non-zero error code on failure
- */
-static int
-dps368_get_pressure_hPa(struct dps368 *dps368,float *pressurehPa)
-{
-    int rc;
-    uint8_t read_buffer[IFX_DPS368_PSR_TMP_READ_LEN] = {0};
-    float  temp_raw;
-    float  temp_scaled;
-    float  press_scaled;
-    float  press_final;
-    float  press_raw;
-
-    struct sensor_itf *itf;
-
-    itf = SENSOR_GET_ITF(&(dps368->sensor));
-
-    if (dps368->validated != 1) {
-
-        rc = dps368_validate_sample_accuracy(dps368);
-
-        if (rc) {
-            return rc;
-        }
-    }
-
-    rc = dps368_read_regs(itf, IFX_DPS368_PSR_TMP_READ_REG_ADDR, read_buffer,
-    IFX_DPS368_PSR_TMP_READ_LEN);
-
-    if (rc) {
-        return rc;
-    }
-
-    press_raw = (read_buffer[2]) + (read_buffer[1]<<8) + (read_buffer[0] <<16);
-
-    temp_raw  = (read_buffer[5]) + (read_buffer[4]<<8) + (read_buffer[3] <<16);
-
-
-    if (temp_raw > POW_2_23_MINUS_1) {
-        temp_raw = temp_raw - POW_2_24;
-    }
-
-    temp_scaled = (float)temp_raw / (float) (dps368->osr_scale_t);
-
-    if (press_raw > POW_2_23_MINUS_1) {
-        press_raw = press_raw - POW_2_24;
-    }
-
-    press_scaled = (float) press_raw / dps368->osr_scale_p;
-
-    press_final = dps368->calib_coeffs.C00 +
-            press_scaled *  (dps368->calib_coeffs.C10 + press_scaled *
-                    (dps368->calib_coeffs.C20 + press_scaled * dps368->calib_coeffs.C30 )) +
-                    temp_scaled * dps368->calib_coeffs.C01 +temp_scaled * press_scaled *
-                    ( dps368->calib_coeffs.C11 + press_scaled * dps368->calib_coeffs.C21 );
-
-    press_final = press_final * 0.01f;  //to convert it into mBar // hPa
-
-    *pressurehPa  = press_final;  //press_final;
-
-    return 0;
-}
-
-/**
- * Gets temperature in degree celcius
- *
- * @param Instance of sensor specific driver
- * @param ptr computed temperature in degree celcius
- *
- * @return 0 on success, and non-zero error code on failure
- */
-static int
-dps368_get_temperature_degC(struct dps368 *dps368,float *tempdegC)
-{
-    int rc;
-    uint8_t read_buffer[IFX_DPS368_PSR_TMP_READ_LEN -3] = {0};
-    float  temp_raw;
-    float  temp_scaled;
-    float  temp_final;
-
-    struct sensor_itf *itf;
-
-
-    itf = SENSOR_GET_ITF(&dps368->sensor);
-
-
-    if (dps368->validated != 1) {
-
-        rc = dps368_validate_sample_accuracy(dps368);
-
-        if (rc) {
-            return rc;
-        }
-    }
-
-
-    rc = dps368_read_regs(itf, IFX_DPS368_PSR_TMP_READ_REG_ADDR + 3,
-            read_buffer,
-            IFX_DPS368_PSR_TMP_READ_LEN - 3);
-
-    if (rc) {
-        return rc;
-    }
-
-    temp_raw = (read_buffer[2]) + (read_buffer[1]<<8) + (read_buffer[0] <<16);
-
-    if (temp_raw > POW_2_23_MINUS_1) {
-        temp_raw = temp_raw - POW_2_24;
-    }
-
-    temp_scaled = (float)temp_raw / (float) (dps368->osr_scale_t);
-
-    temp_final =  (dps368->calib_coeffs.C0 /2.0f) + dps368->calib_coeffs.C1 * temp_scaled ;
-
-    *tempdegC = temp_final;
-
-    return 0;
-
-}
-
-
-/*Public functions implementations*/
-int
-dps368_get_hwid(struct sensor_itf *itf, uint8_t *hwid)
-{
-    int rc;
-    uint8_t tmp;
-
-    rc = dps368_read_regs(itf, IFX_DPS368_PROD_REV_ID_REG_ADDR, &tmp,
-            IFX_DPS368_PROD_REV_ID_LEN);
-
-    if (rc) {
-        hwid = 0;
-        return rc;
-    }
-
-    *hwid = tmp;
-
-    return 0;
-}
-
-int dps368_soft_reset(struct sensor *sensor)
-{
-    int rc;
-
-    uint8_t ready;
-
-    struct sensor_itf *itf;
-
-    itf = SENSOR_GET_ITF(sensor);
-
-    rc = dps368_write_reg(itf, IFX_DPS368_SOFT_RESET_REG_ADDR,
-            IFX_DPS368_SOFT_RESET_REG_DATA);
-
-    if (rc) {
-        return rc;
-    }
-
-    /*wait till sensor boots up back*/
-    os_time_delay(((OS_TICKS_PER_SEC * IFX_DPS368_OFF_TO_IDLE_MS)/1000)+1);
-
-    /*Check if sensor is back */
-    if ((rc = dps368_is_init_complete(itf, &ready))) {
-        return rc;
-    }
-
-    if (ready == 0) {
-        DPS368_LOG(INFO, "Sensor is not ready after reset\n");
-    } else {
-        DPS368_LOG(INFO, "Sensor is ready after reset\n");
-    }
-
-    /*perform post init sequence*/
-    if ((rc = dps368_set_oem_parameters(itf))) {
-        return rc;
-    }
-
-    return 0;
-
-}
-
-int dps368_init(struct os_dev *dev, void *arg)
-{
-    struct dps368 *dps368;
-    struct sensor *sensor;
-    int rc;
-
-    if (!arg || !dev) {
-        return SYS_ENODEV;
-    }
-
-    dps368 = (struct dps368 *) dev;
-
-    sensor = &dps368->sensor;
-
-    dps368->cfg.config_opt = DPS3xx_CONF_WITH_INIT_SEQUENCE;
-
-    dps368_stats_int(dev);
-
-    rc = sensor_init(sensor, dev);
-
-    if (rc) {
-        return rc;
-    }
-
-    DPS368_LOG(INFO,"DPS368init:sensor_init:OK\n");
-
-    /* Add the pressure and temperature driver */
-    rc = sensor_set_driver(sensor, SENSOR_TYPE_PRESSURE |
-            SENSOR_TYPE_TEMPERATURE,
-            (struct sensor_driver *) &dps368_sensor_driver_s);
-
-    if (rc) {
-        return rc;
-    }
-
-    DPS368_LOG(INFO,"DPS368init:sensor_set_driver:OK\n");
-
-    rc = sensor_set_interface(sensor, arg);
-
-    if (rc) {
-        return rc;
-    }
-
-    DPS368_LOG(INFO,"DPS368init:sensor_set_interface:OK\n");
-
-    rc = sensor_mgr_register(sensor);
-
-    if (rc) {
-        return rc;
-    }
-
-    DPS368_LOG(INFO,"DPS368init:sensor_mgr_register:OK\n");
-
-#if !MYNEWT_VAL(BUS_DRIVER_PRESENT)
-    if (sensor->s_itf.si_type == SENSOR_ITF_SPI) {
-
-        rc = hal_spi_config(sensor->s_itf.si_num, &spi_dps368_settings_s);
-
-        if (rc == EINVAL) {
-            return rc;
-        }
-
-        rc = hal_spi_enable(sensor->s_itf.si_num);
-
-        if (rc) {
-            return rc;
-        }
-
-        rc = hal_gpio_init_out(sensor->s_itf.si_cs_pin, 1);
-
-        if (rc) {
-            return rc;
-        }
-    }
-#endif
-
-    return 0;
-}
-
-int dps368_config(struct dps368 *dps368, struct dps368_cfg_s *cfg)
-{
-
-    int rc;
-    struct sensor_itf *itf;
-
-    uint8_t sensor_exist;
-    uint8_t ready;
-
-    struct dps368_cfg_s updated_cfg = dps368->cfg;
-
-    itf = SENSOR_GET_ITF(&(dps368->sensor));
-
-    if (cfg->config_opt & DPS3xx_CONF_WITH_INIT_SEQUENCE) {
-
-        updated_cfg.odr_t = cfg->odr_t;
-        updated_cfg.odr_p = cfg->odr_p;
-        updated_cfg.osr_t = cfg->osr_t;
-        updated_cfg.osr_p = cfg->osr_p;
-        updated_cfg.mode  = cfg->mode;
-
-        if ((rc = dps368_verify_sensor(itf, &sensor_exist))) {
-            return rc;
-        }
-
-        if (sensor_exist == 1) {
-            DPS368_LOG(INFO, "DPS368:Found during config init sequence\n");
-        }
-
-        if ((rc = dps368_soft_reset(&dps368->sensor))) {
-            return rc;
-        }
-
-        DPS368_LOG(INFO, "DPS368:Soft reset: OK\n");
-
-        if ((rc = dps368_is_trim_complete(itf, &ready))) {
-            return rc;
-        }
-
-        if (ready == 1) {
-
-            if ((rc = dps368_prepare_calib_coeff(itf, &dps368->calib_coeffs,
-                    &dps368->temp_src))) {
-                return rc;
-            }
-
-            DPS368_LOG(INFO, "DPS368:Calibration data prepared\n");
-        }
-
-    } else if (cfg->config_opt & DPS3xx_RECONF_ALL) {
-        updated_cfg.odr_t = cfg->odr_t;
-        updated_cfg.odr_p = cfg->odr_p;
-        updated_cfg.osr_t = cfg->osr_t;
-        updated_cfg.osr_p = cfg->osr_p;
-        updated_cfg.mode  = cfg->mode;
-    } else if (cfg->config_opt & DPS3xx_RECONF_ODR_ONLY) {
-        updated_cfg.odr_t = cfg->odr_t;
-        updated_cfg.odr_p = cfg->odr_p;
-    } else if (cfg->config_opt & DPS3xx_RECONF_ODR_WITH_BEST_OSR) {
-        updated_cfg.odr_t = cfg->odr_t;
-        updated_cfg.odr_p = cfg->odr_p;
-        updated_cfg.osr_t = dps368_get_best_osr(cfg->odr_t);
-        updated_cfg.osr_p = dps368_get_best_osr(cfg->odr_p);
-    } else if (cfg->config_opt & DPS3xx_RECONF_OSR_ONLY) {
-        updated_cfg.osr_t = cfg->osr_t;
-        updated_cfg.osr_p = cfg->osr_p;
-    } else if (cfg->config_opt & DPS3xx_RECONF_MODE_ONLY) {
-        updated_cfg.mode = cfg->mode;
-    }
-
-    if ((rc = dps368_reconfig(dps368, updated_cfg.osr_t, updated_cfg.osr_p,
-            updated_cfg.odr_t, updated_cfg.odr_p))) {
-        return rc;
-    }
-
-    DPS368_LOG(INFO, "DPS368:Reconfig done\n");
-
-    if ((rc = dps368_set_mode(dps368, updated_cfg.mode))) {
-        return rc;
-    }
-
-    DPS368_LOG(INFO, "DPS368:Mode is set\n");
-
-    if ((rc = sensor_set_type_mask(&(dps368->sensor), cfg->chosen_type))) {
-        return rc;
-    }
-
-    return 0;
-}
-
-
-/*Local call-backs implementations*/
-static int
-dps368_sensor_read(struct sensor *sensor, sensor_type_t type,
-        sensor_data_func_t data_func, void *data_arg, uint32_t timeout)
-{
-    int rc = SYS_EINVAL;
-
-    struct dps368 *dps368;
-    dps368 = (struct dps368 *)SENSOR_GET_DEVICE(sensor);
-    (void)timeout;
-
-    if (dps368->mode == DPS3xx_MODE_IDLE) {
-
-        DPS368_LOG(ERROR,
-                "Could not stream as mode is inappropriate\n "
-                "First set mode to Background or Command and then try again\n");
-        return rc;
-    }
-
-    if (type & SENSOR_TYPE_PRESSURE) {
-        struct sensor_press_data spd;
-        rc = dps368_get_pressure_hPa(dps368, &spd.spd_press);
-        if (rc) {
-            return rc;
-        }
-
-        spd.spd_press_is_valid = dps368->validated;
-
-        rc = data_func(sensor, data_arg, &spd, SENSOR_TYPE_PRESSURE);
-    }
-
-    if (type & SENSOR_TYPE_TEMPERATURE) {
-        struct sensor_temp_data std;
-
-        rc = dps368_get_temperature_degC(dps368, &std.std_temp);
-
-        if (rc) {
-
-            return rc;
-        }
-
-        std.std_temp_is_valid = dps368->validated;
-
-        rc = data_func(sensor, data_arg, &std, SENSOR_TYPE_TEMPERATURE);
-    }
-
-    if (!(type & SENSOR_TYPE_TEMPERATURE) && !(type & SENSOR_TYPE_PRESSURE)) {
-        return SYS_EINVAL;
-    }
-
-    return rc;
-}
-
-static int
-dps368_sensor_get_config(struct sensor *sensor, sensor_type_t type,
-        struct sensor_cfg *cfg)
-{
-
-    /* If the read isn't looking for pressure, don't do anything. */
-    if (!(type & (SENSOR_TYPE_PRESSURE | SENSOR_TYPE_TEMPERATURE))) {
-        return SYS_EINVAL;
-    }
-
-    cfg->sc_valtype = SENSOR_VALUE_TYPE_FLOAT;
-
-    return 0;
-}
-
-static int
-dps368_sensor_set_config(struct sensor *sensor, void *cfg)
-{
-    struct dps368* dps368 = (struct dps368 *) SENSOR_GET_DEVICE(sensor);
-
-    return dps368_config(dps368, (struct dps368_cfg_s*) cfg);
-}
-
-
-/*Bus- peripheral communication instantiations */
-#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
-static void
-init_node_cb(struct bus_node *bnode, void *arg)
-{
-    struct sensor_itf *itf = arg;
-
-    dps368_init((struct os_dev *)bnode, itf);
-}
-
-int
-dps368_create_i2c_sensor_dev(struct bus_i2c_node *node, const char *name,
-                             const struct bus_i2c_node_cfg *i2c_cfg,
-                             struct sensor_itf *sensor_itf)
-{
-    struct bus_node_callbacks cbs = {
-        .init = init_node_cb,
-    };
-    int rc;
-
-    bus_node_set_callbacks((struct os_dev *)node, &cbs);
-
-    rc = bus_i2c_node_create(name, node, i2c_cfg, sensor_itf);
-
-    return rc;
-}
-
-int
-dps368_create_spi_sensor_dev(struct bus_spi_node *node, const char *name,
-                             const struct bus_spi_node_cfg *spi_cfg,
-                             struct sensor_itf *sensor_itf)
-{
-    struct bus_node_callbacks cbs = {
-        .init = init_node_cb,
-    };
-    int rc;
-
-    bus_node_set_callbacks((struct os_dev *)node, &cbs);
-
-    rc = bus_spi_node_create(name, node, spi_cfg, sensor_itf);
-
-    return rc;
-}
-#endif
-
-
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include <assert.h>
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+#include <stdint.h>
+#include <syscfg/syscfg.h>
+#include <math.h>
+
+#include "sensor/sensor.h"
+#include "sensor/temperature.h"
+#include "sensor/pressure.h"
+
+
+#include "dps368/dps368.h"
+#include "dps368_priv.h"
+#include <stats/stats.h>
+
+/* Define stat names for querying */
+STATS_NAME_START(dps368_stat_section)
+    STATS_NAME(dps368_stat_section, read_errors)
+    STATS_NAME(dps368_stat_section, write_errors)
+STATS_NAME_END(dps368_stat_section)
+
+#if !MYNEWT_VAL(BUS_DRIVER_PRESENT)
+static struct hal_spi_settings spi_dps368_settings_s = {
+    .data_order = HAL_SPI_MSB_FIRST,
+    .data_mode  = HAL_SPI_MODE3,
+    .baudrate   = 4000,
+    .word_size  = HAL_SPI_WORD_SIZE_8BIT,
+};
+#endif
+
+/* Exports for the sensor API */
+static int dps368_sensor_read(struct sensor *, sensor_type_t,
+        sensor_data_func_t, void *, uint32_t);
+static int dps368_sensor_get_config(struct sensor *, sensor_type_t,
+        struct sensor_cfg *);
+static int dps368_sensor_set_config(struct sensor *, void *);
+
+static const struct sensor_driver dps368_sensor_driver_s = {
+    .sd_read = dps368_sensor_read,
+    .sd_get_config = dps368_sensor_get_config,
+    .sd_set_config = dps368_sensor_set_config,
+    .sd_reset = dps368_soft_reset,
+};
+
+
+
+/*Local helper functions implementations*/
+/**
+ * Verify sensor on bus
+ *
+ * @param The sensor interface
+ * @param ptr to indicate if sensor hw is ready
+ * @return 0 on success, non-zero on failure
+ */
+static int
+dps368_verify_sensor(struct sensor_itf *itf, uint8_t *sensor_exist)
+{
+    int rc;
+    uint8_t hwid;
+
+    rc = dps368_get_hwid(itf, &hwid);
+
+    if (rc) {
+        *sensor_exist = 0;
+        return rc;
+    }
+
+    if (hwid == IFX_DPS368_DEV_PROD_REVID) {
+        *sensor_exist = 1;
+    } else {
+        *sensor_exist = 0;
+    }
+
+    return 0;
+
+}
+
+/**
+ * Check status to see if the sensor is ready finishing self init after boot/soft-reset
+ * typical time is 40 ms after reboot/soft-reset
+ * access/use sensor after this
+ * @param The sensor interface
+ * @param ptr to indicate if sensor hw is ready after initialization
+ * @return 0 on success, non-zero on failure
+ */
+static int
+dps368_is_init_complete(struct sensor_itf *itf, uint8_t *ready)
+{
+    uint8_t status;
+    int rc;
+
+    rc = dps368_read_regs(itf, IFX_DPS368_MEAS_CFG_REG_ADDR, &status,
+            IFX_DPS368_MEAS_CFG_REG_LEN);
+
+    if (rc) {
+        return rc;
+    }
+
+    if (status & IFX_DPS368_MEAS_CFG_REG_SEN_RDY_VAL) {
+        *ready = 1;
+    } else {
+        *ready = 0;
+    }
+
+    return 0;
+
+}
+
+/**
+ * Check status to see if the sensor is ready trim
+ * typical time is 12ms after reboot/soft-reset
+ * read calib data after this
+ * @param The sensor interface
+ * @param ptr to indicate if sensor hw is ready after initialization
+ * @return 0 on success, non-zero on failure
+ */
+static int
+dps368_is_trim_complete(struct sensor_itf *itf, uint8_t *ready)
+{
+    uint8_t status;
+    int rc;
+
+    rc = dps368_read_regs(itf, IFX_DPS368_MEAS_CFG_REG_ADDR, &status,
+            IFX_DPS368_MEAS_CFG_REG_LEN);
+
+    if (rc) {
+        *ready = 0;
+        return rc;
+    }
+
+    if (status & IFX_DPS368_MEAS_CFG_REG_COEF_RDY_VAL) {
+        *ready = 1;
+    } else {
+        *ready = 0;
+    }
+
+    return 0;
+}
+
+/**
+ * Prepare calibration coefficients once sensor is ready
+ *
+ * @param The sensor interface
+ * @param ptr read calib reg data
+ * @return 0 on success, non-zero on failure
+ */
+static int
+dps368_prepare_calib_coeff(struct sensor_itf *itf,
+        dps3xx_cal_coeff_regs_s *coeffs, dps3xx_temperature_src_e *src_t)
+{
+     uint8_t read_buffer[IFX_DPS368_COEF_LEN] = {0};
+     int rc;
+
+     rc = dps368_read_regs(itf, IFX_DPS368_COEF_REG_ADDR, read_buffer,
+             IFX_DPS368_COEF_LEN);
+
+     if (rc) {
+         return rc;
+     }
+
+     coeffs->C0 = (read_buffer[0] << 4) + ((read_buffer[1] >>4) & 0x0F);
+     if(coeffs->C0 > POW_2_11_MINUS_1)
+         coeffs->C0 = coeffs->C0 - POW_2_12;
+
+     coeffs->C1 = (read_buffer[2] + ((read_buffer[1] & 0x0F)<<8));
+     if(coeffs->C1 > POW_2_11_MINUS_1)
+         coeffs->C1 = coeffs->C1 - POW_2_12;
+
+     coeffs->C00 = ((read_buffer[4]<<4) + (read_buffer[3]<<12)) + ((read_buffer[5]>>4) & 0x0F);
+     if(coeffs->C00 > POW_2_19_MINUS_1)
+         coeffs->C00 = coeffs->C00 -POW_2_20;
+
+     coeffs->C10 = ((read_buffer[5] & 0x0F)<<16) + read_buffer[7] + (read_buffer[6]<<8);
+     if(coeffs->C10 > POW_2_19_MINUS_1)
+         coeffs->C10 = coeffs->C10 - POW_2_20;
+
+     coeffs->C01 = (read_buffer[9] + (read_buffer[8]<<8));
+     if(coeffs->C01 > ((POW_2_15_MINUS_1)))
+         coeffs->C01 = coeffs->C01 - POW_2_16;
+
+     coeffs->C11 = (read_buffer[11] + (read_buffer[10]<<8));
+     if(coeffs->C11 > ((POW_2_15_MINUS_1)))
+         coeffs->C11 = coeffs->C11 - POW_2_16;
+
+     coeffs->C20 = (read_buffer[13] + (read_buffer[12]<<8));
+     if(coeffs->C20 > ((POW_2_15_MINUS_1)))
+         coeffs->C20 = coeffs->C20 - POW_2_16;
+
+     coeffs->C21 = (read_buffer[15] + (read_buffer[14]<<8));
+     if(coeffs->C21 > ((POW_2_15_MINUS_1)))
+         coeffs->C21 = coeffs->C21 - POW_2_16;
+
+     coeffs->C30 = (read_buffer[17] + (read_buffer[16]<<8));
+     if(coeffs->C30 > ((POW_2_15_MINUS_1)))
+         coeffs->C30 = coeffs->C30 - POW_2_16;
+
+     memset(read_buffer, 0, sizeof(IFX_DPS368_COEF_LEN));
+
+     rc = dps368_read_regs(itf, IFX_DPS368_TMP_COEF_SRCE_REG_ADDR, read_buffer,
+             IFX_DPS368_TMP_CFG_REG_LEN);
+
+     if (rc) {
+         return rc;
+     }
+
+    if ((read_buffer[0] >> IFX_DPS368_TMP_COEF_SRCE_REG_POS) & 1) {
+        *src_t = TMP_EXT_MEMS;
+    } else {
+        *src_t = TMP_EXT_ASIC;
+    }
+
+     return 0;
+}
+
+/**
+ * Choose appropriate scalling factor for given OSR
+ *
+ * @param selected osr
+ * @return chosen scaling coefficient for given osr
+ */
+static dps3xx_scaling_coeffs_e
+dps368_get_scaling_coef (dps3xx_osr_e osr)
+{
+    dps3xx_scaling_coeffs_e scaling_coeff;
+
+    switch (osr){
+
+    case OSR_1:
+        scaling_coeff = OSR_SF_1;
+        break;
+    case OSR_2:
+        scaling_coeff = OSR_SF_2;
+        break;
+    case OSR_4:
+        scaling_coeff = OSR_SF_4;
+        break;
+    case OSR_8:
+        scaling_coeff = OSR_SF_8;
+        break;
+    case OSR_16:
+        scaling_coeff = OSR_SF_16;
+        break;
+    case OSR_32:
+        scaling_coeff = OSR_SF_32;
+        break;
+    case OSR_64:
+        scaling_coeff = OSR_SF_64;
+        break;
+    case OSR_128:
+        scaling_coeff = OSR_SF_128;
+        break;
+    default:
+        scaling_coeff = OSR_SF_1;
+        break;
+    }
+
+    return scaling_coeff;
+}
+
+/**
+ * post init sequence
+ *
+ * @param ptr sensor interface
+ * @return 0 on success else non 0 val
+ */
+static int
+dps368_set_oem_parameters(struct sensor_itf *itf)
+{
+    int rc;
+
+    if ((rc = dps368_write_reg(itf, (uint8_t) 0x0E, (uint8_t) 0xA5))) {
+        goto done;
+    }
+
+    if ((rc = dps368_write_reg(itf, (uint8_t) 0x0F, (uint8_t) 0x96))) {
+        goto done;
+    }
+
+    if ((rc = dps368_write_reg(itf, (uint8_t) 0x62, (uint8_t) 0x02))) {
+        goto done;
+    }
+
+    if ((rc = dps368_write_reg(itf, (uint8_t) 0x0E, (uint8_t) 0x00))) {
+        goto done;
+    }
+
+    if ((rc = dps368_write_reg(itf, (uint8_t) 0x0F, (uint8_t) 0x00))) {
+        goto done;
+    }
+
+    DPS368_LOG(INFO,"DPS368:OEM Parameters are set\n");
+
+done:
+    return rc;
+
+}
+
+/**
+ * Choose maximum possible OSR given ODR
+ *
+ * @param selected odr
+ * @return chosen OSR for given odr
+ */
+static dps3xx_osr_e
+dps368_get_best_osr (dps3xx_odr_e odr)
+{
+    dps3xx_osr_e chosen_osr;
+    switch (odr)
+        {
+        case ODR_1:
+            chosen_osr = OSR_128;
+            break;
+        case ODR_2:
+            chosen_osr = OSR_128;
+            break;
+        case ODR_4:
+            chosen_osr = OSR_128;
+            break;
+        case ODR_8:
+            chosen_osr = OSR_64;
+            break;
+        case ODR_16:
+            chosen_osr = OSR_32;
+            break;
+        case ODR_32:
+            chosen_osr = OSR_16;
+            break;
+        case ODR_64:
+            chosen_osr = OSR_8;
+            break;
+        case ODR_128:
+            chosen_osr = OSR_2;
+            break;
+        default:
+            chosen_osr = OSR_2;
+            break;
+        }
+
+    return chosen_osr;
+
+}
+
+/**
+ * Internal Function:sets sensor to specific predefine operating mode
+ *
+ * @param Instance of sensor specific driver state
+ * @param Instance of enumerated constants defining predefined
+*         modes of operation
+ * @return 0 on success, non-zero on failure
+ */
+static int
+dps368_set_mode(struct dps368 *dps368, dps3xx_operating_modes_e mode)
+{
+    int rc;
+
+    uint8_t md = (uint8_t)mode;
+    struct sensor_itf *itf;
+
+    itf = SENSOR_GET_ITF(&(dps368->sensor));
+
+    if (dps368->mode == mode) {
+        return 0;
+        DPS368_LOG(INFO, "Sensor is already in requested mode\n");
+    }
+
+
+    rc = dps368_write_reg(itf, IFX_DPS368_MEAS_CFG_REG_ADDR, md);
+
+    if (rc) {
+        STATS_INC(dps368->stats, write_errors);
+        return rc;
+    }
+
+    dps368->mode = mode;
+
+    dps368->validated = 0;
+
+    /*wait till config is complete*/
+    os_time_delay((OS_TICKS_PER_SEC * IFX_DPS368_CONFIG_TIME_MS)/1000+1);
+
+    return 0;
+
+}
+
+/**
+* Configures the sensor to operate in given
+* oversampling and streaming rates for both temperature and pressure
+*
+* @param Instance of sensor specific driver state
+* @param Enumerated constants defining oversampling rate for
+*        temperature measurements
+* @param Enumerated constants defining oversampling rate for
+*        pressure measurements
+* @param Enumerated constants defining streaming rate (ODR) for
+*        temperature measurements
+* @param Enumerated constants defining streaming rate (ODR) for
+*        pressure measurements
+* @return 0 on success, non-zero on failure
+*/
+static int
+dps368_reconfig(struct dps368 *dps368, dps3xx_osr_e osr_t,dps3xx_osr_e osr_p,
+            dps3xx_odr_e odr_t,dps3xx_odr_e odr_p)
+{
+    int rc;
+
+    struct sensor_itf *itf;
+
+    uint8_t config_val_tmp = 0;
+    uint8_t config_val_prs = 0;
+    uint8_t config_val;
+
+
+    dps3xx_operating_modes_e current_mode = dps368->mode;
+
+    rc = dps368_set_mode(dps368, DPS3xx_MODE_IDLE);
+
+    if (rc) {
+        return rc;
+    }
+
+    itf = SENSOR_GET_ITF(&(dps368->sensor));
+
+    /*Prepare a configuration word for TMP_CFG register*/
+    config_val_tmp = (uint8_t) dps368->temp_src;
+
+    /*First Set the TMP_RATE[2:0] -> 6:4 */
+    config_val_tmp |= ((uint8_t)odr_t);
+
+    /*Set the TMP_PRC[3:0] -> 2:0 */
+    config_val_tmp |= ((uint8_t)osr_t);
+
+    /*Prepare a configuration word for PRS_CFG register*/
+    config_val_prs = (uint8_t) 0x00;
+    /*First Set the PM_RATE[2:0] -> 6:4 */
+    config_val_prs |= ((uint8_t)odr_p);
+    /*Set the PM_PRC[3:0] -> 3:0 */
+    config_val_prs |= ((uint8_t)osr_p);
+
+    /*write register to set temperature measurement and oversampling rate.*/
+    rc = dps368_write_reg(itf, IFX_DPS368_TMP_CFG_REG_ADDR, config_val_tmp);
+
+    if (rc) {
+        goto write_err;
+    }
+
+    rc = dps368_write_reg(itf, IFX_DPS368_PRS_CFG_REG_ADDR, config_val_prs);
+
+    if (rc) {
+        goto write_err;
+    }
+
+
+    config_val = dps368->cfg_word;
+
+    /*If oversampling rate for temperature is greater than 8 times, then set TMP_SHIFT bit in CFG_REG */
+    if ((uint8_t) osr_t > (uint8_t) OSR_8) {
+        config_val |= (uint8_t) IFX_DPS368_CFG_TMP_SHIFT_EN_SET_VAL;
+    }
+
+    /*If oversampling rate for pressure is greater than 8 times, then set P_SHIFT bit in CFG_REG */
+    if ((uint8_t) osr_p > (uint8_t) OSR_8) {
+        config_val |= (uint8_t) IFX_DPS368_CFG_PRS_SHIFT_EN_SET_VAL;
+    }
+
+    rc = dps368_write_reg(itf,IFX_DPS368_CFG_REG_ADDR,config_val);
+
+    if (rc){
+        goto write_err;
+    }
+
+    /*Update state accordingly with proper scaling factors based on oversampling rates*/
+    dps368->osr_scale_t = dps368_get_scaling_coef(osr_t);
+    dps368->osr_scale_p =  dps368_get_scaling_coef(osr_p);
+
+    dps368->validated = 0;
+
+    /*restore mode*/
+    rc = dps368_set_mode(dps368, current_mode);
+
+    if (rc) {
+        return rc;
+    }
+    return 0;
+write_err:
+    STATS_INC(dps368->stats, write_errors);
+    return rc;
+}
+
+/**
+ * Check and set the validity of sample in driver state
+ *
+ * @param  Instance of specific driver state
+ * @return  0 on success, non-zero on failure
+ */
+static int
+dps368_validate_sample_accuracy(struct dps368 *dps368)
+{
+
+    int rc;
+    uint8_t read_buffer;
+    struct sensor_itf *itf;
+    uint8_t CHEK_MSK = 0;
+    uint8_t CHEK_WORD =0;
+
+    itf = SENSOR_GET_ITF(&(dps368->sensor));
+
+    if ((rc = dps368_read_regs(itf, IFX_DPS368_MEAS_CFG_REG_ADDR, &read_buffer,
+            IFX_DPS368_MEAS_CFG_REG_LEN))) {
+        return rc;
+    }
+
+    if (DPS3xx_MODE_BACKGROUND_ALL == dps368->mode ||
+            DPS3xx_MODE_BACKGROUND_PRESSURE == dps368->mode ||
+            DPS3xx_MODE_COMMAND_PRESSURE == dps368->mode) {
+        CHEK_MSK = 0b00110000;
+        CHEK_WORD = 0x30; //BOTH P And T should be ready
+    }
+    else if (DPS3xx_MODE_BACKGROUND_TEMPERATURE == dps368->mode ||
+                DPS3xx_MODE_COMMAND_TEMPERATURE == dps368->mode) {
+        CHEK_MSK = 0b00100000;
+        CHEK_WORD = 0x20; //ONLY T should be ready
+    }
+
+
+    if ((read_buffer & CHEK_MSK) == CHEK_WORD) {
+        dps368->validated = 1;
+
+    } else {
+        dps368->validated = 0;
+
+    }
+
+    return 0;
+}
+
+/**
+ * Gets compensated pressure in hecto Pascal
+ *
+ * @param Instance of sensor specific driver state
+ * @param ptr computed and temperature compensated pressure in Pa
+ *
+ * @return 0 on success, and non-zero error code on failure
+ */
+static int
+dps368_get_pressure_Pa(struct dps368 *dps368, float *pressurePa)
+{
+    int rc;
+    uint8_t read_buffer[IFX_DPS368_PSR_TMP_READ_LEN] = {0};
+    float  temp_raw;
+    float  temp_scaled;
+    float  press_scaled;
+    float  press_final;
+    float  press_raw;
+
+    struct sensor_itf *itf;
+
+    itf = SENSOR_GET_ITF(&(dps368->sensor));
+
+    if (dps368->validated != 1) {
+        rc = dps368_validate_sample_accuracy(dps368);
+        if (rc) {
+            STATS_INC(dps368->stats, read_errors); 
+            return rc;
+        }
+    }
+
+    rc = dps368_read_regs(itf, IFX_DPS368_PSR_TMP_READ_REG_ADDR, read_buffer,
+                          IFX_DPS368_PSR_TMP_READ_LEN);
+    if (rc) {
+        STATS_INC(dps368->stats, read_errors); 
+        return rc;
+    }
+
+    press_raw = (read_buffer[2]) + (read_buffer[1]<<8) + (read_buffer[0] <<16);
+
+    temp_raw  = (read_buffer[5]) + (read_buffer[4]<<8) + (read_buffer[3] <<16);
+
+
+    if (temp_raw > POW_2_23_MINUS_1) {
+        temp_raw = temp_raw - POW_2_24;
+    }
+
+    temp_scaled = (float)temp_raw / (float) (dps368->osr_scale_t);
+
+    if (press_raw > POW_2_23_MINUS_1) {
+        press_raw = press_raw - POW_2_24;
+    }
+
+    press_scaled = (float) press_raw / dps368->osr_scale_p;
+
+    press_final = dps368->calib_coeffs.C00 +
+            press_scaled *  (dps368->calib_coeffs.C10 + press_scaled *
+                    (dps368->calib_coeffs.C20 + press_scaled * dps368->calib_coeffs.C30 )) +
+                    temp_scaled * dps368->calib_coeffs.C01 +temp_scaled * press_scaled *
+                    ( dps368->calib_coeffs.C11 + press_scaled * dps368->calib_coeffs.C21 );
+
+    *pressurePa  = press_final;
+
+    return 0;
+}
+
+/**
+ * Gets temperature in degree celcius
+ *
+ * @param Instance of sensor specific driver
+ * @param ptr computed temperature in degree celcius
+ *
+ * @return 0 on success, and non-zero error code on failure
+ */
+static int
+dps368_get_temperature_degC(struct dps368 *dps368, float *tempdegC)
+{
+    int rc;
+    uint8_t read_buffer[IFX_DPS368_PSR_TMP_READ_LEN -3] = {0};
+    float  temp_raw;
+    float  temp_scaled;
+    float  temp_final;
+
+    struct sensor_itf *itf;
+
+
+    itf = SENSOR_GET_ITF(&dps368->sensor);
+
+
+    if (dps368->validated != 1) {
+
+        rc = dps368_validate_sample_accuracy(dps368);
+
+        if (rc) {
+            return rc;
+        }
+    }
+
+
+    rc = dps368_read_regs(itf, IFX_DPS368_PSR_TMP_READ_REG_ADDR + 3,
+            read_buffer,
+            IFX_DPS368_PSR_TMP_READ_LEN - 3);
+
+    if (rc) {
+        STATS_INC(dps368->stats, read_errors);
+        return rc;
+    }
+
+    temp_raw = (read_buffer[2]) + (read_buffer[1]<<8) + (read_buffer[0] <<16);
+
+    if (temp_raw > POW_2_23_MINUS_1) {
+        temp_raw = temp_raw - POW_2_24;
+    }
+
+    temp_scaled = (float)temp_raw / (float) (dps368->osr_scale_t);
+
+    temp_final =  (dps368->calib_coeffs.C0 /2.0f) + dps368->calib_coeffs.C1 * temp_scaled ;
+
+    *tempdegC = temp_final;
+
+    return 0;
+
+}
+
+
+/*Public functions implementations*/
+int
+dps368_get_hwid(struct sensor_itf *itf, uint8_t *hwid)
+{
+    int rc;
+    uint8_t tmp;
+
+    rc = dps368_read_regs(itf, IFX_DPS368_PROD_REV_ID_REG_ADDR, &tmp,
+            IFX_DPS368_PROD_REV_ID_LEN);
+
+    if (rc) {
+        hwid = 0;
+        return rc;
+    }
+
+    *hwid = tmp;
+
+    return 0;
+}
+
+int dps368_soft_reset(struct sensor *sensor)
+{
+    int rc;
+
+    uint8_t ready;
+
+    struct sensor_itf *itf;
+
+    itf = SENSOR_GET_ITF(sensor);
+
+    rc = dps368_write_reg(itf, IFX_DPS368_SOFT_RESET_REG_ADDR,
+            IFX_DPS368_SOFT_RESET_REG_DATA);
+
+    if (rc) {
+        STATS_INC(((struct dps368 *)sensor)->stats, write_errors);
+        return rc;
+    }
+
+    /*wait till sensor boots up back*/
+    os_time_delay(((OS_TICKS_PER_SEC * IFX_DPS368_OFF_TO_IDLE_MS)/1000)+1);
+
+    /*Check if sensor is back */
+    if ((rc = dps368_is_init_complete(itf, &ready))) {
+        STATS_INC(((struct dps368 *)sensor)->stats, read_errors);
+        return rc;
+    }
+
+    if (ready == 0) {
+        DPS368_LOG(INFO, "Sensor is not ready after reset\n");
+    } else {
+        DPS368_LOG(INFO, "Sensor is ready after reset\n");
+    }
+
+    /*perform post init sequence*/
+    if ((rc = dps368_set_oem_parameters(itf))) {
+        STATS_INC(((struct dps368 *)sensor)->stats, write_errors);
+        return rc;
+    }
+
+    return 0;
+
+}
+
+static void
+dps368_stats_int(struct os_dev *dev)
+{
+    int rc;
+    /* Initialise the stats entry */
+    rc = stats_init(STATS_HDR(((struct dps368 *)dev)->stats),
+            STATS_SIZE_INIT_PARMS(((struct dps368 *)dev)->stats, STATS_SIZE_32),
+            STATS_NAME_INIT_PARMS(dps368_stat_section));
+    SYSINIT_PANIC_ASSERT(rc == 0);
+    /* Register the entry with the stats registry */
+    rc = stats_register(dev->od_name, STATS_HDR(((struct dps368 *)dev)->stats));
+    SYSINIT_PANIC_ASSERT(rc == 0);
+}
+
+int dps368_init(struct os_dev *dev, void *arg)
+{
+    struct dps368 *dps368;
+    struct sensor *sensor;
+    int rc;
+
+    if (!arg || !dev) {
+        return SYS_ENODEV;
+    }
+
+    dps368 = (struct dps368 *) dev;
+
+    sensor = &dps368->sensor;
+
+    dps368->cfg.config_opt = DPS3xx_CONF_WITH_INIT_SEQUENCE;
+
+    dps368_stats_int(dev);
+
+    rc = sensor_init(sensor, dev);
+
+    if (rc) {
+        return rc;
+    }
+
+    DPS368_LOG(INFO,"DPS368init:sensor_init:OK\n");
+
+    /* Add the pressure and temperature driver */
+    rc = sensor_set_driver(sensor, SENSOR_TYPE_PRESSURE |
+            SENSOR_TYPE_TEMPERATURE,
+            (struct sensor_driver *) &dps368_sensor_driver_s);
+
+    if (rc) {
+        return rc;
+    }
+
+    DPS368_LOG(INFO,"DPS368init:sensor_set_driver:OK\n");
+
+    rc = sensor_set_interface(sensor, arg);
+
+    if (rc) {
+        return rc;
+    }
+
+    DPS368_LOG(INFO,"DPS368init:sensor_set_interface:OK\n");
+
+    rc = sensor_mgr_register(sensor);
+
+    if (rc) {
+        return rc;
+    }
+
+    DPS368_LOG(INFO,"DPS368init:sensor_mgr_register:OK\n");
+
+#if !MYNEWT_VAL(BUS_DRIVER_PRESENT)
+    if (sensor->s_itf.si_type == SENSOR_ITF_SPI) {
+
+        rc = hal_spi_config(sensor->s_itf.si_num, &spi_dps368_settings_s);
+
+        if (rc == EINVAL) {
+            return rc;
+        }
+
+        rc = hal_spi_enable(sensor->s_itf.si_num);
+
+        if (rc) {
+            return rc;
+        }
+
+        rc = hal_gpio_init_out(sensor->s_itf.si_cs_pin, 1);
+
+        if (rc) {
+            return rc;
+        }
+    }
+#endif
+
+    return 0;
+}
+
+int dps368_config(struct dps368 *dps368, struct dps368_cfg_s *cfg)
+{
+
+    int rc;
+    struct sensor_itf *itf;
+
+    uint8_t sensor_exist;
+    uint8_t ready;
+
+    struct dps368_cfg_s updated_cfg = dps368->cfg;
+
+    itf = SENSOR_GET_ITF(&(dps368->sensor));
+
+    if (cfg->config_opt & DPS3xx_CONF_WITH_INIT_SEQUENCE) {
+
+        updated_cfg.odr_t = cfg->odr_t;
+        updated_cfg.odr_p = cfg->odr_p;
+        updated_cfg.osr_t = cfg->osr_t;
+        updated_cfg.osr_p = cfg->osr_p;
+        updated_cfg.mode  = cfg->mode;
+
+        if ((rc = dps368_verify_sensor(itf, &sensor_exist))) {
+            STATS_INC(dps368->stats, read_errors); 
+            return rc;
+        }
+
+        if (sensor_exist == 1) {
+            DPS368_LOG(INFO, "DPS368:Found during config init sequence\n");
+        }
+
+        if ((rc = dps368_soft_reset(&dps368->sensor))) {
+            return rc;
+        }
+
+        DPS368_LOG(INFO, "DPS368:Soft reset: OK\n");
+
+        if ((rc = dps368_is_trim_complete(itf, &ready))) {
+            STATS_INC(dps368->stats, read_errors); 
+            return rc;
+        }
+
+        if (ready == 1) {
+
+            if ((rc = dps368_prepare_calib_coeff(itf, &dps368->calib_coeffs,
+                    &dps368->temp_src))) {
+                STATS_INC(dps368->stats, read_errors); 
+                return rc;
+            }
+
+            DPS368_LOG(INFO, "DPS368:Calibration data prepared\n");
+        }
+
+    } else if (cfg->config_opt & DPS3xx_RECONF_ALL) {
+        updated_cfg.odr_t = cfg->odr_t;
+        updated_cfg.odr_p = cfg->odr_p;
+        updated_cfg.osr_t = cfg->osr_t;
+        updated_cfg.osr_p = cfg->osr_p;
+        updated_cfg.mode  = cfg->mode;
+    } else if (cfg->config_opt & DPS3xx_RECONF_ODR_ONLY) {
+        updated_cfg.odr_t = cfg->odr_t;
+        updated_cfg.odr_p = cfg->odr_p;
+    } else if (cfg->config_opt & DPS3xx_RECONF_ODR_WITH_BEST_OSR) {
+        updated_cfg.odr_t = cfg->odr_t;
+        updated_cfg.odr_p = cfg->odr_p;
+        updated_cfg.osr_t = dps368_get_best_osr(cfg->odr_t);
+        updated_cfg.osr_p = dps368_get_best_osr(cfg->odr_p);
+    } else if (cfg->config_opt & DPS3xx_RECONF_OSR_ONLY) {
+        updated_cfg.osr_t = cfg->osr_t;
+        updated_cfg.osr_p = cfg->osr_p;
+    } else if (cfg->config_opt & DPS3xx_RECONF_MODE_ONLY) {
+        updated_cfg.mode = cfg->mode;
+    }
+
+    if ((rc = dps368_reconfig(dps368, updated_cfg.osr_t, updated_cfg.osr_p,
+            updated_cfg.odr_t, updated_cfg.odr_p))) {
+        return rc;
+    }
+
+    DPS368_LOG(INFO, "DPS368:Reconfig done\n");
+
+    if ((rc = dps368_set_mode(dps368, updated_cfg.mode))) {
+        return rc;
+    }
+
+    DPS368_LOG(INFO, "DPS368:Mode is set\n");
+
+    if ((rc = sensor_set_type_mask(&(dps368->sensor), cfg->chosen_type))) {
+        return rc;
+    }
+
+    return 0;
+}
+
+
+/*Local call-backs implementations*/
+static int
+dps368_sensor_read(struct sensor *sensor, sensor_type_t type,
+        sensor_data_func_t data_func, void *data_arg, uint32_t timeout)
+{
+    int rc = SYS_EINVAL;
+
+    struct dps368 *dps368;
+    dps368 = (struct dps368 *)SENSOR_GET_DEVICE(sensor);
+    (void)timeout;
+
+    if (dps368->mode == DPS3xx_MODE_IDLE) {
+
+        DPS368_LOG(ERROR,
+                "Could not stream as mode is inappropriate\n "
+                "First set mode to Background or Command and then try again\n");
+        return rc;
+    }
+
+    if (type & SENSOR_TYPE_PRESSURE) {
+        struct sensor_press_data spd;
+        rc = dps368_get_pressure_Pa(dps368, &spd.spd_press);
+        if (rc) {
+            return rc;
+        }
+
+        spd.spd_press_is_valid = dps368->validated;
+
+        rc = data_func(sensor, data_arg, &spd, SENSOR_TYPE_PRESSURE);
+    }
+
+    if (type & SENSOR_TYPE_TEMPERATURE) {
+        struct sensor_temp_data std;
+
+        rc = dps368_get_temperature_degC(dps368, &std.std_temp);
+
+        if (rc) {
+
+            return rc;
+        }
+
+        std.std_temp_is_valid = dps368->validated;
+
+        rc = data_func(sensor, data_arg, &std, SENSOR_TYPE_TEMPERATURE);
+    }
+
+    if (!(type & SENSOR_TYPE_TEMPERATURE) && !(type & SENSOR_TYPE_PRESSURE)) {
+        return SYS_EINVAL;
+    }
+
+    return rc;
+}
+
+static int
+dps368_sensor_get_config(struct sensor *sensor, sensor_type_t type,
+        struct sensor_cfg *cfg)
+{
+
+    /* If the read isn't looking for pressure, don't do anything. */
+    if (!(type & (SENSOR_TYPE_PRESSURE | SENSOR_TYPE_TEMPERATURE))) {
+        return SYS_EINVAL;
+    }
+
+    cfg->sc_valtype = SENSOR_VALUE_TYPE_FLOAT;
+
+    return 0;
+}
+
+static int
+dps368_sensor_set_config(struct sensor *sensor, void *cfg)
+{
+    struct dps368* dps368 = (struct dps368 *) SENSOR_GET_DEVICE(sensor);
+
+    return dps368_config(dps368, (struct dps368_cfg_s*) cfg);
+}
+
+
+/*Bus- peripheral communication instantiations */
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+static void
+init_node_cb(struct bus_node *bnode, void *arg)
+{
+    struct sensor_itf *itf = arg;
+
+    dps368_init((struct os_dev *)bnode, itf);
+}
+
+int
+dps368_create_i2c_sensor_dev(struct bus_i2c_node *node, const char *name,
+                             const struct bus_i2c_node_cfg *i2c_cfg,
+                             struct sensor_itf *sensor_itf)
+{
+    struct bus_node_callbacks cbs = {
+        .init = init_node_cb,
+    };
+    int rc;
+
+    bus_node_set_callbacks((struct os_dev *)node, &cbs);
+
+    rc = bus_i2c_node_create(name, node, i2c_cfg, sensor_itf);
+
+    return rc;
+}
+
+int
+dps368_create_spi_sensor_dev(struct bus_spi_node *node, const char *name,
+                             const struct bus_spi_node_cfg *spi_cfg,
+                             struct sensor_itf *sensor_itf)
+{
+    struct bus_node_callbacks cbs = {
+        .init = init_node_cb,
+    };
+    int rc;
+
+    bus_node_set_callbacks((struct os_dev *)node, &cbs);
+
+    rc = bus_spi_node_create(name, node, spi_cfg, sensor_itf);
+
+    return rc;
+}
+#endif
+
diff --git a/hw/drivers/sensors/dps368/src/dps368_comm_interface.c b/hw/drivers/sensors/dps368/src/dps368_comm_interface.c
index 759c598..e7e5d94 100644
--- a/hw/drivers/sensors/dps368/src/dps368_comm_interface.c
+++ b/hw/drivers/sensors/dps368/src/dps368_comm_interface.c
@@ -1,323 +1,276 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#include "dps368/dps368.h"
-#include "dps368_priv.h"
-
-
-/* Define the stats section and records */
-STATS_SECT_START(dps368_stat_section)
-    STATS_SECT_ENTRY(read_errors)
-    STATS_SECT_ENTRY(write_errors)
-    STATS_SECT_ENTRY(out_of_bound_data_errors)
-STATS_SECT_END
-
-/* Define stat names for querying */
-STATS_NAME_START(dps368_stat_section)
-    STATS_NAME(dps368_stat_section, read_errors)
-    STATS_NAME(dps368_stat_section, write_errors)
-    STATS_NAME(dps368_stat_section, out_of_bound_data_errors)
-STATS_NAME_END(dps368_stat_section)
-
-/* Global variable used to hold stats data */
-STATS_SECT_DECL(dps368_stat_section) g_dps368_stats;
-
-
-/**
- * sensor stats init
- *
- *
- * @param ptr Device structure
- *
- * @return  nothing
- */
-void
-dps368_stats_int(struct os_dev *dev)
-{
-    int rc;
-    /* Initialise the stats entry */
-    rc = stats_init(STATS_HDR(g_dps368_stats),
-            STATS_SIZE_INIT_PARMS(g_dps368_stats, STATS_SIZE_32),
-            STATS_NAME_INIT_PARMS(dps368_stat_section));
-    SYSINIT_PANIC_ASSERT(rc == 0);
-    /* Register the entry with the stats registry */
-    rc = stats_register(dev->od_name, STATS_HDR(g_dps368_stats));
-    SYSINIT_PANIC_ASSERT(rc == 0);
-}
-
-
-/*DPS368 bus W/R handling */
-#if !MYNEWT_VAL(BUS_DRIVER_PRESENT)
-/**
- * Writes a single byte to the specified register using i2c
- * interface
- *
- * @param The sensor interface
- * @param The register address to write to
- * @param The value to write
- *
- * @return 0 on success, non-zero error on failure.
- */
-static int
-dps368_i2c_write_reg(struct sensor_itf *itf, uint8_t reg, uint8_t value)
-{
-    int rc;
-    uint8_t payload[2] =
-        { reg, value };
-
-    struct hal_i2c_master_data data_struct =
-        { .address = itf->si_addr, .len = 2, .buffer = payload };
-
-    rc = i2cn_master_write(itf->si_num, &data_struct,
-            MYNEWT_VAL(DPS368_I2C_TIMEOUT_TICKS), 1,
-            MYNEWT_VAL(DPS368_I2C_RETRIES));
-
-    if (rc) {
-        DPS368_LOG(ERROR,
-                "Could not write to 0x%02X:0x%02X with value 0x%02X\n",
-                itf->si_addr, reg, value);
-        STATS_INC(g_dps368_stats, read_errors);
-    }
-
-    return rc;
-}
-
-/**
- * Writes a single byte to the specified register using SPI
- * interface
- *
- * @param The sensor interface
- * @param The register address to write to
- * @param The value to write
- *
- * @return 0 on success, non-zero error on failure.
- */
-static int
-dps368_spi_write_reg(struct sensor_itf *itf, uint8_t reg, uint8_t value)
-{
-    int rc;
-
-    /* Select the device */
-    hal_gpio_write(itf->si_cs_pin, 0);
-
-    /* Send the register address w/write command */
-    rc = hal_spi_tx_val(itf->si_num, reg & ~DPS368_SPI_READ_CMD_BIT);
-    if (rc == 0xFFFF) {
-        rc = SYS_EINVAL;
-        DPS368_LOG(ERROR, "SPI_%u register write failed addr:0x%02X\n",
-                itf->si_num, reg);
-        STATS_INC(g_dps368_stats, write_errors);
-        goto err;
-    }
-
-    /* Write data */
-    rc = hal_spi_tx_val(itf->si_num, value);
-    if (rc == 0xFFFF) {
-        rc = SYS_EINVAL;
-        DPS368_LOG(ERROR, "SPI_%u write failed addr:0x%02X\n", itf->si_num,
-                reg);
-        STATS_INC(g_dps368_stats, write_errors);
-        goto err;
-    }
-
-    rc = 0;
-
-err:
-    /* De-select the device */
-    hal_gpio_write(itf->si_cs_pin, 1);
-
-    os_time_delay((OS_TICKS_PER_SEC * 30) / 1000 + 1);
-
-    return rc;
-}
-
-
-/**
- * Read bytes from the specified register using i2c interface
- *
- * @param The sensor interface
- * @param The register address to read from
- * @param The number of bytes to read
- * @param Pointer to where the register value should be written
- *
- * @return 0 on success, non-zero error on failure.
- */
-static int
-dps368_i2c_read_regs(struct sensor_itf *itf, uint8_t reg, uint8_t size,
-    uint8_t *buffer)
-{
-    int rc;
-    struct hal_i2c_master_data wdata = {
-        .address = itf->si_addr,
-        .len = 1,
-        .buffer = &reg
-    };
-    struct hal_i2c_master_data rdata = {
-        .address = itf->si_addr,
-        .len = size,
-        .buffer = buffer,
-    };
-
-    rc = i2cn_master_write_read_transact(itf->si_num, &wdata, &rdata,
-            MYNEWT_VAL(DPS368_I2C_TIMEOUT_TICKS) * (size + 1), 1,
-            MYNEWT_VAL(DPS368_I2C_RETRIES));
-    if (rc) {
-        DPS368_LOG(ERROR, "I2C access failed at address 0x%02X\n",
-                itf->si_addr);
-        STATS_INC(g_dps368_stats, read_errors);
-        return rc;
-    }
-
-    return rc;
-}
-
-
-/**
- *
- * Read bytes from the specified register using SPI interface
- *
- * @param The sensor interface
- * @param The register address to read from
- * @param The number of bytes to read
- * @param Pointer to where the register value should be written
- *
- * @return 0 on success, non-zero error on failure.
- */
-static int
-dps368_spi_read_regs(struct sensor_itf *itf, uint8_t reg, uint8_t size,
-    uint8_t *buffer)
-{
-    int i;
-    uint16_t retval;
-    int rc;
-    rc = 0;
-
-    /* Select the device */
-    hal_gpio_write(itf->si_cs_pin, 0);
-
-    /* Send the address */
-    retval = hal_spi_tx_val(itf->si_num, reg | DPS368_SPI_READ_CMD_BIT);
-    if (retval == 0xFFFF) {
-        rc = SYS_EINVAL;
-        DPS368_LOG(ERROR, "SPI_%u register write failed addr:0x%02X\n",
-                itf->si_num, reg);
-        STATS_INC(g_dps368_stats, read_errors);
-        goto err;
-    }
-
-    for (i = 0; i < size; i++) {
-        /* Read data */
-        retval = hal_spi_tx_val(itf->si_num, 0);
-        if (retval == 0xFFFF) {
-            rc = SYS_EINVAL;
-            DPS368_LOG(ERROR, "SPI_%u read failed addr:0x%02X\n", itf->si_num,
-                    reg);
-            STATS_INC(g_dps368_stats, read_errors);
-            goto err;
-        }
-        buffer[i] = retval;
-    }
-
-    rc = 0;
-
-err:
-    /* De-select the device */
-    hal_gpio_write(itf->si_cs_pin, 1);
-
-    return rc;
-}
-
-#endif
-
-/**
- * Write a single register to DPS368 value over underlying communication interface
- *
- * @param The sensor interface
- * @param register address
- * @param variable length payload
- * @param length of the payload to write
- */
-int dps368_write_reg(struct sensor_itf *itf, uint8_t addr, uint8_t value)
-{
-    int rc;
-
-#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
-    uint8_t data[2] = { addr, value };
-
-    rc = bus_node_simple_write(itf->si_dev, data, 2);
-#else
-    rc = sensor_itf_lock(itf, MYNEWT_VAL(DPS368_ITF_LOCK_TMO));
-    if (rc) {
-        return rc;
-    }
-
-    if (itf->si_type == SENSOR_ITF_I2C) {
-        rc = dps368_i2c_write_reg(itf, addr, value);
-    } else {
-        rc = dps368_spi_write_reg(itf, addr, value);
-    }
-
-    sensor_itf_unlock(itf);
-#endif
-
-    return rc;
-}
-
-/**
- * Read bytes from the specified register using specified interface
- *
- * @param The sensor interface
- * @param The register address to read from
- * @param The number of bytes to read
- * @param Pointer to where the register value should be written
- *
- * @return 0 on success, non-zero error on failure.
- */
-int dps368_read_regs(struct sensor_itf *itf, uint8_t addr, uint8_t *buff, uint8_t len)
-{
-    int rc;
-
-#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
-    struct dps368 *dev = (struct dps368 *)itf->si_dev;
-
-    if (dev->node_is_spi) {
-        addr |= DPS368_SPI_READ_CMD_BIT;
-    }
-
-    rc = bus_node_simple_write_read_transact(itf->si_dev, &addr, 1, buff, len);
-#else
-    rc = sensor_itf_lock(itf, MYNEWT_VAL(DPS368_ITF_LOCK_TMO));
-
-    if (rc) {
-        return rc;
-    }
-
-    if (itf->si_type == SENSOR_ITF_I2C) {
-        rc = dps368_i2c_read_regs(itf, addr, len, buff);
-    } else {
-        rc = dps368_spi_read_regs(itf, addr, len, buff);
-    }
-
-    sensor_itf_unlock(itf);
-#endif
-
-    return rc;
-}
-
-
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include "dps368/dps368.h"
+#include "dps368_priv.h"
+
+
+/*DPS368 bus W/R handling */
+#if !MYNEWT_VAL(BUS_DRIVER_PRESENT)
+/**
+ * Writes a single byte to the specified register using i2c
+ * interface
+ *
+ * @param The sensor interface
+ * @param The register address to write to
+ * @param The value to write
+ *
+ * @return 0 on success, non-zero error on failure.
+ */
+static int
+dps368_i2c_write_reg(struct sensor_itf *itf, uint8_t reg, uint8_t value)
+{
+    int rc;
+    uint8_t payload[2] =
+        { reg, value };
+
+    struct hal_i2c_master_data data_struct =
+        { .address = itf->si_addr, .len = 2, .buffer = payload };
+
+    rc = i2cn_master_write(itf->si_num, &data_struct,
+            MYNEWT_VAL(DPS368_I2C_TIMEOUT_TICKS), 1,
+            MYNEWT_VAL(DPS368_I2C_RETRIES));
+
+    if (rc) {
+        DPS368_LOG(ERROR,
+                "Could not write to 0x%02X:0x%02X with value 0x%02X\n",
+                itf->si_addr, reg, value);
+    }
+
+    return rc;
+}
+
+/**
+ * Writes a single byte to the specified register using SPI
+ * interface
+ *
+ * @param The sensor interface
+ * @param The register address to write to
+ * @param The value to write
+ *
+ * @return 0 on success, non-zero error on failure.
+ */
+static int
+dps368_spi_write_reg(struct sensor_itf *itf, uint8_t reg, uint8_t value)
+{
+    int rc;
+
+    /* Select the device */
+    hal_gpio_write(itf->si_cs_pin, 0);
+
+    /* Send the register address w/write command */
+    rc = hal_spi_tx_val(itf->si_num, reg & ~DPS368_SPI_READ_CMD_BIT);
+    if (rc == 0xFFFF) {
+        rc = SYS_EINVAL;
+        DPS368_LOG(ERROR, "SPI_%u register write failed addr:0x%02X\n",
+                itf->si_num, reg);
+        goto err;
+    }
+
+    /* Write data */
+    rc = hal_spi_tx_val(itf->si_num, value);
+    if (rc == 0xFFFF) {
+        rc = SYS_EINVAL;
+        DPS368_LOG(ERROR, "SPI_%u write failed addr:0x%02X\n", itf->si_num,
+                reg);
+        goto err;
+    }
+
+    rc = 0;
+
+err:
+    /* De-select the device */
+    hal_gpio_write(itf->si_cs_pin, 1);
+
+    os_time_delay((OS_TICKS_PER_SEC * 30) / 1000 + 1);
+
+    return rc;
+}
+
+
+/**
+ * Read bytes from the specified register using i2c interface
+ *
+ * @param The sensor interface
+ * @param The register address to read from
+ * @param The number of bytes to read
+ * @param Pointer to where the register value should be written
+ *
+ * @return 0 on success, non-zero error on failure.
+ */
+static int
+dps368_i2c_read_regs(struct sensor_itf *itf, uint8_t reg, uint8_t size,
+    uint8_t *buffer)
+{
+    int rc;
+    struct hal_i2c_master_data wdata = {
+        .address = itf->si_addr,
+        .len = 1,
+        .buffer = &reg
+    };
+    struct hal_i2c_master_data rdata = {
+        .address = itf->si_addr,
+        .len = size,
+        .buffer = buffer,
+    };
+
+    rc = i2cn_master_write_read_transact(itf->si_num, &wdata, &rdata,
+            MYNEWT_VAL(DPS368_I2C_TIMEOUT_TICKS) * (size + 1), 1,
+            MYNEWT_VAL(DPS368_I2C_RETRIES));
+    if (rc) {
+        DPS368_LOG(ERROR, "I2C access failed at address 0x%02X\n",
+                itf->si_addr);
+        return rc;
+    }
+
+    return rc;
+}
+
+
+/**
+ *
+ * Read bytes from the specified register using SPI interface
+ *
+ * @param The sensor interface
+ * @param The register address to read from
+ * @param The number of bytes to read
+ * @param Pointer to where the register value should be written
+ *
+ * @return 0 on success, non-zero error on failure.
+ */
+static int
+dps368_spi_read_regs(struct sensor_itf *itf, uint8_t reg, uint8_t size,
+    uint8_t *buffer)
+{
+    int i;
+    uint16_t retval;
+    int rc;
+    rc = 0;
+
+    /* Select the device */
+    hal_gpio_write(itf->si_cs_pin, 0);
+
+    /* Send the address */
+    retval = hal_spi_tx_val(itf->si_num, reg | DPS368_SPI_READ_CMD_BIT);
+    if (retval == 0xFFFF) {
+        rc = SYS_EINVAL;
+        DPS368_LOG(ERROR, "SPI_%u register write failed addr:0x%02X\n",
+                itf->si_num, reg);
+        goto err;
+    }
+
+    for (i = 0; i < size; i++) {
+        /* Read data */
+        retval = hal_spi_tx_val(itf->si_num, 0);
+        if (retval == 0xFFFF) {
+            rc = SYS_EINVAL;
+            DPS368_LOG(ERROR, "SPI_%u read failed addr:0x%02X\n", itf->si_num,
+                    reg);
+            goto err;
+        }
+        buffer[i] = retval;
+    }
+
+    rc = 0;
+
+err:
+    /* De-select the device */
+    hal_gpio_write(itf->si_cs_pin, 1);
+
+    return rc;
+}
+
+#endif
+
+/**
+ * Write a single register to DPS368 value over underlying communication interface
+ *
+ * @param The sensor interface
+ * @param register address
+ * @param variable length payload
+ * @param length of the payload to write
+ */
+int dps368_write_reg(struct sensor_itf *itf, uint8_t addr, uint8_t value)
+{
+    int rc;
+
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+    uint8_t data[2] = { addr, value };
+
+    rc = bus_node_simple_write(itf->si_dev, data, 2);
+#else
+    rc = sensor_itf_lock(itf, MYNEWT_VAL(DPS368_ITF_LOCK_TMO));
+    if (rc) {
+        return rc;
+    }
+
+    if (itf->si_type == SENSOR_ITF_I2C) {
+        rc = dps368_i2c_write_reg(itf, addr, value);
+    } else {
+        rc = dps368_spi_write_reg(itf, addr, value);
+    }
+
+    sensor_itf_unlock(itf);
+#endif
+    
+    return rc;
+}
+
+/**
+ * Read bytes from the specified register using specified interface
+ *
+ * @param The sensor interface
+ * @param The register address to read from
+ * @param The number of bytes to read
+ * @param Pointer to where the register value should be written
+ *
+ * @return 0 on success, non-zero error on failure.
+ */
+int dps368_read_regs(struct sensor_itf *itf, uint8_t addr, uint8_t *buff, uint8_t len)
+{
+    int rc;
+
+#if MYNEWT_VAL(BUS_DRIVER_PRESENT)
+    struct dps368 *dev = (struct dps368 *)itf->si_dev;
+
+    if (dev->node_is_spi) {
+        addr |= DPS368_SPI_READ_CMD_BIT;
+    }
+
+    rc = bus_node_simple_write_read_transact(itf->si_dev, &addr, 1, buff, len);
+#else
+    rc = sensor_itf_lock(itf, MYNEWT_VAL(DPS368_ITF_LOCK_TMO));
+
+    if (rc) {
+        return rc;
+    }
+
+    if (itf->si_type == SENSOR_ITF_I2C) {
+        rc = dps368_i2c_read_regs(itf, addr, len, buff);
+    } else {
+        rc = dps368_spi_read_regs(itf, addr, len, buff);
+    }
+
+    sensor_itf_unlock(itf);
+#endif
+
+    return rc;
+}
+
+
diff --git a/hw/drivers/sensors/dps368/src/dps368_priv.h b/hw/drivers/sensors/dps368/src/dps368_priv.h
index ebcc25a..67ccdaa 100644
--- a/hw/drivers/sensors/dps368/src/dps368_priv.h
+++ b/hw/drivers/sensors/dps368/src/dps368_priv.h
@@ -38,23 +38,11 @@
 
 #define DPS368_SPI_READ_CMD_BIT         0x80
 
-
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 /**
- * sensor stats init
- *
- *
- * @param ptr Device structure
- *
- * @return  nothing
- */
-void
-dps368_stats_int(struct os_dev *dev);
-
-/**
  * Write a single register to DPS368 value over underlying communication interface
  *
  * @param The sensor interface
diff --git a/hw/drivers/sensors/dps368/src/dps368_shell.c b/hw/drivers/sensors/dps368/src/dps368_shell.c
index 934aba9..cfdf669 100644
--- a/hw/drivers/sensors/dps368/src/dps368_shell.c
+++ b/hw/drivers/sensors/dps368/src/dps368_shell.c
@@ -1,120 +1,120 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#include <string.h>
-#include <errno.h>
-#include "os/mynewt.h"
-#include "console/console.h"
-#include "hal/hal_gpio.h"
-#include "dps368/dps368.h"
-#include "dps368_priv.h"
-
-#if MYNEWT_VAL(DPS368_CLI)
-
-#include "shell/shell.h"
-#include "parse/parse.h"
-
-static int dps368_shell_cmd(int argc, char **argv);
-
-static struct shell_cmd dps368_shell_cmd_struct = {
-    .sc_cmd = "dps368",
-    .sc_cmd_func = dps368_shell_cmd
-};
-
-static struct sensor_itf g_sensor_itf = {
-    .si_type = MYNEWT_VAL(DPS368_SHELL_ITF_TYPE),
-    .si_num = MYNEWT_VAL(DPS368_SHELL_ITF_NUM),
-    .si_addr = MYNEWT_VAL(DPS368_SHELL_ITF_ADDR)
-};
-
-static int
-dps368_shell_err_too_many_args(char *cmd_name)
-{
-    console_printf("Error: too many arguments for command \"%s\"\n",
-                   cmd_name);
-    return EINVAL;
-}
-
-static int
-dps368_shell_err_unknown_arg(char *cmd_name)
-{
-    console_printf("Error: unknown argument \"%s\"\n",
-                   cmd_name);
-    return EINVAL;
-}
-
-
-
-static int
-dps368_shell_cmd_read_hw_id(int argc, char **argv)
-{
-    int rc;
-    uint8_t id;
-
-    if (argc > 2) {
-        return dps368_shell_err_too_many_args(argv[1]);
-    }
-
-    rc = dps368_get_hwid(&g_sensor_itf, &id);
-    if (rc) {
-        console_printf("Read falied: %d\r\n", rc);
-        return rc;
-    }
-
-    console_printf("HWID: %x\r\n", id);
-    return 0;
-}
-
-static int
-dps368_shell_help(void)
-{
-    console_printf("%s cmd [flags...]\n", dps368_shell_cmd_struct.sc_cmd);
-    console_printf("cmd:\n");
-    console_printf("\tchipid\n");
-
-    return 0;
-}
-
-static int
-dps368_shell_cmd(int argc, char **argv)
-{
-    if (argc == 1) {
-        return dps368_shell_help();
-    }
-
-    /* Read Chip Id */
-    if (argc > 1 && strcmp(argv[1], "chipid") == 0) {
-        return dps368_shell_cmd_read_hw_id(argc, argv);
-    }
-
-
-    return dps368_shell_err_unknown_arg(argv[1]);
-}
-
-int
-dps368_shell_init(void)
-{
-    int rc;
-    rc = shell_cmd_register(&dps368_shell_cmd_struct);
-    SYSINIT_PANIC_ASSERT(rc == 0);
-
-    return rc;
-}
-
-#endif
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include <string.h>
+#include <errno.h>
+#include "os/mynewt.h"
+#include "console/console.h"
+#include "hal/hal_gpio.h"
+#include "dps368/dps368.h"
+#include "dps368_priv.h"
+
+#if MYNEWT_VAL(DPS368_CLI)
+
+#include "shell/shell.h"
+#include "parse/parse.h"
+
+static int dps368_shell_cmd(int argc, char **argv);
+
+static struct shell_cmd dps368_shell_cmd_struct = {
+    .sc_cmd = "dps368",
+    .sc_cmd_func = dps368_shell_cmd
+};
+
+static struct sensor_itf g_sensor_itf = {
+    .si_type = MYNEWT_VAL(DPS368_SHELL_ITF_TYPE),
+    .si_num = MYNEWT_VAL(DPS368_SHELL_ITF_NUM),
+    .si_addr = MYNEWT_VAL(DPS368_SHELL_ITF_ADDR)
+};
+
+static int
+dps368_shell_err_too_many_args(char *cmd_name)
+{
+    console_printf("Error: too many arguments for command \"%s\"\n",
+                   cmd_name);
+    return EINVAL;
+}
+
+static int
+dps368_shell_err_unknown_arg(char *cmd_name)
+{
+    console_printf("Error: unknown argument \"%s\"\n",
+                   cmd_name);
+    return EINVAL;
+}
+
+
+
+static int
+dps368_shell_cmd_read_hw_id(int argc, char **argv)
+{
+    int rc;
+    uint8_t id;
+
+    if (argc > 2) {
+        return dps368_shell_err_too_many_args(argv[1]);
+    }
+
+    rc = dps368_get_hwid(&g_sensor_itf, &id);
+    if (rc) {
+        console_printf("Read falied: %d\r\n", rc);
+        return rc;
+    }
+
+    console_printf("HWID: %x\r\n", id);
+    return 0;
+}
+
+static int
+dps368_shell_help(void)
+{
+    console_printf("%s cmd [flags...]\n", dps368_shell_cmd_struct.sc_cmd);
+    console_printf("cmd:\n");
+    console_printf("\tchipid\n");
+
+    return 0;
+}
+
+static int
+dps368_shell_cmd(int argc, char **argv)
+{
+    if (argc == 1) {
+        return dps368_shell_help();
+    }
+
+    /* Read Chip Id */
+    if (argc > 1 && strcmp(argv[1], "chipid") == 0) {
+        return dps368_shell_cmd_read_hw_id(argc, argv);
+    }
+
+
+    return dps368_shell_err_unknown_arg(argv[1]);
+}
+
+int
+dps368_shell_init(void)
+{
+    int rc;
+    rc = shell_cmd_register(&dps368_shell_cmd_struct);
+    SYSINIT_PANIC_ASSERT(rc == 0);
+
+    return rc;
+}
+
+#endif