Skip to content

Commit

Permalink
iio: (bma400) add driver for the BMA400
Browse files Browse the repository at this point in the history
Add a IIO driver for the Bosch BMA400 3-axes ultra-low power accelerometer.
The driver supports reading from the acceleration and temperature
registers. The driver also supports reading and configuring the output data
rate, oversampling ratio, and scale.

Signed-off-by: Dan Robertson <dan@dlrobertson.com>
  • Loading branch information
dlrobertson authored and intel-lab-lkp committed Oct 13, 2019
1 parent aa7e9e2 commit 76b8922
Show file tree
Hide file tree
Showing 5 changed files with 948 additions and 0 deletions.
18 changes: 18 additions & 0 deletions drivers/iio/accel/Kconfig
Expand Up @@ -112,6 +112,24 @@ config BMA220
To compile this driver as a module, choose M here: the
module will be called bma220_spi.

config BMA400
tristate "Bosch BMA400 3-Axis Accelerometer Driver"
depends on I2C
select REGMAP
select BMA400_I2C if (I2C)
help
Say Y here if you want to build a driver for the Bosch BMA400
triaxial acceleration sensor.

To compile this driver as a module, choose M here: the
module will be called bma400_core and you will also get
bma400_i2c for I2C.

config BMA400_I2C
tristate
depends on BMA400
select REGMAP_I2C

config BMC150_ACCEL
tristate "Bosch BMC150 Accelerometer Driver"
select IIO_BUFFER
Expand Down
2 changes: 2 additions & 0 deletions drivers/iio/accel/Makefile
Expand Up @@ -14,6 +14,8 @@ obj-$(CONFIG_ADXL372_I2C) += adxl372_i2c.o
obj-$(CONFIG_ADXL372_SPI) += adxl372_spi.o
obj-$(CONFIG_BMA180) += bma180.o
obj-$(CONFIG_BMA220) += bma220_spi.o
obj-$(CONFIG_BMA400) += bma400_core.o
obj-$(CONFIG_BMA400_I2C) += bma400_i2c.o
obj-$(CONFIG_BMC150_ACCEL) += bmc150-accel-core.o
obj-$(CONFIG_BMC150_ACCEL_I2C) += bmc150-accel-i2c.o
obj-$(CONFIG_BMC150_ACCEL_SPI) += bmc150-accel-spi.o
Expand Down
80 changes: 80 additions & 0 deletions drivers/iio/accel/bma400.h
@@ -0,0 +1,80 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* bma400.h - Register constants and other forward declarations
* needed by the bma400 sources.
*
* Copyright 2019 Dan Robertson <dan@dlrobertson.com>
*/

#include <linux/regmap.h>

/*
* Read-Only Registers
*/

/* Status and ID registers */
#define BMA400_CHIP_ID_REG 0x00
#define BMA400_ERR_REG 0x02
#define BMA400_STATUS_REG 0x03

/* Acceleration registers */
#define BMA400_X_AXIS_LSB_REG 0x04
#define BMA400_X_AXIS_MSB_REG 0x05
#define BMA400_Y_AXIS_LSB_REG 0x06
#define BMA400_Y_AXIS_MSB_REG 0x07
#define BMA400_Z_AXIS_LSB_REG 0x08
#define BMA400_Z_AXIS_MSB_REG 0x09

/* Sensor time registers */
#define BMA400_SENSOR_TIME0 0x0a
#define BMA400_SENSOR_TIME1 0x0b
#define BMA400_SENSOR_TIME2 0x0c

/* Event and interrupt registers */
#define BMA400_EVENT_REG 0x0d
#define BMA400_INT_STAT0_REG 0x0e
#define BMA400_INT_STAT1_REG 0x0f
#define BMA400_INT_STAT2_REG 0x10

/* Temperature register */
#define BMA400_TEMP_DATA_REG 0x11

/* FIFO length and data registers */
#define BMA400_FIFO_LENGTH0_REG 0x12
#define BMA400_FIFO_LENGTH1_REG 0x13
#define BMA400_FIFO_DATA_REG 0x14

/* Step count registers */
#define BMA400_STEP_CNT0_REG 0x15
#define BMA400_STEP_CNT1_REG 0x16
#define BMA400_STEP_CNT3_REG 0x17
#define BMA400_STEP_STAT_REG 0x18

/*
* Read-write configuration registers
*/
#define BMA400_ACC_CONFIG0_REG 0x19
#define BMA400_ACC_CONFIG1_REG 0x1a
#define BMA400_ACC_CONFIG2_REG 0x1b
#define BMA400_CMD_REG 0x7e

/* Chip ID of BMA 400 devices found in the chip ID register. */
#define BMA400_ID_REG_VAL 0x90

#define BMA400_TWO_BITS_MASK 0x03
#define BMA400_LP_OSR_MASK 0x60
#define BMA400_NP_OSR_MASK 0x30
#define BMA400_ACC_ODR_MASK 0x0f
#define BMA400_ACC_SCALE_MASK 0xc0

#define BMA400_LP_OSR_SHIFT 0x05
#define BMA400_NP_OSR_SHIFT 0x04
#define BMA400_SCALE_SHIFT 0x06

extern const struct regmap_config bma400_regmap_config;

int bma400_probe(struct device *dev,
struct regmap *regmap,
const char *name);

int bma400_remove(struct device *dev);

0 comments on commit 76b8922

Please sign in to comment.