diff options
author | Gwendal Grignou <gwendal@chromium.org> | 2015-07-31 13:22:40 -0700 |
---|---|---|
committer | ChromeOS Commit Bot <chromeos-commit-bot@chromium.org> | 2015-08-22 09:31:38 +0000 |
commit | 7b102441425af16ba960100c34a415b45917cda9 (patch) | |
tree | 7ca8eea3fc7e5e451be91112add040b48fa43358 /driver | |
parent | ed0192a9b1c7f4d45f646df9dd463ce7879459f6 (diff) | |
download | chrome-ec-7b102441425af16ba960100c34a415b45917cda9.tar.gz |
bmm150: Add support for calibration
Allow sending calibration information to the magnetometer.
BRANCH=smaug
TEST=Check from user space that calibration is taken into account.
BUG=chrome-os-partner:39900
Change-Id: Ic0f595bde1afdc0b6a79e3516a42b55d1f50c17c
Signed-off-by: Gwendal Grignou <gwendal@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/291333
Reviewed-by: Sheng-liang Song <ssl@chromium.org>
Diffstat (limited to 'driver')
-rw-r--r-- | driver/accelgyro_bmi160.c | 5 | ||||
-rw-r--r-- | driver/mag_bmm150.c | 26 | ||||
-rw-r--r-- | driver/mag_bmm150.h | 10 |
3 files changed, 41 insertions, 0 deletions
diff --git a/driver/accelgyro_bmi160.c b/driver/accelgyro_bmi160.c index 29152fe1f0..b3d32ec880 100644 --- a/driver/accelgyro_bmi160.c +++ b/driver/accelgyro_bmi160.c @@ -487,6 +487,8 @@ static int get_offset(const struct motion_sensor_t *s, BMI160_OFFSET_GYRO_DIV_MDS; } break; + case MOTIONSENSE_TYPE_MAG: + return bmm150_get_offset(s, offset, temp); default: for (i = X; i <= Z; i++) offset[i] = 0; @@ -539,6 +541,9 @@ static int set_offset(const struct motion_sensor_t *s, ret = raw_write8(s->addr, BMI160_OFFSET_EN_GYR98, val98 | BMI160_OFFSET_GYRO_EN); break; + case MOTIONSENSE_TYPE_MAG: + ret = bmm150_set_offset(s, offset, temp); + break; default: ret = EC_RES_INVALID_PARAM; } diff --git a/driver/mag_bmm150.c b/driver/mag_bmm150.c index 4bc0d7a8e7..fb2d5c7108 100644 --- a/driver/mag_bmm150.c +++ b/driver/mag_bmm150.c @@ -199,6 +199,7 @@ void bmm150_normalize(const struct motion_sensor_t *s, { uint16_t r; vector_3_t raw; + struct bmm150_comp_registers *regs = BMM150_COMP_REG(s); /* X and Y are two's complement 13 bits vectors */ raw[X] = ((int16_t)(data[0] | (data[1] << 8))) >> 3; @@ -211,5 +212,30 @@ void bmm150_normalize(const struct motion_sensor_t *s, bmm150_temp_compensate_xy(s, raw, v, r); bmm150_temp_compensate_z(s, raw, v, r); + v[X] += regs->offset[X]; + v[Y] += regs->offset[Y]; + v[Z] += regs->offset[Z]; +} + +int bmm150_set_offset(const struct motion_sensor_t *s, + const int16_t *offset, + int16_t temp) +{ + struct bmm150_comp_registers *regs = BMM150_COMP_REG(s); + regs->offset[X] = offset[X]; + regs->offset[Y] = offset[Y]; + regs->offset[Z] = offset[Z]; + return EC_SUCCESS; } +int bmm150_get_offset(const struct motion_sensor_t *s, + int16_t *offset, + int16_t *temp) +{ + struct bmm150_comp_registers *regs = BMM150_COMP_REG(s); + offset[X] = regs->offset[X]; + offset[Y] = regs->offset[Y]; + offset[Z] = regs->offset[Z]; + *temp = EC_MOTION_SENSE_INVALID_CALIB_TEMP; + return EC_SUCCESS; +} diff --git a/driver/mag_bmm150.h b/driver/mag_bmm150.h index 6ae8e679b9..7486a77608 100644 --- a/driver/mag_bmm150.h +++ b/driver/mag_bmm150.h @@ -74,6 +74,9 @@ struct bmm150_comp_registers { int8_t dig_xy2; uint16_t dig_xyz1; + + /* Factory or online calibration */ + int16_t offset[3]; }; #define BMM150_COMP_REG(_s) \ @@ -87,5 +90,12 @@ void bmm150_normalize(const struct motion_sensor_t *s, vector_3_t v, uint8_t *data); +int bmm150_set_offset(const struct motion_sensor_t *s, + const int16_t *offset, + int16_t temp); + +int bmm150_get_offset(const struct motion_sensor_t *s, + int16_t *offset, + int16_t *temp); #endif /* __CROS_EC_MAG_BMM150_H */ |