Module Name: src
Committed By: brad
Date: Thu Dec 1 00:47:51 UTC 2022
Modified Files:
src/sys/dev/i2c: bmx280.c
Log Message:
Correct the humidity conversion for the BME280
To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/sys/dev/i2c/bmx280.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/i2c/bmx280.c
diff -u src/sys/dev/i2c/bmx280.c:1.4 src/sys/dev/i2c/bmx280.c:1.5
--- src/sys/dev/i2c/bmx280.c:1.4 Thu Nov 24 21:07:05 2022
+++ src/sys/dev/i2c/bmx280.c Thu Dec 1 00:47:51 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: bmx280.c,v 1.4 2022/11/24 21:07:05 brad Exp $ */
+/* $NetBSD: bmx280.c,v 1.5 2022/12/01 00:47:51 brad Exp $ */
/*
* Copyright (c) 2022 Brad Spencer <[email protected]>
@@ -17,7 +17,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: bmx280.c,v 1.4 2022/11/24 21:07:05 brad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bmx280.c,v 1.5 2022/12/01 00:47:51 brad Exp $");
/*
Driver for the Bosch BMP280/BME280 temperature, humidity (sometimes) and
@@ -277,8 +277,7 @@ bmx280_store_raw_blob_h(struct bmx280_sc
sc->sc_cal_blob.dig_H2 = (int16_t)b[2] << 8;
sc->sc_cal_blob.dig_H2 = sc->sc_cal_blob.dig_H2 | (int16_t)b[1];
sc->sc_cal_blob.dig_H3 = (uint8_t)b[3];
- sc->sc_cal_blob.dig_H4 = ((int16_t)b[5] & 0x000f) << 8;
- sc->sc_cal_blob.dig_H4 = sc->sc_cal_blob.dig_H4 | (int16_t)b[4];
+ sc->sc_cal_blob.dig_H4 = ((int16_t)((b[4] << 4) | (b[5] & 0x0F)));
sc->sc_cal_blob.dig_H5 = (int16_t)b[6] << 4;
sc->sc_cal_blob.dig_H5 = sc->sc_cal_blob.dig_H5 | (((int16_t)b[5] & 0x00f0) >> 4);
sc->sc_cal_blob.dig_H6 = (int8_t)b[7];
@@ -566,6 +565,13 @@ bmx280_attach(device_t parent, device_t
error);
}
+ if (sc->sc_bmx280debug > 0) {
+ for(int _d = 0;_d < 24;_d++) {
+ DPRINTF(sc, 0, ("%s: %d %02x\n",
+ device_xname(sc->sc_dev), _d, raw_blob_tp[_d]));
+ }
+ }
+
bmx280_store_raw_blob_tp(sc,raw_blob_tp);
if (sc->sc_has_humidity) {
@@ -585,6 +591,13 @@ bmx280_attach(device_t parent, device_t
error);
}
+ if (sc->sc_bmx280debug > 0) {
+ for(int _d = 0;_d < 8;_d++) {
+ DPRINTF(sc, 0, ("%s: %d %02x\n",
+ device_xname(sc->sc_dev), _d, raw_blob_h[_d]));
+ }
+ }
+
bmx280_store_raw_blob_h(sc,raw_blob_h);
}
@@ -1049,15 +1062,15 @@ bmx280_refresh(struct sysmon_envsys * sm
DPRINTF(sc, 2, ("%s: Refresh compensated humidity: %d\n",
device_xname(sc->sc_dev), comp_hum));
- uint32_t q;
+ uint64_t q;
- q = comp_hum;
+ q = (uint64_t)comp_hum * 1000000;
+ DPRINTF(sc, 1, ("%s: Refresh humidity Q 1: %lld\n", __func__, q));
q = q / 1024;
- q = q * 100; /* XXX - this probably is not correct */
- DPRINTF(sc, 1, ("%s: Refresh humidity Q: %d\n", __func__, q));
+ DPRINTF(sc, 1, ("%s: Refresh humidity Q 2: %lld\n", __func__, q));
- edata->value_cur = q;
+ edata->value_cur = (uint32_t) q;
edata->state = ENVSYS_SVALID;
}
}