mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 19:30:30 +09:00
driver: input: sensors: fix mma8452 gsensor data convert err
Change-Id: Icd754e9606dc8b0d1d44e932dd19cf113c79c3d6 Signed-off-by: Zorro Liu <lyx@rock-chips.com>
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user