diff options
| author | Evan Wilson <evan@oliodevices.com> | 2015-06-30 00:51:30 -0700 |
|---|---|---|
| committer | Evan Wilson <evan@oliodevices.com> | 2015-06-30 00:51:30 -0700 |
| commit | 5629b2f2364f4d376f903d1f144b6f0ca9f0238b (patch) | |
| tree | c97bf12a3daf5ab84e1c099f293a258539f9d644 /drivers/iio/imu-aosp/inv_mpu6515/inv_slave_pressure.c | |
| parent | 7b64f89746ec8f5cc5df7acb1c2dfd0bdecfb3dc (diff) | |
| download | olio-linux-3.10-5629b2f2364f4d376f903d1f144b6f0ca9f0238b.tar.xz olio-linux-3.10-5629b2f2364f4d376f903d1f144b6f0ca9f0238b.zip | |
Reverting all changes from Invensense MotionApps patches
Change-Id: Iec2359e6f39a6c4dd34b3feb4a85f563165ba255
Diffstat (limited to 'drivers/iio/imu-aosp/inv_mpu6515/inv_slave_pressure.c')
| -rwxr-xr-x | drivers/iio/imu-aosp/inv_mpu6515/inv_slave_pressure.c | 522 |
1 files changed, 0 insertions, 522 deletions
diff --git a/drivers/iio/imu-aosp/inv_mpu6515/inv_slave_pressure.c b/drivers/iio/imu-aosp/inv_mpu6515/inv_slave_pressure.c deleted file mode 100755 index 24d80810449..00000000000 --- a/drivers/iio/imu-aosp/inv_mpu6515/inv_slave_pressure.c +++ /dev/null @@ -1,522 +0,0 @@ -/* -* Copyright (C) 2012 Invensense, Inc. -* -* This software is licensed under the terms of the GNU General Public -* License version 2, as published by the Free Software Foundation, and -* may be copied, distributed, and modified under those terms. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -*/ - -#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt - -#include <linux/module.h> -#include <linux/init.h> -#include <linux/slab.h> -#include <linux/i2c.h> -#include <linux/err.h> -#include <linux/delay.h> - -#include "inv_mpu_iio.h" - -/* Constants */ -#define SHIFT_RIGHT_4_POSITION 4 -#define SHIFT_LEFT_2_POSITION 2 -#define SHIFT_LEFT_4_POSITION 4 -#define SHIFT_LEFT_5_POSITION 5 -#define SHIFT_LEFT_8_POSITION 8 -#define SHIFT_LEFT_12_POSITION 12 -#define SHIFT_LEFT_16_POSITION 16 - -/* Sensor Specific constants */ -#define BMP280_SLEEP_MODE 0x00 -#define BMP280_FORCED_MODE 0x01 -#define BMP280_NORMAL_MODE 0x03 -#define BMP280_SOFT_RESET 0xB6 - -#define BMP280_DELAYTIME_MS_NONE 0 -#define BMP280_DELAYTIME_MS_5 5 -#define BMP280_DELAYTIME_MS_6 6 -#define BMP280_DELAYTIME_MS_8 8 -#define BMP280_DELAYTIME_MS_12 12 -#define BMP280_DELAYTIME_MS_22 22 -#define BMP280_DELAYTIME_MS_38 38 - -#define BMP280_OVERSAMPLING_SKIPPED 0x00 -#define BMP280_OVERSAMPLING_1X 0x01 -#define BMP280_OVERSAMPLING_2X 0x02 -#define BMP280_OVERSAMPLING_4X 0x03 -#define BMP280_OVERSAMPLING_8X 0x04 -#define BMP280_OVERSAMPLING_16X 0x05 - -#define BMP280_ULTRALOWPOWER_MODE 0x00 -#define BMP280_LOWPOWER_MODE 0x01 -#define BMP280_STANDARDRESOLUTION_MODE 0x02 -#define BMP280_HIGHRESOLUTION_MODE 0x03 -#define BMP280_ULTRAHIGHRESOLUTION_MODE 0x04 - -#define BMP280_ULTRALOWPOWER_OSRS_P BMP280_OVERSAMPLING_1X -#define BMP280_ULTRALOWPOWER_OSRS_T BMP280_OVERSAMPLING_1X - -#define BMP280_LOWPOWER_OSRS_P BMP280_OVERSAMPLING_2X -#define BMP280_LOWPOWER_OSRS_T BMP280_OVERSAMPLING_1X - -#define BMP280_STANDARDRESOLUTION_OSRS_P BMP280_OVERSAMPLING_4X -#define BMP280_STANDARDRESOLUTION_OSRS_T BMP280_OVERSAMPLING_1X - -#define BMP280_HIGHRESOLUTION_OSRS_P BMP280_OVERSAMPLING_8X -#define BMP280_HIGHRESOLUTION_OSRS_T BMP280_OVERSAMPLING_1X - -#define BMP280_ULTRAHIGHRESOLUTION_OSRS_P BMP280_OVERSAMPLING_16X -#define BMP280_ULTRAHIGHRESOLUTION_OSRS_T BMP280_OVERSAMPLING_2X - -#define BMP280_FILTERCOEFF_OFF 0x00 -#define BMP280_FILTERCOEFF_2 0x01 -#define BMP280_FILTERCOEFF_4 0x02 -#define BMP280_FILTERCOEFF_8 0x03 -#define BMP280_FILTERCOEFF_16 0x04 - -/*calibration parameters */ -#define BMP280_DIG_T1_LSB_REG 0x88 -#define BMP280_DIG_T1_MSB_REG 0x89 -#define BMP280_DIG_T2_LSB_REG 0x8A -#define BMP280_DIG_T2_MSB_REG 0x8B -#define BMP280_DIG_T3_LSB_REG 0x8C -#define BMP280_DIG_T3_MSB_REG 0x8D -#define BMP280_DIG_P1_LSB_REG 0x8E -#define BMP280_DIG_P1_MSB_REG 0x8F -#define BMP280_DIG_P2_LSB_REG 0x90 -#define BMP280_DIG_P2_MSB_REG 0x91 -#define BMP280_DIG_P3_LSB_REG 0x92 -#define BMP280_DIG_P3_MSB_REG 0x93 -#define BMP280_DIG_P4_LSB_REG 0x94 -#define BMP280_DIG_P4_MSB_REG 0x95 -#define BMP280_DIG_P5_LSB_REG 0x96 -#define BMP280_DIG_P5_MSB_REG 0x97 -#define BMP280_DIG_P6_LSB_REG 0x98 -#define BMP280_DIG_P6_MSB_REG 0x99 -#define BMP280_DIG_P7_LSB_REG 0x9A -#define BMP280_DIG_P7_MSB_REG 0x9B -#define BMP280_DIG_P8_LSB_REG 0x9C -#define BMP280_DIG_P8_MSB_REG 0x9D -#define BMP280_DIG_P9_LSB_REG 0x9E -#define BMP280_DIG_P9_MSB_REG 0x9F - -#define BMP280_CHIPID_REG 0xD0 /*Chip ID Register */ -#define BMP280_RESET_REG 0xE0 /*Softreset Register */ -#define BMP280_STATUS_REG 0xF3 /*Status Register */ -#define BMP280_CTRLMEAS_REG 0xF4 /*Ctrl Measure Register */ -#define BMP280_CONFIG_REG 0xF5 /*Configuration Register */ -#define BMP280_PRESSURE_MSB_REG 0xF7 /*Pressure MSB Register */ -#define BMP280_PRESSURE_LSB_REG 0xF8 /*Pressure LSB Register */ -#define BMP280_PRESSURE_XLSB_REG 0xF9 /*Pressure XLSB Register */ -#define BMP280_TEMPERATURE_MSB_REG 0xFA /*Temperature MSB Reg */ -#define BMP280_TEMPERATURE_LSB_REG 0xFB /*Temperature LSB Reg */ -#define BMP280_TEMPERATURE_XLSB_REG 0xFC /*Temperature XLSB Reg */ - -/* Status Register */ -#define BMP280_STATUS_REG_MEASURING__POS 3 -#define BMP280_STATUS_REG_MEASURING__MSK 0x08 -#define BMP280_STATUS_REG_MEASURING__LEN 1 -#define BMP280_STATUS_REG_MEASURING__REG BMP280_STATUS_REG - -#define BMP280_STATUS_REG_IMUPDATE__POS 0 -#define BMP280_STATUS_REG_IMUPDATE__MSK 0x01 -#define BMP280_STATUS_REG_IMUPDATE__LEN 1 -#define BMP280_STATUS_REG_IMUPDATE__REG BMP280_STATUS_REG - -/* Control Measurement Register */ -#define BMP280_CTRLMEAS_REG_OSRST__POS 5 -#define BMP280_CTRLMEAS_REG_OSRST__MSK 0xE0 -#define BMP280_CTRLMEAS_REG_OSRST__LEN 3 -#define BMP280_CTRLMEAS_REG_OSRST__REG BMP280_CTRLMEAS_REG - -#define BMP280_CTRLMEAS_REG_OSRSP__POS 2 -#define BMP280_CTRLMEAS_REG_OSRSP__MSK 0x1C -#define BMP280_CTRLMEAS_REG_OSRSP__LEN 3 -#define BMP280_CTRLMEAS_REG_OSRSP__REG BMP280_CTRLMEAS_REG - -#define BMP280_CTRLMEAS_REG_MODE__POS 0 -#define BMP280_CTRLMEAS_REG_MODE__MSK 0x03 -#define BMP280_CTRLMEAS_REG_MODE__LEN 2 -#define BMP280_CTRLMEAS_REG_MODE__REG BMP280_CTRLMEAS_REG - -/* Configuation Register */ -#define BMP280_CONFIG_REG_TSB__POS 5 -#define BMP280_CONFIG_REG_TSB__MSK 0xE0 -#define BMP280_CONFIG_REG_TSB__LEN 3 -#define BMP280_CONFIG_REG_TSB__REG BMP280_CONFIG_REG - -#define BMP280_CONFIG_REG_FILTER__POS 2 -#define BMP280_CONFIG_REG_FILTER__MSK 0x1C -#define BMP280_CONFIG_REG_FILTER__LEN 3 -#define BMP280_CONFIG_REG_FILTER__REG BMP280_CONFIG_REG - -#define BMP280_CONFIG_REG_SPI3WEN__POS 0 -#define BMP280_CONFIG_REG_SPI3WEN__MSK 0x01 -#define BMP280_CONFIG_REG_SPI3WEN__LEN 1 -#define BMP280_CONFIG_REG_SPI3WEN__REG BMP280_CONFIG_REG - -/* Data Register */ -#define BMP280_PRESSURE_XLSB_REG_DATA__POS 4 -#define BMP280_PRESSURE_XLSB_REG_DATA__MSK 0xF0 -#define BMP280_PRESSURE_XLSB_REG_DATA__LEN 4 -#define BMP280_PRESSURE_XLSB_REG_DATA__REG BMP280_PRESSURE_XLSB_REG - -#define BMP280_TEMPERATURE_XLSB_REG_DATA__POS 4 -#define BMP280_TEMPERATURE_XLSB_REG_DATA__MSK 0xF0 -#define BMP280_TEMPERATURE_XLSB_REG_DATA__LEN 4 -#define BMP280_TEMPERATURE_XLSB_REG_DATA__REG BMP280_TEMPERATURE_XLSB_REG - -#define BMP280_RATE_SCALE 35 -#define DATA_BMP280_MIN_READ_TIME (32 * NSEC_PER_MSEC) -#define BMP280_DATA_BYTES_9911 6 -#define FAKE_DATA_NUM_BYTES 10 - -/** this structure holds all device specific calibration parameters */ -struct bmp280_calibration_param_t { - u32 dig_T1; - s32 dig_T2; - s32 dig_T3; - u32 dig_P1; - s32 dig_P2; - s32 dig_P3; - s32 dig_P4; - s32 dig_P5; - s32 dig_P6; - s32 dig_P7; - s32 dig_P8; - s32 dig_P9; - - s32 t_fine; -}; -/** BMP280 image registers data structure */ -struct bmp280_t { - struct bmp280_calibration_param_t cal_param; - - u8 chip_id; - u8 dev_addr; - - u8 waittime; - - u8 osrs_t; - u8 osrs_p; -}; -static struct bmp280_t bmp280; - -static int bmp280_get_calib_param(struct inv_mpu_state *st) -{ - u8 d[24]; - int r; - - r = inv_aux_read(BMP280_DIG_T1_LSB_REG, 24, d); - if (r) - return r; - - bmp280.cal_param.dig_T1 = (u16)((((u16)((u8)d[1])) << - SHIFT_LEFT_8_POSITION) | d[0]); - bmp280.cal_param.dig_T2 = (s16)((((s16)((s8)d[3])) << - SHIFT_LEFT_8_POSITION) | d[2]); - bmp280.cal_param.dig_T3 = (s16)((((s16)((s8)d[5])) << - SHIFT_LEFT_8_POSITION) | d[4]); - bmp280.cal_param.dig_P1 = (u16)((((u16)((u8)d[7])) << - SHIFT_LEFT_8_POSITION) | d[6]); - bmp280.cal_param.dig_P2 = (s16)((((s16)((s8)d[9])) << - SHIFT_LEFT_8_POSITION) | d[8]); - bmp280.cal_param.dig_P3 = (s16)((((s16)((s8)d[11])) << - SHIFT_LEFT_8_POSITION) | d[10]); - bmp280.cal_param.dig_P4 = (s16)((((s16)((s8)d[13])) << - SHIFT_LEFT_8_POSITION) | d[12]); - bmp280.cal_param.dig_P5 = (s16)((((s16)((s8)d[15])) << - SHIFT_LEFT_8_POSITION) | d[14]); - bmp280.cal_param.dig_P6 = (s16)((((s16)((s8)d[17])) << - SHIFT_LEFT_8_POSITION) | d[16]); - bmp280.cal_param.dig_P7 = (s16)((((s16)((s8)d[19])) << - SHIFT_LEFT_8_POSITION) | d[18]); - bmp280.cal_param.dig_P8 = (s16)((((s16)((s8)d[21])) << - SHIFT_LEFT_8_POSITION) | d[20]); - bmp280.cal_param.dig_P9 = (s16)((((s16)((s8)d[23])) << - SHIFT_LEFT_8_POSITION) | d[22]); - - return 0; -} - -static int inv_setup_bmp280(struct inv_mpu_state *st) -{ - int r; - u8 d[10]; - - /* set to bypass mode */ - r = inv_i2c_single_write(st, REG_INT_PIN_CFG, - st->plat_data.int_config | BIT_BYPASS_EN); - if (r) - return r; - /* issue soft reset */ - r = inv_aux_write(BMP280_RESET_REG, BMP280_SOFT_RESET); - if (r) - return r; - msleep(100); - r = inv_aux_read(BMP280_CHIPID_REG, 1, d); - if (r) - return r; - /* set pressure as ultra high resolution */ - bmp280.osrs_t = BMP280_ULTRAHIGHRESOLUTION_OSRS_T; - bmp280.osrs_p = BMP280_ULTRAHIGHRESOLUTION_OSRS_P; - - /* set IIR filter as 4 */ - r = inv_aux_write(BMP280_CONFIG_REG_FILTER__REG, - BMP280_FILTERCOEFF_16 << SHIFT_LEFT_2_POSITION); - if (r) - return r; - r = bmp280_get_calib_param(st); - if (r) - return r; - - /*restore to non-bypass mode */ - r = inv_i2c_single_write(st, REG_INT_PIN_CFG, - st->plat_data.int_config); - if (r) - return r; - - /* setup master mode and master clock and ES bit */ - r = inv_i2c_single_write(st, REG_I2C_MST_CTRL, BIT_WAIT_FOR_ES); - if (r) - return r; - /*slave 3 is used for pressure mode change only*/ - r = inv_i2c_single_write(st, REG_I2C_SLV3_ADDR, - st->plat_data.aux_i2c_addr); - if (r) - return r; - /* pressure sensor mode register address */ - r = inv_i2c_single_write(st, REG_I2C_SLV3_REG, BMP280_CTRLMEAS_REG); - if (r) - return r; - d[0] = (bmp280.osrs_t << SHIFT_LEFT_5_POSITION) + - (bmp280.osrs_p << SHIFT_LEFT_2_POSITION) + - BMP280_FORCED_MODE; - r = inv_i2c_single_write(st, INV_MPU_REG_I2C_SLV3_DO, d[0]); - - return r; -} - -static int inv_check_bmp280_self_test(struct inv_mpu_state *st) -{ - return 0; -} -static int inv_write_bmp280_scale(struct inv_mpu_state *st, int data) -{ - return 0; -} -static int inv_read_bmp280_scale(struct inv_mpu_state *st, int *scale) -{ - return 0; -} - -static int inv_resume_bmp280(struct inv_mpu_state *st) -{ - int r; - u8 bytes, start; - - bytes = BMP280_DATA_BYTES_9911; - start = BMP280_PRESSURE_MSB_REG; - if (st->chip_config.dmp_on) { - if (st->sensor[SENSOR_COMPASS].on) { - if (COMPASS_ID_AK09911 != st->plat_data.sec_slave_id) { - bytes++; - start -= 1; - } - } else { - /* if compass is disabled, read fake data for DMP */ - /*read mode */ - r = inv_i2c_single_write(st, REG_I2C_SLV0_ADDR, - INV_MPU_BIT_I2C_READ | - st->plat_data.aux_i2c_addr); - if (r) - return r; - /* read calibration data as the fake data */ - r = inv_i2c_single_write(st, REG_I2C_SLV0_REG, - BMP280_DIG_T1_LSB_REG); - if (r) - return r; - /* slave 0 is enabled, read 10 bytes from here */ - r = inv_i2c_single_write(st, REG_I2C_SLV0_CTRL, - INV_MPU_BIT_SLV_EN | - FAKE_DATA_NUM_BYTES); - } - } - /* slave 2 is used to read data from pressure sensor */ - /*read mode */ - r = inv_i2c_single_write(st, REG_I2C_SLV2_ADDR, - INV_MPU_BIT_I2C_READ | - st->plat_data.aux_i2c_addr); - if (r) - return r; - /* start from pressure sensor */ - r = inv_i2c_single_write(st, REG_I2C_SLV2_REG, start); - if (r) - return r; - - /* slave 2 is enabled, read 6 or 7 bytes from here */ - r = inv_i2c_single_write(st, REG_I2C_SLV2_CTRL, - INV_MPU_BIT_SLV_EN | bytes); - if (r) - return r; - /* slave 3 is enabled, write byte length is 1 */ - r = inv_i2c_single_write(st, REG_I2C_SLV3_CTRL, - INV_MPU_BIT_SLV_EN | 1); - - return r; -} - -static int inv_suspend_bmp280(struct inv_mpu_state *st) -{ - int r; - - if ((!st->sensor[SENSOR_COMPASS].on) && st->chip_config.dmp_on) { - /* slave 0 is disabled */ - r = inv_i2c_single_write(st, REG_I2C_SLV0_CTRL, 0); - if (r) - return r; - } - - /* slave 2 is disabled */ - r = inv_i2c_single_write(st, REG_I2C_SLV2_CTRL, 0); - if (r) - return r; - /* slave 3 is disabled */ - r = inv_i2c_single_write(st, REG_I2C_SLV3_CTRL, 0); - - return r; -} - -static s32 bmp280_compensate_T_int32(s32 adc_t) -{ - s32 v_x1_u32r = 0; - s32 v_x2_u32r = 0; - s32 temperature = 0; - - v_x1_u32r = ((((adc_t >> 3) - ((s32) - bmp280.cal_param.dig_T1 << 1))) * - ((s32)bmp280.cal_param.dig_T2)) >> 11; - v_x2_u32r = (((((adc_t >> 4) - - ((s32)bmp280.cal_param.dig_T1)) * ((adc_t >> 4) - - ((s32)bmp280.cal_param.dig_T1))) >> 12) * - ((s32)bmp280.cal_param.dig_T3)) >> 14; - bmp280.cal_param.t_fine = v_x1_u32r + v_x2_u32r; - temperature = (bmp280.cal_param.t_fine * 5 + 128) >> 8; - - return temperature; -} - - -static u32 bmp280_compensate_P_int32(s32 adc_p) -{ - s32 v_x1_u32r = 0; - s32 v_x2_u32r = 0; - u32 pressure = 0; - - v_x1_u32r = (((s32)bmp280.cal_param.t_fine) >> 1) - - (s32)64000; - v_x2_u32r = (((v_x1_u32r >> 2) * (v_x1_u32r >> 2)) >> 11) * - ((s32)bmp280.cal_param.dig_P6); - v_x2_u32r = v_x2_u32r + ((v_x1_u32r * - ((s32)bmp280.cal_param.dig_P5)) << 1); - v_x2_u32r = (v_x2_u32r >> 2) + - (((s32)bmp280.cal_param.dig_P4) << 16); - v_x1_u32r = (((bmp280.cal_param.dig_P3 * (((v_x1_u32r >> 2) * - (v_x1_u32r >> 2)) >> 13)) >> 3) + - ((((s32)bmp280.cal_param.dig_P2) * - v_x1_u32r) >> 1)) >> 18; - v_x1_u32r = ((((32768+v_x1_u32r)) * - ((s32)bmp280.cal_param.dig_P1)) >> 15); - /* Avoid exception caused by division by zero */ - if (v_x1_u32r == 0) - return 0; - pressure = (((u32)(((s32)1048576) - adc_p) - - (v_x2_u32r >> 12))) * 3125; - if (pressure < 0x80000000) - pressure = (pressure << 1) / ((u32)v_x1_u32r); - else - pressure = (pressure / (u32)v_x1_u32r) * 2; - v_x1_u32r = (((s32)bmp280.cal_param.dig_P9) * - ((s32)(((pressure >> 3) * (pressure >> 3)) >> 13))) - >> 12; - v_x2_u32r = (((s32)(pressure >> 2)) * - ((s32)bmp280.cal_param.dig_P8)) >> 13; - pressure = (u32)((s32)pressure + - ((v_x1_u32r + v_x2_u32r + bmp280.cal_param.dig_P7) >> 4)); - - return pressure; -} - -static int inv_bmp280_read_data(struct inv_mpu_state *st, short *o) -{ - int r, i; - u8 d[BMP280_DATA_BYTES_9911], reg_addr; - s32 upressure, utemperature; - - if (st->chip_config.dmp_on) { - for (i = 0; i < 6; i++) - d[i] = st->fifo_data[i]; - } else { - if (st->sensor[SENSOR_COMPASS].on) { - if (COMPASS_ID_AK09911 == st->plat_data.sec_slave_id) - reg_addr = REG_EXT_SENS_DATA_09; - else - reg_addr = REG_EXT_SENS_DATA_08; - } else { - reg_addr = REG_EXT_SENS_DATA_00; - } - r = inv_i2c_read(st, reg_addr, BMP280_DATA_BYTES_9911, d); - if (r) - return r; - } - /* pressure */ - upressure = (s32)((((s32)(d[0])) - << SHIFT_LEFT_12_POSITION) | (((u32)(d[1])) - << SHIFT_LEFT_4_POSITION) | ((u32)d[2] >> - SHIFT_RIGHT_4_POSITION)); - - /* Temperature */ - utemperature = (s32)((( - (s32) (d[3])) << SHIFT_LEFT_12_POSITION) | - (((u32)(d[4])) << SHIFT_LEFT_4_POSITION) - | ((u32)d[5] >> SHIFT_RIGHT_4_POSITION)); - - bmp280_compensate_T_int32(utemperature); - r = bmp280_compensate_P_int32(upressure); - o[0] = 0; - o[1] = (r >> 16); - o[2] = (r & 0xffff); - - return 0; -} - -static struct inv_mpu_slave slave_bmp280 = { - .suspend = inv_suspend_bmp280, - .resume = inv_resume_bmp280, - .get_scale = inv_read_bmp280_scale, - .set_scale = inv_write_bmp280_scale, - .self_test = inv_check_bmp280_self_test, - .setup = inv_setup_bmp280, - .read_data = inv_bmp280_read_data, - .rate_scale = BMP280_RATE_SCALE, - .min_read_time = DATA_BMP280_MIN_READ_TIME, -}; - -int inv_mpu_setup_pressure_slave(struct inv_mpu_state *st) -{ - switch (st->plat_data.aux_slave_id) { - case PRESSURE_ID_BMP280: - st->slave_pressure = &slave_bmp280; - break; - default: - return -EINVAL; - } - - return st->slave_pressure->setup(st); -} - |