diff options
author | Zorro Liu <lyx@rock-chips.com> | 2019-01-02 10:00:48 +0800 |
---|---|---|
committer | Tao Huang <huangtao@rock-chips.com> | 2019-01-10 16:33:00 +0800 |
commit | 6395f07d895fda8cd4871d82c66c19c35c15df6f (patch) | |
tree | bd864290c05c495cec663b9e8d01ef9c294ffeea /drivers/input | |
parent | 62b7ebee85557452900dd59aea27f1ebe46e5838 (diff) |
driver: input: sensors: fix mma8452 gsensor data convert err
Change-Id: Icd754e9606dc8b0d1d44e932dd19cf113c79c3d6
Signed-off-by: Zorro Liu <lyx@rock-chips.com>
Diffstat (limited to 'drivers/input')
-rw-r--r-- | drivers/input/sensors/accel/mma8452.c | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/drivers/input/sensors/accel/mma8452.c b/drivers/input/sensors/accel/mma8452.c index 81e251738ea8..a061bbd886e6 100644 --- a/drivers/input/sensors/accel/mma8452.c +++ b/drivers/input/sensors/accel/mma8452.c @@ -109,26 +109,26 @@ Gravity_step: gravity value indicated by per count */ #define FREAD_MASK 0 /* enabled(1<<1) only if reading MSB 8bits*/ -#define MMA845X_RANGE 2000000 +#define MMA845X_RANGE (16384 * 2) /* mma8451 */ #define MMA8451_PRECISION 14 #define MMA8451_BOUNDARY (0x1 << (MMA8451_PRECISION - 1)) -#define MMA8451_GRAVITY_STEP MMA845X_RANGE / MMA8451_BOUNDARY +#define MMA8451_GRAVITY_STEP (MMA845X_RANGE / MMA8451_BOUNDARY) /* mma8452 */ #define MMA8452_PRECISION 12 #define MMA8452_BOUNDARY (0x1 << (MMA8452_PRECISION - 1)) -#define MMA8452_GRAVITY_STEP MMA845X_RANGE / MMA8452_BOUNDARY +#define MMA8452_GRAVITY_STEP (MMA845X_RANGE / MMA8452_BOUNDARY) /* mma8453 */ #define MMA8453_PRECISION 10 #define MMA8453_BOUNDARY (0x1 << (MMA8453_PRECISION - 1)) -#define MMA8453_GRAVITY_STEP MMA845X_RANGE / MMA8453_BOUNDARY +#define MMA8453_GRAVITY_STEP (MMA845X_RANGE / MMA8453_BOUNDARY) /* mma8653 */ #define MMA8653_PRECISION 10 #define MMA8653_BOUNDARY (0x1 << (MMA8653_PRECISION - 1)) -#define MMA8653_GRAVITY_STEP MMA845X_RANGE / MMA8653_BOUNDARY +#define MMA8653_GRAVITY_STEP (MMA845X_RANGE / MMA8653_BOUNDARY) #define MMA8451_DEVID 0x1a @@ -250,28 +250,44 @@ static int sensor_convert_data(struct i2c_client *client, char high_byte, char l swap(high_byte,low_byte); result = ((int)high_byte << (MMA8451_PRECISION-8)) | ((int)low_byte >> (16-MMA8451_PRECISION)); - result *= 4; + if (result < MMA8451_BOUNDARY) + result = result * MMA8451_GRAVITY_STEP; + else + result = ~(((~result & (0x7fff >> (16 - MMA8451_PRECISION))) + 1) + * MMA8451_GRAVITY_STEP) + 1; break; case MMA8452_DEVID: swap(high_byte,low_byte); result = ((int)high_byte << (MMA8452_PRECISION-8)) | ((int)low_byte >> (16-MMA8452_PRECISION)); - result *= 16; + if (result < MMA8452_BOUNDARY) + result = result * MMA8452_GRAVITY_STEP; + else + result = ~(((~result & (0x7fff >> (16 - MMA8452_PRECISION))) + 1) + * MMA8452_GRAVITY_STEP) + 1; break; case MMA8453_DEVID: swap(high_byte,low_byte); result = ((int)high_byte << (MMA8453_PRECISION-8)) | ((int)low_byte >> (16-MMA8453_PRECISION)); - result *= 64; + if (result < MMA8453_BOUNDARY) + result = result * MMA8453_GRAVITY_STEP; + else + result = ~(((~result & (0x7fff >> (16 - MMA8453_PRECISION))) + 1) + * MMA8453_GRAVITY_STEP) + 1; break; case MMA8653_DEVID: swap(high_byte,low_byte); result = ((int)high_byte << (MMA8653_PRECISION-8)) | ((int)low_byte >> (16-MMA8653_PRECISION)); - result *= 64; + if (result < MMA8653_BOUNDARY) + result = result * MMA8653_GRAVITY_STEP; + else + result = ~(((~result & (0x7fff >> (16 - MMA8653_PRECISION))) + 1) + * MMA8653_GRAVITY_STEP) + 1; break; default: @@ -364,7 +380,7 @@ struct sensor_operate gsensor_mma8452_ops = { .precision = MMA8452_PRECISION, .ctrl_reg = MMA8452_REG_CTRL_REG1, .int_status_reg = MMA8452_REG_INTSRC, - .range = {-32768, 32768}, + .range = {-MMA845X_RANGE, MMA845X_RANGE}, .trig = IRQF_TRIGGER_LOW | IRQF_ONESHOT, .active = sensor_active, .init = sensor_init, |