blob: 6184e40b062566c275ba0c2c5aea95dbab46aaa4 [file] [log] [blame]
/*
* Copyright (c) 2023 Google LLC
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_DRIVERS_SENSOR_BMA4XX_BMA4XX_H_
#define ZEPHYR_DRIVERS_SENSOR_BMA4XX_BMA4XX_H_
#include <zephyr/kernel.h>
#include <zephyr/device.h>
#include <zephyr/drivers/sensor.h>
#if DT_ANY_INST_ON_BUS_STATUS_OKAY(spi)
#include <zephyr/drivers/spi.h>
#endif /* DT_ANY_INST_ON_BUS_STATUS_OKAY(spi) */
#if DT_ANY_INST_ON_BUS_STATUS_OKAY(i2c)
#include <zephyr/drivers/i2c.h>
#endif /* DT_ANY_INST_ON_BUS_STATUS_OKAY(i2c) */
/*
* Register definitions
*/
#define BMA4XX_REG_CHIP_ID (0x00)
#define BMA4XX_REG_ERROR (0x02)
#define BMA4XX_REG_STATUS (0x03)
#define BMA4XX_REG_DATA_0 (0x0A)
#define BMA4XX_REG_DATA_1 (0x0B)
#define BMA4XX_REG_DATA_2 (0x0C)
#define BMA4XX_REG_DATA_3 (0x0D)
#define BMA4XX_REG_DATA_4 (0x0E)
#define BMA4XX_REG_DATA_5 (0x0F)
#define BMA4XX_REG_DATA_6 (0x10)
#define BMA4XX_REG_DATA_7 (0x11)
#define BMA4XX_REG_DATA_8 (0x12)
#define BMA4XX_REG_DATA_9 (0x13)
#define BMA4XX_REG_DATA_10 (0x14)
#define BMA4XX_REG_DATA_11 (0x15)
#define BMA4XX_REG_DATA_12 (0x16)
#define BMA4XX_REG_DATA_13 (0x17)
#define BMA4XX_REG_SENSORTIME_0 (0x18)
#define BMA4XX_REG_INT_STAT_0 (0x1C)
#define BMA4XX_REG_INT_STAT_1 (0x1D)
#define BMA4XX_REG_STEP_CNT_OUT_0 (0x1E)
#define BMA4XX_REG_HIGH_G_OUT (0x1F)
#define BMA4XX_REG_TEMPERATURE (0x22)
#define BMA4XX_REG_FIFO_LENGTH_0 (0x24)
#define BMA4XX_REG_FIFO_LENGTH_1 (0x25)
#define BMA4XX_REG_FIFO_DATA (0x26)
#define BMA4XX_REG_ACTIVITY_OUT (0x27)
#define BMA4XX_REG_ORIENTATION_OUT (0x28)
#define BMA4XX_REG_ACCEL_CONFIG (0x40)
#define BMA4XX_REG_ACCEL_RANGE (0x41)
#define BMA4XX_REG_AUX_CONFIG (0x44)
#define BMA4XX_REG_FIFO_DOWN (0x45)
#define BMA4XX_REG_FIFO_WTM_0 (0x46)
#define BMA4XX_REG_FIFO_CONFIG_0 (0x48)
#define BMA4XX_REG_FIFO_CONFIG_1 (0x49)
#define BMA4XX_REG_AUX_DEV_ID (0x4B)
#define BMA4XX_REG_AUX_IF_CONF (0x4C)
#define BMA4XX_REG_AUX_RD (0x4D)
#define BMA4XX_REG_AUX_WR (0x4E)
#define BMA4XX_REG_AUX_WR_DATA (0x4F)
#define BMA4XX_REG_INT1_IO_CTRL (0x53)
#define BMA4XX_REG_INT2_IO_CTRL (0x54)
#define BMA4XX_REG_INT_LATCH (0x55)
#define BMA4XX_REG_INT_MAP_1 (0x56)
#define BMA4XX_REG_INT_MAP_2 (0x57)
#define BMA4XX_REG_INT_MAP_DATA (0x58)
#define BMA4XX_REG_INIT_CTRL (0x59)
#define BMA4XX_REG_RESERVED_REG_5B (0x5B)
#define BMA4XX_REG_RESERVED_REG_5C (0x5C)
#define BMA4XX_REG_FEATURE_CONFIG (0x5E)
#define BMA4XX_REG_IF_CONFIG (0x6B)
#define BMA4XX_REG_ACC_SELF_TEST (0x6D)
#define BMA4XX_REG_NV_CONFIG (0x70)
#define BMA4XX_REG_OFFSET_0 (0x71)
#define BMA4XX_REG_OFFSET_1 (0x72)
#define BMA4XX_REG_OFFSET_2 (0x73)
#define BMA4XX_REG_POWER_CONF (0x7C)
#define BMA4XX_REG_POWER_CTRL (0x7D)
#define BMA4XX_REG_CMD (0x7E)
/*
* Bit positions and masks
*/
#define BMA4XX_BIT_ADV_PWR_SAVE BIT(0)
#define BMA4XX_MASK_ACC_CONF_ODR GENMASK(3, 0)
#define BMA4XX_MASK_ACC_CONF_BWP GENMASK(6, 4)
#define BMA4XX_SHIFT_ACC_CONF_BWP (4)
#define BMA4XX_MASK_ACC_RANGE GENMASK(1, 0)
#define BMA4XX_BIT_ACC_PERF_MODE BIT(7)
#define BMA4XX_BIT_ACC_EN BIT(2)
/* INT_STATUS_1 accelerometer data ready to interrupt */
#define BMA4XX_ACC_DRDY_INT BIT(7)
/* CMD: Clears all data in FIFO, does not change FIFO_CONFIG and FIFO_DOWNS register */
#define BMA4XX_CMD_FIFO_FLUSH (0xB0)
/* FIFO_CONFIG_1 enable: Store Accelerometer data in FIFO (all 3 axes) */
#define BMA4XX_FIFO_ACC_EN BIT(6)
/* Bandwidth parameters */
#define BMA4XX_BWP_OSR4_AVG1 (0x0)
#define BMA4XX_BWP_OSR2_AVG2 (0x1)
#define BMA4XX_BWP_NORM_AVG4 (0x2)
#define BMA4XX_BWP_CIC_AVG8 (0x3)
#define BMA4XX_BWP_RES_AVG16 (0x4)
#define BMA4XX_BWP_RES_AVG32 (0x5)
#define BMA4XX_BWP_RES_AVG64 (0x6)
#define BMA4XX_BWP_RES_AVG128 (0x7)
/* Full-scale ranges */
#define BMA4XX_RANGE_2G (0x0)
#define BMA4XX_RANGE_4G (0x1)
#define BMA4XX_RANGE_8G (0x2)
#define BMA4XX_RANGE_16G (0x3)
/* Output data rates (ODR) */
#define BMA4XX_ODR_RESERVED (0x00)
#define BMA4XX_ODR_0_78125 (0x01)
#define BMA4XX_ODR_1_5625 (0x02)
#define BMA4XX_ODR_3_125 (0x03)
#define BMA4XX_ODR_6_25 (0x04)
#define BMA4XX_ODR_12_5 (0x05)
#define BMA4XX_ODR_25 (0x06)
#define BMA4XX_ODR_50 (0x07)
#define BMA4XX_ODR_100 (0x08)
#define BMA4XX_ODR_200 (0x09)
#define BMA4XX_ODR_400 (0x0a)
#define BMA4XX_ODR_800 (0x0b)
#define BMA4XX_ODR_1600 (0x0c)
#define BMA4XX_ODR_3200 (0x0d)
#define BMA4XX_ODR_6400 (0x0e)
#define BMA4XX_ODR_12800 (0x0f)
/*
* BMA4xx commands
*/
#define BMA4XX_CMD_SOFT_RESET (0xB6)
#define BMA4XX_CHIP_ID_BMA422 (0x12)
#define BMA4XX_CHIP_ID_BMA423 (0x13)
/*
* Other constants
*/
/* Each bit count is 3.9mG or 3900uG */
#define BMA4XX_OFFSET_MICROG_PER_BIT (3900)
#define BMA4XX_OFFSET_MICROG_MIN (INT8_MIN * BMA4XX_OFFSET_MICROG_PER_BIT)
#define BMA4XX_OFFSET_MICROG_MAX (INT8_MAX * BMA4XX_OFFSET_MICROG_PER_BIT)
/* Range is -104C to 150C. Use shift of 8 (+/-256) */
#define BMA4XX_TEMP_SHIFT (8)
/* The total number of used registers specified in bma422 datasheet is 7E */
#define BMA4XX_NUM_REGS 0x7E
/*
* Types
*/
union bma4xx_bus_cfg {
#if DT_ANY_INST_ON_BUS_STATUS_OKAY(i2c)
struct i2c_dt_spec i2c;
#endif /* DT_ANY_INST_ON_BUS_STATUS_OKAY(i2c) */
#if DT_ANY_INST_ON_BUS_STATUS_OKAY(spi)
struct spi_dt_spec spi;
#endif /* DT_ANY_INST_ON_BUS_STATUS_OKAY(spi) */
};
struct bma4xx_config {
int (*bus_init)(const struct device *dev);
const union bma4xx_bus_cfg bus_cfg;
};
/** Used to implement bus-specific R/W operations. See bma4xx_i2c.c and
* bma4xx_spi.c.
*/
struct bma4xx_hw_operations {
int (*read_data)(const struct device *dev, uint8_t reg_addr, uint8_t *value, uint8_t len);
int (*write_data)(const struct device *dev, uint8_t reg_addr, uint8_t *value, uint8_t len);
int (*read_reg)(const struct device *dev, uint8_t reg_addr, uint8_t *value);
int (*write_reg)(const struct device *dev, uint8_t reg_addr, uint8_t value);
int (*update_reg)(const struct device *dev, uint8_t reg_addr, uint8_t mask, uint8_t value);
};
struct bma4xx_data {
/** Current full-scale range setting as a register value */
uint8_t accel_fs_range;
/** Current bandwidth parameter (BWP) as a register value */
uint8_t accel_bwp;
/** Current output data rate as a register value */
uint8_t accel_odr;
/** Pointer to bus-specific I/O API */
const struct bma4xx_hw_operations *hw_ops;
/** Chip ID value stored in BMA4XX_REG_CHIP_ID */
uint8_t chip_id;
};
/*
* RTIO types
*/
struct bma4xx_decoder_header {
uint64_t timestamp;
uint8_t is_fifo: 1;
uint8_t accel_fs: 2;
uint8_t reserved: 5;
} __attribute__((__packed__));
struct bma4xx_encoded_data {
struct bma4xx_decoder_header header;
struct {
/** Set if `accel_xyz` has data */
uint8_t has_accel: 1;
/** Set if `temp` has data */
uint8_t has_temp: 1;
uint8_t reserved: 6;
} __attribute__((__packed__));
int16_t accel_xyz[3];
#ifdef CONFIG_BMA4XX_TEMPERATURE
int8_t temp;
#endif /* CONFIG_BMA4XX_TEMPERATURE */
};
int bma4xx_spi_init(const struct device *dev);
int bma4xx_i2c_init(const struct device *dev);
#endif /* ZEPHYR_DRIVERS_SENSOR_BMA4XX_BMA4XX_H_ */