You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by an...@apache.org on 2017/05/17 09:55:51 UTC

[35/43] incubator-mynewt-core git commit: MYNEWT-748 SensorAPI: Add BME280 support

MYNEWT-748 SensorAPI: Add BME280 support

- SensorAPI pressure, temperature and humidity support
- Compiles


Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/commit/ad7cdf09
Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/ad7cdf09
Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/ad7cdf09

Branch: refs/heads/bluetooth5
Commit: ad7cdf093a9cf325df02b4a27bcf1d70529dce9f
Parents: afc404f
Author: Vipul Rahane <vi...@apache.org>
Authored: Mon Apr 24 11:54:02 2017 -0700
Committer: Vipul Rahane <vi...@apache.org>
Committed: Fri May 12 17:08:08 2017 -0700

----------------------------------------------------------------------
 apps/sensors_test/pkg.yml                       |   1 +
 apps/sensors_test/src/main.c                    |  20 +
 apps/sensors_test/syscfg.yml                    |  10 +-
 hw/bsp/nrf52dk/src/hal_bsp.c                    |  12 +
 .../sensors/bme280/include/bme280/bme280.h      | 245 +++++++
 hw/drivers/sensors/bme280/pkg.yml               |  32 +
 hw/drivers/sensors/bme280/src/bme280.c          | 714 +++++++++++++++++++
 hw/drivers/sensors/bme280/src/bme280_priv.h     | 110 +++
 hw/drivers/sensors/bme280/src/bme280_shell.c    | 364 ++++++++++
 hw/drivers/sensors/bme280/syscfg.yml            |  38 +
 hw/sensor/src/sensor_shell.c                    |  14 +-
 11 files changed, 1554 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/ad7cdf09/apps/sensors_test/pkg.yml
----------------------------------------------------------------------
diff --git a/apps/sensors_test/pkg.yml b/apps/sensors_test/pkg.yml
index 4f8e25c..9f56e7b 100644
--- a/apps/sensors_test/pkg.yml
+++ b/apps/sensors_test/pkg.yml
@@ -33,6 +33,7 @@ pkg.deps:
     - hw/drivers/sensors/tsl2561
     - hw/drivers/sensors/bno055
     - hw/drivers/sensors/tcs34725
+    - hw/drivers/sensors/bme280
     - boot/bootutil
     - sys/shell
     - sys/config

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/ad7cdf09/apps/sensors_test/src/main.c
----------------------------------------------------------------------
diff --git a/apps/sensors_test/src/main.c b/apps/sensors_test/src/main.c
index d05cb94..152d48e 100755
--- a/apps/sensors_test/src/main.c
+++ b/apps/sensors_test/src/main.c
@@ -34,6 +34,7 @@
 #include <tsl2561/tsl2561.h>
 #include <tcs34725/tcs34725.h>
 #include <bno055/bno055.h>
+#include <bme280/bme280.h>
 #include "flash_map/flash_map.h"
 #include <hal/hal_system.h>
 #if MYNEWT_VAL(SPLIT_LOADER)
@@ -386,6 +387,25 @@ config_sensor(void)
     struct os_dev *dev;
     int rc;
 
+#if MYNEWT_VAL(BME280_PRESENT)
+    struct bme280_cfg bmecfg;
+
+    dev = (struct os_dev *) os_dev_open("bme280", OS_TIMEOUT_NEVER, NULL);
+    assert(dev != NULL);
+    rc = bme280_init(dev, NULL);
+    if (rc) {
+        os_dev_close(dev);
+        goto err;
+    }
+
+    rc = bme280_config((struct bme280 *)dev, &bmecfg);
+    if (rc) {
+        os_dev_close(dev);
+        goto err;
+    }
+    os_dev_close(dev);
+#endif
+
 #if MYNEWT_VAL(TCS34725_PRESENT)
     struct tcs34725_cfg tcscfg;
 

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/ad7cdf09/apps/sensors_test/syscfg.yml
----------------------------------------------------------------------
diff --git a/apps/sensors_test/syscfg.yml b/apps/sensors_test/syscfg.yml
index 81876bc..8172a62 100644
--- a/apps/sensors_test/syscfg.yml
+++ b/apps/sensors_test/syscfg.yml
@@ -42,8 +42,9 @@ syscfg.vals:
     CONFIG_NEWTMGR: 0
 
     TSL2561_CLI: 0
-    BNO055_CLI: 1
-    TCS34725_CLI: 1
+    BNO055_CLI: 0
+    TCS34725_CLI: 0
+    BME280_CLI: 0
 
     # Setup Sensor BLE OIC GATT Server
     SENSOR_OIC: 1
@@ -65,10 +66,13 @@ syscfg.defs:
         value : 0
     BNO055_PRESENT:
         description: 'BNO055 is present'
+        value : 0
+    BME280_PRESENT:
+        description: 'BME280 is present'
         value : 1
     TCS34725_PRESENT:
         description: 'TCS34725 is present'
-        value : 1
+        value : 0
     SIM_ACCEL_PRESENT:
         description: 'SIM ACCEL is present'
         value : 0

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/ad7cdf09/hw/bsp/nrf52dk/src/hal_bsp.c
----------------------------------------------------------------------
diff --git a/hw/bsp/nrf52dk/src/hal_bsp.c b/hw/bsp/nrf52dk/src/hal_bsp.c
index c0031b1..46c084d 100644
--- a/hw/bsp/nrf52dk/src/hal_bsp.c
+++ b/hw/bsp/nrf52dk/src/hal_bsp.c
@@ -55,6 +55,9 @@ static struct lsm303dlhc lsm303dlhc;
 #if MYNEWT_VAL(TCS34725_PRESENT)
 #include <tcs34725/tcs34725.h>
 #endif
+#if MYNEWT_VAL(BME280_PRESENT)
+#include <bme280/bme280.h>
+#endif
 
 #if MYNEWT_VAL(LSM303DLHC_PRESENT)
 static struct lsm303dlhc lsm303dlhc;
@@ -72,6 +75,10 @@ static struct tsl2561 tsl2561;
 static struct tcs34725 tcs34725;
 #endif
 
+#if MYNEWT_VAL(BME280_PRESENT)
+static struct bme280 bme280;
+#endif
+
 #if MYNEWT_VAL(UART_0)
 static struct uart_dev os_bsp_uart0;
 static const struct nrf52_uart_cfg os_bsp_uart0_cfg = {
@@ -234,6 +241,11 @@ sensor_dev_create(void)
     assert(rc == 0);
 #endif
 
+#if MYNEWT_VAL(BME280_PRESENT)
+    rc = os_dev_create((struct os_dev *) &bme280, "bme280",
+      OS_DEV_INIT_PRIMARY, 0, color_init, NULL);
+    assert(rc == 0);
+#endif
 }
 
 void

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/ad7cdf09/hw/drivers/sensors/bme280/include/bme280/bme280.h
----------------------------------------------------------------------
diff --git a/hw/drivers/sensors/bme280/include/bme280/bme280.h b/hw/drivers/sensors/bme280/include/bme280/bme280.h
new file mode 100644
index 0000000..f5ea131
--- /dev/null
+++ b/hw/drivers/sensors/bme280/include/bme280/bme280.h
@@ -0,0 +1,245 @@
+/*
+ * 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.
+ */
+
+
+#ifndef __BME280_H__
+#define __BME280_H__
+
+#include <os/os.h>
+#include "os/os_dev.h"
+#include "sensor/sensor.h"
+
+#define BME280_SPI_READ_CMD_BIT 0x80
+
+/* Sampling */
+#define BME280_SAMPLING_NONE     0x0
+#define BME280_SAMPLING_X1       0x1
+#define BME280_SAMPLING_X2       0x2
+#define BME280_SAMPLING_X4       0x3
+#define BME280_SAMPLING_X8       0x4
+#define BME280_SAMPLING_X16      0x5
+
+/* Operating modes */
+#define BME280_MODE_SLEEP        0x0
+#define BME280_MODE_FORCED       0x1
+#define BME280_MODE_NORMAL       0x3
+
+/* Filter settings */
+#define BME280_FILTER_OFF        0x0
+#define BME280_FILTER_X2         0x1
+#define BME280_FILTER_X4         0x2
+#define BME280_FILTER_X8         0x3
+#define BME280_FILTER_X16        0x4
+
+/* Standby durations in ms */
+#define BME280_STANDBY_MS_0_5    0x0
+#define BME280_STANDBY_MS_10     0x6
+#define BME280_STANDBY_MS_20     0x7
+#define BME280_STANDBY_MS_62_5   0x1
+#define BME280_STANDBY_MS_125    0x2
+#define BME280_STANDBY_MS_250    0x3
+#define BME280_STANDBY_MS_500    0x4
+#define BME280_STANDBY_MS_1000   0x5
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct bme280_calib_data {
+    uint16_t bcd_dig_T1;
+    int16_t  bcd_dig_T2;
+    int16_t  bcd_dig_T3;
+
+    uint16_t bcd_dig_P1;
+    int16_t  bcd_dig_P2;
+    int16_t  bcd_dig_P3;
+    int16_t  bcd_dig_P4;
+    int16_t  bcd_dig_P5;
+    int16_t  bcd_dig_P6;
+    int16_t  bcd_dig_P7;
+    int16_t  bcd_dig_P8;
+    int16_t  bcd_dig_P9;
+
+    uint8_t  bcd_dig_H1;
+    int16_t  bcd_dig_H2;
+    uint8_t  bcd_dig_H3;
+    int16_t  bcd_dig_H4;
+    int16_t  bcd_dig_H5;
+    int8_t   bcd_dig_H6;
+};
+
+struct bme280_over_cfg {
+    sensor_type_t boc_type;
+    uint8_t boc_oversample;
+};
+
+struct bme280_cfg {
+    uint8_t bc_iir;
+    struct bme280_over_cfg bc_boc[3];
+    uint8_t bc_mode;
+};
+
+struct bme280 {
+    struct os_dev dev;
+    struct sensor sensor;
+    struct bme280_cfg cfg;
+    os_time_t last_read_time;
+};
+
+/**
+ * Initialize the bme280.
+ *
+ * @param dev  Pointer to the bme280_dev device descriptor
+ *
+ * @return 0 on success, and non-zero error code on failure
+ */
+int bme280_init(struct os_dev *dev, void *arg);
+
+/**
+ * Sets IIR filter
+ *
+ * @param filter setting
+ *
+ * @return 0 on success, and non-zero error code on failure
+ */
+int bme280_set_iir(uint8_t iir);
+
+/**
+ * Get IIR filter setting
+ *
+ * @param ptr to fill up iir setting into
+ *
+ * @return 0 on success, and non-zero error code on failure
+ */
+int bme280_get_iir(uint8_t *iir);
+
+/**
+ * Gets a new data sample from the sensor.
+ *
+ * @param temperature sensor output
+ * @param pressure sensor output
+ * @param humidity sensor output
+ * @param bme280 config and OS device structure
+ *
+ * @return 0 on success, and non-zero error code on failure
+ */
+int bme280_get_data(uint32_t *temp, uint32_t *press, uint32_t *humidity,
+                    struct bme280 *bme280);
+
+/**
+ * Gets temperature
+ *
+ * @param temperature
+ *
+ * @return 0 on success, and non-zero error code on failure
+ */
+int bme280_get_temperature(uint32_t *temp);
+
+/**
+ * Gets pressure
+ *
+ * @param pressure
+ *
+ * @return 0 on success, and non-zero error code on failure
+ */
+int bme280_get_pressure(uint32_t *press);
+
+/**
+ * Gets humidity
+ *
+ * @param humidity
+ *
+ * @return 0 on success, and non-zero error code on failure
+ */
+int bme280_get_humidity(uint32_t *humidity);
+
+/**
+ * Sets the sampling rate
+ *
+ * @param sensor type
+ * @param sampling rate
+ *
+ * @return 0 on success, and non-zero error code on failure
+ */
+int bme280_set_oversample(sensor_type_t type, uint8_t rate);
+
+/**
+ * Gets the current sampling rate for the type of sensor
+ *
+ * @param Type of sensor to return sampling rate
+ *
+ * @return 0 on success, non-zero on failure
+ */
+int bme280_get_oversample(sensor_type_t type, uint8_t *rate);
+
+/**
+ * Sets the operating mode
+ *
+ * @param mode
+ *
+ * @return 0 on success, and non-zero error code on failure
+ */
+int bme280_set_mode(uint8_t mode);
+
+/**
+ * Gets the operating mode
+ *
+ * @param ptr to the mode variable to be filled up
+ *
+ * @return 0 on success, and non-zero error code on failure
+ */
+int bme280_get_mode(uint8_t *mode);
+
+/**
+ * Resets the BME280 chip
+ *
+ * @return 0 on success, non-zero on failure
+ */
+int
+bme280_reset(void);
+
+/**
+ * Configure BME280 sensor
+ *
+ * @param Sensor device BME280 structure
+ * @param Sensor device BME280 config
+ *
+ * @return 0 on success, and non-zero error code on failure
+ */
+int bme280_config(struct bme280 *bme280, struct bme280_cfg *cfg);
+
+/**
+ * Get the chip id
+ *
+ * @param ptr to fill up the chip id
+ *
+ * @return 0 on success, and non-zero error code on failure
+ */
+int
+bme280_get_chipid(uint8_t *chipid);
+
+#if MYNEWT_VAL(BME280_CLI)
+int bme280_shell_init(void);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __BME280_H__ */

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/ad7cdf09/hw/drivers/sensors/bme280/pkg.yml
----------------------------------------------------------------------
diff --git a/hw/drivers/sensors/bme280/pkg.yml b/hw/drivers/sensors/bme280/pkg.yml
new file mode 100644
index 0000000..496e35e
--- /dev/null
+++ b/hw/drivers/sensors/bme280/pkg.yml
@@ -0,0 +1,32 @@
+#
+# 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.
+#
+
+pkg.name: hw/drivers/sensors/bme280
+pkg.description: Driver for the BME280 light to digital sensor
+pkg.author: "Vipul Rahane <vi...@runtime.io>"
+pkg.homepage: "http://www.runtime.io/"
+pkg.keywords:
+    - adafruit
+    - bme280
+    - spi
+    - sensor
+
+pkg.deps:
+    - "@apache-mynewt-core/kernel/os"
+    - "@apache-mynewt-core/hw/hal"

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/ad7cdf09/hw/drivers/sensors/bme280/src/bme280.c
----------------------------------------------------------------------
diff --git a/hw/drivers/sensors/bme280/src/bme280.c b/hw/drivers/sensors/bme280/src/bme280.c
new file mode 100644
index 0000000..ca5ee0a
--- /dev/null
+++ b/hw/drivers/sensors/bme280/src/bme280.c
@@ -0,0 +1,714 @@
+/*
+ * 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 "defs/error.h"
+#include "os/os.h"
+#include "sysinit/sysinit.h"
+#include "hal/hal_spi.h"
+#include "sensor/sensor.h"
+#include "bme280/bme280.h"
+#include "bme280_priv.h"
+#include "hal/hal_gpio.h"
+
+#if MYNEWT_VAL(BME280_LOG)
+#include "log/log.h"
+#endif
+
+#if MYNEWT_VAL(BME280_STATS)
+#include "stats/stats.h"
+#endif
+
+static struct hal_spi_settings spi_bme280_settings = {
+    .data_order = HAL_SPI_MSB_FIRST,
+    .data_mode  = HAL_SPI_MODE0,
+    .baudrate   = 500,
+    .word_size  = HAL_SPI_WORD_SIZE_8BIT,
+};
+
+#if MYNEWT_VAL(BME280_STATS)
+/* Define the stats section and records */
+STATS_SECT_START(bme280_stat_section)
+    STATS_SECT_ENTRY(errors)
+STATS_SECT_END
+
+/* Define stat names for querying */
+STATS_NAME_START(bme280_stat_section)
+    STATS_NAME(bme280_stat_section, errors)
+STATS_NAME_END(bme280_stat_section)
+
+/* Global variable used to hold stats data */
+STATS_SECT_DECL(bme280_stat_section) g_bme280stats;
+#endif
+
+#if MYNEWT_VAL(BME280_LOG)
+#define LOG_MODULE_BME280    (2561)
+#define BME280_INFO(...)     LOG_INFO(&_log, LOG_MODULE_BME280, __VA_ARGS__)
+#define BME280_ERR(...)      LOG_ERROR(&_log, LOG_MODULE_BME280, __VA_ARGS__)
+static struct log _log;
+#else
+#define BME280_INFO(...)
+#define BME280_ERR(...)
+#endif
+
+/* Exports for the sensor interface.
+ */
+static void *bme280_sensor_get_interface(struct sensor *, sensor_type_t);
+static int bme280_sensor_read(struct sensor *, sensor_type_t,
+        sensor_data_func_t, void *, uint32_t);
+static int bme280_sensor_get_config(struct sensor *, sensor_type_t,
+        struct sensor_cfg *);
+
+static const struct sensor_driver g_bme280_sensor_driver = {
+    bme280_sensor_get_interface,
+    bme280_sensor_read,
+    bme280_sensor_get_config
+};
+
+static int
+bme280_default_cfg(struct bme280_cfg *cfg)
+{
+    cfg->bc_iir = BME280_FILTER_OFF;
+    cfg->bc_mode = BME280_MODE_NORMAL;
+
+    cfg->bc_boc[0].boc_type = SENSOR_TYPE_TEMPERATURE;
+    cfg->bc_boc[0].boc_oversample = BME280_SAMPLING_NONE;
+    cfg->bc_boc[1].boc_type = SENSOR_TYPE_PRESSURE;
+    cfg->bc_boc[1].boc_oversample = BME280_SAMPLING_NONE;
+    cfg->bc_boc[2].boc_type = SENSOR_TYPE_RELATIVE_HUMIDITY;
+    cfg->bc_boc[2].boc_oversample = BME280_SAMPLING_NONE;
+
+    return 0;
+}
+
+/**
+ * Expects to be called back through os_dev_create().
+ *
+ * @param The device object associated with bme280
+ * @param Argument passed to OS device init, unused
+ *
+ * @return 0 on success, non-zero error on failure.
+ */
+int
+bme280_init(struct os_dev *dev, void *arg)
+{
+    struct bme280 *bme280;
+    struct sensor *sensor;
+    int rc;
+
+    bme280 = (struct bme280 *) dev;
+
+    rc = bme280_default_cfg(&bme280->cfg);
+    if (rc) {
+        goto err;
+    }
+
+#if MYNEWT_VAL(BME280_LOG)
+    log_register("bme280", &_log, &log_console_handler, NULL, LOG_SYSLEVEL);
+#endif
+
+    sensor = &bme280->sensor;
+
+#if MYNEWT_VAL(BME280_STATS)
+    /* Initialise the stats entry */
+    rc = stats_init(
+        STATS_HDR(g_bme280stats),
+        STATS_SIZE_INIT_PARMS(g_bme280stats, STATS_SIZE_32),
+        STATS_NAME_INIT_PARMS(bme280_stat_section));
+    SYSINIT_PANIC_ASSERT(rc == 0);
+    /* Register the entry with the stats registry */
+    rc = stats_register("bme280", STATS_HDR(g_bme280stats));
+    SYSINIT_PANIC_ASSERT(rc == 0);
+#endif
+    rc = sensor_init(sensor, dev);
+    if (rc != 0) {
+        goto err;
+    }
+
+    /* Add the driver */
+    rc = sensor_set_driver(sensor, SENSOR_TYPE_TEMPERATURE |
+                           SENSOR_TYPE_PRESSURE            |
+                           SENSOR_TYPE_RELATIVE_HUMIDITY,
+                           (struct sensor_driver *) &g_bme280_sensor_driver);
+    if (rc != 0) {
+        goto err;
+    }
+
+    rc = sensor_mgr_register(sensor);
+    if (rc != 0) {
+        goto err;
+    }
+
+    rc = hal_spi_config(MYNEWT_VAL(BME280_SPINUM), &spi_bme280_settings);
+    if (rc) {
+        goto err;
+    }
+
+    rc = hal_spi_enable(MYNEWT_VAL(BME280_SPINUM));
+    if (rc) {
+        goto err;
+    }
+
+    rc = hal_gpio_init_out(MYNEWT_VAL(BME280_CSPIN), 1);
+    if (rc) {
+        goto err;
+    }
+
+    return (0);
+err:
+    return (rc);
+
+}
+
+static void *
+bme280_sensor_get_interface(struct sensor *sensor, sensor_type_t type)
+{
+    return (NULL);
+}
+
+static int
+bme280_sensor_read(struct sensor *sensor, sensor_type_t type,
+        sensor_data_func_t data_func, void *data_arg, uint32_t timeout)
+{
+    uint32_t temp;
+    uint32_t press;
+    uint32_t humid;
+    int rc;
+
+    if (!(type & SENSOR_TYPE_PRESSURE)    ||
+        !(type & SENSOR_TYPE_TEMPERATURE) ||
+        !(type & SENSOR_TYPE_RELATIVE_HUMIDITY)) {
+        rc = SYS_EINVAL;
+        goto err;
+    }
+
+    temp = press = humid = 0;
+
+    /* Get a new pressure sample */
+    if (type & SENSOR_TYPE_PRESSURE) {
+        rc = bme280_get_pressure(&press);
+        if (rc) {
+            goto err;
+        }
+
+        //lux = bme280_calculate_lux(full, ir, &(bme280->cfg));
+
+        /* Call data function */
+        rc = data_func(sensor, data_arg, &press);
+        if (rc) {
+            goto err;
+        }
+    }
+
+    /* Get a new temperature sample */
+    if (type & SENSOR_TYPE_TEMPERATURE) {
+        rc = bme280_get_temperature(&temp);
+        if (rc) {
+            goto err;
+        }
+
+        //lux = bme280_calculate_lux(full, ir, &(bme280->cfg));
+
+        /* Call data function */
+        rc = data_func(sensor, data_arg, &temp);
+        if (rc) {
+            goto err;
+        }
+    }
+
+    /* Get a new relative humidity sample */
+    if (type & SENSOR_TYPE_RELATIVE_HUMIDITY) {
+        rc = bme280_get_humidity(&humid);
+        if (rc) {
+            goto err;
+        }
+
+        //lux = bme280_calculate_lux(full, ir, &(bme280->cfg));
+
+        /* Call data function */
+        rc = data_func(sensor, data_arg, &humid);
+        if (rc) {
+            goto err;
+        }
+    }
+
+    return 0;
+err:
+    return rc;
+}
+
+static int
+bme280_sensor_get_config(struct sensor *sensor, sensor_type_t type,
+        struct sensor_cfg *cfg)
+{
+    int rc;
+
+    if (!(type & SENSOR_TYPE_PRESSURE)    ||
+        !(type & SENSOR_TYPE_TEMPERATURE) ||
+        !(type & SENSOR_TYPE_RELATIVE_HUMIDITY)) {
+        rc = SYS_EINVAL;
+        goto err;
+    }
+
+    cfg->sc_valtype = SENSOR_VALUE_TYPE_INT32;
+
+    return (0);
+err:
+    return (rc);
+}
+
+/**
+ * Configure BME280 sensor
+ *
+ * @param Sensor device BME280 structure
+ * @param Sensor device BME280 config
+ *
+ * @return 0 on success, non-zero on failure
+ */
+int
+bme280_config(struct bme280 *bme280, struct bme280_cfg *cfg)
+{
+    int rc;
+
+    rc = bme280_set_iir(cfg->bc_iir);
+
+    rc |= bme280_set_mode(cfg->bc_mode);
+
+    rc |= bme280_set_oversample(cfg->bc_boc[0].boc_type,
+                                cfg->bc_boc[0].boc_oversample);
+
+    rc |= bme280_set_oversample(cfg->bc_boc[1].boc_type,
+                                cfg->bc_boc[1].boc_oversample);
+
+    rc |= bme280_set_oversample(cfg->bc_boc[2].boc_type,
+                                cfg->bc_boc[2].boc_oversample);
+
+    if (rc) {
+        goto err;
+    }
+
+    /* Overwrite the configuration data. */
+    memcpy(&bme280->cfg, cfg, sizeof(*cfg));
+
+err:
+    return (rc);
+}
+
+/**
+ * Read multiple length data from BME280 sensor over SPI
+ *
+ * @param register address
+ * @param variable length payload
+ * @param length of the payload to read
+ *
+ * @return 0 on success, non-zero on failure
+ */
+int
+bme280_readlen(uint8_t addr, uint8_t *payload, uint8_t len)
+{
+    int i;
+    int rc;
+    uint8_t txdata;
+    uint8_t rxdata;
+
+    /* Select the device */
+    hal_gpio_write(MYNEWT_VAL(BME280_CSPIN), 0);
+
+    /* Send the address */
+    rc = hal_spi_tx_val(MYNEWT_VAL(BME280_SPINUM), addr | BME280_SPI_READ_CMD_BIT);
+    if (rc) {
+        goto err;
+    }
+
+    txdata = 0;
+
+    for (i = 0; i < len; i++) {
+        /* Read data */
+        rc = hal_spi_txrx(MYNEWT_VAL(BME280_SPINUM), &txdata, &rxdata, 1);
+        if (rc) {
+            goto err;
+        }
+
+        payload[i] = rxdata;
+    }
+
+    /* De-select the device */
+    hal_gpio_write(MYNEWT_VAL(BME280_CSPIN), 1);
+
+    return 0;
+err:
+    return rc;
+}
+
+/**
+ * Write multiple length data to BME280 sensor over SPI
+ *
+ * @param register address
+ * @param variable length payload
+ * @param length of the payload to write
+ *
+ * @return 0 on success, non-zero on failure
+ */
+int
+bme280_writelen(uint8_t addr, uint8_t *payload, uint8_t len)
+{
+    int i;
+    int rc;
+
+    /* Select the device */
+    hal_gpio_write(MYNEWT_VAL(BME280_CSPIN), 0);
+
+    /* Send the address */
+    rc = hal_spi_tx_val(MYNEWT_VAL(BME280_SPINUM), addr | BME280_SPI_READ_CMD_BIT);
+    if (rc) {
+        goto err;
+    }
+
+    for (i = 0; i < len; i++) {
+        /* Read data */
+        rc = hal_spi_tx_val(MYNEWT_VAL(BME280_SPINUM), payload[i]);
+        if (rc) {
+            goto err;
+        }
+    }
+
+    /* De-select the device */
+    hal_gpio_write(MYNEWT_VAL(BME280_CSPIN), 1);
+
+    return 0;
+err:
+    return rc;
+}
+
+/**
+ * Gets temperature
+ *
+ * @param temperature
+ *
+ * @return 0 on success, and non-zero error code on failure
+ */
+int
+bme280_get_temperature(uint32_t *temp)
+{
+    int rc;
+    uint8_t tmp[3];
+
+    rc = bme280_readlen(BME280_REG_ADDR_TEMP, tmp, 3);
+    if (rc) {
+        goto err;
+    }
+
+    *temp = (tmp[1] << 8 | tmp[0]) << 4 | (tmp[2] >> 4);
+
+err:
+    return rc;
+}
+
+/**
+ * Gets humidity
+ *
+ * @param humidity
+ *
+ * @return 0 on success, and non-zero error code on failure
+ */
+int
+bme280_get_humidity(uint32_t *humid)
+{
+    int rc;
+    uint8_t tmp[2];
+
+    rc = bme280_readlen(BME280_REG_ADDR_HUM, tmp, 2);
+    if (rc) {
+        goto err;
+    }
+
+    *humid = (tmp[1] << 8 | tmp[0]);
+
+err:
+    return rc;
+}
+
+/**
+ * Gets pressure
+ *
+ * @param pressure
+ *
+ * @return 0 on success, and non-zero error code on failure
+ */
+int
+bme280_get_pressure(uint32_t *press)
+{
+    int rc;
+    uint8_t tmp[3];
+
+    rc = bme280_readlen(BME280_REG_ADDR_PRESS, tmp, 2);
+    if (rc) {
+        goto err;
+    }
+
+    *press = (tmp[1] << 8 | tmp[0]) << 4 | (tmp[2] >> 4);
+
+err:
+    return rc;
+}
+
+/**
+ * Resets the BME280 chip
+ *
+ * @return 0 on success, non-zero on failure
+ */
+int
+bme280_reset(void)
+{
+    uint8_t txdata;
+
+    txdata = 1;
+
+    return bme280_writelen(BME280_REG_ADDR_RESET, &txdata, 1);
+}
+
+/**
+ * Get IIR filter setting
+ *
+ * @param ptr to fill up iir setting into
+ *
+ * @return 0 on success, non-zero on failure
+ */
+int
+bme280_get_iir(uint8_t *iir)
+{
+    int rc;
+    uint8_t tmp;
+
+    rc = bme280_readlen(BME280_REG_ADDR_CONFIG, &tmp, 1);
+    if (rc) {
+        goto err;
+    }
+
+    *iir = ((tmp & BME280_REG_CONFIG_FILTER) >> 5);
+
+err:
+    return rc;
+}
+
+/**
+ * Sets IIR filter
+ *
+ * @param filter setting
+ *
+ * @return 0 on success, non-zero on failure
+ */
+int
+bme280_set_iir(uint8_t iir)
+{
+    int rc;
+    uint8_t cfg;
+
+    rc = bme280_readlen(BME280_REG_ADDR_CONFIG, &cfg, 1);
+    if (rc) {
+        goto err;
+    }
+
+    iir = cfg | ((iir << 5) & BME280_REG_CONFIG_FILTER);
+
+    rc = bme280_writelen(BME280_REG_ADDR_CONFIG, &iir, 1);
+    if (rc) {
+        goto err;
+    }
+
+    return 0;
+err:
+    return rc;
+}
+
+/**
+ * Gets the operating mode
+ *
+ * @param ptr to the mode variable to be filled up
+ *
+ * @return 0 on success, and non-zero error code on failure
+ */
+int
+bme280_get_mode(uint8_t *mode)
+{
+    int rc;
+    uint8_t tmp;
+
+    rc = bme280_readlen(BME280_REG_ADDR_CTRL_MEAS, &tmp, 1);
+    if (rc) {
+        goto err;
+    }
+
+    *mode = (tmp & BME280_REG_CTRL_MEAS_MODE);
+
+err:
+    return rc;
+}
+
+/**
+ * Sets the operating mode
+ *
+ * @param mode
+ *
+ * @return 0 on success, and non-zero error code on failure
+ */
+int
+bme280_set_mode(uint8_t mode)
+{
+    int rc;
+    uint8_t cfg;
+
+    rc = bme280_readlen(BME280_REG_ADDR_CTRL_MEAS, &cfg, 1);
+    if (rc) {
+        goto err;
+    }
+
+    mode = cfg | (mode & BME280_REG_CTRL_MEAS_MODE);
+
+    rc = bme280_writelen(BME280_REG_ADDR_CTRL_MEAS, &mode, 1);
+    if (rc) {
+        goto err;
+    }
+
+    return 0;
+err:
+    return rc;
+}
+
+/**
+ * Gets the current sampling rate for the type of sensor
+ *
+ * @param Type of sensor to return sampling rate
+ *
+ * @return 0 on success, non-zero on failure
+ */
+int
+bme280_get_oversample(sensor_type_t type, uint8_t *oversample)
+{
+    int rc;
+    uint8_t tmp;
+
+    if (type & SENSOR_TYPE_TEMPERATURE || type & SENSOR_TYPE_PRESSURE) {
+        rc = bme280_readlen(BME280_REG_ADDR_CTRL_MEAS, &tmp, 1);
+        if (rc) {
+            goto err;
+        }
+
+        if (type & SENSOR_TYPE_TEMPERATURE) {
+            *oversample = ((tmp & BME280_REG_CTRL_MEAS_TOVER) >> 5);
+        }
+
+        if (type & SENSOR_TYPE_PRESSURE) {
+            *oversample = ((tmp & BME280_REG_CTRL_MEAS_POVER) >> 3);
+        }
+    }
+
+    if (type & SENSOR_TYPE_RELATIVE_HUMIDITY) {
+        rc = bme280_readlen(BME280_REG_ADDR_CTRL_HUM, &tmp, 1);
+        if (rc) {
+            goto err;
+        }
+        *oversample = (tmp & BME280_REG_CTRL_HUM_HOVER);
+    }
+
+    return 0;
+err:
+    return rc;
+}
+
+/**
+ * Sets the sampling rate
+ *
+ * @param sensor type
+ * @param sampling rate
+ *
+ * @return 0 on success, and non-zero error code on failure
+ */
+int
+bme280_set_oversample(sensor_type_t type, uint8_t oversample)
+{
+    int rc;
+    uint8_t cfg;
+
+    if (type & SENSOR_TYPE_TEMPERATURE || type & SENSOR_TYPE_PRESSURE) {
+        rc = bme280_readlen(BME280_REG_ADDR_CTRL_MEAS, &cfg, 1);
+        if (rc) {
+            goto err;
+        }
+
+        if (type & SENSOR_TYPE_TEMPERATURE) {
+            oversample = cfg | ((oversample << 5) & BME280_REG_CTRL_MEAS_TOVER);
+        }
+
+        if (type & SENSOR_TYPE_PRESSURE) {
+            oversample = cfg | ((oversample << 3) & BME280_REG_CTRL_MEAS_POVER);
+        }
+
+        rc = bme280_writelen(BME280_REG_ADDR_CTRL_MEAS, &oversample, 1);
+        if (rc) {
+            goto err;
+        }
+    }
+
+    if (type & SENSOR_TYPE_RELATIVE_HUMIDITY) {
+        rc = bme280_readlen(BME280_REG_ADDR_CTRL_HUM, &cfg, 1);
+        if (rc) {
+            goto err;
+        }
+
+        oversample = cfg | (oversample & BME280_REG_CTRL_HUM_HOVER);
+
+        rc = bme280_writelen(BME280_REG_ADDR_CTRL_HUM, &oversample, 1);
+        if (rc) {
+            goto err;
+        }
+    }
+
+    return 0;
+err:
+    return rc;
+}
+
+/**
+ * Get the chip id
+ *
+ * @param ptr to fill up the chip id
+ *
+ * @return 0 on success, non-zero on failure
+ */
+int
+bme280_get_chipid(uint8_t *chipid)
+{
+    int rc;
+    uint8_t tmp;
+
+    rc = bme280_readlen(BME280_REG_ADDR_PRESS, &tmp, 1);
+    if (rc) {
+        goto err;
+    }
+
+    *chipid = tmp;
+
+err:
+    return rc;
+}

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/ad7cdf09/hw/drivers/sensors/bme280/src/bme280_priv.h
----------------------------------------------------------------------
diff --git a/hw/drivers/sensors/bme280/src/bme280_priv.h b/hw/drivers/sensors/bme280/src/bme280_priv.h
new file mode 100644
index 0000000..1c93aeb
--- /dev/null
+++ b/hw/drivers/sensors/bme280/src/bme280_priv.h
@@ -0,0 +1,110 @@
+/*
+ * 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.
+ */
+
+#ifndef __BME280_PRIV_H__
+#define __BME280_PRIV_H__
+
+#define BME280_REG_ADDR_DIG_T1            0x88
+#define BME280_REG_ADDR_DIG_T2            0x8A
+#define BME280_REG_ADDR_DIG_T3            0x8C
+
+#define BME280_REG_ADDR_DIG_P1            0x8E
+#define BME280_REG_ADDR_DIG_P2            0x90
+#define BME280_REG_ADDR_DIG_P3            0x92
+#define BME280_REG_ADDR_DIG_P4            0x94
+#define BME280_REG_ADDR_DIG_P5            0x96
+#define BME280_REG_ADDR_DIG_P6            0x98
+#define BME280_REG_ADDR_DIG_P7            0x9A
+#define BME280_REG_ADDR_DIG_P8            0x9C
+#define BME280_REG_ADDR_DIG_P9            0x9E
+
+#define BME280_REG_ADDR_DIG_H1            0xA1
+#define BME280_REG_ADDR_DIG_H2            0xE1
+#define BME280_REG_ADDR_DIG_H3            0xE3
+#define BME280_REG_ADDR_DIG_H4            0xE4
+#define BME280_REG_ADDR_DIG_H5            0xE5
+#define BME280_REG_ADDR_DIG_H6            0xE7
+
+#define BME280_REG_ADDR_CHIPID            0xD0
+#define BME280_REG_ADDR_VERSION           0xD1
+#define BME280_REG_ADDR_SOFTRESET         0xE0
+
+#define BME280_REG_ADDR_CAL26             0xE1  // R calibration stored in 0xE1-0xF0
+
+#define BME280_REG_ADDR_CTRL_HUM          0xF2
+#define BME280_REG_CTRL_HUM_NONE        (0x1F)
+#define BME280_REG_CTRL_HUM_HOVER       (0x11)
+
+#define BME280_REG_ADDR_STATUS            0XF3
+#define BME280_REG_STATUS_MEAS            0x04
+#define BME280_REG_STATUS_IM_UP           0x01
+
+#define BME280_REG_ADDR_CTRL_MEAS         0xF4
+#define BME280_REG_CTRL_MEAS_TOVER (0x11 << 5)
+#define BME280_REG_CTRL_MEAS_POVER (0x11 << 3)
+#define BME280_REG_CTRL_MEAS_MODE       (0x11)
+
+#define BME280_REG_ADDR_CONFIG            0xF5
+#define BME280_REG_CONFIG_STANDBY  (0x11 << 5)
+#define BME280_REG_CONFIG_FILTER   (0x11 << 3)
+#define BME280_REG_CONFIG_SPI3_EN        (0x1)
+
+#define BME280_REG_ADDR_PRESS             0xF7
+#define BME280_REG_ADDR_PRESS_MSB         0xF7
+#define BME280_REG_ADDR_PRESS_LSB         0xF8
+#define BME280_REG_ADDR_PRESS_XLSB        0xF9
+
+#define BME280_REG_ADDR_TEMP              0xFA
+#define BME280_REG_ADDR_TEMP_MSB          0xFA
+#define BME280_REG_ADDR_TEMP_LSB          0xFB
+#define BME280_REG_ADDR_TEMP_XLSB         0xFC
+
+#define BME280_REG_ADDR_HUM               0xFD
+
+#define BME280_REG_ADDR_RESET             0xE0
+
+#define BME280_REG_CHIPID                 0x60
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Write multiple length data to BME280 sensor over SPI
+ *
+ * @param register address
+ * @param variable length payload
+ * @param length of the payload to write
+ */
+int bme280_writelen(uint8_t addr, uint8_t *payload, uint8_t len);
+
+/**
+ * Read multiple length data from BME280 sensor over SPI
+ *
+ * @param register address
+ * @param variable length payload
+ * @param length of the payload to read
+ */
+int bme280_readlen(uint8_t addr, uint8_t *payload, uint8_t len);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __BME280_PRIV_H_ */

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/ad7cdf09/hw/drivers/sensors/bme280/src/bme280_shell.c
----------------------------------------------------------------------
diff --git a/hw/drivers/sensors/bme280/src/bme280_shell.c b/hw/drivers/sensors/bme280/src/bme280_shell.c
new file mode 100644
index 0000000..f9d3f46
--- /dev/null
+++ b/hw/drivers/sensors/bme280/src/bme280_shell.c
@@ -0,0 +1,364 @@
+/*
+ * 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 "sysinit/sysinit.h"
+#include "console/console.h"
+#include "shell/shell.h"
+#include "hal/hal_gpio.h"
+#include "bme280/bme280.h"
+#include "bme280_priv.h"
+
+#if MYNEWT_VAL(BME280_CLI)
+
+static int bme280_shell_cmd(int argc, char **argv);
+
+static struct shell_cmd bme280_shell_cmd_struct = {
+    .sc_cmd = "bme280",
+    .sc_cmd_func = bme280_shell_cmd
+};
+
+static int
+bme280_shell_stol(char *param_val, long min, long max, long *output)
+{
+    char *endptr;
+    long lval;
+
+    lval = strtol(param_val, &endptr, 10); /* Base 10 */
+    if (param_val != '\0' && *endptr == '\0' &&
+        lval >= min && lval <= max) {
+            *output = lval;
+    } else {
+        return EINVAL;
+    }
+
+    return 0;
+}
+
+static int
+bme280_shell_err_too_many_args(char *cmd_name)
+{
+    console_printf("Error: too many arguments for command \"%s\"\n",
+                   cmd_name);
+    return EINVAL;
+}
+
+static int
+bme280_shell_err_unknown_arg(char *cmd_name)
+{
+    console_printf("Error: unknown argument \"%s\"\n",
+                   cmd_name);
+    return EINVAL;
+}
+
+static int
+bme280_shell_err_invalid_arg(char *cmd_name)
+{
+    console_printf("Error: invalid argument \"%s\"\n",
+                   cmd_name);
+    return EINVAL;
+}
+
+static int
+bme280_shell_help(void)
+{
+    console_printf("%s cmd [flags...]\n", bme280_shell_cmd_struct.sc_cmd);
+    console_printf("cmd:\n");
+    console_printf("\tr    [n_samples]\n");
+    console_printf("\tmode [0-sleep | 1-forced | 3-normal]\n");
+    console_printf("\tiir [1-enabled | 0-disabled]");
+    console_printf("\toversample [type 5-temperature | 6-pressure | 8-humidity]\n"
+                   "             [0-none | 1-x1 | 2-x2 | 3-x4 | 4-x8 | 5-x16]\n");
+    console_printf("\treset\n");
+    console_printf("\tchip_id");
+    console_printf("\tdump\n");
+
+    return 0;
+}
+
+static int
+bme280_shell_cmd_read_chipid(int argc, char **argv)
+{
+    int rc;
+    uint8_t chipid;
+
+    rc = bme280_get_chipid(&chipid);
+    if (rc) {
+        goto err;
+    }
+
+    console_printf("CHIP_ID:%02X", chipid);
+
+    return 0;
+err:
+    return rc;
+}
+
+static int
+bme280_shell_cmd_reset(int argc, char **argv)
+{
+    return bme280_reset();
+}
+
+static int
+bme280_shell_cmd_read(int argc, char **argv)
+{
+    uint32_t temp;
+    uint32_t press;
+    uint32_t humid;
+    uint16_t samples = 1;
+    long val;
+    int rc;
+    struct bme280 bme280;
+
+    if (argc > 3) {
+        return bme280_shell_err_too_many_args(argv[1]);
+    }
+
+    /* Check if more than one sample requested */
+    if (argc == 3) {
+        if (bme280_shell_stol(argv[2], 1, UINT16_MAX, &val)) {
+            return bme280_shell_err_invalid_arg(argv[2]);
+        }
+        samples = (uint16_t)val;
+    }
+
+    while(samples--) {
+
+        rc = bme280_get_data(&temp, &press, &humid, &bme280);
+        if (rc != 0) {
+            console_printf("Read failed: %d\n", rc);
+            return rc;
+        }
+        console_printf("temperature: %u\tpressure: %u\thumidity: %u\n",
+                       temp, press, humid);
+    }
+
+    return 0;
+}
+
+static int
+bme280_shell_cmd_oversample(int argc, char **argv)
+{
+    long val;
+    int rc;
+    uint8_t oversample;
+    uint32_t type;
+
+    if (argc > 3) {
+        return bme280_shell_err_too_many_args(argv[1]);
+    }
+
+    /* Display the oversample */
+    if (argc == 3) {
+        if (bme280_shell_stol(argv[2], 4, 8, &val)) {
+            return bme280_shell_err_invalid_arg(argv[2]);
+        }
+        rc = bme280_get_oversampling(val, &oversample);
+        if (rc) {
+            goto err;
+        }
+        console_printf("%u\n", oversample);
+    }
+
+    /* Update the oversampling  */
+    if (argc == 4) {
+        if (bme280_shell_stol(argv[2], 4, 8, &val)) {
+            return bme280_shell_err_invalid_arg(argv[2]);
+        }
+
+        type = val;
+
+        if (bme280_shell_stol(argv[3], 0, 5, &val)) {
+            return bme280_shell_err_invalid_arg(argv[2]);
+        }
+
+        oversample = val;
+
+        rc = bme280_set_oversample(type, oversample);
+        if (rc) {
+            goto err;
+        }
+    }
+
+    return 0;
+err:
+    return rc;
+}
+
+static int
+bme280_shell_cmd_iir(int argc, char **argv)
+{
+    uint8_t iir;
+    long val;
+
+    if (argc > 3) {
+        return bme280_shell_err_too_many_args(argv[1]);
+    }
+
+    /* Display if iir enabled */
+    if (argc == 2) {
+        rc = bme280_get_iir(&iir);
+        if (rc) {
+            goto err;
+        }
+        console_printf("IIR: %02X", iir);
+    }
+
+    /* Enable/disable iir*/
+    if (argc == 3) {
+        if (bme280_shell_stol(argv[2], 0, 1, &val)) {
+            return bme280_shell_err_invalid_arg(argv[2]);
+        }
+        rc = bme280_set_iir(val);
+        if (rc) {
+            goto err;
+        }
+    }
+
+    return 0;
+}
+
+static int
+bme280_shell_cmd_dump(int argc, char **argv)
+{
+  uint8_t val;
+
+  if (argc > 3) {
+      return bme280_shell_err_too_many_args(argv[1]);
+  }
+
+  /* Dump all the register values for debug purposes */
+  val = 0;
+  assert(0 == bme280_readlen(BME280_REG_ADDR_DIG_T1, &val, 1));
+  console_printf("0x%02X (DIG_T1): 0x%02X\n", BME280_REG_ADDR_DIG_T1, val);
+  assert(0 == bme280_readlen(BME280_REG_ADDR_DIG_T2, &val, 1));
+  console_printf("0x%02X (DIG_T2):  0x%02X\n", BME280_REG_ADDR_DIG_T2, val);
+  assert(0 == bme280_readlen(BME280_REG_ADDR_DIG_T3, &val, 1));
+  console_printf("0x%02X (DIG_T3):   0x%02X\n", BME280_REG_ADDR_DIG_T3, val);
+  assert(0 == bme280_readlen(BME280_REG_ADDR_DIG_P1, &val, 1));
+  console_printf("0x%02X (DIG_P1): 0x%02X\n", BME280_REG_ADDR_DIG_P1, val);
+  assert(0 == bme280_readlen(BME280_REG_ADDR_DIG_P2, &val, 1));
+  console_printf("0x%02X (DIG_P2):  0x%02X\n", BME280_REG_ADDR_DIG_P2, val);
+  assert(0 == bme280_readlen(BME280_REG_ADDR_DIG_P3, &val, 1));
+  console_printf("0x%02X (DIG_P3):   0x%02X\n", BME280_REG_ADDR_DIG_P3, val);
+  assert(0 == bme280_readlen(BME280_REG_ADDR_DIG_P4, &val, 1));
+  console_printf("0x%02X (DIG_P4): 0x%02X\n", BME280_REG_ADDR_DIG_P4, val);
+  assert(0 == bme280_readlen(BME280_REG_ADDR_DIG_P5, &val, 1));
+  console_printf("0x%02X (DIG_P5):  0x%02X\n", BME280_REG_ADDR_DIG_P5, val);
+  assert(0 == bme280_readlen(BME280_REG_ADDR_DIG_P6, &val, 1));
+  console_printf("0x%02X (DIG_P6):   0x%02X\n", BME280_REG_ADDR_DIG_P6, val);
+  assert(0 == bme280_readlen(BME280_REG_ADDR_DIG_P7, &val, 1));
+  console_printf("0x%02X (DIG_P7): 0x%02X\n", BME280_REG_ADDR_DIG_P7, val);
+  assert(0 == bme280_readlen(BME280_REG_ADDR_DIG_P8, &val, 1));
+  console_printf("0x%02X (DIG_P8):  0x%02X\n", BME280_REG_ADDR_DIG_P8, val);
+  assert(0 == bme280_readlen(BME280_REG_ADDR_DIG_P9, &val, 1));
+  console_printf("0x%02X (DIG_P9):   0x%02X\n", BME280_REG_ADDR_DIG_P9, val);
+  assert(0 == bme280_readlen(BME280_REG_ADDR_DIG_H1, &val, 1));
+  console_printf("0x%02X (DIG_H1): 0x%02X\n", BME280_REG_ADDR_DIG_H1, val);
+  assert(0 == bme280_readlen(BME280_REG_ADDR_DIG_H2, &val, 1));
+  console_printf("0x%02X (DIG_H2):  0x%02X\n", BME280_REG_ADDR_DIG_H2, val);
+  assert(0 == bme280_readlen(BME280_REG_ADDR_DIG_H3, &val, 1));
+  console_printf("0x%02X (DIG_H3):   0x%02X\n", BME280_REG_ADDR_DIG_H3, val);
+  assert(0 == bme280_readlen(BME280_REG_ADDR_DIG_H4, &val, 1));
+  console_printf("0x%02X (DIG_H4): 0x%02X\n", BME280_REG_ADDR_DIG_H4, val);
+  assert(0 == bme280_readlen(BME280_REG_ADDR_DIG_H5, &val, 1));
+  console_printf("0x%02X (DIG_H5):  0x%02X\n", BME280_REG_ADDR_DIG_H5, val);
+  assert(0 == bme280_readlen(BME280_REG_ADDR_DIG_H6, &val, 1));
+  console_printf("0x%02X (DIG_H6):   0x%02X\n", BME280_REG_ADDR_DIG_H6, val);
+  assert(0 == bme280_readlen(BME280_REG_ADDR_CHIPID, &val, 1));
+  console_printf("0x%02X (CHIPID):   0x%02X\n", BME280_REG_ADDR_CHIPID, val);
+  assert(0 == bme280_readlen(BME280_REG_ADDR_VERSION, &val, 1));
+  console_printf("0x%02X (VER):   0x%02X\n", BME280_REG_ADDR_VERSION, val);
+  assert(0 == bme280_readlen(BME280_REG_ADDR_CTRL_HUM, &val, 1));
+  console_printf("0x%02X (CTRL_HUM):   0x%02X\n", BME280_REG_ADDR_CTRL_HUM, val);
+  assert(0 == bme280_readlen(BME280_REG_ADDR_STATUS, &val, 1));
+  console_printf("0x%02X (STATUS):   0x%02X\n", BME280_REG_ADDR_STATUS, val);
+  assert(0 == bme280_readlen(BME280_REG_ADDR_CTRL_MEAS, &val, 1));
+  console_printf("0x%02X (CTRL_MEAS):   0x%02X\n", BME280_REG_ADDR_CTRL_MEAS, val);
+  assert(0 == bme280_readlen(BME280_REG_ADDR_CONFIG, &val, 1));
+  console_printf("0x%02X (CONFIG):   0x%02X\n", BME280_REG_ADDR_CONFIG, val);
+  assert(0 == bme280_readlen(BME280_REG_ADDR_PRESS, &val, 1));
+  console_printf("0x%02X (PRESS):   0x%02X\n", BME280_REG_ADDR_PRESS, val);
+  assert(0 == bme280_readlen(BME280_REG_ADDR_TEMP, &val, 1));
+  console_printf("0x%02X (TEMP):   0x%02X\n", BME280_REG_ADDR_TEMP, val);
+  assert(0 == bme280_readlen(BME280_REG_ADDR_HUM, &val, 1));
+  console_printf("0x%02X (HUM):   0x%02X\n", BME280_REG_ADDR_HUM, val);
+
+  return 0;
+}
+
+static int
+bme280_shell_cmd(int argc, char **argv)
+{
+    if (argc == 1) {
+        return bme280_shell_help();
+    }
+
+    /* Read command (get a new data sample) */
+    if (argc > 1 && strcmp(argv[1], "r") == 0) {
+        return bme280_shell_cmd_read(argc, argv);
+    }
+
+    /* Mode command */
+    if (argc > 1 && strcmp(argv[1], "mode") == 0) {
+        return bme280_shell_cmd_mode(argc, argv);
+    }
+
+    /* IIR */
+    if (argc > 1 && strcmp(argv[1], "iir") == 0) {
+        return bme280_shell_cmd_iir(argc, argv);
+    }
+
+    /* Oversample */
+    if (argc > 1 && strcmp(argv[1], "oversample") == 0) {
+        return bme280_shell_cmd_oversample(argc, argv);
+    }
+
+    /* Reset */
+    if (argc > 1 && strcmp(argv[1], "reset") == 0) {
+        return bme280_shell_cmd_reset(argc, argv);
+    }
+
+    /* Chip ID */
+    if (argc > 1 && strcmp(argv[1], "chipid") == 0) {
+        return bme280_shell_cmd_read_chipid(argc, argv);
+    }
+
+    /* Dump */
+    if (argc > 1 && strcmp(argv[1], "dump") == 0) {
+        return bme280_shell_cmd_dump(argc, argv);
+    }
+
+    return bme280_shell_err_unknown_arg(argv[1]);
+}
+
+int
+bme280_shell_init(void)
+{
+    int rc;
+
+    rc = shell_cmd_register(&bme280_shell_cmd_struct);
+    SYSINIT_PANIC_ASSERT(rc == 0);
+
+    return rc;
+}
+
+#endif

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/ad7cdf09/hw/drivers/sensors/bme280/syscfg.yml
----------------------------------------------------------------------
diff --git a/hw/drivers/sensors/bme280/syscfg.yml b/hw/drivers/sensors/bme280/syscfg.yml
new file mode 100644
index 0000000..126ecda
--- /dev/null
+++ b/hw/drivers/sensors/bme280/syscfg.yml
@@ -0,0 +1,38 @@
+# The BSD License (BSD)
+#
+# Copyright (c) 2016 Adafruit Industries
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+syscfg.defs:
+    BME280_SPINUM:
+        description: 'SPI number for the BME280'
+        value: -1
+    BME280_CLI:
+        description: 'Enable shell support for the BME280'
+        value: 0
+    BME280_LOG:
+        description: 'Enable BME280 logging'
+        value: 0
+    BME280_STATS:
+        description: 'Enable BME280 statistics'
+        value: 0
+    BME280_CSPIN:
+        description: 'CS pin for BME280'
+        value : 0

http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/ad7cdf09/hw/sensor/src/sensor_shell.c
----------------------------------------------------------------------
diff --git a/hw/sensor/src/sensor_shell.c b/hw/sensor/src/sensor_shell.c
index 481e241..ebe3b1b 100644
--- a/hw/sensor/src/sensor_shell.c
+++ b/hw/sensor/src/sensor_shell.c
@@ -230,7 +230,6 @@ sensor_shell_read_listener(struct sensor *sensor, void *arg, void *data)
     struct sensor_euler_data *sed;
     struct sensor_quat_data *sqd;
     struct sensor_color_data *scd;
-    int8_t *temperature;
     char tmpstr[13];
 
     ctx = (struct sensor_shell_read_ctx *) arg;
@@ -288,8 +287,7 @@ sensor_shell_read_listener(struct sensor *sensor, void *arg, void *data)
     }
 
     if (ctx->type == SENSOR_TYPE_TEMPERATURE) {
-        temperature = (int8_t *) data;
-        console_printf("temprature = %d", *temperature);
+        console_printf("temprature = %d", *(int *)data);
         console_printf("\n");
     }
 
@@ -366,6 +364,16 @@ sensor_shell_read_listener(struct sensor *sensor, void *arg, void *data)
         console_printf("\n\n");
     }
 
+    if (ctx->type == SENSOR_TYPE_PRESSURE) {
+        console_printf("pressure = %d", *(int *)data);
+        console_printf("\n");
+    }
+
+    if (ctx->type == SENSOR_TYPE_RELATIVE_HUMIDITY) {
+        console_printf("relative humidity = %d", *(int *)data);
+        console_printf("\n");
+    }
+
     return (0);
 }