blob: eac21c2407b8ec6d5b3964369d64721f4be6bc72 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#ifndef __BMA253_PRIV_H__
#define __BMA253_PRIV_H__
#include "bma253/bma253.h"
#ifdef __cplusplus
#extern "C" {
#endif
/*
* Full register map:
*/
#define REG_ADDR_BGW_CHIPID 0x00 /* r */
/* RESERVED */ /* */
#define REG_ADDR_ACCD_X_LSB 0x02 /* r */
#define REG_ADDR_ACCD_X_MSB 0x03 /* r */
#define REG_ADDR_ACCD_Y_LSB 0x04 /* r */
#define REG_ADDR_ACCD_Y_MSB 0x05 /* r */
#define REG_ADDR_ACCD_Z_LSB 0x06 /* r */
#define REG_ADDR_ACCD_Z_MSB 0x07 /* r */
#define REG_ADDR_ACCD_TEMP 0x08 /* r */
#define REG_ADDR_INT_STATUS_0 0x09 /* r */
#define REG_ADDR_INT_STATUS_1 0x0A /* r */
#define REG_ADDR_INT_STATUS_2 0x0B /* r */
#define REG_ADDR_INT_STATUS_3 0x0C /* r */
/* RESERVED */ /* */
#define REG_ADDR_FIFO_STATUS 0x0E /* r */
#define REG_ADDR_PMU_RANGE 0x0F /* rw */
#define REG_ADDR_PMU_BW 0x10 /* rw */
#define REG_ADDR_PMU_LPW 0x11 /* rw */
#define REG_ADDR_PMU_LOW_POWER 0x12 /* rw */
#define REG_ADDR_ACCD_HBW 0x13 /* rw */
#define REG_ADDR_BGW_SOFTRESET 0x14 /* w */
/* RESERVED */ /* */
#define REG_ADDR_INT_EN_0 0x16 /* rw */
#define REG_ADDR_INT_EN_1 0x17 /* rw */
#define REG_ADDR_INT_EN_2 0x18 /* rw */
#define REG_ADDR_INT_MAP_0 0x19 /* rw */
#define REG_ADDR_INT_MAP_1 0x1A /* rw */
#define REG_ADDR_INT_MAP_2 0x1B /* rw */
/* RESERVED */ /* */
/* RESERVED */ /* */
#define REG_ADDR_INT_SRC 0x1E /* rw */
/* RESERVED */ /* */
#define REG_ADDR_INT_OUT_CTRL 0x20 /* rw */
#define REG_ADDR_INT_RST_LATCH 0x21 /* rw */
#define REG_ADDR_INT_0 0x22 /* rw */
#define REG_ADDR_INT_1 0x23 /* rw */
#define REG_ADDR_INT_2 0x24 /* rw */
#define REG_ADDR_INT_3 0x25 /* rw */
#define REG_ADDR_INT_4 0x26 /* rw */
#define REG_ADDR_INT_5 0x27 /* rw */
#define REG_ADDR_INT_6 0x28 /* rw */
#define REG_ADDR_INT_7 0x29 /* rw */
#define REG_ADDR_INT_8 0x2A /* rw */
#define REG_ADDR_INT_9 0x2B /* rw */
#define REG_ADDR_INT_A 0x2C /* rw */
#define REG_ADDR_INT_B 0x2D /* rw */
#define REG_ADDR_INT_C 0x2E /* rw */
#define REG_ADDR_INT_D 0x2F /* rw */
#define REG_ADDR_FIFO_CONFIG_0 0x30 /* rw */
/* RESERVED */ /* */
#define REG_ADDR_PMU_SELF_TEST 0x32 /* rw */
#define REG_ADDR_TRIM_NVM_CTRL 0x33 /* rw */
#define REG_ADDR_BGW_SPI3_WDT 0x34 /* rw */
/* RESERVED */ /* */
#define REG_ADDR_OFC_CTRL 0x36 /* rw */
#define REG_ADDR_OFC_SETTING 0x37 /* rw */
#define REG_ADDR_OFC_OFFSET_X 0x38 /* rw nvm */
#define REG_ADDR_OFC_OFFSET_Y 0x39 /* rw nvm */
#define REG_ADDR_OFC_OFFSET_Z 0x3A /* rw nvm */
#define REG_ADDR_TRIM_GP0 0x3B /* rw nvm */
#define REG_ADDR_TRIM_GP1 0x3C /* rw nvm */
/* RESERVED */ /* */
#define REG_ADDR_FIFO_CONFIG_1 0x3E /* rw */
#define REG_ADDR_FIFO_DATA 0x3F /* r */
/* Magical value that the chip always reports as its ID */
#define REG_VALUE_CHIP_ID 0xFA
/* Magical value that is used to initiate a full reset */
#define REG_VALUE_SOFT_RESET 0xB6
/* Get the chip ID */
int
bma253_get_chip_id(const struct bma253 * bma253,
uint8_t * chip_id);
/* All three axis types */
enum axis {
AXIS_X = 0,
AXIS_Y = 1,
AXIS_Z = 2,
AXIS_ALL = 3,
};
/* A single accelerometer measurement for one axis */
struct accel_data {
float accel_g;
bool new_data;
};
/* Get an accelerometer measurement for a single axis */
int
bma253_get_accel(const struct bma253 * bma253,
enum bma253_g_range g_range,
enum axis axis,
struct accel_data * accel_data);
/* Get a temperature measurement */
int
bma253_get_temp(const struct bma253 * bma253,
float * temp_c);
/* Which direction in an axis was this interrupt triggered on */
enum axis_trigger_sign {
AXIS_TRIGGER_SIGN_POS = 0,
AXIS_TRIGGER_SIGN_NEG = 1,
};
/* Which axis was this interrupt triggered on */
struct axis_trigger {
enum axis_trigger_sign sign;
enum axis axis;
bool axis_known;
};
/* Active status of all interrupts */
struct int_status {
bool flat_int_active;
bool orient_int_active;
bool s_tap_int_active;
bool d_tap_int_active;
bool slow_no_mot_int_active;
bool slope_int_active;
bool high_g_int_active;
bool low_g_int_active;
bool data_int_active;
bool fifo_wmark_int_active;
bool fifo_full_int_active;
struct axis_trigger tap_trigger;
struct axis_trigger slope_trigger;
bool device_is_flat;
bool device_is_down;
enum bma253_orient_xy device_orientation;
struct axis_trigger high_g_trigger;
};
/* Get the active status of all interrupts */
int
bma253_get_int_status(const struct bma253 * bma253,
struct int_status * int_status);
/* Get the status and size of the FIFO */
int
bma253_get_fifo_status(const struct bma253 * bma253,
bool * overrun,
uint8_t * frame_counter);
/* Get/Set the accelerometer range */
int
bma253_get_g_range(const struct bma253 * bma253,
enum bma253_g_range * g_range);
int
bma253_set_g_range(const struct bma253 * bma253,
enum bma253_g_range g_range);
/* Get/Set the filter output bandwidth */
int
bma253_get_filter_bandwidth(const struct bma253 * bma253,
enum bma253_filter_bandwidth * filter_bandwidth);
int
bma253_set_filter_bandwidth(const struct bma253 * bma253,
enum bma253_filter_bandwidth filter_bandwidth);
/* Whether the sleep timer is locked to events or to time */
enum sleep_timer {
SLEEP_TIMER_EVENT_DRIVEN = 0,
SLEEP_TIMER_EQUIDISTANT_SAMPLING = 1,
};
/* Power settings of the device */
struct power_settings {
enum bma253_power_mode power_mode;
enum bma253_sleep_duration sleep_duration;
enum sleep_timer sleep_timer;
};
/* Get/Set the power settings of the device */
int
bma253_get_power_settings(const struct bma253 * bma253,
struct power_settings * power_settings);
int
bma253_set_power_settings(const struct bma253 * bma253,
const struct power_settings * power_settings);
/* Get/Set the data register settings */
int
bma253_get_data_acquisition(const struct bma253 * bma253,
bool * unfiltered_reg_data,
bool * disable_reg_shadow);
int
bma253_set_data_acquisition(const struct bma253 * bma253,
bool unfiltered_reg_data,
bool disable_reg_shadow);
/* Kick off a full soft reset of the device */
int
bma253_set_softreset(const struct bma253 * bma253);
/* Enable settings of all interupts */
struct int_enable {
bool flat_int_enable;
bool orient_int_enable;
bool s_tap_int_enable;
bool d_tap_int_enable;
bool slope_z_int_enable;
bool slope_y_int_enable;
bool slope_x_int_enable;
bool fifo_wmark_int_enable;
bool fifo_full_int_enable;
bool data_int_enable;
bool low_g_int_enable;
bool high_g_z_int_enable;
bool high_g_y_int_enable;
bool high_g_x_int_enable;
bool no_motion_select;
bool slow_no_mot_z_int_enable;
bool slow_no_mot_y_int_enable;
bool slow_no_mot_x_int_enable;
};
/* Get/Set the enable settings of all interrupts */
int
bma253_get_int_enable(const struct bma253 * bma253,
struct int_enable * int_enable);
int
bma253_set_int_enable(const struct bma253 * bma253,
const struct int_enable * int_enable);
/* Which physical device pin is a given interrupt routed to */
enum int_route {
INT_ROUTE_NONE = 0,
INT_ROUTE_PIN_1 = 1,
INT_ROUTE_PIN_2 = 2,
INT_ROUTE_BOTH = 3,
};
enum bma253_int_num {
INT1_PIN,
INT2_PIN
};
/* Pin routing settings of all interrupts */
struct int_routes {
enum int_route flat_int_route;
enum int_route orient_int_route;
enum int_route s_tap_int_route;
enum int_route d_tap_int_route;
enum int_route slow_no_mot_int_route;
enum int_route slope_int_route;
enum int_route high_g_int_route;
enum int_route low_g_int_route;
enum int_route fifo_wmark_int_route;
enum int_route fifo_full_int_route;
enum int_route data_int_route;
};
/* Get/Set the pin routing settings of all interrupts */
int
bma253_get_int_routes(const struct bma253 * bma253,
struct int_routes * int_routes);
int
bma253_set_int_routes(const struct bma253 * bma253,
const struct int_routes * int_routes);
/* Whether each interrupt uses filtered or unfiltered data */
struct int_filters {
bool unfiltered_data_int;
bool unfiltered_tap_int;
bool unfiltered_slow_no_mot_int;
bool unfiltered_slope_int;
bool unfiltered_high_g_int;
bool unfiltered_low_g_int;
};
/* Get/Set the filtered data settings of all interrupts */
int
bma253_get_int_filters(const struct bma253 * bma253,
struct int_filters * int_filters);
int
bma253_set_int_filters(const struct bma253 * bma253,
const struct int_filters * int_filters);
/* Drive mode of the interrupt pins */
enum int_pin_output {
INT_PIN_OUTPUT_PUSH_PULL = 0,
INT_PIN_OUTPUT_OPEN_DRAIN = 1,
};
/* Active mode of the interrupt pins */
enum int_pin_active {
INT_PIN_ACTIVE_LOW = 0,
INT_PIN_ACTIVE_HIGH = 1,
};
/* Electrical settings of both interrupt pins */
struct int_pin_electrical {
enum int_pin_output pin1_output;
enum int_pin_active pin1_active;
enum int_pin_output pin2_output;
enum int_pin_active pin2_active;
};
/* Get/Set the electrical settings of both interrupt pins */
int
bma253_get_int_pin_electrical(const struct bma253 * bma253,
struct int_pin_electrical * electrical);
int
bma253_set_int_pin_electrical(const struct bma253 * bma253,
const struct int_pin_electrical * electrical);
/* Length of time that an interrupt condition should be latched active */
enum int_latch {
INT_LATCH_NON_LATCHED = 0,
INT_LATCH_LATCHED = 1,
INT_LATCH_TEMPORARY_250_US = 2,
INT_LATCH_TEMPORARY_500_US = 3,
INT_LATCH_TEMPORARY_1_MS = 4,
INT_LATCH_TEMPORARY_12_5_MS = 5,
INT_LATCH_TEMPORARY_25_MS = 6,
INT_LATCH_TEMPORARY_50_MS = 7,
INT_LATCH_TEMPORARY_250_MS = 8,
INT_LATCH_TEMPORARY_500_MS = 9,
INT_LATCH_TEMPORARY_1_S = 10,
INT_LATCH_TEMPORARY_2_S = 11,
INT_LATCH_TEMPORARY_4_S = 12,
INT_LATCH_TEMPORARY_8_S = 13,
};
/* Get/Set the interrupt condition latch time */
int
bma253_get_int_latch(const struct bma253 * bma253,
enum int_latch * int_latch);
int
bma253_set_int_latch(const struct bma253 * bma253,
bool reset_ints,
enum int_latch int_latch);
/* Settings for the low-g interrupt */
struct low_g_int_cfg {
uint16_t delay_ms;
float thresh_g;
float hyster_g;
bool axis_summing;
};
/* Get/Set the low-g interrupt settings */
int
bma253_get_low_g_int_cfg(const struct bma253 * bma253,
struct low_g_int_cfg * low_g_int_cfg);
int
bma253_set_low_g_int_cfg(const struct bma253 * bma253,
const struct low_g_int_cfg * low_g_int_cfg);
/* Settings for the high-g interrupt */
struct high_g_int_cfg {
float hyster_g;
uint16_t delay_ms;
float thresh_g;
};
/* Get/Set the high-g interrupt settings */
int
bma253_get_high_g_int_cfg(const struct bma253 * bma253,
enum bma253_g_range g_range,
struct high_g_int_cfg * high_g_int_cfg);
int
bma253_set_high_g_int_cfg(const struct bma253 * bma253,
enum bma253_g_range g_range,
const struct high_g_int_cfg * high_g_int_cfg);
/* Settings for the slow/no-motion interrupt */
struct slow_no_mot_int_cfg {
uint16_t duration_p_or_s;
float thresh_g;
};
/* Get/Set the slow/no-motion interrupt settings */
int
bma253_get_slow_no_mot_int_cfg(const struct bma253 * bma253,
bool no_motion_select,
enum bma253_g_range g_range,
struct slow_no_mot_int_cfg * slow_no_mot_int_cfg);
int
bma253_set_slow_no_mot_int_cfg(const struct bma253 * bma253,
bool no_motion_select,
enum bma253_g_range g_range,
const struct slow_no_mot_int_cfg * slow_no_mot_int_cfg);
/* Settings for the slope interrupt */
struct slope_int_cfg {
uint8_t duration_p;
float thresh_g;
};
/* Get/Set the slope interrupt settings */
int
bma253_get_slope_int_cfg(const struct bma253 * bma253,
enum bma253_g_range g_range,
struct slope_int_cfg * slope_int_cfg);
int
bma253_set_slope_int_cfg(const struct bma253 * bma253,
enum bma253_g_range g_range,
const struct slope_int_cfg * slope_int_cfg);
/* Settings for the double/single tap interrupt */
struct tap_int_cfg {
enum bma253_tap_quiet tap_quiet;
enum bma253_tap_shock tap_shock;
enum bma253_d_tap_window d_tap_window;
enum bma253_tap_wake_samples tap_wake_samples;
float thresh_g;
};
/* Get/Set the double/single tap interrupt settings */
int
bma253_get_tap_int_cfg(const struct bma253 * bma253,
enum bma253_g_range g_range,
struct tap_int_cfg * tap_int_cfg);
int
bma253_set_tap_int_cfg(const struct bma253 * bma253,
enum bma253_g_range g_range,
const struct tap_int_cfg * tap_int_cfg);
/* Settings for the orientation interrupt */
struct orient_int_cfg {
float hyster_g;
enum bma253_orient_blocking orient_blocking;
enum bma253_orient_mode orient_mode;
bool signal_up_dn;
uint8_t blocking_angle;
};
/* Get/Set the orientation interrupt settings */
int
bma253_get_orient_int_cfg(const struct bma253 * bma253,
struct orient_int_cfg * orient_int_cfg);
int
bma253_set_orient_int_cfg(const struct bma253 * bma253,
const struct orient_int_cfg * orient_int_cfg);
/* Hold time for flat condition */
enum flat_hold {
FLAT_HOLD_0_MS = 0,
FLAT_HOLD_512_MS = 1,
FLAT_HOLD_1024_MS = 2,
FLAT_HOLD_2048_MS = 3,
};
/* Settings for the flat interrupt */
struct flat_int_cfg {
uint8_t flat_angle;
enum flat_hold flat_hold;
uint8_t flat_hyster;
bool hyster_enable;
};
/* Get/Set the flat interrupt settings */
int
bma253_get_flat_int_cfg(const struct bma253 * bma253,
struct flat_int_cfg * flat_int_cfg);
int
bma253_set_flat_int_cfg(const struct bma253 * bma253,
const struct flat_int_cfg * flat_int_cfg);
/* Get/Set the FIFO watermark level */
int
bma253_get_fifo_wmark_level(const struct bma253 * bma253,
uint8_t * wmark_level);
int
bma253_set_fifo_wmark_level(const struct bma253 * bma253,
uint8_t wmark_level);
/* Amplitude of a self-test induced acceleration */
enum self_test_ampl {
SELF_TEST_AMPL_HIGH = 0,
SELF_TEST_AMPL_LOW = 1,
};
/* Direction of a self-test induced acceleration */
enum self_test_sign {
SELF_TEST_SIGN_NEGATIVE = 0,
SELF_TEST_SIGN_POSITIVE = 1,
};
/* Settings for the self-test functionality */
struct self_test_cfg {
enum self_test_ampl self_test_ampl;
enum self_test_sign self_test_sign;
enum axis self_test_axis;
bool self_test_enabled;
};
/* Get/Set the self-test settings */
int
bma253_get_self_test_cfg(const struct bma253 * bma253,
struct self_test_cfg * self_test_cfg);
int
bma253_set_self_test_cfg(const struct bma253 * bma253,
const struct self_test_cfg * self_test_cfg);
/* Get/Set the NVM reset/write control values */
int
bma253_get_nvm_control(const struct bma253 * bma253,
uint8_t * remaining_cycles,
bool * load_from_nvm,
bool * nvm_is_ready,
bool * nvm_unlocked);
int
bma253_set_nvm_control(const struct bma253 * bma253,
bool load_from_nvm,
bool store_into_nvm,
bool nvm_unlocked);
/* Length of time before the I2C watchdog fires */
enum i2c_watchdog {
I2C_WATCHDOG_DISABLED = 0,
I2C_WATCHDOG_1_MS = 1,
I2C_WATCHDOG_50_MS = 2,
};
/* Get/Set the I2C watchdog settings */
int
bma253_get_i2c_watchdog(const struct bma253 * bma253,
enum i2c_watchdog * i2c_watchdog);
int
bma253_set_i2c_watchdog(const struct bma253 * bma253,
enum i2c_watchdog i2c_watchdog);
/* Offset compensation settings used in slow compensation mode */
struct slow_ofc_cfg {
bool ofc_z_enabled;
bool ofc_y_enabled;
bool ofc_x_enabled;
bool high_bw_cut_off;
};
/* Get/Set the fast & slow offset compensation mode settings, and reset all
* offset compensation values back to NVM defaults */
int
bma253_get_fast_ofc_cfg(const struct bma253 * bma253,
bool * fast_ofc_ready,
enum bma253_offset_comp_target * ofc_target_z,
enum bma253_offset_comp_target * ofc_target_y,
enum bma253_offset_comp_target * ofc_target_x);
int
bma253_set_fast_ofc_cfg(const struct bma253 * bma253,
enum axis fast_ofc_axis,
enum bma253_offset_comp_target fast_ofc_target,
bool trigger_fast_ofc);
int
bma253_get_slow_ofc_cfg(const struct bma253 * bma253,
struct slow_ofc_cfg * slow_ofc_cfg);
int
bma253_set_slow_ofc_cfg(const struct bma253 * bma253,
const struct slow_ofc_cfg * slow_ofc_cfg);
int
bma253_set_ofc_reset(const struct bma253 * bma253);
/* Get/Set the offset compensation value for a specific axis */
int
bma253_get_ofc_offset(const struct bma253 * bma253,
enum axis axis,
float * offset_g);
int
bma253_set_ofc_offset(const struct bma253 * bma253,
enum axis axis,
float offset_g);
/* General purpose non-volatile data registers */
enum saved_data_addr {
SAVED_DATA_ADDR_0 = 0,
SAVED_DATA_ADDR_1 = 1,
};
/* Get/Set the data stored in general purpose non-volatile registers */
int
bma253_get_saved_data(const struct bma253 * bma253,
enum saved_data_addr saved_data_addr,
uint8_t * saved_data_val);
int
bma253_set_saved_data(const struct bma253 * bma253,
enum saved_data_addr saved_data_addr,
uint8_t saved_data_val);
/* Mode that the FIFO is running in */
enum fifo_mode {
FIFO_MODE_BYPASS = 0,
FIFO_MODE_FIFO = 1,
FIFO_MODE_STREAM = 2,
};
/* Measurements for which axis to capture into the FIFO */
enum fifo_data {
FIFO_DATA_X_AND_Y_AND_Z = 0,
FIFO_DATA_X_ONLY = 1,
FIFO_DATA_Y_ONLY = 2,
FIFO_DATA_Z_ONLY = 3,
};
/* FIFO capture and behavior settings */
struct fifo_cfg {
enum fifo_mode fifo_mode;
enum fifo_data fifo_data;
};
/* Get/Set the FIFO capture and behavior settings */
int
bma253_get_fifo_cfg(const struct bma253 * bma253,
struct fifo_cfg * fifo_cfg);
int
bma253_set_fifo_cfg(const struct bma253 * bma253,
const struct fifo_cfg * fifo_cfg);
/* Read a single multi-axis data frame from the FIFO */
int
bma253_get_fifo(const struct bma253 * bma253,
enum bma253_g_range g_range,
enum fifo_data fifo_data,
struct accel_data * accel_data);
#ifdef __cplusplus
}
#endif
#endif