bme680_core.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Bosch BME680 - Temperature, Pressure, Humidity & Gas Sensor
  4. *
  5. * Copyright (C) 2017 - 2018 Bosch Sensortec GmbH
  6. * Copyright (C) 2018 Himanshu Jha <himanshujha199640@gmail.com>
  7. *
  8. * Datasheet:
  9. * https://ae-bst.resource.bosch.com/media/_tech/media/datasheets/BST-BME680-DS001-00.pdf
  10. */
  11. #include <linux/acpi.h>
  12. #include <linux/bitfield.h>
  13. #include <linux/device.h>
  14. #include <linux/module.h>
  15. #include <linux/log2.h>
  16. #include <linux/regmap.h>
  17. #include <linux/iio/iio.h>
  18. #include <linux/iio/sysfs.h>
  19. #include "bme680.h"
  20. struct bme680_calib {
  21. u16 par_t1;
  22. s16 par_t2;
  23. s8 par_t3;
  24. u16 par_p1;
  25. s16 par_p2;
  26. s8 par_p3;
  27. s16 par_p4;
  28. s16 par_p5;
  29. s8 par_p6;
  30. s8 par_p7;
  31. s16 par_p8;
  32. s16 par_p9;
  33. u8 par_p10;
  34. u16 par_h1;
  35. u16 par_h2;
  36. s8 par_h3;
  37. s8 par_h4;
  38. s8 par_h5;
  39. s8 par_h6;
  40. s8 par_h7;
  41. s8 par_gh1;
  42. s16 par_gh2;
  43. s8 par_gh3;
  44. u8 res_heat_range;
  45. s8 res_heat_val;
  46. s8 range_sw_err;
  47. };
  48. struct bme680_data {
  49. struct regmap *regmap;
  50. struct bme680_calib bme680;
  51. u8 oversampling_temp;
  52. u8 oversampling_press;
  53. u8 oversampling_humid;
  54. u16 heater_dur;
  55. u16 heater_temp;
  56. /*
  57. * Carryover value from temperature conversion, used in pressure
  58. * and humidity compensation calculations.
  59. */
  60. s32 t_fine;
  61. };
  62. static const struct regmap_range bme680_volatile_ranges[] = {
  63. regmap_reg_range(BME680_REG_MEAS_STAT_0, BME680_REG_GAS_R_LSB),
  64. regmap_reg_range(BME680_REG_STATUS, BME680_REG_STATUS),
  65. regmap_reg_range(BME680_T2_LSB_REG, BME680_GH3_REG),
  66. };
  67. static const struct regmap_access_table bme680_volatile_table = {
  68. .yes_ranges = bme680_volatile_ranges,
  69. .n_yes_ranges = ARRAY_SIZE(bme680_volatile_ranges),
  70. };
  71. const struct regmap_config bme680_regmap_config = {
  72. .reg_bits = 8,
  73. .val_bits = 8,
  74. .max_register = 0xef,
  75. .volatile_table = &bme680_volatile_table,
  76. .cache_type = REGCACHE_RBTREE,
  77. };
  78. EXPORT_SYMBOL(bme680_regmap_config);
  79. static const struct iio_chan_spec bme680_channels[] = {
  80. {
  81. .type = IIO_TEMP,
  82. .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) |
  83. BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),
  84. },
  85. {
  86. .type = IIO_PRESSURE,
  87. .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) |
  88. BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),
  89. },
  90. {
  91. .type = IIO_HUMIDITYRELATIVE,
  92. .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) |
  93. BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO),
  94. },
  95. {
  96. .type = IIO_RESISTANCE,
  97. .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED),
  98. },
  99. };
  100. static const int bme680_oversampling_avail[] = { 1, 2, 4, 8, 16 };
  101. static int bme680_read_calib(struct bme680_data *data,
  102. struct bme680_calib *calib)
  103. {
  104. struct device *dev = regmap_get_device(data->regmap);
  105. unsigned int tmp, tmp_msb, tmp_lsb;
  106. int ret;
  107. __le16 buf;
  108. /* Temperature related coefficients */
  109. ret = regmap_bulk_read(data->regmap, BME680_T1_LSB_REG,
  110. (u8 *) &buf, 2);
  111. if (ret < 0) {
  112. dev_err(dev, "failed to read BME680_T1_LSB_REG\n");
  113. return ret;
  114. }
  115. calib->par_t1 = le16_to_cpu(buf);
  116. ret = regmap_bulk_read(data->regmap, BME680_T2_LSB_REG,
  117. (u8 *) &buf, 2);
  118. if (ret < 0) {
  119. dev_err(dev, "failed to read BME680_T2_LSB_REG\n");
  120. return ret;
  121. }
  122. calib->par_t2 = le16_to_cpu(buf);
  123. ret = regmap_read(data->regmap, BME680_T3_REG, &tmp);
  124. if (ret < 0) {
  125. dev_err(dev, "failed to read BME680_T3_REG\n");
  126. return ret;
  127. }
  128. calib->par_t3 = tmp;
  129. /* Pressure related coefficients */
  130. ret = regmap_bulk_read(data->regmap, BME680_P1_LSB_REG,
  131. (u8 *) &buf, 2);
  132. if (ret < 0) {
  133. dev_err(dev, "failed to read BME680_P1_LSB_REG\n");
  134. return ret;
  135. }
  136. calib->par_p1 = le16_to_cpu(buf);
  137. ret = regmap_bulk_read(data->regmap, BME680_P2_LSB_REG,
  138. (u8 *) &buf, 2);
  139. if (ret < 0) {
  140. dev_err(dev, "failed to read BME680_P2_LSB_REG\n");
  141. return ret;
  142. }
  143. calib->par_p2 = le16_to_cpu(buf);
  144. ret = regmap_read(data->regmap, BME680_P3_REG, &tmp);
  145. if (ret < 0) {
  146. dev_err(dev, "failed to read BME680_P3_REG\n");
  147. return ret;
  148. }
  149. calib->par_p3 = tmp;
  150. ret = regmap_bulk_read(data->regmap, BME680_P4_LSB_REG,
  151. (u8 *) &buf, 2);
  152. if (ret < 0) {
  153. dev_err(dev, "failed to read BME680_P4_LSB_REG\n");
  154. return ret;
  155. }
  156. calib->par_p4 = le16_to_cpu(buf);
  157. ret = regmap_bulk_read(data->regmap, BME680_P5_LSB_REG,
  158. (u8 *) &buf, 2);
  159. if (ret < 0) {
  160. dev_err(dev, "failed to read BME680_P5_LSB_REG\n");
  161. return ret;
  162. }
  163. calib->par_p5 = le16_to_cpu(buf);
  164. ret = regmap_read(data->regmap, BME680_P6_REG, &tmp);
  165. if (ret < 0) {
  166. dev_err(dev, "failed to read BME680_P6_REG\n");
  167. return ret;
  168. }
  169. calib->par_p6 = tmp;
  170. ret = regmap_read(data->regmap, BME680_P7_REG, &tmp);
  171. if (ret < 0) {
  172. dev_err(dev, "failed to read BME680_P7_REG\n");
  173. return ret;
  174. }
  175. calib->par_p7 = tmp;
  176. ret = regmap_bulk_read(data->regmap, BME680_P8_LSB_REG,
  177. (u8 *) &buf, 2);
  178. if (ret < 0) {
  179. dev_err(dev, "failed to read BME680_P8_LSB_REG\n");
  180. return ret;
  181. }
  182. calib->par_p8 = le16_to_cpu(buf);
  183. ret = regmap_bulk_read(data->regmap, BME680_P9_LSB_REG,
  184. (u8 *) &buf, 2);
  185. if (ret < 0) {
  186. dev_err(dev, "failed to read BME680_P9_LSB_REG\n");
  187. return ret;
  188. }
  189. calib->par_p9 = le16_to_cpu(buf);
  190. ret = regmap_read(data->regmap, BME680_P10_REG, &tmp);
  191. if (ret < 0) {
  192. dev_err(dev, "failed to read BME680_P10_REG\n");
  193. return ret;
  194. }
  195. calib->par_p10 = tmp;
  196. /* Humidity related coefficients */
  197. ret = regmap_read(data->regmap, BME680_H1_MSB_REG, &tmp_msb);
  198. if (ret < 0) {
  199. dev_err(dev, "failed to read BME680_H1_MSB_REG\n");
  200. return ret;
  201. }
  202. ret = regmap_read(data->regmap, BME680_H1_LSB_REG, &tmp_lsb);
  203. if (ret < 0) {
  204. dev_err(dev, "failed to read BME680_H1_LSB_REG\n");
  205. return ret;
  206. }
  207. calib->par_h1 = (tmp_msb << BME680_HUM_REG_SHIFT_VAL) |
  208. (tmp_lsb & BME680_BIT_H1_DATA_MSK);
  209. ret = regmap_read(data->regmap, BME680_H2_MSB_REG, &tmp_msb);
  210. if (ret < 0) {
  211. dev_err(dev, "failed to read BME680_H2_MSB_REG\n");
  212. return ret;
  213. }
  214. ret = regmap_read(data->regmap, BME680_H2_LSB_REG, &tmp_lsb);
  215. if (ret < 0) {
  216. dev_err(dev, "failed to read BME680_H2_LSB_REG\n");
  217. return ret;
  218. }
  219. calib->par_h2 = (tmp_msb << BME680_HUM_REG_SHIFT_VAL) |
  220. (tmp_lsb >> BME680_HUM_REG_SHIFT_VAL);
  221. ret = regmap_read(data->regmap, BME680_H3_REG, &tmp);
  222. if (ret < 0) {
  223. dev_err(dev, "failed to read BME680_H3_REG\n");
  224. return ret;
  225. }
  226. calib->par_h3 = tmp;
  227. ret = regmap_read(data->regmap, BME680_H4_REG, &tmp);
  228. if (ret < 0) {
  229. dev_err(dev, "failed to read BME680_H4_REG\n");
  230. return ret;
  231. }
  232. calib->par_h4 = tmp;
  233. ret = regmap_read(data->regmap, BME680_H5_REG, &tmp);
  234. if (ret < 0) {
  235. dev_err(dev, "failed to read BME680_H5_REG\n");
  236. return ret;
  237. }
  238. calib->par_h5 = tmp;
  239. ret = regmap_read(data->regmap, BME680_H6_REG, &tmp);
  240. if (ret < 0) {
  241. dev_err(dev, "failed to read BME680_H6_REG\n");
  242. return ret;
  243. }
  244. calib->par_h6 = tmp;
  245. ret = regmap_read(data->regmap, BME680_H7_REG, &tmp);
  246. if (ret < 0) {
  247. dev_err(dev, "failed to read BME680_H7_REG\n");
  248. return ret;
  249. }
  250. calib->par_h7 = tmp;
  251. /* Gas heater related coefficients */
  252. ret = regmap_read(data->regmap, BME680_GH1_REG, &tmp);
  253. if (ret < 0) {
  254. dev_err(dev, "failed to read BME680_GH1_REG\n");
  255. return ret;
  256. }
  257. calib->par_gh1 = tmp;
  258. ret = regmap_bulk_read(data->regmap, BME680_GH2_LSB_REG,
  259. (u8 *) &buf, 2);
  260. if (ret < 0) {
  261. dev_err(dev, "failed to read BME680_GH2_LSB_REG\n");
  262. return ret;
  263. }
  264. calib->par_gh2 = le16_to_cpu(buf);
  265. ret = regmap_read(data->regmap, BME680_GH3_REG, &tmp);
  266. if (ret < 0) {
  267. dev_err(dev, "failed to read BME680_GH3_REG\n");
  268. return ret;
  269. }
  270. calib->par_gh3 = tmp;
  271. /* Other coefficients */
  272. ret = regmap_read(data->regmap, BME680_REG_RES_HEAT_RANGE, &tmp);
  273. if (ret < 0) {
  274. dev_err(dev, "failed to read resistance heat range\n");
  275. return ret;
  276. }
  277. calib->res_heat_range = (tmp & BME680_RHRANGE_MSK) / 16;
  278. ret = regmap_read(data->regmap, BME680_REG_RES_HEAT_VAL, &tmp);
  279. if (ret < 0) {
  280. dev_err(dev, "failed to read resistance heat value\n");
  281. return ret;
  282. }
  283. calib->res_heat_val = tmp;
  284. ret = regmap_read(data->regmap, BME680_REG_RANGE_SW_ERR, &tmp);
  285. if (ret < 0) {
  286. dev_err(dev, "failed to read range software error\n");
  287. return ret;
  288. }
  289. calib->range_sw_err = (tmp & BME680_RSERROR_MSK) / 16;
  290. return 0;
  291. }
  292. /*
  293. * Taken from Bosch BME680 API:
  294. * https://github.com/BoschSensortec/BME680_driver/blob/63bb5336/bme680.c#L876
  295. *
  296. * Returns temperature measurement in DegC, resolutions is 0.01 DegC. Therefore,
  297. * output value of "3233" represents 32.33 DegC.
  298. */
  299. static s16 bme680_compensate_temp(struct bme680_data *data,
  300. s32 adc_temp)
  301. {
  302. struct bme680_calib *calib = &data->bme680;
  303. s64 var1, var2, var3;
  304. s16 calc_temp;
  305. /* If the calibration is invalid, attempt to reload it */
  306. if (!calib->par_t2)
  307. bme680_read_calib(data, calib);
  308. var1 = (adc_temp >> 3) - (calib->par_t1 << 1);
  309. var2 = (var1 * calib->par_t2) >> 11;
  310. var3 = ((var1 >> 1) * (var1 >> 1)) >> 12;
  311. var3 = (var3 * (calib->par_t3 << 4)) >> 14;
  312. data->t_fine = var2 + var3;
  313. calc_temp = (data->t_fine * 5 + 128) >> 8;
  314. return calc_temp;
  315. }
  316. /*
  317. * Taken from Bosch BME680 API:
  318. * https://github.com/BoschSensortec/BME680_driver/blob/63bb5336/bme680.c#L896
  319. *
  320. * Returns pressure measurement in Pa. Output value of "97356" represents
  321. * 97356 Pa = 973.56 hPa.
  322. */
  323. static u32 bme680_compensate_press(struct bme680_data *data,
  324. u32 adc_press)
  325. {
  326. struct bme680_calib *calib = &data->bme680;
  327. s32 var1, var2, var3, press_comp;
  328. var1 = (data->t_fine >> 1) - 64000;
  329. var2 = ((((var1 >> 2) * (var1 >> 2)) >> 11) * calib->par_p6) >> 2;
  330. var2 = var2 + (var1 * calib->par_p5 << 1);
  331. var2 = (var2 >> 2) + (calib->par_p4 << 16);
  332. var1 = (((((var1 >> 2) * (var1 >> 2)) >> 13) *
  333. (calib->par_p3 << 5)) >> 3) +
  334. ((calib->par_p2 * var1) >> 1);
  335. var1 = var1 >> 18;
  336. var1 = ((32768 + var1) * calib->par_p1) >> 15;
  337. press_comp = 1048576 - adc_press;
  338. press_comp = ((press_comp - (var2 >> 12)) * 3125);
  339. if (press_comp >= BME680_MAX_OVERFLOW_VAL)
  340. press_comp = ((press_comp / (u32)var1) << 1);
  341. else
  342. press_comp = ((press_comp << 1) / (u32)var1);
  343. var1 = (calib->par_p9 * (((press_comp >> 3) *
  344. (press_comp >> 3)) >> 13)) >> 12;
  345. var2 = ((press_comp >> 2) * calib->par_p8) >> 13;
  346. var3 = ((press_comp >> 8) * (press_comp >> 8) *
  347. (press_comp >> 8) * calib->par_p10) >> 17;
  348. press_comp += (var1 + var2 + var3 + (calib->par_p7 << 7)) >> 4;
  349. return press_comp;
  350. }
  351. /*
  352. * Taken from Bosch BME680 API:
  353. * https://github.com/BoschSensortec/BME680_driver/blob/63bb5336/bme680.c#L937
  354. *
  355. * Returns humidity measurement in percent, resolution is 0.001 percent. Output
  356. * value of "43215" represents 43.215 %rH.
  357. */
  358. static u32 bme680_compensate_humid(struct bme680_data *data,
  359. u16 adc_humid)
  360. {
  361. struct bme680_calib *calib = &data->bme680;
  362. s32 var1, var2, var3, var4, var5, var6, temp_scaled, calc_hum;
  363. temp_scaled = (data->t_fine * 5 + 128) >> 8;
  364. var1 = (adc_humid - ((s32) ((s32) calib->par_h1 * 16))) -
  365. (((temp_scaled * (s32) calib->par_h3) / 100) >> 1);
  366. var2 = ((s32) calib->par_h2 *
  367. (((temp_scaled * calib->par_h4) / 100) +
  368. (((temp_scaled * ((temp_scaled * calib->par_h5) / 100))
  369. >> 6) / 100) + (1 << 14))) >> 10;
  370. var3 = var1 * var2;
  371. var4 = calib->par_h6 << 7;
  372. var4 = (var4 + ((temp_scaled * calib->par_h7) / 100)) >> 4;
  373. var5 = ((var3 >> 14) * (var3 >> 14)) >> 10;
  374. var6 = (var4 * var5) >> 1;
  375. calc_hum = (((var3 + var6) >> 10) * 1000) >> 12;
  376. if (calc_hum > 100000) /* Cap at 100%rH */
  377. calc_hum = 100000;
  378. else if (calc_hum < 0)
  379. calc_hum = 0;
  380. return calc_hum;
  381. }
  382. /*
  383. * Taken from Bosch BME680 API:
  384. * https://github.com/BoschSensortec/BME680_driver/blob/63bb5336/bme680.c#L973
  385. *
  386. * Returns gas measurement in Ohm. Output value of "82986" represent 82986 ohms.
  387. */
  388. static u32 bme680_compensate_gas(struct bme680_data *data, u16 gas_res_adc,
  389. u8 gas_range)
  390. {
  391. struct bme680_calib *calib = &data->bme680;
  392. s64 var1;
  393. u64 var2;
  394. s64 var3;
  395. u32 calc_gas_res;
  396. /* Look up table for the possible gas range values */
  397. const u32 lookupTable[16] = {2147483647u, 2147483647u,
  398. 2147483647u, 2147483647u, 2147483647u,
  399. 2126008810u, 2147483647u, 2130303777u,
  400. 2147483647u, 2147483647u, 2143188679u,
  401. 2136746228u, 2147483647u, 2126008810u,
  402. 2147483647u, 2147483647u};
  403. var1 = ((1340 + (5 * (s64) calib->range_sw_err)) *
  404. ((s64) lookupTable[gas_range])) >> 16;
  405. var2 = ((gas_res_adc << 15) - 16777216) + var1;
  406. var3 = ((125000 << (15 - gas_range)) * var1) >> 9;
  407. var3 += (var2 >> 1);
  408. calc_gas_res = div64_s64(var3, (s64) var2);
  409. return calc_gas_res;
  410. }
  411. /*
  412. * Taken from Bosch BME680 API:
  413. * https://github.com/BoschSensortec/BME680_driver/blob/63bb5336/bme680.c#L1002
  414. */
  415. static u8 bme680_calc_heater_res(struct bme680_data *data, u16 temp)
  416. {
  417. struct bme680_calib *calib = &data->bme680;
  418. s32 var1, var2, var3, var4, var5, heatr_res_x100;
  419. u8 heatr_res;
  420. if (temp > 400) /* Cap temperature */
  421. temp = 400;
  422. var1 = (((s32) BME680_AMB_TEMP * calib->par_gh3) / 1000) * 256;
  423. var2 = (calib->par_gh1 + 784) * (((((calib->par_gh2 + 154009) *
  424. temp * 5) / 100)
  425. + 3276800) / 10);
  426. var3 = var1 + (var2 / 2);
  427. var4 = (var3 / (calib->res_heat_range + 4));
  428. var5 = 131 * calib->res_heat_val + 65536;
  429. heatr_res_x100 = ((var4 / var5) - 250) * 34;
  430. heatr_res = (heatr_res_x100 + 50) / 100;
  431. return heatr_res;
  432. }
  433. /*
  434. * Taken from Bosch BME680 API:
  435. * https://github.com/BoschSensortec/BME680_driver/blob/63bb5336/bme680.c#L1188
  436. */
  437. static u8 bme680_calc_heater_dur(u16 dur)
  438. {
  439. u8 durval, factor = 0;
  440. if (dur >= 0xfc0) {
  441. durval = 0xff; /* Max duration */
  442. } else {
  443. while (dur > 0x3F) {
  444. dur = dur / 4;
  445. factor += 1;
  446. }
  447. durval = dur + (factor * 64);
  448. }
  449. return durval;
  450. }
  451. static int bme680_set_mode(struct bme680_data *data, bool mode)
  452. {
  453. struct device *dev = regmap_get_device(data->regmap);
  454. int ret;
  455. if (mode) {
  456. ret = regmap_write_bits(data->regmap, BME680_REG_CTRL_MEAS,
  457. BME680_MODE_MASK, BME680_MODE_FORCED);
  458. if (ret < 0)
  459. dev_err(dev, "failed to set forced mode\n");
  460. } else {
  461. ret = regmap_write_bits(data->regmap, BME680_REG_CTRL_MEAS,
  462. BME680_MODE_MASK, BME680_MODE_SLEEP);
  463. if (ret < 0)
  464. dev_err(dev, "failed to set sleep mode\n");
  465. }
  466. return ret;
  467. }
  468. static int bme680_chip_config(struct bme680_data *data)
  469. {
  470. struct device *dev = regmap_get_device(data->regmap);
  471. int ret;
  472. u8 osrs = FIELD_PREP(BME680_OSRS_HUMIDITY_MASK,
  473. data->oversampling_humid + 1);
  474. /*
  475. * Highly recommended to set oversampling of humidity before
  476. * temperature/pressure oversampling.
  477. */
  478. ret = regmap_update_bits(data->regmap, BME680_REG_CTRL_HUMIDITY,
  479. BME680_OSRS_HUMIDITY_MASK, osrs);
  480. if (ret < 0) {
  481. dev_err(dev, "failed to write ctrl_hum register\n");
  482. return ret;
  483. }
  484. /* IIR filter settings */
  485. ret = regmap_update_bits(data->regmap, BME680_REG_CONFIG,
  486. BME680_FILTER_MASK,
  487. BME680_FILTER_COEFF_VAL);
  488. if (ret < 0) {
  489. dev_err(dev, "failed to write config register\n");
  490. return ret;
  491. }
  492. osrs = FIELD_PREP(BME680_OSRS_TEMP_MASK, data->oversampling_temp + 1) |
  493. FIELD_PREP(BME680_OSRS_PRESS_MASK, data->oversampling_press + 1);
  494. ret = regmap_write_bits(data->regmap, BME680_REG_CTRL_MEAS,
  495. BME680_OSRS_TEMP_MASK |
  496. BME680_OSRS_PRESS_MASK,
  497. osrs);
  498. if (ret < 0)
  499. dev_err(dev, "failed to write ctrl_meas register\n");
  500. return ret;
  501. }
  502. static int bme680_gas_config(struct bme680_data *data)
  503. {
  504. struct device *dev = regmap_get_device(data->regmap);
  505. int ret;
  506. u8 heatr_res, heatr_dur;
  507. heatr_res = bme680_calc_heater_res(data, data->heater_temp);
  508. /* set target heater temperature */
  509. ret = regmap_write(data->regmap, BME680_REG_RES_HEAT_0, heatr_res);
  510. if (ret < 0) {
  511. dev_err(dev, "failed to write res_heat_0 register\n");
  512. return ret;
  513. }
  514. heatr_dur = bme680_calc_heater_dur(data->heater_dur);
  515. /* set target heating duration */
  516. ret = regmap_write(data->regmap, BME680_REG_GAS_WAIT_0, heatr_dur);
  517. if (ret < 0) {
  518. dev_err(dev, "failted to write gas_wait_0 register\n");
  519. return ret;
  520. }
  521. /* Selecting the runGas and NB conversion settings for the sensor */
  522. ret = regmap_update_bits(data->regmap, BME680_REG_CTRL_GAS_1,
  523. BME680_RUN_GAS_MASK | BME680_NB_CONV_MASK,
  524. BME680_RUN_GAS_EN_BIT | BME680_NB_CONV_0_VAL);
  525. if (ret < 0)
  526. dev_err(dev, "failed to write ctrl_gas_1 register\n");
  527. return ret;
  528. }
  529. static int bme680_read_temp(struct bme680_data *data, int *val)
  530. {
  531. struct device *dev = regmap_get_device(data->regmap);
  532. int ret;
  533. __be32 tmp = 0;
  534. s32 adc_temp;
  535. s16 comp_temp;
  536. /* set forced mode to trigger measurement */
  537. ret = bme680_set_mode(data, true);
  538. if (ret < 0)
  539. return ret;
  540. ret = regmap_bulk_read(data->regmap, BME680_REG_TEMP_MSB,
  541. (u8 *) &tmp, 3);
  542. if (ret < 0) {
  543. dev_err(dev, "failed to read temperature\n");
  544. return ret;
  545. }
  546. adc_temp = be32_to_cpu(tmp) >> 12;
  547. if (adc_temp == BME680_MEAS_SKIPPED) {
  548. /* reading was skipped */
  549. dev_err(dev, "reading temperature skipped\n");
  550. return -EINVAL;
  551. }
  552. comp_temp = bme680_compensate_temp(data, adc_temp);
  553. /*
  554. * val might be NULL if we're called by the read_press/read_humid
  555. * routine which is callled to get t_fine value used in
  556. * compensate_press/compensate_humid to get compensated
  557. * pressure/humidity readings.
  558. */
  559. if (val) {
  560. *val = comp_temp * 10; /* Centidegrees to millidegrees */
  561. return IIO_VAL_INT;
  562. }
  563. return ret;
  564. }
  565. static int bme680_read_press(struct bme680_data *data,
  566. int *val, int *val2)
  567. {
  568. struct device *dev = regmap_get_device(data->regmap);
  569. int ret;
  570. __be32 tmp = 0;
  571. s32 adc_press;
  572. /* Read and compensate temperature to get a reading of t_fine */
  573. ret = bme680_read_temp(data, NULL);
  574. if (ret < 0)
  575. return ret;
  576. ret = regmap_bulk_read(data->regmap, BME680_REG_PRESS_MSB,
  577. (u8 *) &tmp, 3);
  578. if (ret < 0) {
  579. dev_err(dev, "failed to read pressure\n");
  580. return ret;
  581. }
  582. adc_press = be32_to_cpu(tmp) >> 12;
  583. if (adc_press == BME680_MEAS_SKIPPED) {
  584. /* reading was skipped */
  585. dev_err(dev, "reading pressure skipped\n");
  586. return -EINVAL;
  587. }
  588. *val = bme680_compensate_press(data, adc_press);
  589. *val2 = 100;
  590. return IIO_VAL_FRACTIONAL;
  591. }
  592. static int bme680_read_humid(struct bme680_data *data,
  593. int *val, int *val2)
  594. {
  595. struct device *dev = regmap_get_device(data->regmap);
  596. int ret;
  597. __be16 tmp = 0;
  598. s32 adc_humidity;
  599. u32 comp_humidity;
  600. /* Read and compensate temperature to get a reading of t_fine */
  601. ret = bme680_read_temp(data, NULL);
  602. if (ret < 0)
  603. return ret;
  604. ret = regmap_bulk_read(data->regmap, BM6880_REG_HUMIDITY_MSB,
  605. (u8 *) &tmp, 2);
  606. if (ret < 0) {
  607. dev_err(dev, "failed to read humidity\n");
  608. return ret;
  609. }
  610. adc_humidity = be16_to_cpu(tmp);
  611. if (adc_humidity == BME680_MEAS_SKIPPED) {
  612. /* reading was skipped */
  613. dev_err(dev, "reading humidity skipped\n");
  614. return -EINVAL;
  615. }
  616. comp_humidity = bme680_compensate_humid(data, adc_humidity);
  617. *val = comp_humidity;
  618. *val2 = 1000;
  619. return IIO_VAL_FRACTIONAL;
  620. }
  621. static int bme680_read_gas(struct bme680_data *data,
  622. int *val)
  623. {
  624. struct device *dev = regmap_get_device(data->regmap);
  625. int ret;
  626. __be16 tmp = 0;
  627. unsigned int check;
  628. u16 adc_gas_res;
  629. u8 gas_range;
  630. /* Set heater settings */
  631. ret = bme680_gas_config(data);
  632. if (ret < 0) {
  633. dev_err(dev, "failed to set gas config\n");
  634. return ret;
  635. }
  636. /* set forced mode to trigger measurement */
  637. ret = bme680_set_mode(data, true);
  638. if (ret < 0)
  639. return ret;
  640. ret = regmap_read(data->regmap, BME680_REG_MEAS_STAT_0, &check);
  641. if (check & BME680_GAS_MEAS_BIT) {
  642. dev_err(dev, "gas measurement incomplete\n");
  643. return -EBUSY;
  644. }
  645. ret = regmap_read(data->regmap, BME680_REG_GAS_R_LSB, &check);
  646. if (ret < 0) {
  647. dev_err(dev, "failed to read gas_r_lsb register\n");
  648. return ret;
  649. }
  650. /*
  651. * occurs if either the gas heating duration was insuffient
  652. * to reach the target heater temperature or the target
  653. * heater temperature was too high for the heater sink to
  654. * reach.
  655. */
  656. if ((check & BME680_GAS_STAB_BIT) == 0) {
  657. dev_err(dev, "heater failed to reach the target temperature\n");
  658. return -EINVAL;
  659. }
  660. ret = regmap_bulk_read(data->regmap, BME680_REG_GAS_MSB,
  661. (u8 *) &tmp, 2);
  662. if (ret < 0) {
  663. dev_err(dev, "failed to read gas resistance\n");
  664. return ret;
  665. }
  666. gas_range = check & BME680_GAS_RANGE_MASK;
  667. adc_gas_res = be16_to_cpu(tmp) >> BME680_ADC_GAS_RES_SHIFT;
  668. *val = bme680_compensate_gas(data, adc_gas_res, gas_range);
  669. return IIO_VAL_INT;
  670. }
  671. static int bme680_read_raw(struct iio_dev *indio_dev,
  672. struct iio_chan_spec const *chan,
  673. int *val, int *val2, long mask)
  674. {
  675. struct bme680_data *data = iio_priv(indio_dev);
  676. switch (mask) {
  677. case IIO_CHAN_INFO_PROCESSED:
  678. switch (chan->type) {
  679. case IIO_TEMP:
  680. return bme680_read_temp(data, val);
  681. case IIO_PRESSURE:
  682. return bme680_read_press(data, val, val2);
  683. case IIO_HUMIDITYRELATIVE:
  684. return bme680_read_humid(data, val, val2);
  685. case IIO_RESISTANCE:
  686. return bme680_read_gas(data, val);
  687. default:
  688. return -EINVAL;
  689. }
  690. case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
  691. switch (chan->type) {
  692. case IIO_TEMP:
  693. *val = 1 << data->oversampling_temp;
  694. return IIO_VAL_INT;
  695. case IIO_PRESSURE:
  696. *val = 1 << data->oversampling_press;
  697. return IIO_VAL_INT;
  698. case IIO_HUMIDITYRELATIVE:
  699. *val = 1 << data->oversampling_humid;
  700. return IIO_VAL_INT;
  701. default:
  702. return -EINVAL;
  703. }
  704. default:
  705. return -EINVAL;
  706. }
  707. }
  708. static int bme680_write_oversampling_ratio_temp(struct bme680_data *data,
  709. int val)
  710. {
  711. int i;
  712. for (i = 0; i < ARRAY_SIZE(bme680_oversampling_avail); i++) {
  713. if (bme680_oversampling_avail[i] == val) {
  714. data->oversampling_temp = ilog2(val);
  715. return bme680_chip_config(data);
  716. }
  717. }
  718. return -EINVAL;
  719. }
  720. static int bme680_write_oversampling_ratio_press(struct bme680_data *data,
  721. int val)
  722. {
  723. int i;
  724. for (i = 0; i < ARRAY_SIZE(bme680_oversampling_avail); i++) {
  725. if (bme680_oversampling_avail[i] == val) {
  726. data->oversampling_press = ilog2(val);
  727. return bme680_chip_config(data);
  728. }
  729. }
  730. return -EINVAL;
  731. }
  732. static int bme680_write_oversampling_ratio_humid(struct bme680_data *data,
  733. int val)
  734. {
  735. int i;
  736. for (i = 0; i < ARRAY_SIZE(bme680_oversampling_avail); i++) {
  737. if (bme680_oversampling_avail[i] == val) {
  738. data->oversampling_humid = ilog2(val);
  739. return bme680_chip_config(data);
  740. }
  741. }
  742. return -EINVAL;
  743. }
  744. static int bme680_write_raw(struct iio_dev *indio_dev,
  745. struct iio_chan_spec const *chan,
  746. int val, int val2, long mask)
  747. {
  748. struct bme680_data *data = iio_priv(indio_dev);
  749. switch (mask) {
  750. case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
  751. switch (chan->type) {
  752. case IIO_TEMP:
  753. return bme680_write_oversampling_ratio_temp(data, val);
  754. case IIO_PRESSURE:
  755. return bme680_write_oversampling_ratio_press(data, val);
  756. case IIO_HUMIDITYRELATIVE:
  757. return bme680_write_oversampling_ratio_humid(data, val);
  758. default:
  759. return -EINVAL;
  760. }
  761. default:
  762. return -EINVAL;
  763. }
  764. }
  765. static const char bme680_oversampling_ratio_show[] = "1 2 4 8 16";
  766. static IIO_CONST_ATTR(oversampling_ratio_available,
  767. bme680_oversampling_ratio_show);
  768. static struct attribute *bme680_attributes[] = {
  769. &iio_const_attr_oversampling_ratio_available.dev_attr.attr,
  770. NULL,
  771. };
  772. static const struct attribute_group bme680_attribute_group = {
  773. .attrs = bme680_attributes,
  774. };
  775. static const struct iio_info bme680_info = {
  776. .read_raw = &bme680_read_raw,
  777. .write_raw = &bme680_write_raw,
  778. .attrs = &bme680_attribute_group,
  779. };
  780. static const char *bme680_match_acpi_device(struct device *dev)
  781. {
  782. const struct acpi_device_id *id;
  783. id = acpi_match_device(dev->driver->acpi_match_table, dev);
  784. if (!id)
  785. return NULL;
  786. return dev_name(dev);
  787. }
  788. int bme680_core_probe(struct device *dev, struct regmap *regmap,
  789. const char *name)
  790. {
  791. struct iio_dev *indio_dev;
  792. struct bme680_data *data;
  793. unsigned int val;
  794. int ret;
  795. ret = regmap_write(regmap, BME680_REG_SOFT_RESET,
  796. BME680_CMD_SOFTRESET);
  797. if (ret < 0) {
  798. dev_err(dev, "Failed to reset chip\n");
  799. return ret;
  800. }
  801. ret = regmap_read(regmap, BME680_REG_CHIP_ID, &val);
  802. if (ret < 0) {
  803. dev_err(dev, "Error reading chip ID\n");
  804. return ret;
  805. }
  806. if (val != BME680_CHIP_ID_VAL) {
  807. dev_err(dev, "Wrong chip ID, got %x expected %x\n",
  808. val, BME680_CHIP_ID_VAL);
  809. return -ENODEV;
  810. }
  811. indio_dev = devm_iio_device_alloc(dev, sizeof(*data));
  812. if (!indio_dev)
  813. return -ENOMEM;
  814. if (!name && ACPI_HANDLE(dev))
  815. name = bme680_match_acpi_device(dev);
  816. data = iio_priv(indio_dev);
  817. dev_set_drvdata(dev, indio_dev);
  818. data->regmap = regmap;
  819. indio_dev->dev.parent = dev;
  820. indio_dev->name = name;
  821. indio_dev->channels = bme680_channels;
  822. indio_dev->num_channels = ARRAY_SIZE(bme680_channels);
  823. indio_dev->info = &bme680_info;
  824. indio_dev->modes = INDIO_DIRECT_MODE;
  825. /* default values for the sensor */
  826. data->oversampling_humid = ilog2(2); /* 2X oversampling rate */
  827. data->oversampling_press = ilog2(4); /* 4X oversampling rate */
  828. data->oversampling_temp = ilog2(8); /* 8X oversampling rate */
  829. data->heater_temp = 320; /* degree Celsius */
  830. data->heater_dur = 150; /* milliseconds */
  831. ret = bme680_chip_config(data);
  832. if (ret < 0) {
  833. dev_err(dev, "failed to set chip_config data\n");
  834. return ret;
  835. }
  836. ret = bme680_gas_config(data);
  837. if (ret < 0) {
  838. dev_err(dev, "failed to set gas config data\n");
  839. return ret;
  840. }
  841. ret = bme680_read_calib(data, &data->bme680);
  842. if (ret < 0) {
  843. dev_err(dev,
  844. "failed to read calibration coefficients at probe\n");
  845. return ret;
  846. }
  847. return devm_iio_device_register(dev, indio_dev);
  848. }
  849. EXPORT_SYMBOL_GPL(bme680_core_probe);
  850. MODULE_AUTHOR("Himanshu Jha <himanshujha199640@gmail.com>");
  851. MODULE_DESCRIPTION("Bosch BME680 Driver");
  852. MODULE_LICENSE("GPL v2");