summaryrefslogtreecommitdiff
path: root/driver/baro_bmp280.c
diff options
context:
space:
mode:
authorGwendal Grignou <gwendal@chromium.org>2016-09-13 12:27:18 -0700
committerchrome-bot <chrome-bot@chromium.org>2016-09-15 16:16:10 -0700
commitf48b781dea0593f153715fc3c08a8dcf50236360 (patch)
treec091de6645c522c73289e0ea81300736e2098db2 /driver/baro_bmp280.c
parent22d7aeb27711b87277f65288d58dda12efb77ffe (diff)
downloadchrome-ec-f48b781dea0593f153715fc3c08a8dcf50236360.tar.gz
driver: bmp280: set_data_rate rate in mHz.
The argument is mHz not ms. BUG=chrome-os-partner:57117,b:27849483 BRANCH=reef TEST=Using frequency sysfs parameter check the returned value is close to the requested value. It will be greater than the requested frequency. It maxes out at 76Hz when frequency is greater than 13.5Hz. Check Androsensor reports pressure. Change-Id: Ie40ac0f0a83d1578b5b66097d85a9124ec8e4c54 Signed-off-by: Gwendal Grignou <gwendal@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/385083 Reviewed-by: Divya S Sasidharan <divya.s.sasidharan@intel.com> Reviewed-by: Aseda Aboagye <aaboagye@chromium.org>
Diffstat (limited to 'driver/baro_bmp280.c')
-rw-r--r--driver/baro_bmp280.c43
1 files changed, 22 insertions, 21 deletions
diff --git a/driver/baro_bmp280.c b/driver/baro_bmp280.c
index d2fb25d378..6e394dbf72 100644
--- a/driver/baro_bmp280.c
+++ b/driver/baro_bmp280.c
@@ -66,7 +66,7 @@
#define CPRINTF(format, args...) cprintf(CC_ACCEL, format, ## args)
#define CPRINTS(format, args...) cprints(CC_ACCEL, format, ## args)
-static const int standby_durn[] = {1, 63, 125, 250, 500, 1000, 2000, 4000};
+static const uint16_t standby_durn[] = {1, 63, 125, 250, 500, 1000, 2000, 4000};
static inline int raw_read8(const int port, const int addr, const uint8_t reg,
int *data_ptr)
@@ -249,7 +249,6 @@ static int bmp280_set_standby_durn(const struct motion_sensor_t *s,
uint8_t durn)
{
int ret, val;
- struct bmp280_drv_data_t *data = BMP280_GET_DATA(s);
ret = raw_read8(s->port, s->addr,
BMP280_CONFIG_REG, &val);
@@ -261,7 +260,6 @@ static int bmp280_set_standby_durn(const struct motion_sensor_t *s,
BMP280_CONFIG_REG, val);
}
- data->rate = standby_durn[durn] + BMP280_COMPUTE_TIME;
return ret;
}
@@ -334,10 +332,6 @@ static int bmp280_read(const struct motion_sensor_t *s, vector_3_t v)
int ret, pres;
struct bmp280_drv_data_t *data = BMP280_GET_DATA(s);
- /* Sensor in sleep mode */
- if (!data->rate)
- return EC_ERROR_INVAL;
-
ret = bmp280_read_uncomp_pressure(s, &pres);
if (ret)
@@ -349,17 +343,18 @@ static int bmp280_read(const struct motion_sensor_t *s, vector_3_t v)
return EC_SUCCESS;
}
-/* Set desired standby duration in ms */
+/*
+ * Set data rate, rate in mHz.
+ * Calculate the delay (in ms) to apply.
+ */
static int bmp280_set_data_rate(const struct motion_sensor_t *s, int rate,
int roundup)
{
struct bmp280_drv_data_t *data = BMP280_GET_DATA(s);
int durn, i, ret;
+ int period = 1000000 / rate; /* Period in ms */
- if (rate < 0)
- return EC_ERROR_INVAL;
-
- if (!rate) {
+ if (rate == 0) {
/* Set to sleep mode */
data->rate = 0;
return bmp280_set_power_mode(s, BMP280_SLEEP_MODE);
@@ -372,26 +367,32 @@ static int bmp280_set_data_rate(const struct motion_sensor_t *s, int rate,
return ret;
}
- durn = BMP280_STANDBY_CNT-1;
- for (i = 0; i < BMP280_STANDBY_CNT-1; i++) {
- if (rate == (standby_durn[i] + BMP280_COMPUTE_TIME) ||
- rate < (standby_durn[i] + BMP280_COMPUTE_TIME)) {
+ durn = 0;
+ for (i = BMP280_STANDBY_CNT-1; i > 0; i--) {
+ if (period >= standby_durn[i] + BMP280_COMPUTE_TIME) {
durn = i;
break;
- } else if (rate > (standby_durn[i] + BMP280_COMPUTE_TIME) &&
- rate < (standby_durn[i+1] + BMP280_COMPUTE_TIME)) {
- durn = roundup ? i+1 : i;
+ } else if (period > standby_durn[i-1] + BMP280_COMPUTE_TIME) {
+ durn = roundup ? i-1 : i;
break;
}
}
- return bmp280_set_standby_durn(s, durn);
+ ret = bmp280_set_standby_durn(s, durn);
+ if (ret == EC_SUCCESS)
+ /*
+ * The maximum frequency is around 76Hz. Be sure it fits in 16
+ * bits by shifting by one bit.
+ */
+ data->rate = (1000000 >> BMP280_RATE_SHIFT) /
+ (standby_durn[durn] + BMP280_COMPUTE_TIME);
+ return ret;
}
static int bmp280_get_data_rate(const struct motion_sensor_t *s)
{
struct bmp280_drv_data_t *data = BMP280_GET_DATA(s);
- return data->rate;
+ return data->rate << BMP280_RATE_SHIFT;
}
struct bmp280_drv_data_t bmp280_drv_data;