1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00

pkg: add Bosch Sensortech BME680 driver

Add the vendor driver implementation from Bosch Sensortech as a package.
This commit is contained in:
Gunar Schorcht 2020-03-10 15:30:14 +01:00
parent 1e8037670b
commit 90fb789697
10 changed files with 239 additions and 0 deletions

View File

@ -0,0 +1,12 @@
PKG_NAME=driver_bme680
PKG_URL=https://github.com/BoschSensortec/BME680_driver
PKG_VERSION=63bb5336db4659519860832be2738c685133aa33
PKG_LICENSE=BSD-3-Clause
include $(RIOTBASE)/pkg/pkg.mk
.PHONY: all
all:
@cp Makefile.$(PKG_NAME) $(PKG_BUILDDIR)/Makefile
"$(MAKE)" -C $(PKG_BUILDDIR)

View File

@ -0,0 +1 @@
USEMODULE += driver_bme680_contrib

View File

@ -0,0 +1,7 @@
MODULE = driver_bme680
ifneq (,$(filter bme680_fp,$(USEMODULE)))
CFLAGS += -DBME680_FLOAT_POINT_COMPENSATION
endif
include $(RIOTBASE)/Makefile.base

View File

@ -0,0 +1,4 @@
INCLUDES += -I$(PKGDIRBASE)/driver_bme680
INCLUDES += -I$(RIOTPKG)/driver_bme680/include
DIRS += $(RIOTPKG)/driver_bme680/contrib

View File

@ -0,0 +1,41 @@
# BME680 vendor driver
## Introduction
The [BME680_driver](https://github.com/BoschSensortec/BME680_driver) is an
I2C/SPI API for BME680 sensor.
The library is written and maintained by Bosch Sensortec. It is platform
independent, as long as the right drivers are available for the given MCU.
In addition, this driver can use floating point if available on your MCU.
By default, this package does not use it.
## Usage
Refer to the code documentation at
[GitHub](https://github.com/BoschSensortec/BME680_driver) for more information
on the API.
## RIOT-OS interface
BME680 sensors are connected either via I2C or SPI. Which interface is used by
which BME680 sensor is defined in the `bme680_params` parameters. The
respective implementation is enabled by the modules `bme680_i2c` and
`bme680_spi`. Both I2C and SPI can be used in one application.
```
USEMODULE='bme680_spi bme680_i2c' make BOARD=... -C tests/driver_bme680
```
In order to use floating point, you can enable module `bme680_fp` variable:
```
USEMODULE='bme680_fp bme680_i2c' make BOARD=... -C tests/driver_bme680
```
The following callbacks add support for the included drivers via I2C and SPI
peripherals:
* `bme680_i2c_read_hal`
* `bme680_i2c_write_hal`
* `bme680_spi_read_hal`
* `bme680_spi_write_hal`

View File

@ -0,0 +1,3 @@
MODULE = driver_bme680_contrib
include $(RIOTBASE)/Makefile.base

View File

@ -0,0 +1,116 @@
/*
* Copyright (C) 2019 Mesotic SAS
* 2020 Gunar Schorcht
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*/
/**
* @ingroup pkg_driver_bme680
* @ingroup drivers_bme680
* @{
*
* @file
* @brief Abstraction layer for RIOT adaption
*
* @author Dylan Laduranty <dylan.laduranty@mesotic.com>
* @author Gunar Schorcht <gunar@schorcht.net>
*/
#include <stdio.h>
#include <string.h>
#include "bme680.h"
#include "bme680_hal.h"
#ifdef MODULE_PERIPH_I2C
#include "periph/i2c.h"
#endif
#ifdef MODULE_PERIPH_SPI
#include "periph/spi.h"
#endif
#include "xtimer.h"
#ifndef BME680_SPI_SPEED
#define BME680_SPI_SPEED (SPI_CLK_1MHZ)
#endif /* BME680_SPI_SPEED */
#ifndef BME680_SPI_MODE
#define BME680_SPI_MODE (SPI_MODE_0)
#endif /* BME680_SPI_MODE */
void bme680_ms_sleep(uint32_t msleep)
{
xtimer_usleep(msleep * US_PER_MS);
}
#ifdef MODULE_PERIPH_I2C
int8_t bme680_i2c_read_hal(uint8_t dev_id, uint8_t reg_addr,
uint8_t *data, uint16_t len)
{
assert(dev_id < bme680_devs_numof);
bme680_intf_i2c_t* intf = &(bme680_devs[dev_id]->intf.i2c);
uint8_t ret;
i2c_acquire(intf->dev);
ret = i2c_read_regs(intf->dev, intf->addr, reg_addr, data, len, 0);
i2c_release(intf->dev);
return ret;
}
int8_t bme680_i2c_write_hal(uint8_t dev_id, uint8_t reg_addr,
uint8_t *data, uint16_t len)
{
assert(dev_id < bme680_devs_numof);
bme680_intf_i2c_t* intf = &(bme680_devs[dev_id]->intf.i2c);
uint8_t ret;
i2c_acquire(intf->dev);
ret = i2c_write_regs(intf->dev, intf->addr, reg_addr, data, len, 0);
i2c_release(intf->dev);
return ret;
}
#endif /* MODULE_PERIPH_I2C */
#ifdef MODULE_PERIPH_SPI
int8_t bme680_spi_read_hal(uint8_t dev_id, uint8_t reg_addr,
uint8_t *data, uint16_t len)
{
assert(dev_id < bme680_devs_numof);
bme680_intf_spi_t* intf = &(bme680_devs[dev_id]->intf.spi);
unsigned int cpsr = irq_disable();
gpio_clear(intf->nss_pin);
spi_acquire(intf->dev, SPI_CS_UNDEF, BME680_SPI_MODE, BME680_SPI_SPEED);
spi_transfer_regs(intf->dev, SPI_CS_UNDEF, reg_addr, NULL, data, len);
gpio_set(intf->nss_pin);
irq_restore(cpsr);
spi_release(intf->dev);
return 0;
}
int8_t bme680_spi_write_hal(uint8_t dev_id, uint8_t reg_addr,
uint8_t *data, uint16_t len)
{
assert(dev_id < bme680_devs_numof);
bme680_intf_spi_t* intf = &(bme680_devs[dev_id]->intf.spi);
unsigned int cpsr = irq_disable();
gpio_clear(intf->nss_pin);
spi_acquire(intf->dev, SPI_CS_UNDEF, BME680_SPI_MODE, BME680_SPI_SPEED);
spi_transfer_regs(intf->dev, SPI_CS_UNDEF, reg_addr, data, NULL, len);
gpio_set(intf->nss_pin);
irq_restore(cpsr);
spi_release(intf->dev);
return 0;
}
#endif /* MODULE_PERIPH_SPI */

View File

@ -0,0 +1,6 @@
/**
* @defgroup pkg_driver_bme680 Driver package for I2C/SPI BME680 sensor
* @ingroup pkg
* @brief Provides the Bosch Sensortec's BME680 gas sensor API
* @see https://github.com/BoschSensortec/BME680_driver
*/

View File

@ -0,0 +1,49 @@
/*
* Copyright (C) 2018 Mesotic SAS
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*/
/**
* @ingroup pkg_driver_bme680
* @{
*
* @file
* @brief Abstraction layer for RIOT adaption
*
* @author Dylan Laduranty <dylan.laduranty@mesotic.com>
*/
#ifndef BME680_HAL_H
#define BME680_HAL_H
#ifdef __cplusplus
extern "C" {
#endif
void bme680_ms_sleep(uint32_t msleep);
#ifdef MODULE_PERIPH_I2C
int8_t bme680_i2c_read_hal(uint8_t dev_id, uint8_t reg_addr,
uint8_t *data, uint16_t len);
int8_t bme680_i2c_write_hal(uint8_t dev_id, uint8_t reg_addr,
uint8_t *data, uint16_t len);
#endif
#ifdef MODULE_PERIPH_SPI
int8_t bme680_spi_read_hal(uint8_t dev_id, uint8_t reg_addr,
uint8_t *data, uint16_t len);
int8_t bme680_spi_write_hal(uint8_t dev_id, uint8_t reg_addr,
uint8_t *data, uint16_t len);
#endif
#ifdef __cplusplus
}
#endif
#endif /* BME680_HAL_H */
/** @} */