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_mpu_iio.h | |
| 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_mpu_iio.h')
| -rw-r--r-- | drivers/iio/imu-aosp/inv_mpu6515/inv_mpu_iio.h | 1078 |
1 files changed, 0 insertions, 1078 deletions
diff --git a/drivers/iio/imu-aosp/inv_mpu6515/inv_mpu_iio.h b/drivers/iio/imu-aosp/inv_mpu6515/inv_mpu_iio.h deleted file mode 100644 index 701d4db78ed..00000000000 --- a/drivers/iio/imu-aosp/inv_mpu6515/inv_mpu_iio.h +++ /dev/null @@ -1,1078 +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. -*/ - -#ifndef _INV_MPU_IIO_H_ -#define _INV_MPU_IIO_H_ - -#include <linux/i2c.h> -#include <linux/kfifo.h> -#include <linux/miscdevice.h> -#include <linux/spinlock.h> -#include <linux/mpu.h> - -#include "iio.h" -#include "buffer.h" - -#include "dmpKey.h" - -/*register and associated bit definition*/ -#define REG_3050_FIFO_EN 0x12 -#define BITS_3050_ACCEL_OUT 0x0E - -#define REG_3050_AUX_VDDIO 0x13 -#define BIT_3050_VDDIO 0x04 - -#define REG_3050_SLAVE_ADDR 0x14 -#define REG_3050_SAMPLE_RATE_DIV 0x15 -#define REG_3050_LPF 0x16 -#define REG_3050_INT_ENABLE 0x17 -#define REG_3050_AUX_BST_ADDR 0x18 -#define REG_3050_INT_STATUS 0x1A -#define REG_3050_TEMPERATURE 0x1B -#define REG_3050_RAW_GYRO 0x1D -#define REG_3050_AUX_XOUT_H 0x23 -#define REG_3050_FIFO_COUNT_H 0x3A -#define REG_3050_FIFO_R_W 0x3C - -#define REG_3050_USER_CTRL 0x3D -#define BIT_3050_AUX_IF_EN 0x20 -#define BIT_3050_FIFO_RST 0x02 - -#define REG_3050_PWR_MGMT_1 0x3E -#define BITS_3050_POWER1 0x30 -#define BITS_3050_POWER2 0x10 -#define BITS_3050_GYRO_STANDBY 0x38 - -#define REG_3500_OTP 0x0 - -#define REG_YGOFFS_TC 0x1 -#define BIT_I2C_MST_VDDIO 0x80 - -#define REG_XA_OFFS_H 0x6 -#define REG_XA_OFFS_L_TC 0x7 -#define REG_PRODUCT_ID 0xC -#define REG_ST_GCT_X 0xD -#define REG_XG_OFFS_USRH 0x13 -#define REG_SAMPLE_RATE_DIV 0x19 -#define REG_CONFIG 0x1A - -#define REG_GYRO_CONFIG 0x1B -#define BITS_SELF_TEST_EN 0xE0 - -#define REG_ACCEL_CONFIG 0x1C -#define REG_ACCEL_MOT_THR 0x1F -#define REG_ACCEL_MOT_DUR 0x20 - -#define REG_FIFO_EN 0x23 -#define BIT_ACCEL_OUT 0x08 -#define BITS_GYRO_OUT 0x70 - -#define REG_I2C_MST_CTRL 0x24 -#define BIT_WAIT_FOR_ES 0x40 - -#define REG_I2C_SLV0_ADDR 0x25 -#define REG_I2C_SLV0_REG 0x26 -#define REG_I2C_SLV0_CTRL 0x27 -#define REG_I2C_SLV1_ADDR 0x28 -#define REG_I2C_SLV1_REG 0x29 -#define REG_I2C_SLV1_CTRL 0x2A -#define REG_I2C_SLV2_ADDR 0x2B -#define REG_I2C_SLV2_REG 0x2C -#define REG_I2C_SLV2_CTRL 0x2D -#define REG_I2C_SLV3_ADDR 0x2E -#define REG_I2C_SLV3_REG 0x2F -#define REG_I2C_SLV3_CTRL 0x30 -#define REG_I2C_SLV4_CTRL 0x34 - -#define INV_MPU_BIT_SLV_EN 0x80 -#define INV_MPU_BIT_BYTE_SW 0x40 -#define INV_MPU_BIT_REG_DIS 0x20 -#define INV_MPU_BIT_GRP 0x10 -#define INV_MPU_BIT_I2C_READ 0x80 - -#define REG_INT_PIN_CFG 0x37 -#define BIT_BYPASS_EN 0x2 - -#define REG_INT_ENABLE 0x38 -#define BIT_DATA_RDY_EN 0x01 -#define BIT_DMP_INT_EN 0x02 -#define BIT_ZMOT_EN 0x20 -#define BIT_MOT_EN 0x40 -#define BIT_6500_WOM_EN 0x40 - -#define REG_DMP_INT_STATUS 0x39 -#define BIT_DMP_INT_CI 0x01 - -#define REG_INT_STATUS 0x3A -#define BIT_MOT_INT 0x40 -#define BIT_ZMOT_INT 0x20 - -#define REG_RAW_ACCEL 0x3B -#define REG_TEMPERATURE 0x41 -#define REG_EXT_SENS_DATA_00 0x49 -#define REG_EXT_SENS_DATA_08 0x51 -#define REG_EXT_SENS_DATA_09 0x52 - -#define REG_ACCEL_INTEL_STATUS 0x61 - -#define INV_MPU_REG_I2C_SLV0_DO 0x63 -#define INV_MPU_REG_I2C_SLV1_DO 0x64 -#define INV_MPU_REG_I2C_SLV2_DO 0x65 -#define INV_MPU_REG_I2C_SLV3_DO 0x66 - -#define REG_I2C_MST_DELAY_CTRL 0x67 -#define BIT_SLV0_DLY_EN 0x01 -#define BIT_SLV1_DLY_EN 0x02 -#define BIT_SLV2_DLY_EN 0x04 -#define BIT_SLV3_DLY_EN 0x08 - -#define REG_USER_CTRL 0x6A -#define BIT_FIFO_RST 0x04 -#define BIT_DMP_RST 0x08 -#define BIT_I2C_MST_EN 0x20 -#define BIT_FIFO_EN 0x40 -#define BIT_DMP_EN 0x80 - -#define REG_PWR_MGMT_1 0x6B -#define BIT_H_RESET 0x80 -#define BIT_SLEEP 0x40 -#define BIT_CYCLE 0x20 -#define BIT_CLK_MASK 0x7 - -#define REG_PWR_MGMT_2 0x6C -#define BIT_PWR_ACCEL_STBY 0x38 -#define BIT_PWR_GYRO_STBY 0x07 -#define BIT_LPA_FREQ 0xC0 - -#define REG_BANK_SEL 0x6D -#define REG_MEM_START_ADDR 0x6E -#define REG_MEM_RW 0x6F -#define REG_PRGM_STRT_ADDRH 0x70 -#define REG_FIFO_COUNT_H 0x72 -#define REG_FIFO_R_W 0x74 -#define REG_WHOAMI 0x75 - -#define REG_6500_XG_ST_DATA 0x0 -#define REG_6500_XA_ST_DATA 0xD -#define REG_6500_XA_OFFS_H 0x77 -#define REG_6500_YA_OFFS_H 0x7A -#define REG_6500_ZA_OFFS_H 0x7D -#define REG_6500_ACCEL_CONFIG2 0x1D -#define BIT_ACCEL_FCHOCIE_B 0x08 -#define BIT_FIFO_SIZE_1K 0x40 - -#define REG_6500_LP_ACCEL_ODR 0x1E -#define REG_6500_ACCEL_WOM_THR 0x1F - -#define REG_6500_ACCEL_INTEL_CTRL 0x69 -#define BIT_ACCEL_INTEL_ENABLE 0x80 -#define BIT_ACCEL_INTEL_MODE 0x40 - -/* data definitions */ -#define DMP_START_ADDR 0x400 -#define DMP_MASK_TAP 0x3f -#define DMP_MASK_DIS_ORIEN 0xC0 -#define DMP_DIS_ORIEN_SHIFT 6 -/* this is derived from 1000 divided by 50, which is the pedometer - running frequency */ -#define MS_PER_PED_TICKS 20 - - -#define BYTES_FOR_DMP 8 -#define BYTES_FOR_EVENTS 4 -#define QUATERNION_BYTES 16 -#define BYTES_PER_SENSOR 6 -#define MPU3050_FOOTER_SIZE 2 -#define FIFO_COUNT_BYTE 2 -#define FIFO_THRESHOLD 800 -#define FIFO_SIZE 992 -#define HARDWARE_FIFO_SIZE 1024 -#define MAX_READ_SIZE 64 -#define POWER_UP_TIME 100 -#define SENSOR_UP_TIME 30 -#define REG_UP_TIME 2 -#define INV_MPU_SAMPLE_RATE_CHANGE_STABLE 50 -#define MPU_MEM_BANK_SIZE 256 -#define SELF_TEST_GYRO_FULL_SCALE 250 -#define SELF_TEST_ACCEL_FULL_SCALE 8 -#define SELF_TEST_ACCEL_6500_SCALE 2 - -/* data header defines */ -#define PRESSURE_HDR 0x8000 -#define ACCEL_HDR 0x4000 -#define GYRO_HDR 0x2000 -#define COMPASS_HDR 0x1000 -#define COMPASS_HDR_2 0x1800 -#define LPQUAT_HDR 0x0800 -#define SIXQUAT_HDR 0x0400 -#define PEDQUAT_HDR 0x0200 -#define STEP_DETECTOR_HDR 0x0100 -#define STEP_INDICATOR_MASK 0xf - -#define MAX_BYTES_PER_SAMPLE 80 -#define MAX_HW_FIFO_BYTES (BYTES_PER_SENSOR * 2) -#define IIO_BUFFER_BYTES 8 -#define HEADERED_NORMAL_BYTES 8 -#define HEADERED_Q_BYTES 16 - -#define MPU6XXX_MAX_MOTION_THRESH (255*4) -#define MPU6050_MOTION_THRESH_SHIFT 5 -#define MPU6500_MOTION_THRESH_SHIFT 2 -#define MPU6050_MOTION_DUR_DEFAULT 1 -#define MPU6050_ID 0x68 -#define MPU6050_MAX_MOTION_DUR 255 -#define MPU_TEMP_SHIFT 16 -#define LPA_FREQ_SHIFT 6 -#define COMPASS_RATE_SCALE 10 -#define MAX_GYRO_FS_PARAM 3 -#define MAX_ACCEL_FS_PARAM 3 -#define MAX_LPA_FREQ_PARAM 3 -#define MPU_MAX_A_OFFSET_VALUE 16383 -#define MPU_MIN_A_OFFSET_VALUE -16384 -#define MPU_MAX_G_OFFSET_VALUE 32767 -#define MPU_MIN_G_OFFSET_VALUE -32767 -#define MPU6XXX_MAX_MPU_MEM (256 * 12) - -#define INIT_MOT_DUR 128 -#define INIT_MOT_THR 128 -#define INIT_ZMOT_DUR 128 -#define INIT_ZMOT_THR 128 -#define INIT_ST_SAMPLES 200 -#define INIT_ST_MPU6050_SAMPLES 600 -#define INIT_ST_THRESHOLD 50 -#define INIT_PED_INT_THRESH 2 -#define INIT_PED_THRESH 9 -#define ST_THRESHOLD_MULTIPLIER 10 -#define ST_MAX_SAMPLES 500 -#define ST_MAX_THRESHOLD 100 -#define DMP_INTERVAL_INIT (5 * NSEC_PER_MSEC) -#define DMP_INTERVAL_MIN_ADJ (50 * NSEC_PER_USEC) - -/*---- MPU6500 ----*/ -#define MPU6500_ID 0x70 /* unique WHOAMI */ -#define MPU6515_ID 0x74 /* unique WHOAMI */ -#define MPU6500_PRODUCT_REVISION 1 -#define MPU6500_MEM_REV_ADDR 0x16 -#define INV_MPU_REV_MASK 0x0F -#define MPU6500_REV 2 -#define MPU_DMP_LOAD_START 0x20 - -/*---- MPU9250 ----*/ -#define MPU9250_ID 0x71 /* unique WHOAMI */ - -/* ----MPU9350 ----*/ -#define MPU9350_ID 0x72 - -#define THREE_AXIS 3 -#define GYRO_CONFIG_FSR_SHIFT 3 -#define ACCEL_CONFIG_FSR_SHIFT 3 -#define GYRO_DPS_SCALE 250 -#define MEM_ADDR_PROD_REV 0x6 -#define SOFT_PROD_VER_BYTES 5 -#define CRC_FIRMWARE_SEED 0 -#define SELF_TEST_SUCCESS 1 -#define MS_PER_DMP_TICK 20 -#define DMP_IMAGE_SIZE 2943 - -/* init parameters */ -#define INIT_FIFO_RATE 50 -#define INIT_DMP_OUTPUT_RATE 25 -#define INIT_DUR_TIME (NSEC_PER_SEC / INIT_FIFO_RATE) -#define INIT_TAP_THRESHOLD 100 -#define INIT_TAP_TIME 100 -#define INIT_TAP_MIN_COUNT 2 -#define INIT_SAMPLE_DIVIDER 4 -#define MPU_INIT_SMD_DELAY_THLD 3 -#define MPU_INIT_SMD_DELAY2_THLD 1 -#define MPU_INIT_SMD_THLD 1500 -#define MPU_DEFAULT_DMP_FREQ 200 -#define MPL_PROD_KEY(ver, rev) (ver * 100 + rev) -#define NUM_OF_PROD_REVS (ARRAY_SIZE(prod_rev_map)) -/*---- MPU6050 Silicon Revisions ----*/ -#define MPU_SILICON_REV_A2 1 /* MPU6050A2 Device */ -#define MPU_SILICON_REV_B1 2 /* MPU6050B1 Device */ - -#define BIT_PRFTCH_EN 0x40 -#define BIT_CFG_USER_BANK 0x20 -#define BITS_MEM_SEL 0x1f - -#define TIME_STAMP_TOR 5 -#define MAX_CATCH_UP 5 -#define DMP_TICK_DUR 5 -#define DEFAULT_ACCEL_TRIM 16384 -#define DEFAULT_GYRO_TRIM 131 -#define MAX_FIFO_RATE 1000 -#define MAX_DMP_OUTPUT_RATE 200 -#define MIN_FIFO_RATE 4 -#define ONE_K_HZ 1000 -#define NS_PER_MS_SHIFT 20 -#define END_MARKER 0x0010 -#define EMPTY_MARKER 0x0020 - -/*tap related defines */ -#define INV_TAP 0x08 -#define INV_NUM_TAP_AXES 3 - -#define INV_TAP_AXIS_X_POS 0x20 -#define INV_TAP_AXIS_X_NEG 0x10 -#define INV_TAP_AXIS_Y_POS 0x08 -#define INV_TAP_AXIS_Y_NEG 0x04 -#define INV_TAP_AXIS_Z_POS 0x02 -#define INV_TAP_AXIS_Z_NEG 0x01 -#define INV_TAP_ALL_DIRECTIONS 0x3f - -#define INV_TAP_AXIS_X 0x1 -#define INV_TAP_AXIS_Y 0x2 -#define INV_TAP_AXIS_Z 0x4 - -#define INV_TAP_AXIS_ALL \ - (INV_TAP_AXIS_X | \ - INV_TAP_AXIS_Y | \ - INV_TAP_AXIS_Z) - -#define INT_SRC_TAP 0x01 -#define INT_SRC_DISPLAY_ORIENT 0x08 -#define INT_SRC_SHAKE 0x10 - -#define INV_X_AXIS_INDEX 0x00 -#define INV_Y_AXIS_INDEX 0x01 -#define INV_Z_AXIS_INDEX 0x02 - -#define INV_ELEMENT_1 0x0001 -#define INV_ELEMENT_2 0x0002 -#define INV_ELEMENT_3 0x0004 -#define INV_ELEMENT_4 0x0008 -#define INV_ELEMENT_5 0x0010 -#define INV_ELEMENT_6 0x0020 -#define INV_ELEMENT_7 0x0040 -#define INV_ELEMENT_8 0x0080 -#define INV_ALL 0xFFFF -#define INV_ELEMENT_MASK 0x00FF -#define INV_GYRO_ACC_MASK 0x007E -#define INV_ACCEL_MASK 0x70 -#define INV_GYRO_MASK 0xE - -struct inv_mpu_state; - -/** - * struct inv_reg_map_s - Notable slave registers. - * @sample_rate_div: Divider applied to gyro output rate. - * @lpf: Configures internal LPF. - * @bank_sel: Selects between memory banks. - * @user_ctrl: Enables/resets the FIFO. - * @fifo_en: Determines which data will appear in FIFO. - * @gyro_config: gyro config register. - * @accel_config: accel config register - * @fifo_count_h: Upper byte of FIFO count. - * @fifo_r_w: FIFO register. - * @raw_accel Address of first accel register. - * @temperature temperature register - * @int_enable: Interrupt enable register. - * @int_status: Interrupt flags. - * @pwr_mgmt_1: Controls chip's power state and clock source. - * @pwr_mgmt_2: Controls power state of individual sensors. - * @mem_start_addr: Address of first memory read. - * @mem_r_w: Access to memory. - * @prgm_strt_addrh firmware program start address register - */ -struct inv_reg_map_s { - u8 sample_rate_div; - u8 lpf; - u8 bank_sel; - u8 user_ctrl; - u8 fifo_en; - u8 gyro_config; - u8 accel_config; - u8 fifo_count_h; - u8 fifo_r_w; - u8 raw_accel; - u8 temperature; - u8 int_enable; - u8 int_status; - u8 pwr_mgmt_1; - u8 pwr_mgmt_2; - u8 mem_start_addr; - u8 mem_r_w; - u8 prgm_strt_addrh; -}; - -/* device enum */ -enum inv_devices { - INV_ITG3500, - INV_MPU3050, - INV_MPU6050, - INV_MPU9150, - INV_MPU6500, - INV_MPU9250, - INV_MPU6XXX, - INV_MPU9350, - INV_MPU6515, - INV_NUM_PARTS -}; - -/** - * struct inv_hw_s - Other important hardware information. - * @num_reg: Number of registers on device. - * @name: name of the chip - */ -struct inv_hw_s { - u8 num_reg; - u8 *name; -}; - -/* enum for sensor */ -enum INV_SENSORS { - SENSOR_GYRO = 0, - SENSOR_ACCEL, - SENSOR_COMPASS, - SENSOR_PRESSURE, - SENSOR_STEP, - SENSOR_PEDQ, - SENSOR_SIXQ, - SENSOR_LPQ, - SENSOR_NUM_MAX, - SENSOR_INVALID, -}; - -/** - * struct inv_sensor - information for each sensor. - * @ts: this sensors timestamp. - * @dur: duration between samples in ns. - * @rate: sensor data rate. - * @counter: dmp tick counter corresponding to rate. - * @on: sensor on/off. - * @sample_size: number of bytes for the sensor. - * @send_data: function pointer to send data or not. - * @set_rate: funcition pointer to set data rate. - */ -struct inv_sensor { - u64 ts; - int dur; - int rate; - int counter; - bool on; - u8 sample_size; - int (*send_data)(struct inv_mpu_state *st, bool on); - int (*set_rate)(struct inv_mpu_state *st); -}; - -/** - * struct inv_batch - information batchmode. - * @on: derived variable for batch mode. - * @overflow_on: overflow mode for batchmode. - * @wake_fifo_on: overflow for suspend mode. - * @counter: counter for batch mode. - * @timeout: nominal timeout value for batchmode in milliseconds. - * @min_rate: minimum sensor rate that is turned on. - */ -struct inv_batch { - bool on; - bool overflow_on; - bool wake_fifo_on; - u32 counter; - u32 timeout; - u32 min_rate; -}; - -/** - * struct inv_chip_config_s - Cached chip configuration data. - * @fsr: Full scale range. - * @lpf: Digital low pass filter frequency. - * @accel_fs: accel full scale range. - * @has_footer: MPU3050 specific work around. - * @has_compass: has compass or not. - * @has_pressure: has pressure sensor or not. - * @enable: master enable to enable output - * @accel_enable: enable accel functionality - * @gyro_enable: enable gyro functionality - * @is_asleep: 1 if chip is powered down. - * @dmp_on: dmp is on/off. - * @dmp_int_on: dmp interrupt on/off. - * @step_indicator_on: step indicate bit added to the sensor or not. - * @dmp_event_int_on: dmp event interrupt on/off. - * @firmware_loaded: flag indicate firmware loaded or not. - * @lpa_mod: low power mode. - * @display_orient_on: display orientation on/off. - * @normal_compass_measure: discard first compass data after reset. - * @normal_pressure_measure: discard first pressure data after reset. - * @smd_enable: disable/enable SMD function. - * @adjust_time: flag to indicate whether adjust chip clock or not. - * @smd_triggered: smd is triggered. - * @lpa_freq: low power frequency - * @prog_start_addr: firmware program start address. - * @fifo_rate: current FIFO update rate. - * @bytes_per_datum: number of bytes for 1 sample data. - */ -struct inv_chip_config_s { - u32 fsr:2; - u32 lpf:3; - u32 accel_fs:2; - u32 has_footer:1; - u32 has_compass:1; - u32 has_pressure:1; - u32 enable:1; - u32 accel_enable:1; - u32 gyro_enable:1; - u32 is_asleep:1; - u32 dmp_on:1; - u32 dmp_int_on:1; - u32 dmp_event_int_on:1; - u32 step_indicator_on:1; - u32 firmware_loaded:1; - u32 lpa_mode:1; - u32 display_orient_on:1; - u32 normal_compass_measure:1; - u32 normal_pressure_measure:1; - u32 smd_enable:1; - u32 adjust_time:1; - u32 smd_triggered:1; - u16 lpa_freq; - u16 prog_start_addr; - u16 fifo_rate; - u16 bytes_per_datum; -}; - -/** - * struct inv_chip_info_s - Chip related information. - * @product_id: Product id. - * @product_revision: Product revision. - * @silicon_revision: Silicon revision. - * @software_revision: software revision. - * @multi: accel specific multiplier. - * @compass_sens: compass sensitivity. - * @gyro_sens_trim: Gyro sensitivity trim factor. - * @accel_sens_trim: accel sensitivity trim factor. - */ -struct inv_chip_info_s { - u8 product_id; - u8 product_revision; - u8 silicon_revision; - u8 software_revision; - u8 multi; - u8 compass_sens[3]; - u32 gyro_sens_trim; - u32 accel_sens_trim; -}; - -/** - * struct inv_tap structure to store tap data. - * @min_count: minimum taps counted. - * @thresh: tap threshold. - * @time: tap time. - * @on: tap on/off. - */ -struct inv_tap { - u16 min_count; - u16 thresh; - u16 time; - bool on; -}; - -/** - * struct accel_mot_int_s structure to store motion interrupt data - * @mot_thr: motion threshold. - * @mot_dur: motion duration. - * @mot_on: flag to indicate motion detection on; - */ -struct accel_mot_int { - u16 mot_thr; - u32 mot_dur; - u8 mot_on:1; -}; - -/** - * struct self_test_setting - self test settables from sysfs - * samples: number of samples used in self test. - * threshold: threshold fail/pass criterion in self test. - * This value is in the percentage multiplied by 100. - * So 14% would be 14. - */ -struct self_test_setting { - u16 samples; - u16 threshold; -}; - -/** - * struct inv_smd significant motion detection structure. - * @threshold: accel threshold for motion detection. - * @delay: delay time to confirm 2nd motion. - * @delay2: delay window parameter. - */ -struct inv_smd { - u32 threshold; - u32 delay; - u32 delay2; -}; - -/** - * struct inv_ped pedometer related data structure. - * @step: steps taken. - * @time: time taken during the period. - * @last_step_time: last time the step is taken. - * @step_thresh: step threshold to show steps. - * @int_thresh: step threshold to generate interrupt. - * @int_on: pedometer interrupt enable/disable. - * @on: pedometer on/off. - */ -struct inv_ped { - u64 step; - u64 time; - u64 last_step_time; - u16 step_thresh; - u16 int_thresh; - bool int_on; - bool on; -}; - -struct inv_mpu_slave; -/** - * struct inv_mpu_state - Driver state variables. - * @chip_config: Cached attribute information. - * @chip_info: Chip information from read-only registers. - * @trig; iio trigger. - * @tap: tap data structure. - * @smd: SMD data structure. - * @ped: pedometer data structure. - * @batch: batchmode data structure. - * @reg: Map of important registers. - * @self_test: self test settings. - * @hw: Other hardware-specific information. - * @chip_type: chip type. - * @time_stamp_lock: spin lock to time stamp. - * @suspend_resume_lock: mutex lock for suspend/resume. - * @client: i2c client handle. - * @plat_data: platform data. - * @slave_accel: mpu slave handle for accelerometer(MPU3050 only). - * @slave_compass: mpu slave handle for magnetometer. - * @slave_pressure: mpu slave handle for pressure sensor. - * (*set_power_state)(struct inv_mpu_state *, int on): function ptr - * (*switch_gyro_engine)(struct inv_mpu_state *, int on): function ptr - * (*switch_accel_engine)(struct inv_mpu_state *, int on): function ptr - * (*init_config)(struct iio_dev *indio_dev): function ptr - * (*setup_reg)(struct inv_reg_map_s *reg): function ptr - * @timestamps: kfifo queue to store time stamp. - * @irq: irq number store. - * @accel_bias: accel bias store. - * @gyro_bias: gyro bias store. - * @input_gyro_offset[3]: gyro offset from sysfs. - * @input_accel_offset[3]: accel offset from sysfs. - * @input_accel_dmp_bias[3]: accel bias for dmp. - * @input_gyro_dmp_bias[3];: gyro bias for dmp. - * @rom_gyro_bias[3]: gyro bias from sysfs. - * @rom_accel_bias[3]: accel bias from sysfs. - * @fifo_data[6]: fifo data storage. - * @i2c_addr: i2c address. - * @sample_divider: sample divider for dmp. - * @fifo_divider: fifo divider for dmp. - * @display_orient_data:display orient data. - * @tap_data: tap data. - * @bytes_per_sec: bytes per seconds when in DMP mode. - * @left_over[HEADERED_Q_BYTES]: left over bytes storage. - * @left_over_size: left over size. - * @sensor{SENSOR_NUM_MAX]: sensor individual properties. - * @fifo_count: current fifo_count; - * @dmp_counter: dmp_counter; - * @dmp_ticks: DMP ticks past since the previous read. - * @sl_handle: Handle to I2C port. - * @irq_dur_ns: duration between each irq. - * @ts_counter: time stamp counter. - * @suspend_state: state indicator suspend. - * @dmp_interval: dmp interval. nomial value is 5 ms. - * @dmp_interval_accum: dmp interval accumlater. - * @diff_accumulater: accumlator for the difference of nominal and actual. - * @last_ts: last time stamp. - * @step_detector_base_ts: base time stamp for step detector calculation. - * @prev_ts: previous time stamp. - * @pedometer_step: pedometer steps stored in driver. - * @pedometer_time: pedometer time stored in driver. - * @last_run_time: last time the post ISR runs. - * @name: name for distiguish MPU6050 and MPU6500 in MPU6XXX. - * @secondary_name: name for the slave device in the secondary I2C. - */ -struct inv_mpu_state { -#define TIMESTAMP_FIFO_SIZE 64 - struct inv_chip_config_s chip_config; - struct inv_chip_info_s chip_info; - struct iio_trigger *trig; - struct inv_tap tap; - struct inv_smd smd; - struct inv_ped ped; - struct inv_batch batch; - struct inv_reg_map_s reg; - struct self_test_setting self_test; - const struct inv_hw_s *hw; - enum inv_devices chip_type; - spinlock_t time_stamp_lock; - struct mutex suspend_resume_lock; - struct i2c_client *client; - struct mpu_platform_data plat_data; - struct inv_mpu_slave *slave_accel; - struct inv_mpu_slave *slave_compass; - struct inv_mpu_slave *slave_pressure; - struct accel_mot_int mot_int; - int (*set_power_state)(struct inv_mpu_state *, bool on); - int (*switch_gyro_engine)(struct inv_mpu_state *, bool on); - int (*switch_accel_engine)(struct inv_mpu_state *, bool on); - int (*init_config)(struct iio_dev *indio_dev); - void (*setup_reg)(struct inv_reg_map_s *reg); - DECLARE_KFIFO(timestamps, u64, TIMESTAMP_FIFO_SIZE); - short irq; - int accel_bias[3]; - int gyro_bias[3]; - s16 input_gyro_offset[3]; - s16 input_accel_offset[3]; - int input_accel_dmp_bias[3]; - int input_gyro_dmp_bias[3]; - s16 rom_gyro_offset[3]; - s16 rom_accel_offset[3]; - u8 fifo_data[6]; - u8 i2c_addr; - u8 sample_divider; - u8 fifo_divider; - u8 display_orient_data; - u8 tap_data; - u16 bytes_per_sec; - u8 left_over[HEADERED_Q_BYTES]; - u32 left_over_size; - struct inv_sensor sensor[SENSOR_NUM_MAX]; - u32 fifo_count; - u32 dmp_counter; - u32 dmp_ticks; - void *sl_handle; - u32 irq_dur_ns; - u32 ts_counter; - bool suspend_state; - u32 dmp_interval; - s32 dmp_interval_accum; - s64 diff_accumulater; - u64 last_ts; - u64 step_detector_base_ts; - u64 prev_ts; - u64 last_run_time; - u8 name[20]; - u8 secondary_name[20]; -}; - -/* produces an unique identifier for each device based on the - combination of product version and product revision */ -struct prod_rev_map_t { - u16 mpl_product_key; - u8 silicon_rev; - u16 gyro_trim; - u16 accel_trim; -}; - -/** - * struct inv_mpu_slave - MPU slave structure. - * @st_upper: compass self test upper limit. - * @st_lower: compass self test lower limit. - * @scale: compass scale. - * @rate_scale: decide how fast a compass can read. - * @min_read_time: minimum time between each reading. - * @self_test: self test method of the slave. - * @set_scale: set scale of slave - * @get_scale: read scale back of the slave. - * @suspend: suspend operation. - * @resume: resume operation. - * @setup: setup chip. initialization. - * @combine_data: combine raw data into meaningful data. - * @read_data: read external sensor and output - * @get_mode: get current chip mode. - * @set_lpf: set low pass filter. - * @set_fs: set full scale - * @prev_ts: last time it is read. - */ -struct inv_mpu_slave { - const short *st_upper; - const short *st_lower; - int scale; - int rate_scale; - int min_read_time; - int (*self_test)(struct inv_mpu_state *); - int (*set_scale)(struct inv_mpu_state *, int scale); - int (*get_scale)(struct inv_mpu_state *, int *val); - int (*suspend)(struct inv_mpu_state *); - int (*resume)(struct inv_mpu_state *); - int (*setup)(struct inv_mpu_state *); - int (*combine_data)(u8 *in, short *out); - int (*read_data)(struct inv_mpu_state *, short *out); - int (*get_mode)(void); - int (*set_lpf)(struct inv_mpu_state *, int rate); - int (*set_fs)(struct inv_mpu_state *, int fs); - u64 prev_ts; -}; - -/* scan element definition */ -enum inv_mpu_scan { - INV_MPU_SCAN_QUAT_R = 0, - INV_MPU_SCAN_QUAT_X, - INV_MPU_SCAN_QUAT_Y, - INV_MPU_SCAN_QUAT_Z, - INV_MPU_SCAN_ACCEL_X, - INV_MPU_SCAN_ACCEL_Y, - INV_MPU_SCAN_ACCEL_Z, - INV_MPU_SCAN_GYRO_X, - INV_MPU_SCAN_GYRO_Y, - INV_MPU_SCAN_GYRO_Z, - INV_MPU_SCAN_MAGN_X, - INV_MPU_SCAN_MAGN_Y, - INV_MPU_SCAN_MAGN_Z, - INV_MPU_SCAN_TIMESTAMP, -}; - -enum inv_filter_e { - INV_FILTER_256HZ_NOLPF2 = 0, - INV_FILTER_188HZ, - INV_FILTER_98HZ, - INV_FILTER_42HZ, - INV_FILTER_20HZ, - INV_FILTER_10HZ, - INV_FILTER_5HZ, - INV_FILTER_2100HZ_NOLPF, - NUM_FILTER -}; - -enum inv_slave_mode { - INV_MODE_SUSPEND, - INV_MODE_NORMAL, -}; - -/*==== MPU6050B1 MEMORY ====*/ -enum MPU_MEMORY_BANKS { - MEM_RAM_BANK_0 = 0, - MEM_RAM_BANK_1, - MEM_RAM_BANK_2, - MEM_RAM_BANK_3, - MEM_RAM_BANK_4, - MEM_RAM_BANK_5, - MEM_RAM_BANK_6, - MEM_RAM_BANK_7, - MEM_RAM_BANK_8, - MEM_RAM_BANK_9, - MEM_RAM_BANK_10, - MEM_RAM_BANK_11, - MPU_MEM_NUM_RAM_BANKS, - MPU_MEM_OTP_BANK_0 = 16 -}; - -/* IIO attribute address */ -enum MPU_IIO_ATTR_ADDR { - ATTR_DMP_GYRO_X_DMP_BIAS, - ATTR_DMP_GYRO_Y_DMP_BIAS, - ATTR_DMP_GYRO_Z_DMP_BIAS, - ATTR_DMP_ACCEL_X_DMP_BIAS, - ATTR_DMP_ACCEL_Y_DMP_BIAS, - ATTR_DMP_ACCEL_Z_DMP_BIAS, - ATTR_DMP_PED_INT_ON, - ATTR_DMP_PED_STEP_THRESH, - ATTR_DMP_PED_INT_THRESH, - ATTR_DMP_PED_ON, - ATTR_DMP_SMD_ENABLE, - ATTR_DMP_SMD_THLD, - ATTR_DMP_SMD_DELAY_THLD, - ATTR_DMP_SMD_DELAY_THLD2, - ATTR_DMP_PEDOMETER_STEPS, - ATTR_DMP_PEDOMETER_TIME, - ATTR_DMP_PEDOMETER_COUNTER, - ATTR_DMP_TAP_ON, - ATTR_DMP_TAP_THRESHOLD, - ATTR_DMP_TAP_MIN_COUNT, - ATTR_DMP_TAP_TIME, - ATTR_DMP_DISPLAY_ORIENTATION_ON, -/* *****above this line, are DMP features, power needs on/off */ -/* *****below this line, are DMP features, no power needed */ - ATTR_DMP_ON, - ATTR_DMP_INT_ON, - ATTR_DMP_EVENT_INT_ON, - ATTR_DMP_STEP_INDICATOR_ON, - ATTR_DMP_BATCHMODE_TIMEOUT, - ATTR_DMP_BATCHMODE_WAKE_FIFO_FULL, - ATTR_DMP_SIX_Q_ON, - ATTR_DMP_SIX_Q_RATE, - ATTR_DMP_LPQ_ON, - ATTR_DMP_LPQ_RATE, - ATTR_DMP_PED_Q_ON, - ATTR_DMP_PED_Q_RATE, - ATTR_DMP_STEP_DETECTOR_ON, - ATTR_DMP_STEP_DETECTOR_RATE, -/* *****above this line, it is all DMP related features */ -/* *****below this line, it is all non-DMP related features */ - ATTR_GYRO_SCALE, - ATTR_ACCEL_SCALE, - ATTR_COMPASS_SCALE, - ATTR_GYRO_X_OFFSET, - ATTR_GYRO_Y_OFFSET, - ATTR_GYRO_Z_OFFSET, - ATTR_ACCEL_X_OFFSET, - ATTR_ACCEL_Y_OFFSET, - ATTR_ACCEL_Z_OFFSET, - ATTR_MOTION_LPA_ON, - ATTR_MOTION_LPA_FREQ, - ATTR_MOTION_LPA_THRESHOLD, -/* *****above this line, it is non-DMP, power needs on/off */ -/* *****below this line, it is non-DMP, no needs to on/off power */ - ATTR_SELF_TEST_SAMPLES, - ATTR_SELF_TEST_THRESHOLD, - ATTR_GYRO_ENABLE, - ATTR_GYRO_FIFO_ENABLE, - ATTR_GYRO_RATE, - ATTR_ACCEL_ENABLE, - ATTR_ACCEL_FIFO_ENABLE, - ATTR_ACCEL_RATE, - ATTR_COMPASS_ENABLE, - ATTR_COMPASS_RATE, - ATTR_PRESSURE_ENABLE, - ATTR_PRESSURE_RATE, - ATTR_POWER_STATE, /* this is fake sysfs for compatibility */ - ATTR_FIRMWARE_LOADED, - ATTR_SAMPLING_FREQ, -/* *****below this line, it is attributes only has show methods */ - ATTR_SELF_TEST, /* this has show-only methods needs power on/off */ - ATTR_GYRO_X_CALIBBIAS, - ATTR_GYRO_Y_CALIBBIAS, - ATTR_GYRO_Z_CALIBBIAS, - ATTR_ACCEL_X_CALIBBIAS, - ATTR_ACCEL_Y_CALIBBIAS, - ATTR_ACCEL_Z_CALIBBIAS, - ATTR_SELF_TEST_GYRO_SCALE, - ATTR_SELF_TEST_ACCEL_SCALE, - ATTR_GYRO_MATRIX, - ATTR_ACCEL_MATRIX, - ATTR_COMPASS_MATRIX, - ATTR_SECONDARY_NAME, -#ifdef CONFIG_INV_TESTING - ATTR_COMPASS_SENS, - ATTR_I2C_COUNTERS, - ATTR_REG_WRITE, - ATTR_DEBUG_SMD_ENABLE_TESTP1, - ATTR_DEBUG_SMD_ENABLE_TESTP2, - ATTR_DEBUG_SMD_EXE_STATE, - ATTR_DEBUG_SMD_DELAY_CNTR, - ATTR_DEBUG_GYRO_COUNTER, - ATTR_DEBUG_ACCEL_COUNTER, - ATTR_DEBUG_COMPASS_COUNTER, - ATTR_DEBUG_PRESSURE_COUNTER, - ATTR_DEBUG_LPQ_COUNTER, - ATTR_DEBUG_SIXQ_COUNTER, - ATTR_DEBUG_PEDQ_COUNTER, -#endif -}; - -enum inv_accel_fs_e { - INV_FS_02G = 0, - INV_FS_04G, - INV_FS_08G, - INV_FS_16G, - NUM_ACCEL_FSR -}; - -enum inv_fsr_e { - INV_FSR_250DPS = 0, - INV_FSR_500DPS, - INV_FSR_1000DPS, - INV_FSR_2000DPS, - NUM_FSR -}; - -enum inv_clock_sel_e { - INV_CLK_INTERNAL = 0, - INV_CLK_PLL, - NUM_CLK -}; - -ssize_t inv_dmp_firmware_write(struct file *fp, struct kobject *kobj, - struct bin_attribute *attr, char *buf, loff_t pos, size_t size); -ssize_t inv_dmp_firmware_read(struct file *filp, - struct kobject *kobj, - struct bin_attribute *bin_attr, - char *buf, loff_t off, size_t count); -ssize_t inv_six_q_write(struct file *fp, struct kobject *kobj, - struct bin_attribute *attr, char *buf, loff_t pos, size_t size); - -int inv_mpu_configure_ring(struct iio_dev *indio_dev); -int inv_mpu_probe_trigger(struct iio_dev *indio_dev); -void inv_mpu_unconfigure_ring(struct iio_dev *indio_dev); -void inv_mpu_remove_trigger(struct iio_dev *indio_dev); -int inv_init_config_mpu3050(struct iio_dev *indio_dev); -int inv_get_silicon_rev_mpu6050(struct inv_mpu_state *st); -int inv_get_silicon_rev_mpu6500(struct inv_mpu_state *st); -int set_3050_bypass(struct inv_mpu_state *st, bool enable); -int inv_register_mpu3050_slave(struct inv_mpu_state *st); -void inv_setup_reg_mpu3050(struct inv_reg_map_s *reg); -int inv_switch_3050_gyro_engine(struct inv_mpu_state *st, bool en); -int inv_switch_3050_accel_engine(struct inv_mpu_state *st, bool en); -int set_power_mpu3050(struct inv_mpu_state *st, bool power_on); -int inv_set_interrupt_on_gesture_event(struct inv_mpu_state *st, bool on); -int inv_set_display_orient_interrupt_dmp(struct inv_mpu_state *st, bool on); -u16 inv_dmp_get_address(u16 key); -int inv_q30_mult(int a, int b); -int inv_set_tap_threshold_dmp(struct inv_mpu_state *st, u16 threshold); -int inv_write_2bytes(struct inv_mpu_state *st, int k, int data); -int inv_set_min_taps_dmp(struct inv_mpu_state *st, u16 min_taps); -int inv_set_tap_time_dmp(struct inv_mpu_state *st, u16 time); -int inv_enable_tap_dmp(struct inv_mpu_state *st, bool on); -int inv_i2c_read_base(struct inv_mpu_state *st, u16 i2c_addr, - u8 reg, u16 length, u8 *data); -int inv_i2c_single_write_base(struct inv_mpu_state *st, - u16 i2c_addr, u8 reg, u8 data); -int inv_hw_self_test(struct inv_mpu_state *st); -s64 get_time_ns(void); -int write_be32_key_to_mem(struct inv_mpu_state *st, - u32 data, int key); -int inv_set_accel_bias_dmp(struct inv_mpu_state *st); -int inv_mpu_setup_compass_slave(struct inv_mpu_state *st); -int inv_mpu_setup_pressure_slave(struct inv_mpu_state *st); -int mpu_memory_write(struct inv_mpu_state *st, u8 mpu_addr, u16 mem_addr, - u32 len, u8 const *data); -int mpu_memory_read(struct inv_mpu_state *st, u8 mpu_addr, u16 mem_addr, - u32 len, u8 *data); -int mpu_memory_write_unaligned(struct inv_mpu_state *st, u16 key, int len, - u8 const *d); -int inv_quaternion_on(struct inv_mpu_state *st, - struct iio_buffer *ring, bool en); -int inv_enable_pedometer_interrupt(struct inv_mpu_state *st, bool en); -int inv_read_pedometer_counter(struct inv_mpu_state *st); -int inv_enable_pedometer(struct inv_mpu_state *st, bool en); -int inv_get_pedometer_steps(struct inv_mpu_state *st, u32 *steps); -int inv_get_pedometer_time(struct inv_mpu_state *st, u32 *time); -int inv_reset_fifo(struct iio_dev *indio_dev); -int inv_reset_offset_reg(struct inv_mpu_state *st, bool en); -int inv_batchmode_setup(struct inv_mpu_state *st); -void inv_init_sensor_struct(struct inv_mpu_state *st); -int inv_read_time_and_ticks(struct inv_mpu_state *st, bool resume); -int inv_flush_batch_data(struct iio_dev *indio_dev, bool *has_data); -int set_inv_enable(struct iio_dev *indio_dev, bool enable); -/* used to print i2c data using pr_debug */ -char *wr_pr_debug_begin(u8 const *data, u32 len, char *string); -char *wr_pr_debug_end(char *string); - -#define mem_w(a, b, c) \ - mpu_memory_write(st, st->i2c_addr, a, b, c) -#define mem_w_key(key, b, c) mpu_memory_write_unaligned(st, key, b, c) -#define inv_i2c_read(st, reg, len, data) \ - inv_i2c_read_base(st, st->i2c_addr, reg, len, data) -#define inv_i2c_single_write(st, reg, data) \ - inv_i2c_single_write_base(st, st->i2c_addr, reg, data) -#define inv_secondary_read(reg, len, data) \ - inv_i2c_read_base(st, st->plat_data.secondary_i2c_addr, reg, len, data) -#define inv_secondary_write(reg, data) \ - inv_i2c_single_write_base(st, st->plat_data.secondary_i2c_addr, \ - reg, data) -#define inv_aux_read(reg, len, data) \ - inv_i2c_read_base(st, st->plat_data.aux_i2c_addr, reg, len, data) -#define inv_aux_write(reg, data) \ - inv_i2c_single_write_base(st, st->plat_data.aux_i2c_addr, \ - reg, data) - -#endif /* #ifndef _INV_MPU_IIO_H_ */ - |