@@ -118,6 +118,7 @@ struct bme680_data {
118
118
u8 oversampling_temp ;
119
119
u8 oversampling_press ;
120
120
u8 oversampling_humid ;
121
+ u8 preheat_curr_mA ;
121
122
u16 heater_dur ;
122
123
u16 heater_temp ;
123
124
@@ -214,6 +215,12 @@ static const struct iio_chan_spec bme680_channels[] = {
214
215
},
215
216
},
216
217
IIO_CHAN_SOFT_TIMESTAMP (4 ),
218
+ {
219
+ .type = IIO_CURRENT ,
220
+ .info_mask_separate = BIT (IIO_CHAN_INFO_PROCESSED ),
221
+ .output = 1 ,
222
+ .scan_index = -1 ,
223
+ },
217
224
};
218
225
219
226
static int bme680_read_calib (struct bme680_data * data ,
@@ -561,6 +568,12 @@ static u8 bme680_calc_heater_dur(u16 dur)
561
568
return durval ;
562
569
}
563
570
571
+ /* Taken from datasheet, section 5.3.3 */
572
+ static u8 bme680_calc_heater_preheat_current (u8 curr )
573
+ {
574
+ return 8 * curr - 1 ;
575
+ }
576
+
564
577
static int bme680_set_mode (struct bme680_data * data , enum bme680_op_mode mode )
565
578
{
566
579
struct device * dev = regmap_get_device (data -> regmap );
@@ -659,6 +672,20 @@ static int bme680_chip_config(struct bme680_data *data)
659
672
return 0 ;
660
673
}
661
674
675
+ static int bme680_preheat_curr_config (struct bme680_data * data , u8 val )
676
+ {
677
+ struct device * dev = regmap_get_device (data -> regmap );
678
+ u8 heatr_curr ;
679
+ int ret ;
680
+
681
+ heatr_curr = bme680_calc_heater_preheat_current (val );
682
+ ret = regmap_write (data -> regmap , BME680_REG_IDAC_HEAT_0 , heatr_curr );
683
+ if (ret < 0 )
684
+ dev_err (dev , "failed to write idac_heat_0 register\n" );
685
+
686
+ return ret ;
687
+ }
688
+
662
689
static int bme680_gas_config (struct bme680_data * data )
663
690
{
664
691
struct device * dev = regmap_get_device (data -> regmap );
@@ -687,6 +714,10 @@ static int bme680_gas_config(struct bme680_data *data)
687
714
return ret ;
688
715
}
689
716
717
+ ret = bme680_preheat_curr_config (data , data -> preheat_curr_mA );
718
+ if (ret )
719
+ return ret ;
720
+
690
721
/* Enable the gas sensor and select heater profile set-point 0 */
691
722
ret = regmap_update_bits (data -> regmap , BME680_REG_CTRL_GAS_1 ,
692
723
BME680_RUN_GAS_MASK | BME680_NB_CONV_MASK ,
@@ -939,6 +970,15 @@ static int bme680_write_raw(struct iio_dev *indio_dev,
939
970
940
971
return bme680_chip_config (data );
941
972
}
973
+ case IIO_CHAN_INFO_PROCESSED :
974
+ {
975
+ switch (chan -> type ) {
976
+ case IIO_CURRENT :
977
+ return bme680_preheat_curr_config (data , (u8 )val );
978
+ default :
979
+ return - EINVAL ;
980
+ }
981
+ }
942
982
default :
943
983
return - EINVAL ;
944
984
}
@@ -1072,6 +1112,7 @@ int bme680_core_probe(struct device *dev, struct regmap *regmap,
1072
1112
data -> oversampling_temp = 8 ; /* 8X oversampling rate */
1073
1113
data -> heater_temp = 320 ; /* degree Celsius */
1074
1114
data -> heater_dur = 150 ; /* milliseconds */
1115
+ data -> preheat_curr_mA = 0 ;
1075
1116
1076
1117
ret = regmap_write (regmap , BME680_REG_SOFT_RESET , BME680_CMD_SOFTRESET );
1077
1118
if (ret < 0 )
0 commit comments