This is an automated email from the ASF dual-hosted git repository.
acassis pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new 2c606a7b41f !sensors/bme680: allow sensor configuration during
registration
2c606a7b41f is described below
commit 2c606a7b41f5ca8c9cf04ae0d4b22b1e8d7cdbcd
Author: raiden00pl <[email protected]>
AuthorDate: Wed May 7 11:32:53 2025 +0200
!sensors/bme680: allow sensor configuration during registration
BREAKING CHANGE: bme680_register() takes an additional "*config" argument.
When config is NULL - driver behavior is the same as before.
With this change bme680 can be configured during registration in board
logic.
This way we don't have to callibrate sensor from user-space but sensor is
ready
to use after registration.
This change makes the registration the same as for bme688, which is a
similar
sensor.
Signed-off-by: raiden00pl <[email protected]>
---
boards/xtensa/esp32/common/src/esp32_bme680.c | 2 +-
drivers/sensors/bme680_uorb.c | 213 ++++++++++++++++++--------
include/nuttx/sensors/bme680.h | 3 +-
3 files changed, 148 insertions(+), 70 deletions(-)
diff --git a/boards/xtensa/esp32/common/src/esp32_bme680.c
b/boards/xtensa/esp32/common/src/esp32_bme680.c
index d7472fdff2e..ab01783df2c 100644
--- a/boards/xtensa/esp32/common/src/esp32_bme680.c
+++ b/boards/xtensa/esp32/common/src/esp32_bme680.c
@@ -74,7 +74,7 @@ int board_bme680_initialize(int devno, int busno)
* available controllers.
*/
- ret = bme680_register(devno, i2c);
+ ret = bme680_register(devno, i2c, NULL);
if (ret < 0)
{
snerr("ERROR: Error registering BME680 in I2C%d\n", busno);
diff --git a/drivers/sensors/bme680_uorb.c b/drivers/sensors/bme680_uorb.c
index b4dece225ab..3b8c00ac11f 100644
--- a/drivers/sensors/bme680_uorb.c
+++ b/drivers/sensors/bme680_uorb.c
@@ -402,6 +402,7 @@ static int bme680_calibrate(FAR struct sensor_lowerhalf_s
*lower,
static int bme680_control(FAR struct sensor_lowerhalf_s *lower,
FAR struct file *filep,
int cmd, unsigned long arg);
+
/****************************************************************************
* Private Data
****************************************************************************/
@@ -791,6 +792,10 @@ static int bme680_set_oversamp(FAR struct bme680_dev_s
*priv)
}
#ifndef CONFIG_BME680_DISABLE_PRESS_MEAS
+/****************************************************************************
+ * Name: bme680_push_press_data
+ ****************************************************************************/
+
static int bme680_push_press_data(FAR struct bme680_dev_s *priv,
FAR struct bme680_data_s *data)
{
@@ -815,6 +820,10 @@ static int bme680_push_press_data(FAR struct bme680_dev_s
*priv,
return OK;
}
#else
+/****************************************************************************
+ * Name: bme680_push_temp_data
+ ****************************************************************************/
+
static int bme680_push_temp_data(FAR struct bme680_dev_s *priv,
FAR struct bme680_data_s *data)
{
@@ -839,6 +848,10 @@ static int bme680_push_temp_data(FAR struct bme680_dev_s
*priv,
#endif /* !CONFIG_BME680_DISABLE_PRESS_MEAS */
#ifndef CONFIG_BME680_DISABLE_HUM_MEAS
+/****************************************************************************
+ * Name: bme680_push_hum_data
+ ****************************************************************************/
+
static int bme680_push_hum_data(FAR struct bme680_dev_s *priv,
FAR struct bme680_data_s *data)
{
@@ -863,6 +876,10 @@ static int bme680_push_hum_data(FAR struct bme680_dev_s
*priv,
#endif /* !CONFIG_BME680_DISABLE_HUM_MEAS */
#ifndef CONFIG_BME680_DISABLE_GAS_MEAS
+/****************************************************************************
+ * Name: bme680_push_gas_data
+ ****************************************************************************/
+
static int bme680_push_gas_data(FAR struct bme680_dev_s *priv,
FAR struct bme680_data_s *data)
{
@@ -965,6 +982,10 @@ static uint8_t calc_heater_dur(FAR const struct
bme680_dev_s *priv)
return gas_wait_val;
}
+/****************************************************************************
+ * Name: bme680_set_gas_config
+ ****************************************************************************/
+
static int bme680_set_gas_config(FAR struct bme680_dev_s *priv)
{
int ret;
@@ -1081,6 +1102,77 @@ err_out:
return ret;
}
+/****************************************************************************
+ * Name: bme680_configure
+ ****************************************************************************/
+
+static int bme680_configure(FAR struct bme680_dev_s *priv,
+ FAR struct bme680_config_s *config)
+{
+ int ret;
+
+ /* Sanity checks */
+
+ if (!CHECK_OS_BOUNDS(config->temp_os))
+ {
+ return -EINVAL;
+ }
+
+#ifndef CONFIG_BME680_DISABLE_PRESS_MEAS
+ if (!CHECK_OS_BOUNDS(config->press_os))
+ {
+ return -EINVAL;
+ }
+#endif
+
+#ifndef CONFIG_BME680_DISABLE_HUM_MEAS
+ if (!CHECK_OS_BOUNDS(config->hum_os))
+ {
+ return -EINVAL;
+ }
+#endif
+
+#ifdef CONFIG_BME680_ENABLE_IIR_FILTER
+ if (config->filter_coef < BME680_FILTER_COEF0 ||
+ config->filter_coef > BME680_FILTER_COEF127)
+ {
+ return -EINVAL;
+ }
+#endif
+
+#ifndef CONFIG_BME680_DISABLE_GAS_MEAS
+ if (config->target_temp < MIN_HOT_PLATE_TEMP ||
+ config->target_temp > MAX_HOT_PLATE_TEMP)
+ {
+ return -EINVAL;
+ }
+
+ if (config->nb_conv > 9)
+ {
+ return -EINVAL;
+ }
+#endif
+
+ /* Update config in priv */
+
+ memcpy(&priv->dev.config, config, sizeof(struct bme680_config_s));
+
+ ret = bme680_write_config(priv);
+ if (ret < 0)
+ {
+ snerr("Failed to calibrate sensor.\n");
+ return ret;
+ }
+
+ priv->dev.calibrated = true;
+
+ return ret;
+}
+
+/****************************************************************************
+ * Name: bme680_comp_temp
+ ****************************************************************************/
+
static float bme680_comp_temp(FAR struct bme680_dev_s *priv,
uint32_t adc_temp)
{
@@ -1107,6 +1199,10 @@ static float bme680_comp_temp(FAR struct bme680_dev_s
*priv,
}
#ifndef CONFIG_BME680_DISABLE_PRESS_MEAS
+/****************************************************************************
+ * Name: bme680_comp_press
+ ****************************************************************************/
+
static float bme680_comp_press(FAR struct bme680_dev_s *priv,
uint32_t adc_press)
{
@@ -1144,6 +1240,10 @@ static float bme680_comp_press(FAR struct bme680_dev_s
*priv,
#endif /* !CONFIG_BME680_DISABLE_PRESS_MEAS */
#ifndef CONFIG_BME680_DISABLE_HUM_MEAS
+/****************************************************************************
+ * Name: bme680_comp_hum
+ ****************************************************************************/
+
static float bme680_comp_hum(FAR struct bme680_dev_s *priv,
uint16_t adc_hum)
{
@@ -1187,6 +1287,10 @@ static float bme680_comp_hum(FAR struct bme680_dev_s
*priv,
#endif /* !CONFIG_BME680_DISABLE_HUM_MEAS */
#ifndef CONFIG_BME680_DISABLE_GAS_MEAS
+/****************************************************************************
+ * Name: bme680_calc_gas_res
+ ****************************************************************************/
+
static float bme680_calc_gas_res(FAR struct bme680_dev_s *priv,
uint16_t adc_gas_res, uint8_t gas_range)
{
@@ -1209,7 +1313,7 @@ static float bme680_calc_gas_res(FAR struct bme680_dev_s
*priv,
*
* Description:
* Reads the raw data from the sensor and computes the compensated
- * values, storing them in the data struct.
+ * values, storing them in the data struct.
*
****************************************************************************/
@@ -1239,7 +1343,6 @@ static int bme680_read_measurements(FAR struct
bme680_dev_s *priv,
uint8_t data_regs[BME680_DATA_LEN];
ret = bme680_getregs(priv, BME680_DATA_ADDR, data_regs, BME680_DATA_LEN);
-
if (ret < 0)
{
snerr("Failed to read data registers.\n");
@@ -1285,7 +1388,6 @@ static int bme680_read_measurements(FAR struct
bme680_dev_s *priv,
/* Is measured gas valid? */
gas_valid = data_regs[14] & BME680_GASM_VALID_MSK;
-
if (!gas_valid)
{
sninfo("Invalid gas measurement.\n");
@@ -1293,7 +1395,6 @@ static int bme680_read_measurements(FAR struct
bme680_dev_s *priv,
}
heat_stab = data_regs[14] & BME680_HEAT_STAB_MSK;
-
if (!heat_stab)
{
sninfo("The heater did not stabilize.\n");
@@ -1313,7 +1414,7 @@ static int bme680_read_measurements(FAR struct
bme680_dev_s *priv,
*
* Description:
* Compute the duration of a tphg cycle in us, taking into consideration
- * the settings of the sensor.
+ * the settings of the sensor.
*
****************************************************************************/
@@ -1362,6 +1463,10 @@ static uint16_t bme680_get_tphg_dur(FAR struct
bme680_dev_s *priv)
return duration;
}
+/****************************************************************************
+ * Name: bme680_activate
+ ****************************************************************************/
+
static int bme680_activate(FAR struct sensor_lowerhalf_s *lower,
FAR struct file *filep, bool enable)
{
@@ -1405,7 +1510,6 @@ static int bme680_activate(FAR struct sensor_lowerhalf_s
*lower,
if (!priv->enabled && enable)
{
- dev->calibrated = false;
priv->enabled = enable;
/* Wake up the polling thread */
@@ -1420,6 +1524,10 @@ static int bme680_activate(FAR struct sensor_lowerhalf_s
*lower,
return OK;
}
+/****************************************************************************
+ * Name: bme680_calibrate
+ ****************************************************************************/
+
static int bme680_calibrate(FAR struct sensor_lowerhalf_s *lower,
FAR struct file *filep, unsigned long arg)
{
@@ -1427,7 +1535,6 @@ static int bme680_calibrate(FAR struct sensor_lowerhalf_s
*lower,
FAR struct bme680_sensor_s *dev;
FAR struct bme680_dev_s *priv;
FAR struct bme680_config_s *calibval = (FAR struct bme680_config_s *)arg;
- int ret;
/* Get offset inside array of lowerhalfs */
@@ -1459,65 +1566,13 @@ static int bme680_calibrate(FAR struct
sensor_lowerhalf_s *lower,
priv = container_of(dev, FAR struct bme680_dev_s, dev);
- /* Sanity checks */
-
- if (!CHECK_OS_BOUNDS(calibval->temp_os))
- {
- return -EINVAL;
- }
-
-#ifndef CONFIG_BME680_DISABLE_PRESS_MEAS
- if (!CHECK_OS_BOUNDS(calibval->press_os))
- {
- return -EINVAL;
- }
-#endif
-
-#ifndef CONFIG_BME680_DISABLE_HUM_MEAS
- if (!CHECK_OS_BOUNDS(calibval->hum_os))
- {
- return -EINVAL;
- }
-#endif
-
-#ifdef CONFIG_BME680_ENABLE_IIR_FILTER
- if (calibval->filter_coef < BME680_FILTER_COEF0 ||
- calibval->filter_coef > BME680_FILTER_COEF127)
- {
- return -EINVAL;
- }
-#endif
-
-#ifndef CONFIG_BME680_DISABLE_GAS_MEAS
- if (calibval->target_temp < MIN_HOT_PLATE_TEMP ||
- calibval->target_temp > MAX_HOT_PLATE_TEMP)
- {
- return -EINVAL;
- }
-
- if (calibval->nb_conv > 9)
- {
- return -EINVAL;
- }
-#endif
-
- /* Update config in priv */
-
- memcpy(&priv->dev.config, calibval, sizeof(struct bme680_config_s));
-
- ret = bme680_write_config(priv);
-
- if (ret < 0)
- {
- snerr("Failed to calibrate sensor.\n");
- return ret;
- }
-
- priv->dev.calibrated = true;
-
- return ret;
+ return bme680_configure(priv, calibval);
}
+/****************************************************************************
+ * Name: bme680_control
+ ****************************************************************************/
+
static int bme680_control(FAR struct sensor_lowerhalf_s *lower,
FAR struct file *filep,
int cmd, unsigned long arg)
@@ -1557,6 +1612,10 @@ static int bme680_control(FAR struct sensor_lowerhalf_s
*lower,
return OK;
}
+/****************************************************************************
+ * Name: bme680_thread
+ ****************************************************************************/
+
static int bme680_thread(int argc, char **argv)
{
FAR struct bme680_dev_s *priv =
@@ -1623,15 +1682,20 @@ static int bme680_thread(int argc, char **argv)
*
* Description:
* Register the BME680 character device
- * @devno - The user-specified device number, starting from 0
- * @i2c - An instance of the I2C interface to use to communicate with
+ *
+ * Input Parameters:
+ * devno - The user-specified device number, starting from 0
+ * i2c - An instance of the I2C interface to use to communicate with
* BME680
+ * config - optional sensor initial configuration
*
* Return value:
* Zero (OK) on success; a negated errno value on failure
+ *
****************************************************************************/
-int bme680_register(int devno, FAR struct i2c_master_s *i2c)
+int bme680_register(int devno, FAR struct i2c_master_s *i2c,
+ FAR struct bme680_config_s *config)
{
FAR struct sensor_lowerhalf_s *lower;
FAR struct bme680_dev_s *priv;
@@ -1668,13 +1732,26 @@ int bme680_register(int devno, FAR struct i2c_master_s
*i2c)
/* Get Calibration Data */
ret = bme680_get_calib_data(priv);
-
if (ret < 0)
{
snerr("Failed to read calib data from bme680:%d\n", ret);
goto err_init;
}
+ /* Sensor configuration */
+
+ priv->dev.calibrated = false;
+
+ if (config)
+ {
+ ret = bme680_configure(priv, config);
+ if (ret < 0)
+ {
+ snerr("Failed to configure bme680:%d\n", ret);
+ goto err_init;
+ }
+ }
+
#ifndef CONFIG_BME680_DISABLE_PRESS_MEAS
/* Register the barometer driver */
diff --git a/include/nuttx/sensors/bme680.h b/include/nuttx/sensors/bme680.h
index 30c16ccf0c8..1b2a0757c23 100644
--- a/include/nuttx/sensors/bme680.h
+++ b/include/nuttx/sensors/bme680.h
@@ -127,7 +127,8 @@ extern "C"
*
****************************************************************************/
-int bme680_register(int devno, FAR struct i2c_master_s *i2c);
+int bme680_register(int devno, FAR struct i2c_master_s *i2c,
+ FAR struct bme680_config_s *config);
#undef EXTERN
#ifdef __cplusplus