mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2024-12-29 04:50:03 +01:00
Merge pull request #15383 from quangphhr/hsc_driver
drives/hsc: Add driver for Honeywell HSC series pressure and temperature sensor
This commit is contained in:
commit
4bd448b949
@ -67,6 +67,7 @@ rsource "gp2y10xx/Kconfig"
|
|||||||
rsource "hdc1000/Kconfig"
|
rsource "hdc1000/Kconfig"
|
||||||
rsource "hih6130/Kconfig"
|
rsource "hih6130/Kconfig"
|
||||||
rsource "hmc5883l/Kconfig"
|
rsource "hmc5883l/Kconfig"
|
||||||
|
rsource "hsc/Kconfig"
|
||||||
rsource "hts221/Kconfig"
|
rsource "hts221/Kconfig"
|
||||||
rsource "ina2xx/Kconfig"
|
rsource "ina2xx/Kconfig"
|
||||||
rsource "ina3221/Kconfig"
|
rsource "ina3221/Kconfig"
|
||||||
|
41
drivers/hsc/Kconfig
Normal file
41
drivers/hsc/Kconfig
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
# Copyright (c) 2020 Deutsches Zentrum für Luft- und Raumfahrt e.V. (DLR)
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
|
||||||
|
config MODULE_HSC
|
||||||
|
bool "Driver for Honeywell HSC series pressure and temperature sensor"
|
||||||
|
depends on HAS_PERIPH_I2C
|
||||||
|
depends on TEST_KCONFIG
|
||||||
|
select MODULE_PERIPH_I2C
|
||||||
|
help
|
||||||
|
This driver supports the Honeywell HSC series pressure and temperature
|
||||||
|
sensors that use an I2C interface.
|
||||||
|
|
||||||
|
menuconfig KCONFIG_USEMODULE_HSC
|
||||||
|
bool "Configure HSC pressure and temperature sensor driver"
|
||||||
|
depends on USEMODULE_HSC
|
||||||
|
help
|
||||||
|
Configure the hsc driver using Kconfig.
|
||||||
|
|
||||||
|
if KCONFIG_USEMODULE_HSC
|
||||||
|
|
||||||
|
config HSC_I2C_ADDRESS
|
||||||
|
hex "I2C address of the HSC pressure and temperature sensor"
|
||||||
|
range 0x28 0x98
|
||||||
|
default 0x28
|
||||||
|
help
|
||||||
|
The HSC sensors can have one of the following I2C addresses:
|
||||||
|
0x28, 0x38, 0x48, 0x58, 0x68, 0x78, 0x88, and 0x98
|
||||||
|
|
||||||
|
config HSC_RANGE
|
||||||
|
int "Pressure range in millibar"
|
||||||
|
range 1 10000
|
||||||
|
default 40
|
||||||
|
help
|
||||||
|
The HSC sensors support a pressure range of 1.6 millibar to 10 bar,
|
||||||
|
depending on the model.
|
||||||
|
|
||||||
|
endif # KCONFIG_USEMODULE_HSC
|
1
drivers/hsc/Makefile
Normal file
1
drivers/hsc/Makefile
Normal file
@ -0,0 +1 @@
|
|||||||
|
include $(RIOTBASE)/Makefile.base
|
1
drivers/hsc/Makefile.dep
Normal file
1
drivers/hsc/Makefile.dep
Normal file
@ -0,0 +1 @@
|
|||||||
|
FEATURES_REQUIRED += periph_i2c
|
2
drivers/hsc/Makefile.include
Normal file
2
drivers/hsc/Makefile.include
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
USEMODULE_INCLUDES_hsc := $(LAST_MAKEFILEDIR)/include
|
||||||
|
USEMODULE_INCLUDES += $(USEMODULE_INCLUDES_hsc)
|
163
drivers/hsc/hsc.c
Normal file
163
drivers/hsc/hsc.c
Normal file
@ -0,0 +1,163 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 Deutsches Zentrum für Luft- und Raumfahrt e.V. (DLR)
|
||||||
|
*
|
||||||
|
* 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 drivers_hsc
|
||||||
|
* @{
|
||||||
|
*
|
||||||
|
* @file
|
||||||
|
* @brief Device driver implementation for the Honeywell HSC
|
||||||
|
* temperature and pressure sensor.
|
||||||
|
*
|
||||||
|
* @author Quang Pham <phhr_quang@live.com>
|
||||||
|
*
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "hsc.h"
|
||||||
|
#include "errno.h"
|
||||||
|
#include "hsc_internals.h"
|
||||||
|
#include "hsc_params.h"
|
||||||
|
#include "periph/i2c.h"
|
||||||
|
|
||||||
|
#define ENABLE_DEBUG 0
|
||||||
|
#include "debug.h"
|
||||||
|
|
||||||
|
#define DEV_I2C (dev->params.i2c_dev)
|
||||||
|
#define DEV_ADDR (dev->params.i2c_addr)
|
||||||
|
#define PRESS_RANGE (dev->params.hsc_range)
|
||||||
|
|
||||||
|
/* Internal function prototypes */
|
||||||
|
static int _read_ut(const hsc_t *dev, int32_t *ut);
|
||||||
|
static int _read_up(const hsc_t *dev, int32_t *up);
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
* HSC Core API *
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
int hsc_init(hsc_t *dev, const hsc_params_t *params)
|
||||||
|
{
|
||||||
|
dev->params = *params;
|
||||||
|
uint8_t buf[HSC_FULL_DATA_LENGTH];
|
||||||
|
|
||||||
|
/* Acquire exclusive access */
|
||||||
|
if (i2c_acquire(DEV_I2C)) {
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i2c_read_bytes(DEV_I2C, DEV_ADDR, buf, sizeof(buf), 0) < 0) {
|
||||||
|
i2c_release(DEV_I2C);
|
||||||
|
DEBUG("[hsc] read_bytes fails\n");
|
||||||
|
|
||||||
|
return -EIO;
|
||||||
|
}
|
||||||
|
|
||||||
|
i2c_release(DEV_I2C);
|
||||||
|
|
||||||
|
/* Check the status of the sensor */
|
||||||
|
uint8_t status = buf[0];
|
||||||
|
|
||||||
|
switch (status & HSC_STATUS_MASK) {
|
||||||
|
case HSC_STATUS_OK:
|
||||||
|
break;
|
||||||
|
case HSC_STATUS_STALE_DATA:
|
||||||
|
return -EAGAIN;
|
||||||
|
default:
|
||||||
|
return -EIO;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int hsc_read_temperature(const hsc_t *dev, int16_t *dest)
|
||||||
|
{
|
||||||
|
int32_t ut = 0;
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
/* Read uncompensated temperature value */
|
||||||
|
if ((retval = _read_ut(dev, &ut)) != 0) {
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Formular from section 4.0 in
|
||||||
|
* https://sensing.honeywell.com/i2c-comms-digital-output-pressure-sensors-tn-008201-3-en-final-30may12.pdf */
|
||||||
|
*dest = ut * 2000 / 2047 - 500;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int hsc_read_pressure(const hsc_t *dev, int32_t *dest)
|
||||||
|
{
|
||||||
|
int32_t up = 0;
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
/* Read uncompensated pressure value */
|
||||||
|
if ((retval = _read_up(dev, &up)) != 0) {
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Formular from section 3.0 in
|
||||||
|
* https://sensing.honeywell.com/i2c-comms-digital-output-pressure-sensors-tn-008201-3-en-final-30may12.pdf */
|
||||||
|
const int32_t output_max = 14745;
|
||||||
|
const int32_t output_min = 1636;
|
||||||
|
*dest = ((up - output_min) * 2000 * HSC_PARAM_RANGE / (output_max - output_min) - 1000 * HSC_PARAM_RANGE);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
* Internal functions *
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
static int _read_ut(const hsc_t *dev, int32_t *output)
|
||||||
|
{
|
||||||
|
/* Read UT (Uncompsensated Temperature value) */
|
||||||
|
uint8_t buf[HSC_FULL_DATA_LENGTH];
|
||||||
|
|
||||||
|
/* Acquire exclusive access */
|
||||||
|
if (i2c_acquire(DEV_I2C)) {
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i2c_read_bytes(DEV_I2C, DEV_ADDR, buf, sizeof(buf), 0) < 0) {
|
||||||
|
i2c_release(DEV_I2C);
|
||||||
|
DEBUG("[hsc] read_bytes fails\n");
|
||||||
|
|
||||||
|
return -EIO;
|
||||||
|
}
|
||||||
|
|
||||||
|
i2c_release(DEV_I2C);
|
||||||
|
|
||||||
|
*output = (((buf[2] << 8) | buf[3]) >> HSC_TEMPERATURE_SHIFT);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int _read_up(const hsc_t *dev, int32_t *output)
|
||||||
|
{
|
||||||
|
/* Read UP (Uncompsensated Pressure value) */
|
||||||
|
uint8_t buf[HSC_FULL_DATA_LENGTH];
|
||||||
|
|
||||||
|
/* Acquire exclusive access */
|
||||||
|
if (i2c_acquire(DEV_I2C)) {
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i2c_read_bytes(DEV_I2C, DEV_ADDR, buf, sizeof(buf), 0) < 0) {
|
||||||
|
i2c_release(DEV_I2C);
|
||||||
|
DEBUG("[hsc] read_bytes fails\n");
|
||||||
|
|
||||||
|
return -EIO;
|
||||||
|
}
|
||||||
|
|
||||||
|
i2c_release(DEV_I2C);
|
||||||
|
|
||||||
|
*output = ((buf[0] << 8) | buf[1]) & HSC_PRESSURE_MASK;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
56
drivers/hsc/hsc_saul.c
Normal file
56
drivers/hsc/hsc_saul.c
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 Deutsches Zentrum für Luft- und Raumfahrt e.V. (DLR)
|
||||||
|
*
|
||||||
|
* 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 drivers_hsc
|
||||||
|
* @{
|
||||||
|
*
|
||||||
|
* @file
|
||||||
|
* @brief SAUL adaption for HSC device
|
||||||
|
*
|
||||||
|
* @author Quang Pham <phhr_quang@live.com>
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include "saul.h"
|
||||||
|
#include "hsc.h"
|
||||||
|
|
||||||
|
static int read_temperature(const void *dev, phydat_t *res)
|
||||||
|
{
|
||||||
|
if (hsc_read_temperature(dev, res->val) != 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
res->unit = UNIT_TEMP_C;
|
||||||
|
res->scale = -1;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int read_pressure(const void *dev, phydat_t *res)
|
||||||
|
{
|
||||||
|
int32_t value;
|
||||||
|
if (hsc_read_pressure(dev, &value) != 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
res->unit = UNIT_BAR;
|
||||||
|
res->scale = -6;
|
||||||
|
phydat_fit(res, &value, 1);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
const saul_driver_t hsc_temperature_saul_driver = {
|
||||||
|
.read = read_temperature,
|
||||||
|
.write = saul_notsup,
|
||||||
|
.type = SAUL_SENSE_TEMP
|
||||||
|
};
|
||||||
|
|
||||||
|
const saul_driver_t hsc_pressure_saul_driver = {
|
||||||
|
.read = read_pressure,
|
||||||
|
.write = saul_notsup,
|
||||||
|
.type = SAUL_SENSE_PRESS
|
||||||
|
};
|
64
drivers/hsc/include/hsc_internals.h
Normal file
64
drivers/hsc/include/hsc_internals.h
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 Deutsches Zentrum für Luft- und Raumfahrt e.V. (DLR)
|
||||||
|
*
|
||||||
|
* 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 drivers_hsc
|
||||||
|
* @brief Internal addresses, constants for the HSC sensor.
|
||||||
|
* @{
|
||||||
|
*
|
||||||
|
* @file
|
||||||
|
* @brief Internal addresses, constants for the HSC sensor.
|
||||||
|
*
|
||||||
|
* @author Quang Pham <phhr_quang@live.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef HSC_INTERNALS_H
|
||||||
|
#define HSC_INTERNALS_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name HSC I2C Packet Readout
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#define HSC_PRESSURE_DATA_LENGTH (2) /**<
|
||||||
|
Pressure is stored in the first 2 bytes of data */
|
||||||
|
#define HSC_FULL_DATA_LENGTH (4) /**<
|
||||||
|
Pressure + temperature data is 4 bytes long */
|
||||||
|
#define HSC_STATUS_MASK (0xc0) /**<
|
||||||
|
Bit mask for the status bits in the first byte */
|
||||||
|
#define HSC_PRESSURE_MASK (0x3fff) /**<
|
||||||
|
Bit mask for the pressure data */
|
||||||
|
#define HSC_TEMPERATURE_SHIFT (5) /**<
|
||||||
|
Temperature data is left adjusted within the word */
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name Status and error return codes
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
enum {
|
||||||
|
HSC_STATUS_OK = 0x00,
|
||||||
|
/**
|
||||||
|
* stale data: data that has already been fetched since the last measurement
|
||||||
|
* cycle, or data fetched before the first measurement has been completed.
|
||||||
|
*/
|
||||||
|
HSC_STATUS_STALE_DATA = 0x40,
|
||||||
|
HSC_STATUS_COMMAND_MODE = 0x80,
|
||||||
|
HSC_STATUS_DIAGNOSTIC = 0xc0,
|
||||||
|
};
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* HSC_INTERNALS_H */
|
||||||
|
/** @} */
|
76
drivers/hsc/include/hsc_params.h
Normal file
76
drivers/hsc/include/hsc_params.h
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 Deutsches Zentrum für Luft- und Raumfahrt e.V. (DLR)
|
||||||
|
*
|
||||||
|
* 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 drivers_hsc
|
||||||
|
*
|
||||||
|
* @{
|
||||||
|
* @file
|
||||||
|
* @brief Default configuration for HSC
|
||||||
|
*
|
||||||
|
* @author Quang Pham <phhr_quang@live.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef HSC_PARAMS_H
|
||||||
|
#define HSC_PARAMS_H
|
||||||
|
|
||||||
|
#include "board.h"
|
||||||
|
#include "hsc.h"
|
||||||
|
#include "hsc_internals.h"
|
||||||
|
#include "saul_reg.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name Set default configuration parameters for the HSC
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#ifndef HSC_PARAM_I2C_DEV
|
||||||
|
#define HSC_PARAM_I2C_DEV I2C_DEV(0)
|
||||||
|
#endif
|
||||||
|
#ifndef HSC_PARAM_I2C_ADDR
|
||||||
|
#define HSC_PARAM_I2C_ADDR CONFIG_HSC_I2C_ADDR
|
||||||
|
#endif
|
||||||
|
#ifndef HSC_PARAM_RANGE
|
||||||
|
#define HSC_PARAM_RANGE CONFIG_HSC_RANGE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef HSC_PARAMS
|
||||||
|
#define HSC_PARAMS { .i2c_dev = HSC_PARAM_I2C_DEV, \
|
||||||
|
.i2c_addr = HSC_PARAM_I2C_ADDR, \
|
||||||
|
.hsc_range = HSC_PARAM_RANGE, }
|
||||||
|
#endif
|
||||||
|
#ifndef HSC_SAUL_INFO
|
||||||
|
#define HSC_SAUL_INFO { .name = "hsc" }
|
||||||
|
#endif
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Configure HSC
|
||||||
|
*/
|
||||||
|
static const hsc_params_t hsc_params[] =
|
||||||
|
{
|
||||||
|
HSC_PARAMS
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Configure SAUL registry entries
|
||||||
|
*/
|
||||||
|
static const saul_reg_info_t hsc_saul_info[] =
|
||||||
|
{
|
||||||
|
HSC_SAUL_INFO
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* HSC_PARAMS_H */
|
||||||
|
/** @} */
|
105
drivers/include/hsc.h
Normal file
105
drivers/include/hsc.h
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 Deutsches Zentrum für Luft- und Raumfahrt e.V. (DLR)
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup drivers_hsc HSC temperature and pressure sensor
|
||||||
|
* @ingroup drivers_sensors
|
||||||
|
* @ingroup drivers_saul
|
||||||
|
* @brief Device driver interface for the HSC sensor
|
||||||
|
*
|
||||||
|
* This driver provides @ref drivers_saul capabilities.
|
||||||
|
* @{
|
||||||
|
*
|
||||||
|
* @file
|
||||||
|
* @brief Device driver interface for the HSC sensor.
|
||||||
|
*
|
||||||
|
* @author Quang Pham <phhr_quang@live.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef HSC_H
|
||||||
|
#define HSC_H
|
||||||
|
|
||||||
|
#include "saul.h"
|
||||||
|
#include "periph/i2c.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Device initialization parameters
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
i2c_t i2c_dev; /**< I2C device which is used */
|
||||||
|
uint8_t i2c_addr; /**< I2C address */
|
||||||
|
uint8_t hsc_range; /**< Pressure range in mBar */
|
||||||
|
} hsc_params_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Device descriptor for the HSC sensor
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
hsc_params_t params; /**< Device initialization parameters */
|
||||||
|
} hsc_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initialize the given HSC device
|
||||||
|
*
|
||||||
|
* @param[out] dev Initialized device descriptor of HSC device
|
||||||
|
* @param[in] params Initialization parameters
|
||||||
|
*
|
||||||
|
* @retval 0 Success
|
||||||
|
* @retval -ENXIO No HSC at given address
|
||||||
|
* @return -EIO An error occurred when reading calibration values
|
||||||
|
*/
|
||||||
|
int hsc_init(hsc_t *dev, const hsc_params_t *params);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Read temperature value from the given HSC device, returned in 0.1°C
|
||||||
|
*
|
||||||
|
* @param[in] dev Device descriptor of HSC device to read from
|
||||||
|
* @param[out] dest Temperature in 0.1°C
|
||||||
|
*
|
||||||
|
* @retval 0 Success
|
||||||
|
* @retval -ENXIO No HSC at given address
|
||||||
|
* @return -EIO An error occurred when reading calibration values
|
||||||
|
*/
|
||||||
|
int hsc_read_temperature(const hsc_t *dev, int16_t *dest);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Read pressure value from the given HSC device, returned in uBar
|
||||||
|
*
|
||||||
|
* @param[in] dev Device descriptor of HSC device to read from
|
||||||
|
* @param[out] dest Pressure in uBar
|
||||||
|
*
|
||||||
|
* @retval 0 Success
|
||||||
|
* @retval -ENXIO No HSC at given address
|
||||||
|
* @return -EIO An error occurred when reading calibration values
|
||||||
|
*/
|
||||||
|
int hsc_read_pressure(const hsc_t *dev, int32_t *dest);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name Default configuration values
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
#if !defined(CONFIG_HSC_I2C_ADDR) || defined(DOXYGEN)
|
||||||
|
#define CONFIG_HSC_I2C_ADDR (0x28) /**< Use address 0x28 by default */
|
||||||
|
#endif
|
||||||
|
#if !defined(CONFIG_HSC_RANGE) || defined(DOXYGEN)
|
||||||
|
#define CONFIG_HSC_RANGE (40U) /**< Default to 40 millibar range */
|
||||||
|
#endif
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* HSC_H */
|
||||||
|
/** @} */
|
87
drivers/saul/init_devs/auto_init_hsc.c
Normal file
87
drivers/saul/init_devs/auto_init_hsc.c
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 Deutsches Zentrum für Luft- und Raumfahrt e.V. (DLR)
|
||||||
|
*
|
||||||
|
* 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 sys_auto_init_saul
|
||||||
|
* @{
|
||||||
|
*
|
||||||
|
* @file
|
||||||
|
* @brief Auto initialization of HSC driver.
|
||||||
|
*
|
||||||
|
* @author Quang Pham <phhr_quang@live.com>
|
||||||
|
*
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef MODULE_HSC
|
||||||
|
|
||||||
|
#include "assert.h"
|
||||||
|
#include "log.h"
|
||||||
|
#include "saul_reg.h"
|
||||||
|
#include "hsc.h"
|
||||||
|
#include "hsc_params.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Define the number of configured sensors
|
||||||
|
*/
|
||||||
|
#define HSC_NUM ARRAY_SIZE(hsc_params)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Allocation of memory for device descriptors
|
||||||
|
*/
|
||||||
|
static hsc_t hsc_devs[HSC_NUM];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Memory for the SAUL registry entries
|
||||||
|
*/
|
||||||
|
static saul_reg_t saul_entries[HSC_NUM * 2];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Define the number of saul info
|
||||||
|
*/
|
||||||
|
#define HSC_INFO_NUM ARRAY_SIZE(hsc_saul_info)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name Reference the driver structs.
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
extern const saul_driver_t hsc_temperature_saul_driver;
|
||||||
|
extern const saul_driver_t hsc_pressure_saul_driver;
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
void auto_init_hsc(void)
|
||||||
|
{
|
||||||
|
static_assert(HSC_INFO_NUM == HSC_NUM, "Number of descriptions and sensors must match");
|
||||||
|
LOG_DEBUG("[auto_init_saul] Number of HSC devices = %d\n", HSC_NUM);
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < HSC_NUM; i++) {
|
||||||
|
LOG_DEBUG("[auto_init_saul] initializing hsc #%u\n", i);
|
||||||
|
|
||||||
|
if (hsc_init(&hsc_devs[i], &hsc_params[i]) != 0) {
|
||||||
|
LOG_ERROR("[auto_init_saul] error initializing hsc #%u\n", i);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* temperature */
|
||||||
|
saul_entries[(i * 2)].dev = &(hsc_devs[i]);
|
||||||
|
saul_entries[(i * 2)].name = hsc_saul_info[i].name;
|
||||||
|
saul_entries[(i * 2)].driver = &hsc_temperature_saul_driver;
|
||||||
|
|
||||||
|
/* pressure */
|
||||||
|
saul_entries[(i * 2) + 1].dev = &(hsc_devs[i]);
|
||||||
|
saul_entries[(i * 2) + 1].name = hsc_saul_info[i].name;
|
||||||
|
saul_entries[(i * 2) + 1].driver = &hsc_pressure_saul_driver;
|
||||||
|
|
||||||
|
/* register to saul */
|
||||||
|
saul_reg_add(&(saul_entries[(i * 2)]));
|
||||||
|
saul_reg_add(&(saul_entries[(i * 2) + 1]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
typedef int dont_be_pedantic;
|
||||||
|
#endif /* MODULE_HSC */
|
@ -119,6 +119,10 @@ void saul_init_devs(void)
|
|||||||
extern void auto_init_hdc1000(void);
|
extern void auto_init_hdc1000(void);
|
||||||
auto_init_hdc1000();
|
auto_init_hdc1000();
|
||||||
}
|
}
|
||||||
|
if (IS_USED(MODULE_HSC)) {
|
||||||
|
extern void auto_init_hsc(void);
|
||||||
|
auto_init_hsc();
|
||||||
|
}
|
||||||
if (IS_USED(MODULE_HTS221)) {
|
if (IS_USED(MODULE_HTS221)) {
|
||||||
extern void auto_init_hts221(void);
|
extern void auto_init_hts221(void);
|
||||||
auto_init_hts221();
|
auto_init_hts221();
|
||||||
|
6
tests/driver_hsc/Makefile
Normal file
6
tests/driver_hsc/Makefile
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
include ../Makefile.tests_common
|
||||||
|
|
||||||
|
USEMODULE += hsc
|
||||||
|
USEMODULE += xtimer
|
||||||
|
|
||||||
|
include $(RIOTBASE)/Makefile.include
|
3
tests/driver_hsc/Makefile.ci
Normal file
3
tests/driver_hsc/Makefile.ci
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
BOARD_INSUFFICIENT_MEMORY := \
|
||||||
|
nucleo-l011k4 \
|
||||||
|
#
|
10
tests/driver_hsc/Readme.md
Normal file
10
tests/driver_hsc/Readme.md
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
## About
|
||||||
|
This is a test application for the HSC Pressure and Temperature sensor.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
The application will continue trying to initiate the HSC sensor.
|
||||||
|
|
||||||
|
After initialization, every second, the application:
|
||||||
|
* reads the temperature (°C);
|
||||||
|
* reads the pressure (uBar);
|
||||||
|
* prints those values to STDOUT.
|
2
tests/driver_hsc/app.config.test
Normal file
2
tests/driver_hsc/app.config.test
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
CONFIG_MODULE_HSC=y
|
||||||
|
CONFIG_MODULE_XTIMER=y
|
79
tests/driver_hsc/main.c
Normal file
79
tests/driver_hsc/main.c
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 Deutsches Zentrum für Luft- und Raumfahrt e.V. (DLR)
|
||||||
|
*
|
||||||
|
* 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 tests
|
||||||
|
* @{
|
||||||
|
*
|
||||||
|
* @file
|
||||||
|
* @brief Test application for the HSC pressure and temperature sensor
|
||||||
|
*
|
||||||
|
* @author Quang Pham <phhr_quang@live.com>
|
||||||
|
*
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "errno.h"
|
||||||
|
#include "string.h"
|
||||||
|
#include "hsc.h"
|
||||||
|
#include "hsc_params.h"
|
||||||
|
#include "xtimer.h"
|
||||||
|
|
||||||
|
#define SLEEP_USEC (1UL * US_PER_SEC)
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
hsc_t dev;
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
xtimer_usleep(SLEEP_USEC);
|
||||||
|
|
||||||
|
puts("HSC test application\n");
|
||||||
|
|
||||||
|
printf("+------------Initializing------------+\n");
|
||||||
|
do {
|
||||||
|
retval = hsc_init(&dev, &hsc_params[0]);
|
||||||
|
if (retval < 0) {
|
||||||
|
if (IS_USED(MODULE_NEWLIB) || IS_USED(MODULE_PICOLIBC)) {
|
||||||
|
printf("Initialization error with code: %s\n", strerror(-retval));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
puts("Initialization failed");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
xtimer_usleep(SLEEP_USEC);
|
||||||
|
} while (retval);
|
||||||
|
|
||||||
|
puts("Initialization successful\n");
|
||||||
|
|
||||||
|
printf("+--------Starting Measurements--------+\n");
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
/* Get temperature in degrees celsius */
|
||||||
|
int16_t temperature;
|
||||||
|
if ((retval = hsc_read_temperature(&dev, &temperature)) != 0) {
|
||||||
|
printf("Get temp fail with code %d\n", retval);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get pressure in ubar */
|
||||||
|
int32_t pressure;
|
||||||
|
if ((retval = hsc_read_pressure(&dev, &pressure)) != 0) {
|
||||||
|
printf("Get press fail with code %d\n", retval);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Measured pressure is %" PRId32 "ubar\n", pressure);
|
||||||
|
printf(" Measured temp is %d.%d °C\n", temperature/10, temperature%10);
|
||||||
|
|
||||||
|
xtimer_usleep(SLEEP_USEC);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user