summaryrefslogtreecommitdiff
path: root/fw/mpu6050.h
diff options
context:
space:
mode:
Diffstat (limited to 'fw/mpu6050.h')
-rw-r--r--fw/mpu6050.h491
1 files changed, 491 insertions, 0 deletions
diff --git a/fw/mpu6050.h b/fw/mpu6050.h
new file mode 100644
index 0000000..39132a4
--- /dev/null
+++ b/fw/mpu6050.h
@@ -0,0 +1,491 @@
+/* MPU6050 device I2C library code for ARM STM32F103xx is placed under the MIT license
+ Copyright (c) 2012 Harinadha Reddy Chintalapalli
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+ */
+
+#ifndef __MPU6050_H
+#define __MPU6050_H
+
+#include "global.h"
+
+#ifndef MPU_I2C_PERIPH
+#define MPU_I2C_PERIPH I2C1
+#endif
+
+
+enum mpu_i2c_addr {
+ MPU_ADDRESS_AD0_LOW = 0xd0, // address pin low (GND), default for InvenSense evaluation board
+ MPU_ADDRESS_AD0_HIGH = 0xd1, // address pin high (VCC)
+ MPU_DEFAULT_ADDRESS = MPU_ADDRESS_AD0_LOW
+};
+
+enum mpu_reg_addr {
+ MPU_RA_XG_OFFS_TC = 0x00, //[7] PWR_MODE, [6:1] XG_OFFS_TC, [0] OTP_BNK_VLD
+ MPU_RA_YG_OFFS_TC = 0x01, //[7] PWR_MODE, [6:1] YG_OFFS_TC, [0] OTP_BNK_VLD
+ MPU_RA_ZG_OFFS_TC = 0x02, //[7] PWR_MODE, [6:1] ZG_OFFS_TC, [0] OTP_BNK_VLD
+ MPU_RA_X_FINE_GAIN = 0x03, //[7:0] X_FINE_GAIN
+ MPU_RA_Y_FINE_GAIN = 0x04, //[7:0] Y_FINE_GAIN
+ MPU_RA_Z_FINE_GAIN = 0x05, //[7:0] Z_FINE_GAIN
+ MPU_RA_XA_OFFS_H = 0x06, //[15:0] XA_OFFS
+ MPU_RA_XA_OFFS_L_TC = 0x07,
+ MPU_RA_YA_OFFS_H = 0x08, //[15:0] YA_OFFS
+ MPU_RA_YA_OFFS_L_TC = 0x09,
+ MPU_RA_ZA_OFFS_H = 0x0A, //[15:0] ZA_OFFS
+ MPU_RA_ZA_OFFS_L_TC = 0x0B,
+ MPU_RA_XG_OFFS_USRH = 0x13, //[15:0] XG_OFFS_USR
+ MPU_RA_XG_OFFS_USRL = 0x14,
+ MPU_RA_YG_OFFS_USRH = 0x15, //[15:0] YG_OFFS_USR
+ MPU_RA_YG_OFFS_USRL = 0x16,
+ MPU_RA_ZG_OFFS_USRH = 0x17, //[15:0] ZG_OFFS_USR
+ MPU_RA_ZG_OFFS_USRL = 0x18,
+ MPU_RA_SMPLRT_DIV = 0x19,
+ MPU_RA_CONFIG = 0x1A,
+ MPU_RA_GYRO_CONFIG = 0x1B,
+ MPU_RA_ACCEL_CONFIG = 0x1C,
+ MPU_RA_FF_THR = 0x1D,
+ MPU_RA_FF_DUR = 0x1E,
+ MPU_RA_MOT_THR = 0x1F,
+ MPU_RA_MOT_DUR = 0x20,
+ MPU_RA_ZRMOT_THR = 0x21,
+ MPU_RA_ZRMOT_DUR = 0x22,
+ MPU_RA_FIFO_EN = 0x23,
+ MPU_RA_I2C_MST_CTRL = 0x24,
+ MPU_RA_I2C_SLV0_ADDR = 0x25,
+ MPU_RA_I2C_SLV0_REG = 0x26,
+ MPU_RA_I2C_SLV0_CTRL = 0x27,
+ MPU_RA_I2C_SLV1_ADDR = 0x28,
+ MPU_RA_I2C_SLV1_REG = 0x29,
+ MPU_RA_I2C_SLV1_CTRL = 0x2A,
+ MPU_RA_I2C_SLV2_ADDR = 0x2B,
+ MPU_RA_I2C_SLV2_REG = 0x2C,
+ MPU_RA_I2C_SLV2_CTRL = 0x2D,
+ MPU_RA_I2C_SLV3_ADDR = 0x2E,
+ MPU_RA_I2C_SLV3_REG = 0x2F,
+ MPU_RA_I2C_SLV3_CTRL = 0x30,
+ MPU_RA_I2C_SLV4_ADDR = 0x31,
+ MPU_RA_I2C_SLV4_REG = 0x32,
+ MPU_RA_I2C_SLV4_DO = 0x33,
+ MPU_RA_I2C_SLV4_CTRL = 0x34,
+ MPU_RA_I2C_SLV4_DI = 0x35,
+ MPU_RA_I2C_MST_STATUS = 0x36,
+ MPU_RA_INT_PIN_CFG = 0x37,
+ MPU_RA_INT_ENABLE = 0x38,
+ MPU_RA_DMP_INT_STATUS = 0x39,
+ MPU_RA_INT_STATUS = 0x3A,
+ MPU_RA_ACCEL_XOUT_H = 0x3B,
+ MPU_RA_ACCEL_XOUT_L = 0x3C,
+ MPU_RA_ACCEL_YOUT_H = 0x3D,
+ MPU_RA_ACCEL_YOUT_L = 0x3E,
+ MPU_RA_ACCEL_ZOUT_H = 0x3F,
+ MPU_RA_ACCEL_ZOUT_L = 0x40,
+ MPU_RA_TEMP_OUT_H = 0x41,
+ MPU_RA_TEMP_OUT_L = 0x42,
+ MPU_RA_GYRO_XOUT_H = 0x43,
+ MPU_RA_GYRO_XOUT_L = 0x44,
+ MPU_RA_GYRO_YOUT_H = 0x45,
+ MPU_RA_GYRO_YOUT_L = 0x46,
+ MPU_RA_GYRO_ZOUT_H = 0x47,
+ MPU_RA_GYRO_ZOUT_L = 0x48,
+ MPU_RA_EXT_SENS_DATA_00 = 0x49,
+ MPU_RA_EXT_SENS_DATA_01 = 0x4A,
+ MPU_RA_EXT_SENS_DATA_02 = 0x4B,
+ MPU_RA_EXT_SENS_DATA_03 = 0x4C,
+ MPU_RA_EXT_SENS_DATA_04 = 0x4D,
+ MPU_RA_EXT_SENS_DATA_05 = 0x4E,
+ MPU_RA_EXT_SENS_DATA_06 = 0x4F,
+ MPU_RA_EXT_SENS_DATA_07 = 0x50,
+ MPU_RA_EXT_SENS_DATA_08 = 0x51,
+ MPU_RA_EXT_SENS_DATA_09 = 0x52,
+ MPU_RA_EXT_SENS_DATA_10 = 0x53,
+ MPU_RA_EXT_SENS_DATA_11 = 0x54,
+ MPU_RA_EXT_SENS_DATA_12 = 0x55,
+ MPU_RA_EXT_SENS_DATA_13 = 0x56,
+ MPU_RA_EXT_SENS_DATA_14 = 0x57,
+ MPU_RA_EXT_SENS_DATA_15 = 0x58,
+ MPU_RA_EXT_SENS_DATA_16 = 0x59,
+ MPU_RA_EXT_SENS_DATA_17 = 0x5A,
+ MPU_RA_EXT_SENS_DATA_18 = 0x5B,
+ MPU_RA_EXT_SENS_DATA_19 = 0x5C,
+ MPU_RA_EXT_SENS_DATA_20 = 0x5D,
+ MPU_RA_EXT_SENS_DATA_21 = 0x5E,
+ MPU_RA_EXT_SENS_DATA_22 = 0x5F,
+ MPU_RA_EXT_SENS_DATA_23 = 0x60,
+ MPU_RA_MOT_DETECT_STATUS = 0x61,
+ MPU_RA_I2C_SLV0_DO = 0x63,
+ MPU_RA_I2C_SLV1_DO = 0x64,
+ MPU_RA_I2C_SLV2_DO = 0x65,
+ MPU_RA_I2C_SLV3_DO = 0x66,
+ MPU_RA_I2C_MST_DELAY_CTRL = 0x67,
+ MPU_RA_SIGNAL_PATH_RESET = 0x68,
+ MPU_RA_MOT_DETECT_CTRL = 0x69,
+ MPU_RA_USER_CTRL = 0x6A,
+ MPU_RA_PWR_MGMT1 = 0x6B,
+ MPU_RA_PWR_MGMT2 = 0x6C,
+ MPU_RA_BANK_SEL = 0x6D,
+ MPU_RA_MEM_START_ADDR = 0x6E,
+ MPU_RA_MEM_R_W = 0x6F,
+ MPU_RA_DMP_CFG1 = 0x70,
+ MPU_RA_DMP_CFG2 = 0x71,
+ MPU_RA_FIFO_COUNTH = 0x72,
+ MPU_RA_FIFO_COUNTL = 0x73,
+ MPU_RA_FIFO_R_W = 0x74,
+ MPU_RA_WHO_AM_I = 0x75,
+};
+
+enum mpu_tc {
+ MPU_TC_PWR_MODE_BIT = 7,
+ MPU_TC_OFFSET_BIT = 6,
+ MPU_TC_OFFSET_LENGTH = 6,
+ MPU_TC_OTP_BNK_VLD_BIT = 0,
+};
+
+enum mpu_vddio {
+ MPU_VDDIO_LEVEL_VLOGIC = 0,
+ MPU_VDDIO_LEVEL_VDD = 1,
+};
+
+enum mpu_cfg {
+ MPU_CFG_EXT_SYNC_SET_BIT = 5,
+ MPU_CFG_EXT_SYNC_SET_LENGTH = 3,
+ MPU_CFG_DLPF_CFG_BIT = 2,
+ MPU_CFG_DLPF_CFG_LENGTH = 3,
+};
+
+enum mpu_ext {
+ MPU_EXT_SYNC_DISABLED = 0x0,
+ MPU_EXT_SYNC_TEMP_OUT_L = 0x1,
+ MPU_EXT_SYNC_GYRO_XOUT_L = 0x2,
+ MPU_EXT_SYNC_GYRO_YOUT_L = 0x3,
+ MPU_EXT_SYNC_GYRO_ZOUT_L = 0x4,
+ MPU_EXT_SYNC_ACCEL_XOUT_L = 0x5,
+ MPU_EXT_SYNC_ACCEL_YOUT_L = 0x6,
+ MPU_EXT_SYNC_ACCEL_ZOUT_L = 0x7,
+};
+
+enum mpu_dlpf {
+ MPU_DLPF_BW_256 = 0x00,
+ MPU_DLPF_BW_188 = 0x01,
+ MPU_DLPF_BW_98 = 0x02,
+ MPU_DLPF_BW_42 = 0x03,
+ MPU_DLPF_BW_20 = 0x04,
+ MPU_DLPF_BW_10 = 0x05,
+ MPU_DLPF_BW_5 = 0x06,
+};
+
+enum mpu_gyro_config {
+ /* self test */
+ MPU_GYRO_XG_ST = 1<<7,
+ MPU_GYRO_YG_ST = 1<<6,
+ MPU_GYRO_ZG_ST = 1<<5,
+ /* full scale */
+ MPU_GYRO_FS_SEL_Pos = 3,
+ MPU_GYRO_FS_SEL_Msk = 3<<3,
+ MPU_GYRO_FS_250 = 0<<3,
+ MPU_GYRO_FS_500 = 1<<3,
+ MPU_GYRO_FS_1000 = 2<<3,
+ MPU_GYRO_FS_2000 = 3<<3,
+ /* dlpf config, default 0b00 */
+ MPU_GYRO_FCHOICE_B_Pos = 0,
+ MPU_GYRO_FCHOICE_B_Msk = 3<<0,
+};
+
+enum mpu_accel_config {
+ /* self test */
+ MPU_ACCEL_CONFIG_XA_ST = 1<<7,
+ MPU_ACCEL_CONFIG_YA_ST = 1<<6,
+ MPU_ACCEL_CONFIG_ZA_ST = 1<<5,
+ /* full scale */
+ MPU_ACCEL_CONFIG_FS_SEL_Pos = 3,
+ MPU_ACCEL_CONFIG_FS_SEL_Msk = 3<<3,
+ MPU_ACCEL_FS_2 = 0x00,
+ MPU_ACCEL_FS_4 = 0x01,
+ MPU_ACCEL_FS_8 = 0x02,
+ MPU_ACCEL_FS_16 = 0x03,
+};
+
+enum mpu_en {
+ MPU_TEMP_FIFO_EN_BIT = 7,
+ MPU_XG_FIFO_EN_BIT = 6,
+ MPU_YG_FIFO_EN_BIT = 5,
+ MPU_ZG_FIFO_EN_BIT = 4,
+ MPU_ACCEL_FIFO_EN_BIT = 3,
+ MPU_SLV2_FIFO_EN_BIT = 2,
+ MPU_SLV1_FIFO_EN_BIT = 1,
+ MPU_SLV0_FIFO_EN_BIT = 0,
+
+ MPU_MULT_MST_EN_BIT = 7,
+ MPU_WAIT_FOR_ES_BIT = 6,
+ MPU_SLV_3_FIFO_EN_BIT = 5,
+ MPU_I2C_MST_P_NSR_BIT = 4,
+ MPU_I2C_MST_CLK_BIT = 3,
+ MPU_I2C_MST_CLK_LENGTH = 4,
+};
+
+enum mpu_clkdiv {
+ MPU_CLOCK_DIV_348 = 0x0,
+ MPU_CLOCK_DIV_333 = 0x1,
+ MPU_CLOCK_DIV_320 = 0x2,
+ MPU_CLOCK_DIV_308 = 0x3,
+ MPU_CLOCK_DIV_296 = 0x4,
+ MPU_CLOCK_DIV_286 = 0x5,
+ MPU_CLOCK_DIV_276 = 0x6,
+ MPU_CLOCK_DIV_267 = 0x7,
+ MPU_CLOCK_DIV_258 = 0x8,
+ MPU_CLOCK_DIV_500 = 0x9,
+ MPU_CLOCK_DIV_471 = 0xA,
+ MPU_CLOCK_DIV_444 = 0xB,
+ MPU_CLOCK_DIV_421 = 0xC,
+ MPU_CLOCK_DIV_400 = 0xD,
+ MPU_CLOCK_DIV_381 = 0xE,
+ MPU_CLOCK_DIV_364 = 0xF,
+};
+
+enum mpu_i2c_slv {
+ MPU_I2C_SLV_RW_BIT = 7,
+ MPU_I2C_SLV_ADDR_BIT = 6,
+ MPU_I2C_SLV_ADDR_LENGTH = 7,
+ MPU_I2C_SLV_EN_BIT = 7,
+ MPU_I2C_SLV_BYTE_SW_BIT = 6,
+ MPU_I2C_SLV_REG_DIS_BIT = 5,
+ MPU_I2C_SLV_GRP_BIT = 4,
+ MPU_I2C_SLV_LEN_BIT = 3,
+ MPU_I2C_SLV_LEN_LENGTH = 4,
+};
+
+enum mpu_i2c_slv4 {
+ MPU_I2C_SLV4_RW_BIT = 7,
+ MPU_I2C_SLV4_ADDR_BIT = 6,
+ MPU_I2C_SLV4_ADDR_LENGTH = 7,
+ MPU_I2C_SLV4_EN_BIT = 7,
+ MPU_I2C_SLV4_INT_EN_BIT = 6,
+ MPU_I2C_SLV4_REG_DIS_BIT = 5,
+ MPU_I2C_SLV4_MST_DLY_BIT = 4,
+ MPU_I2C_SLV4_MST_DLY_LENGTH = 5,
+};
+
+enum mpu_mst {
+ MPU_MST_PASS_THROUGH_BIT = 7,
+ MPU_MST_I2C_SLV4_DONE_BIT = 6,
+ MPU_MST_I2C_LOST_ARB_BIT = 5,
+ MPU_MST_I2C_SLV4_NACK_BIT = 4,
+ MPU_MST_I2C_SLV3_NACK_BIT = 3,
+ MPU_MST_I2C_SLV2_NACK_BIT = 2,
+ MPU_MST_I2C_SLV1_NACK_BIT = 1,
+ MPU_MST_I2C_SLV0_NACK_BIT = 0,
+};
+
+enum mpu_intcfg {
+ MPU_INT_PIN_CFG_INT_LEVEL = 1<<7,
+ MPU_INTMODE_ACTIVEHIGH = 0,
+ MPU_INTMODE_ACTIVELOW = 1<<7,
+
+ MPU_INT_PIN_CFG_INT_OPEN = 1<<6,
+ MPU_INTDRV_PUSHPULL = 0,
+ MPU_INTDRV_OPENDRAIN = 1<<6,
+
+ MPU_INT_PIN_CFG_LATCH_INT_EN = 1<<5,
+ MPU_INTLATCH_50USPULSE = 0,
+ MPU_INTLATCH_WAITCLEAR = 1<<5,
+
+ MPU_INT_PIN_CFG_RD_CLEAR = 1<<4,
+ MPU_INTCLEAR_STATUSREAD = 0,
+ MPU_INTCLEAR_ANYREAD = 1<<4,
+
+ MPU_INT_PIN_CFG_FSYNC_INT_LEVEL = 1<<3,
+ MPU_INT_PIN_CFG_FSYNC_INT_EN = 1<<2,
+ MPU_INT_PIN_CFG_I2C_BYPASS_EN = 1<<1,
+ MPU_INT_PIN_CFG_CLKOUT_EN = 1<<0,
+};
+
+enum mpu_int_enable {
+ MPU_INT_ENABLE_FIFO_OFLOW = 1<<4,
+ MPU_INT_ENABLE_I2C_MST_INT = 1<<3,
+ MPU_INT_ENABLE_DATA_RDY = 1<<0,
+};
+
+// TODO: Need to work on DMP related things
+enum mpu_dmpint {
+ MPU_DMPINT_5_BIT = 5,
+ MPU_DMPINT_4_BIT = 4,
+ MPU_DMPINT_3_BIT = 3,
+ MPU_DMPINT_2_BIT = 2,
+ MPU_DMPINT_1_BIT = 1,
+ MPU_DMPINT_0_BIT = 0,
+};
+
+enum mpu_motion {
+ MPU_MOTION_MOT_XNEG_BIT = 7,
+ MPU_MOTION_MOT_XPOS_BIT = 6,
+ MPU_MOTION_MOT_YNEG_BIT = 5,
+ MPU_MOTION_MOT_YPOS_BIT = 4,
+ MPU_MOTION_MOT_ZNEG_BIT = 3,
+ MPU_MOTION_MOT_ZPOS_BIT = 2,
+ MPU_MOTION_MOT_ZRMOT_BIT = 0,
+};
+
+enum mpu_delayctrl {
+ MPU_DELAYCTRL_DELAY_ES_SHADOW_BIT = 7,
+ MPU_DELAYCTRL_I2C_SLV4_DLY_EN_BIT = 4,
+ MPU_DELAYCTRL_I2C_SLV3_DLY_EN_BIT = 3,
+ MPU_DELAYCTRL_I2C_SLV2_DLY_EN_BIT = 2,
+ MPU_DELAYCTRL_I2C_SLV1_DLY_EN_BIT = 1,
+ MPU_DELAYCTRL_I2C_SLV0_DLY_EN_BIT = 0,
+};
+
+enum mpu_pathreset {
+ MPU_PATHRESET_GYRO_RESET_BIT = 2,
+ MPU_PATHRESET_ACCEL_RESET_BIT = 1,
+ MPU_PATHRESET_TEMP_RESET_BIT = 0,
+};
+
+enum mpu_detect {
+ MPU_DETECT_ACCEL_ON_DELAY_BIT = 5,
+ MPU_DETECT_ACCEL_ON_DELAY_LENGTH = 2,
+ MPU_DETECT_FF_COUNT_BIT = 3,
+ MPU_DETECT_FF_COUNT_LENGTH = 2,
+ MPU_DETECT_MOT_COUNT_BIT = 1,
+ MPU_DETECT_MOT_COUNT_LENGTH = 2,
+
+ MPU_DETECT_DECREMENT_RESET = 0x0,
+ MPU_DETECT_DECREMENT_1 = 0x1,
+ MPU_DETECT_DECREMENT_2 = 0x2,
+ MPU_DETECT_DECREMENT_4 = 0x3,
+};
+
+enum mpu_userctrl {
+ MPU_USERCTRL_DMP_EN_BIT = 7,
+ MPU_USERCTRL_FIFO_EN_BIT = 6,
+ MPU_USERCTRL_I2C_MST_EN_BIT = 5,
+ MPU_USERCTRL_I2C_IF_DIS_BIT = 4,
+ MPU_USERCTRL_DMP_RESET_BIT = 3,
+ MPU_USERCTRL_FIFO_RESET_BIT = 2,
+ MPU_USERCTRL_I2C_MST_RESET_BIT = 1,
+ MPU_USERCTRL_SIG_COND_RESET_BIT = 0,
+};
+
+enum mpu_pwr_mgmt1 {
+ MPU_PWR_MGMT1_DEVICE_RESET = 1<<7,
+ /* Low power sleep mode */
+ MPU_PWR_MGMT1_SLEEP = 1<<6,
+ /* Low power auto wakeup/cycle mode */
+ MPU_PWR_MGMT1_CYCLE = 1<<5,
+ /* Temperature sensor disable */
+ MPU_PWR_MGMT1_TEMP_DIS = 1<<3,
+ /* Clock source selection */
+ MPU_PWR_MGMT1_CLKSEL_Msk = 0x7,
+ MPU_PWR_MGMT1_CLKSEL_Pos = 0,
+ MPU_CLOCK_INTERNAL = 0,
+ MPU_CLOCK_PLL_XGYRO = 1,
+ MPU_CLOCK_PLL_YGYRO = 2,
+ MPU_CLOCK_PLL_ZGYRO = 3,
+ MPU_CLOCK_PLL_EXT32K = 4,
+ MPU_CLOCK_PLL_EXT19M = 5,
+ MPU_CLOCK_KEEP_RESET = 7,
+};
+
+enum mpu_pwr_mgmt2 {
+ /* low-power cyclic auto wakeup */
+ MPU_PWR_MGMT2_LP_WAKE_CTRL_Pos = 6,
+ MPU_PWR_MGMT2_LP_WAKE_CTRL_Msk = 3<<6,
+ MPU_WAKE_FREQ_1P25 = 0<<6,
+ MPU_WAKE_FREQ_5 = 1<<6,
+ MPU_WAKE_FREQ_20 = 2<<6,
+ MPU_WAKE_FREQ_40 = 3<<6,
+ /* axis standby bits */
+ MPU_PWR_MGMT2_STBY_XA = 1<<5,
+ MPU_PWR_MGMT2_STBY_YA = 1<<4,
+ MPU_PWR_MGMT2_STBY_ZA = 1<<3,
+ MPU_PWR_MGMT2_STBY_XG = 1<<2,
+ MPU_PWR_MGMT2_STBY_YG = 1<<1,
+ MPU_PWR_MGMT2_STBY_ZG = 1<<0,
+};
+
+enum mpu_banksel {
+ MPU_BANKSEL_PRFTCH_EN_BIT = 6,
+ MPU_BANKSEL_CFG_USER_BANK_BIT = 5,
+ MPU_BANKSEL_MEM_SEL_BIT = 4,
+ MPU_BANKSEL_MEM_SEL_LENGTH = 5,
+};
+
+enum mpu_whoami {
+ MPU_WHO_AM_I_Pos = 1,
+ MPU_WHO_AM_I_Msk = 0x3f<<1,
+ MPU_DEVICE_ID = 0x34,
+};
+
+enum mpu_dmp_mem {
+ MPU_DMP_MEMORY_BANKS = 8,
+ MPU_DMP_MEMORY_BANK_SIZE = 256,
+ MPU_DMP_MEMORY_CHUNK_SIZE = 16,
+};
+
+
+struct __attribute__((packed)) mpu_accel_data {
+ union {
+ struct { int16_t x, y, z; };
+ int16_t channels[3];
+ };
+};
+
+struct __attribute__((packed)) mpu_gyro_data {
+ union {
+ struct { int16_t x, y, z; };
+ int16_t channels[3];
+ };
+};
+
+struct __attribute__((packed)) mpu_raw_data {
+ union {
+ struct {
+ struct mpu_accel_data accel;
+ int16_t temp;
+ struct mpu_gyro_data gyro;
+ };
+ int16_t channels[7];
+ };
+};
+
+
+void mpu_init();
+void mpu_init_low_power(uint8_t wake_freq, bool enable_interrupt);
+bool mpu_test_connection();
+
+uint8_t mpu_get_gyro_fs();
+void mpu_set_gyro_fs(uint8_t range);
+
+uint8_t mpu_get_accel_fs();
+void mpu_set_accel_fs(uint8_t range);
+
+// PWR_MGMT_1 register
+bool mpu_get_sleep_mode();
+void mpu_set_sleep_mode(bool val);
+// WHO_AM_I register
+uint8_t mpu_device_id();
+
+void mpu_read_accel_gyro(struct mpu_raw_data *out);
+int16_t mpu_read_temp();
+void mpu_read_accel(struct mpu_accel_data *out);
+void mpu_read_gyro(struct mpu_gyro_data *out);
+
+void mpu_reg_write(uint8_t reg, uint8_t val);
+void mpu_reg_read_multiple(uint8_t addr, uint8_t* buf, size_t len);
+uint8_t mpu_reg_read(uint8_t addr);
+
+#endif /* __MPU6050_H */