blob: 6b8b33f8ec72c358379d5451aaf68017912f8a12 [file] [log] [blame]
/* Bosch BMI08X inertial measurement unit header
*
* Copyright (c) 2022 Meta Platforms, Inc. and its affiliates
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_DRIVERS_SENSOR_BMI08X_H_
#define ZEPHYR_DRIVERS_SENSOR_BMI08X_H_
#include <zephyr/drivers/gpio.h>
#include <zephyr/drivers/i2c.h>
#include <zephyr/drivers/sensor.h>
#include <zephyr/drivers/spi.h>
#include <zephyr/sys/util.h>
/* Accel Chip Id register */
#define BMI08X_REG_ACCEL_CHIP_ID 0x00
/* Accel Error condition register */
#define BMI08X_REG_ACCEL_ERR 0x02
/* Accel Status flag register */
#define BMI08X_REG_ACCEL_STATUS 0x03
/* Accel X LSB data register */
#define BMI08X_REG_ACCEL_X_LSB 0x12
/* Accel X MSB data register */
#define BMI08X_REG_ACCEL_X_MSB 0x13
/* Accel Y LSB data register */
#define BMI08X_REG_ACCEL_Y_LSB 0x14
/* Accel Y MSB data register */
#define BMI08X_REG_ACCEL_Y_MSB 0x15
/* Accel Z LSB data register */
#define BMI08X_REG_ACCEL_Z_LSB 0x16
/* Accel Z MSB data register */
#define BMI08X_REG_ACCEL_Z_MSB 0x17
/* Sensor time byte 0 register */
#define BMI08X_REG_ACCEL_SENSORTIME_0 0x18
/* Sensor time byte 1 register */
#define BMI08X_REG_ACCEL_SENSORTIME_1 0x19
/* Sensor time byte 2 register */
#define BMI08X_REG_ACCEL_SENSORTIME_2 0x1A
/* Accel Interrupt status0 register */
#define BMI08X_REG_ACCEL_INT_STAT_0 0x1C
/* Accel Interrupt status1 register */
#define BMI08X_REG_ACCEL_INT_STAT_1 0x1D
/* Accel general purpose register 0*/
#define BMI08X_REG_ACCEL_GP_0 0x1E
/* Sensor temperature MSB data register */
#define BMI08X_REG_TEMP_MSB 0x22
/* Sensor temperature LSB data register */
#define BMI08X_REG_TEMP_LSB 0x23
/* Accel general purpose register 4*/
#define BMI08X_REG_ACCEL_GP_4 0x27
/* Accel Internal status register */
#define BMI08X_REG_ACCEL_INTERNAL_STAT 0x2A
/* Accel configuration register */
#define BMI08X_REG_ACCEL_CONF 0x40
/* Accel range setting register */
#define BMI08X_REG_ACCEL_RANGE 0x41
/* Accel Interrupt pin 1 configuration register */
#define BMI08X_REG_ACCEL_INT1_IO_CONF 0x53
/* Accel Interrupt pin 2 configuration register */
#define BMI08X_REG_ACCEL_INT2_IO_CONF 0x54
/* Accel Interrupt latch configuration register */
#define BMI08X_REG_ACCEL_INT_LATCH_CONF 0x55
/* Accel Interrupt pin1 mapping register */
#define BMI08X_REG_ACCEL_INT1_MAP 0x56
/* Accel Interrupt pin2 mapping register */
#define BMI08X_REG_ACCEL_INT2_MAP 0x57
/* Accel Interrupt map register */
#define BMI08X_REG_ACCEL_INT1_INT2_MAP_DATA 0x58
/* Accel Init control register */
#define BMI08X_REG_ACCEL_INIT_CTRL 0x59
/* Accel Self test register */
#define BMI08X_REG_ACCEL_SELF_TEST 0x6D
/* Accel Power mode configuration register */
#define BMI08X_REG_ACCEL_PWR_CONF 0x7C
/* Accel Power control (switch on or off register */
#define BMI08X_REG_ACCEL_PWR_CTRL 0x7D
/* Accel Soft reset register */
#define BMI08X_REG_ACCEL_SOFTRESET 0x7E
/* BMI085 Accel unique chip identifier */
#define BMI085_ACCEL_CHIP_ID 0x1F
/* BMI088 Accel unique chip identifier */
#define BMI088_ACCEL_CHIP_ID 0x1E
/* Feature Config related Registers */
#define BMI08X_ACCEL_RESERVED_5B_REG 0x5B
#define BMI08X_ACCEL_RESERVED_5C_REG 0x5C
#define BMI08X_ACCEL_FEATURE_CFG_REG 0x5E
/* Interrupt masks */
#define BMI08X_ACCEL_DATA_READY_INT 0x80
/* Accel Bandwidth */
#define BMI08X_ACCEL_BW_OSR4 0x00
#define BMI08X_ACCEL_BW_OSR2 0x01
#define BMI08X_ACCEL_BW_NORMAL 0x02
/* BMI085 Accel Range */
#define BMI085_ACCEL_RANGE_2G 0x00
#define BMI085_ACCEL_RANGE_4G 0x01
#define BMI085_ACCEL_RANGE_8G 0x02
#define BMI085_ACCEL_RANGE_16G 0x03
/**\name BMI088 Accel Range */
#define BMI088_ACCEL_RANGE_3G 0x00
#define BMI088_ACCEL_RANGE_6G 0x01
#define BMI088_ACCEL_RANGE_12G 0x02
#define BMI088_ACCEL_RANGE_24G 0x03
/* Accel Output data rate */
#define BMI08X_ACCEL_ODR_12_5_HZ 0x05
#define BMI08X_ACCEL_ODR_25_HZ 0x06
#define BMI08X_ACCEL_ODR_50_HZ 0x07
#define BMI08X_ACCEL_ODR_100_HZ 0x08
#define BMI08X_ACCEL_ODR_200_HZ 0x09
#define BMI08X_ACCEL_ODR_400_HZ 0x0A
#define BMI08X_ACCEL_ODR_800_HZ 0x0B
#define BMI08X_ACCEL_ODR_1600_HZ 0x0C
/* Accel Init Ctrl */
#define BMI08X_ACCEL_INIT_CTRL_DISABLE 0x00
#define BMI08X_ACCEL_INIT_CTRL_ENABLE 0x01
/* Accel Self test */
#define BMI08X_ACCEL_SWITCH_OFF_SELF_TEST 0x00
#define BMI08X_ACCEL_POSITIVE_SELF_TEST 0x0D
#define BMI08X_ACCEL_NEGATIVE_SELF_TEST 0x09
/* Accel Power mode */
#define BMI08X_ACCEL_PM_ACTIVE 0x00
#define BMI08X_ACCEL_PM_SUSPEND 0x03
/* Accel Power control settings */
#define BMI08X_ACCEL_POWER_DISABLE 0x00
#define BMI08X_ACCEL_POWER_ENABLE 0x04
/* Accel internal interrupt pin mapping */
#define BMI08X_ACCEL_INTA_DISABLE 0x00
#define BMI08X_ACCEL_INTA_ENABLE 0x01
#define BMI08X_ACCEL_INTB_DISABLE 0x00
#define BMI08X_ACCEL_INTB_ENABLE 0x02
#define BMI08X_ACCEL_INTC_DISABLE 0x00
#define BMI08X_ACCEL_INTC_ENABLE 0x04
/* Accel Soft reset delay */
#define BMI08X_ACCEL_SOFTRESET_DELAY_MS 1
/* Mask definitions for ACCEL_ERR_REG register */
#define BMI08X_FATAL_ERR_MASK 0x01
#define BMI08X_ERR_CODE_MASK 0x1C
/* Position definitions for ACCEL_ERR_REG register */
#define BMI08X_CMD_ERR_POS 1
#define BMI08X_ERR_CODE_POS 2
/* Mask definition for ACCEL_STATUS_REG register */
#define BMI08X_ACCEL_STATUS_MASK 0x80
/* Position definitions for ACCEL_STATUS_REG */
#define BMI08X_ACCEL_STATUS_POS 7
/* Mask definitions for odr, bandwidth and range */
#define BMI08X_ACCEL_ODR_MASK 0x0F
#define BMI08X_ACCEL_BW_MASK 0x70
#define BMI08X_ACCEL_RANGE_MASK 0x03
/* Position definitions for odr, bandwidth and range */
#define BMI08X_ACCEL_BW_POS 4
/* Mask definitions for INT1_IO_CONF register */
#define BMI08X_ACCEL_INT_EDGE_MASK 0x01
#define BMI08X_ACCEL_INT_LVL_MASK 0x02
#define BMI08X_ACCEL_INT_OD_MASK 0x04
#define BMI08X_ACCEL_INT_IO_MASK 0x08
#define BMI08X_ACCEL_INT_IN_MASK 0x10
/* Position definitions for INT1_IO_CONF register */
#define BMI08X_ACCEL_INT_EDGE_POS 0
#define BMI08X_ACCEL_INT_LVL_POS 1
#define BMI08X_ACCEL_INT_OD_POS 2
#define BMI08X_ACCEL_INT_IO_POS 3
#define BMI08X_ACCEL_INT_IN_POS 4
/* Mask definitions for INT1/INT2 mapping register */
#define BMI08X_ACCEL_MAP_INTA_MASK 0x01
/* Mask definitions for INT1/INT2 mapping register */
#define BMI08X_ACCEL_MAP_INTA_POS 0x00
/* Mask definitions for INT1_INT2_MAP_DATA register */
#define BMI08X_ACCEL_INT1_DRDY_MASK 0x04
#define BMI08X_ACCEL_INT2_DRDY_MASK 0x40
/* Position definitions for INT1_INT2_MAP_DATA register */
#define BMI08X_ACCEL_INT1_DRDY_POS 2
#define BMI08X_ACCEL_INT2_DRDY_POS 6
/* Asic Initialization value */
#define BMI08X_ASIC_INITIALIZED 0x01
#define BMI08X_TEMP_OFFSET 32
/*************************** BMI08 Gyroscope Macros *****************************/
/** Register map */
/* Gyro registers */
/* Gyro Chip Id register */
#define BMI08X_REG_GYRO_CHIP_ID 0x00
/* Gyro X LSB data register */
#define BMI08X_REG_GYRO_X_LSB 0x02
/* Gyro X MSB data register */
#define BMI08X_REG_GYRO_X_MSB 0x03
/* Gyro Y LSB data register */
#define BMI08X_REG_GYRO_Y_LSB 0x04
/* Gyro Y MSB data register */
#define BMI08X_REG_GYRO_Y_MSB 0x05
/* Gyro Z LSB data register */
#define BMI08X_REG_GYRO_Z_LSB 0x06
/* Gyro Z MSB data register */
#define BMI08X_REG_GYRO_Z_MSB 0x07
/* Gyro Interrupt status register */
#define BMI08X_REG_GYRO_INT_STAT_1 0x0A
/* Gyro Range register */
#define BMI08X_REG_GYRO_RANGE 0x0F
/* Gyro Bandwidth register */
#define BMI08X_REG_GYRO_BANDWIDTH 0x10
/* Gyro Power register */
#define BMI08X_REG_GYRO_LPM1 0x11
/* Gyro Soft reset register */
#define BMI08X_REG_GYRO_SOFTRESET 0x14
/* Gyro Interrupt control register */
#define BMI08X_REG_GYRO_INT_CTRL 0x15
/* Gyro Interrupt Pin configuration register */
#define BMI08X_REG_GYRO_INT3_INT4_IO_CONF 0x16
/* Gyro Interrupt Map register */
#define BMI08X_REG_GYRO_INT3_INT4_IO_MAP 0x18
/* Gyro Self test register */
#define BMI08X_REG_GYRO_SELF_TEST 0x3C
/* Gyro unique chip identifier */
#define BMI08X_GYRO_CHIP_ID 0x0F
/* Gyro Range */
#define BMI08X_GYRO_RANGE_2000_DPS 0x00
#define BMI08X_GYRO_RANGE_1000_DPS 0x01
#define BMI08X_GYRO_RANGE_500_DPS 0x02
#define BMI08X_GYRO_RANGE_250_DPS 0x03
#define BMI08X_GYRO_RANGE_125_DPS 0x04
/* Gyro Output data rate and bandwidth */
#define BMI08X_GYRO_BW_532_ODR_2000_HZ 0x00
#define BMI08X_GYRO_BW_230_ODR_2000_HZ 0x01
#define BMI08X_GYRO_BW_116_ODR_1000_HZ 0x02
#define BMI08X_GYRO_BW_47_ODR_400_HZ 0x03
#define BMI08X_GYRO_BW_23_ODR_200_HZ 0x04
#define BMI08X_GYRO_BW_12_ODR_100_HZ 0x05
#define BMI08X_GYRO_BW_64_ODR_200_HZ 0x06
#define BMI08X_GYRO_BW_32_ODR_100_HZ 0x07
#define BMI08X_GYRO_ODR_RESET_VAL 0x80
/* Gyro Power mode */
#define BMI08X_GYRO_PM_NORMAL 0x00
#define BMI08X_GYRO_PM_DEEP_SUSPEND 0x20
#define BMI08X_GYRO_PM_SUSPEND 0x80
/* Gyro data ready interrupt enable value */
#define BMI08X_GYRO_DRDY_INT_DISABLE_VAL 0x00
#define BMI08X_GYRO_DRDY_INT_ENABLE_VAL 0x80
/* Gyro data ready map values */
#define BMI08X_GYRO_MAP_DRDY_TO_INT3 0x01
#define BMI08X_GYRO_MAP_DRDY_TO_INT4 0x80
#define BMI08X_GYRO_MAP_DRDY_TO_BOTH_INT3_INT4 0x81
/* Gyro Soft reset delay */
#define BMI08X_GYRO_SOFTRESET_DELAY 30
/* Gyro power mode config delay */
#define BMI08X_GYRO_POWER_MODE_CONFIG_DELAY 30
/** Mask definitions for range, bandwidth and power */
#define BMI08X_GYRO_RANGE_MASK 0x07
#define BMI08X_GYRO_BW_MASK 0x0F
#define BMI08X_GYRO_POWER_MASK 0xA0
/** Position definitions for range, bandwidth and power */
#define BMI08X_GYRO_POWER_POS 5
/* Mask definitions for BMI08X_GYRO_INT_CTRL_REG register */
#define BMI08X_GYRO_DATA_EN_MASK 0x80
/* Position definitions for BMI08X_GYRO_INT_CTRL_REG register */
#define BMI08X_GYRO_DATA_EN_POS 7
/* Mask definitions for BMI08X_GYRO_INT3_INT4_IO_CONF_REG register */
#define BMI08X_GYRO_INT3_LVL_MASK 0x01
#define BMI08X_GYRO_INT3_OD_MASK 0x02
#define BMI08X_GYRO_INT4_LVL_MASK 0x04
#define BMI08X_GYRO_INT4_OD_MASK 0x08
/* Position definitions for BMI08X_GYRO_INT3_INT4_IO_CONF_REG register */
#define BMI08X_GYRO_INT3_OD_POS 1
#define BMI08X_GYRO_INT4_LVL_POS 2
#define BMI08X_GYRO_INT4_OD_POS 3
/* Mask definitions for BMI08X_GYRO_INT_EN_REG register */
#define BMI08X_GYRO_INT_EN_MASK 0x80
/* Position definitions for BMI08X_GYRO_INT_EN_REG register */
#define BMI08X_GYRO_INT_EN_POS 7
/* Mask definitions for BMI088_GYRO_INT_MAP_REG register */
#define BMI08X_GYRO_INT3_MAP_MASK 0x01
#define BMI08X_GYRO_INT4_MAP_MASK 0x80
/* Position definitions for BMI088_GYRO_INT_MAP_REG register */
#define BMI08X_GYRO_INT3_MAP_POS 0
#define BMI08X_GYRO_INT4_MAP_POS 7
/* Mask definitions for BMI088_GYRO_INT_MAP_REG register */
#define BMI088_GYRO_INT3_MAP_MASK 0x01
#define BMI088_GYRO_INT4_MAP_MASK 0x80
/* Position definitions for BMI088_GYRO_INT_MAP_REG register */
#define BMI088_GYRO_INT3_MAP_POS 0
#define BMI088_GYRO_INT4_MAP_POS 7
/* Mask definitions for GYRO_SELF_TEST register */
#define BMI08X_GYRO_SELF_TEST_EN_MASK 0x01
#define BMI08X_GYRO_SELF_TEST_RDY_MASK 0x02
#define BMI08X_GYRO_SELF_TEST_RESULT_MASK 0x04
#define BMI08X_GYRO_SELF_TEST_FUNCTION_MASK 0x08
/* Position definitions for GYRO_SELF_TEST register */
#define BMI08X_GYRO_SELF_TEST_RDY_POS 1
#define BMI08X_GYRO_SELF_TEST_RESULT_POS 2
#define BMI08X_GYRO_SELF_TEST_FUNCTION_POS 3
/*************************** Common Macros for both Accel and Gyro *****************************/
/** Soft reset Value */
#define BMI08X_SOFT_RESET_CMD 0xB6
/* Constant values macros */
#define BMI08X_SENSOR_DATA_SYNC_TIME_MS 1
#define BMI08X_DELAY_BETWEEN_WRITES_MS 1
#define BMI08X_SELF_TEST_DELAY_MS 3
#define BMI08X_POWER_CONFIG_DELAY 5
#define BMI08X_SENSOR_SETTLE_TIME_MS 30
#define BMI08X_SELF_TEST_DATA_READ_MS 50
#define BMI08X_ASIC_INIT_TIME_MS 150
/* allowed ODR values */
enum bmi08x_odr {
BMI08X_ODR_25_2,
BMI08X_ODR_25,
BMI08X_ODR_50,
BMI08X_ODR_100,
BMI08X_ODR_200,
BMI08X_ODR_400,
BMI08X_ODR_800,
BMI08X_ODR_1600,
};
/* Range values for accelerometer */
#define BMI08X_ACC_RANGE_2G_3G 0x0
#define BMI08X_ACC_RANGE_4G_6G 0x1
#define BMI08X_ACC_RANGE_8G_12G 0x2
#define BMI08X_ACC_RANGE_16G_24G 0x3
/* Range values for gyro */
#define BMI08X_GYR_RANGE_2000DPS 0
#define BMI08X_GYR_RANGE_1000DPS 1
#define BMI08X_GYR_RANGE_500DPS 2
#define BMI08X_GYR_RANGE_250DPS 3
#define BMI08X_GYR_RANGE_125DPS 4
#define BMI08X_ACC_SCALE(range_g) ((2 * range_g * SENSOR_G) / 65536LL)
#define BMI08X_GYR_SCALE(range_dps) ((2 * range_dps * SENSOR_PI) / 180LL / 65536LL)
/* report of data sync is selected */
#define BMI08X_ACCEL_DATA_SYNC_EN(inst) DT_NODE_HAS_STATUS(DT_INST_PHANDLE(inst, data_sync), okay)
/* Macro used for compile time optimization to compile in/out code used for data-sync
* if at least 1 bmi08x has data-sync enabled
*/
#define ACCEL_HELPER(inst) BMI08X_ACCEL_DATA_SYNC_EN(inst) ||
#define BMI08X_ACCEL_ANY_INST_HAS_DATA_SYNC DT_INST_FOREACH_STATUS_OKAY(ACCEL_HELPER) 0
#define GYRO_HELPER(inst) DT_INST_PROP(inst, data_sync) ||
#define BMI08X_GYRO_ANY_INST_HAS_DATA_SYNC DT_INST_FOREACH_STATUS_OKAY(GYRO_HELPER) 0
struct bmi08x_range {
uint16_t range;
uint8_t reg_val;
};
union bmi08x_bus {
#if DT_ANY_INST_ON_BUS_STATUS_OKAY(spi)
struct spi_dt_spec spi;
#endif
#if DT_ANY_INST_ON_BUS_STATUS_OKAY(i2c)
struct i2c_dt_spec i2c;
#endif
};
struct bmi08x_accel_bus_io {
int (*check)(const union bmi08x_bus *bus);
int (*bus_init)(const struct device *dev);
int (*transceive)(const struct device *dev, uint8_t reg, bool write, void *data,
size_t length);
#if BMI08X_ACCEL_ANY_INST_HAS_DATA_SYNC
int (*write_config_file)(const struct device *dev);
#endif
};
struct bmi08x_gyro_bus_io {
int (*check)(const union bmi08x_bus *bus);
int (*transceive)(const struct device *dev, uint8_t reg, bool write, void *data,
size_t length);
};
struct bmi08x_accel_config {
union bmi08x_bus bus;
const struct bmi08x_accel_bus_io *api;
#if defined(CONFIG_BMI08X_ACCEL_TRIGGER)
struct gpio_dt_spec int_gpio;
#endif
#if defined(CONFIG_BMI08X_ACCEL_TRIGGER) || BMI08X_ACCEL_ANY_INST_HAS_DATA_SYNC
uint8_t int1_map;
uint8_t int2_map;
uint8_t int1_conf_io;
uint8_t int2_conf_io;
#endif
uint8_t accel_hz;
uint8_t accel_fs;
#if BMI08X_ACCEL_ANY_INST_HAS_DATA_SYNC
uint8_t data_sync;
#endif
};
struct bmi08x_gyro_config {
union bmi08x_bus bus;
const struct bmi08x_gyro_bus_io *api;
#if defined(CONFIG_BMI08X_GYRO_TRIGGER)
struct gpio_dt_spec int_gpio;
#endif
#if defined(CONFIG_BMI08X_GYRO_TRIGGER) || BMI08X_GYRO_ANY_INST_HAS_DATA_SYNC
uint8_t int3_4_map;
uint8_t int3_4_conf_io;
#endif
uint8_t gyro_hz;
uint16_t gyro_fs;
};
struct bmi08x_accel_data {
#if defined(CONFIG_BMI08X_ACCEL_TRIGGER)
struct gpio_callback gpio_cb;
#endif
uint16_t acc_sample[3];
uint16_t scale; /* micro m/s^2/lsb */
#if defined(CONFIG_BMI08X_ACCEL_TRIGGER_OWN_THREAD)
K_KERNEL_STACK_MEMBER(thread_stack, CONFIG_BMI08X_ACCEL_THREAD_STACK_SIZE);
struct k_thread thread;
struct k_sem sem;
#elif defined(CONFIG_BMI08X_ACCEL_TRIGGER_GLOBAL_THREAD)
struct k_work work;
const struct device *dev;
#endif
#ifdef CONFIG_BMI08X_ACCEL_TRIGGER
sensor_trigger_handler_t handler_drdy_acc;
const struct sensor_trigger *drdy_trig_acc;
#endif /* CONFIG_BMI08X_ACCEL_TRIGGER */
uint8_t accel_chip_id;
};
struct bmi08x_gyro_data {
#if defined(CONFIG_BMI08X_GYRO_TRIGGER)
struct gpio_callback gpio_cb;
#endif
uint16_t gyr_sample[3];
uint16_t scale; /* micro radians/s/lsb */
#if defined(CONFIG_BMI08X_GYRO_TRIGGER_OWN_THREAD)
K_KERNEL_STACK_MEMBER(thread_stack, CONFIG_BMI08X_GYRO_THREAD_STACK_SIZE);
struct k_thread thread;
struct k_sem sem;
#elif defined(CONFIG_BMI08X_GYRO_TRIGGER_GLOBAL_THREAD)
struct k_work work;
const struct device *dev;
#endif
#ifdef CONFIG_BMI08X_GYRO_TRIGGER
sensor_trigger_handler_t handler_drdy_gyr;
const struct sensor_trigger *drdy_trig_gyr;
#endif /* CONFIG_BMI08X_GYRO_TRIGGER */
};
/* common functions for accel and gyro */
int bmi08x_freq_to_odr_val(uint16_t freq_int, uint16_t freq_milli);
int32_t bmi08x_range_to_reg_val(uint16_t range, const struct bmi08x_range *range_map,
uint16_t range_map_size);
int32_t bmi08x_reg_val_to_range(uint8_t reg_val, const struct bmi08x_range *range_map,
uint16_t range_map_size);
int bmi08x_accel_read(const struct device *dev, uint8_t reg_addr, uint8_t *data, uint8_t len);
int bmi08x_accel_write(const struct device *dev, uint8_t reg_addr, uint8_t *data, uint16_t len);
int bmi08x_accel_byte_read(const struct device *dev, uint8_t reg_addr, uint8_t *byte);
int bmi08x_accel_byte_write(const struct device *dev, uint8_t reg_addr, uint8_t byte);
int bmi08x_accel_word_write(const struct device *dev, uint8_t reg_addr, uint16_t word);
int bmi08x_accel_reg_field_update(const struct device *dev, uint8_t reg_addr, uint8_t pos,
uint8_t mask, uint8_t val);
static inline int bmi08x_accel_reg_update(const struct device *dev, uint8_t reg_addr, uint8_t mask,
uint8_t val)
{
return bmi08x_accel_reg_field_update(dev, reg_addr, 0, mask, val);
}
int bmi08x_gyro_read(const struct device *dev, uint8_t reg_addr, uint8_t *data, uint8_t len);
int bmi08x_gyro_byte_read(const struct device *dev, uint8_t reg_addr, uint8_t *byte);
int bmi08x_gyro_byte_write(const struct device *dev, uint8_t reg_addr, uint8_t byte);
int bmi08x_gyro_word_write(const struct device *dev, uint8_t reg_addr, uint16_t word);
int bmi08x_gyro_reg_field_update(const struct device *dev, uint8_t reg_addr, uint8_t pos,
uint8_t mask, uint8_t val);
static inline int bmi08x_gyro_reg_update(const struct device *dev, uint8_t reg_addr, uint8_t mask,
uint8_t val)
{
return bmi08x_gyro_reg_field_update(dev, reg_addr, 0, mask, val);
}
int bmi08x_acc_trigger_mode_init(const struct device *dev);
int bmi08x_trigger_set_acc(const struct device *dev, const struct sensor_trigger *trig,
sensor_trigger_handler_t handler);
int bmi08x_acc_slope_config(const struct device *dev, enum sensor_attribute attr,
const struct sensor_value *val);
int32_t bmi08x_acc_reg_val_to_range(uint8_t reg_val);
int bmi08x_gyr_trigger_mode_init(const struct device *dev);
int bmi08x_trigger_set_gyr(const struct device *dev, const struct sensor_trigger *trig,
sensor_trigger_handler_t handler);
int bmi08x_gyr_slope_config(const struct device *dev, enum sensor_attribute attr,
const struct sensor_value *val);
int32_t bmi08x_gyr_reg_val_to_range(uint8_t reg_val);
#endif /* ZEPHYR_DRIVERS_SENSOR_BMI08X_H_ */