summaryrefslogtreecommitdiff
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
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>
-rw-r--r--driver/baro_bmp280.c43
-rw-r--r--driver/baro_bmp280.h10
2 files changed, 28 insertions, 25 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;
diff --git a/driver/baro_bmp280.h b/driver/baro_bmp280.h
index 7a420655ab..1af1aa2125 100644
--- a/driver/baro_bmp280.h
+++ b/driver/baro_bmp280.h
@@ -144,9 +144,9 @@
*/
#define BMP280_COMPUTE_TIME \
((T_INIT_MAX + T_MEASURE_PER_OSRS_MAX * \
- (((1 << BMP280_OVERSAMP_TEMP) >> 1) + \
- ((1 << BMP280_OVERSAMP_PRES) >> 1)) + \
- (BMP280_OVERSAMP_PRES ? T_SETUP_PRESSURE_MAX : 0) + 15) / 16)
+ (((1 << BMP280_OVERSAMP_TEMP) >> 1) + \
+ ((1 << BMP280_OVERSAMP_PRES) >> 1)) + \
+ (BMP280_OVERSAMP_PRES ? T_SETUP_PRESSURE_MAX : 0) + 15) / 16)
/*
* These values are selected as per Bosch recommendation for
@@ -192,7 +192,8 @@ struct bmp280_calib_param_t {
/*
* struct bmp280_t - This structure holds BMP280 initialization parameters
* @calib_param: calibration data
- * @rate: rate set
+ * @rate: frequency, in mHz.
+ * @range: bit offset to fit data in 16 bit or less.
*/
struct bmp280_drv_data_t {
@@ -200,6 +201,7 @@ struct bmp280_drv_data_t {
uint16_t rate;
uint16_t range;
};
+#define BMP280_RATE_SHIFT 1
extern const struct accelgyro_drv bmp280_drv;
extern struct bmp280_drv_data_t bmp280_drv_data;