[PATCH v1 09/13] iio: chemical: bme680: Move ambient temperature to attributes

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Vasileios Amoiridis <vassilisamir@xxxxxxxxx>

Remove the ambient temperature from being a macro and implement it as
an attribute. This way, it is possible to dynamically configure the
ambient temperature of the environment to improve the accuracy of the
measurements.

Signed-off-by: Vasileios Amoiridis <vassilisamir@xxxxxxxxx>
---
 drivers/iio/chemical/bme680.h      |  1 -
 drivers/iio/chemical/bme680_core.c | 35 +++++++++++++++++++++++++++++-
 2 files changed, 34 insertions(+), 2 deletions(-)

diff --git a/drivers/iio/chemical/bme680.h b/drivers/iio/chemical/bme680.h
index e9e3e08fa366..95d39c154d59 100644
--- a/drivers/iio/chemical/bme680.h
+++ b/drivers/iio/chemical/bme680.h
@@ -45,7 +45,6 @@
 #define BME680_REG_RES_HEAT_0			0x5A
 #define BME680_REG_GAS_WAIT_0			0x64
 #define BME680_ADC_GAS_RES			GENMASK(15, 6)
-#define BME680_AMB_TEMP				25
 
 #define BME680_REG_CTRL_GAS_1			0x71
 #define   BME680_RUN_GAS_MASK			BIT(4)
diff --git a/drivers/iio/chemical/bme680_core.c b/drivers/iio/chemical/bme680_core.c
index 5fd5740bb7fe..0979c8f0afcf 100644
--- a/drivers/iio/chemical/bme680_core.c
+++ b/drivers/iio/chemical/bme680_core.c
@@ -120,6 +120,7 @@ struct bme680_data {
 	u16 heater_temp;
 
 	struct regulator_bulk_data supplies[BME680_NUM_SUPPLIES];
+	int ambient_temp;
 
 	union {
 		u8 buf[3];
@@ -483,7 +484,7 @@ static u8 bme680_calc_heater_res(struct bme680_data *data, u16 temp)
 	if (temp > 400) /* Cap temperature */
 		temp = 400;
 
-	var1 = (((s32)BME680_AMB_TEMP * calib->par_gh3) / 1000) * 256;
+	var1 = (((s32)data->ambient_temp * calib->par_gh3) / 1000) * 256;
 	var2 = (calib->par_gh1 + 784) * (((((calib->par_gh2 + 154009) *
 						temp * 5) / 100)
 						+ 3276800) / 10);
@@ -878,6 +879,37 @@ static int bme680_write_raw(struct iio_dev *indio_dev,
 	return ret;
 }
 
+static ssize_t ambient_temp_show(struct device *dev,
+				 struct device_attribute *attr, char *buf)
+{
+	struct iio_dev *indio_dev = dev_to_iio_dev(dev);
+	struct bme680_data *data = iio_priv(indio_dev);
+	int vals[2];
+
+	vals[0] = data->ambient_temp;
+	vals[1] = 1;
+
+	return iio_format_value(buf, IIO_VAL_INT, 1, vals);
+}
+
+static ssize_t ambient_temp_store(struct device *dev,
+				  struct device_attribute *attr,
+				  const char *buf, size_t len)
+{
+	struct iio_dev *indio_dev = dev_to_iio_dev(dev);
+	struct bme680_data *data = iio_priv(indio_dev);
+	int ret, val_int, val_fract;
+
+	ret = iio_str_to_fixpoint(buf, 1, &val_int, &val_fract);
+	if (ret)
+		return ret;
+
+	data->ambient_temp = val_int;
+	return len;
+}
+
+static IIO_DEVICE_ATTR_RW(ambient_temp, 0);
+
 static const char bme680_oversampling_ratio_show[] = "1 2 4 8 16";
 
 static IIO_CONST_ATTR(oversampling_ratio_available,
@@ -885,6 +917,7 @@ static IIO_CONST_ATTR(oversampling_ratio_available,
 
 static struct attribute *bme680_attributes[] = {
 	&iio_const_attr_oversampling_ratio_available.dev_attr.attr,
+	&iio_dev_attr_ambient_temp.dev_attr.attr,
 	NULL,
 };
 
-- 
2.43.0





[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Input]     [Linux Kernel]     [Linux SCSI]     [X.org]

  Powered by Linux