-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
iio: imu: Add initial support for Bosch BMI160
BMI160 is an Inertial Measurement Unit (IMU) which provides acceleration and angular rate measurement. It also offers a secondary I2C interface for connecting a magnetometer sensor (usually BMM160). Current driver offers support for accelerometer and gyroscope readings via sysfs or via buffer interface using an external trigger (e.g. hrtimer). Data is retrieved from IMU via I2C or SPI interface. Datasheet is at: http://www.mouser.com/ds/2/783/BST-BMI160-DS000-07-786474.pdf Signed-off-by: Daniel Baluta <daniel.baluta@intel.com> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
- Loading branch information
Daniel Baluta
authored and
Jonathan Cameron
committed
Apr 16, 2016
1 parent
ab4b649
commit 77c4ad2
Showing
8 changed files
with
782 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
# | ||
# BMI160 IMU driver | ||
# | ||
|
||
config BMI160 | ||
tristate | ||
select IIO_BUFFER | ||
select IIO_TRIGGERED_BUFFER | ||
|
||
config BMI160_I2C | ||
tristate "Bosch BMI160 I2C driver" | ||
depends on I2C | ||
select BMI160 | ||
select REGMAP_I2C | ||
help | ||
If you say yes here you get support for BMI160 IMU on I2C with | ||
accelerometer, gyroscope and external BMG160 magnetometer. | ||
|
||
This driver can also be built as a module. If so, the module will be | ||
called bmi160_i2c. | ||
|
||
config BMI160_SPI | ||
tristate "Bosch BMI160 SPI driver" | ||
depends on SPI | ||
select BMI160 | ||
select REGMAP_SPI | ||
help | ||
If you say yes here you get support for BMI160 IMU on SPI with | ||
accelerometer, gyroscope and external BMG160 magnetometer. | ||
|
||
This driver can also be built as a module. If so, the module will be | ||
called bmi160_spi. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
# | ||
# Makefile for Bosch BMI160 IMU | ||
# | ||
obj-$(CONFIG_BMI160) += bmi160_core.o | ||
obj-$(CONFIG_BMI160_I2C) += bmi160_i2c.o | ||
obj-$(CONFIG_BMI160_SPI) += bmi160_spi.o |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
#ifndef BMI160_H_ | ||
#define BMI160_H_ | ||
|
||
extern const struct regmap_config bmi160_regmap_config; | ||
|
||
int bmi160_core_probe(struct device *dev, struct regmap *regmap, | ||
const char *name, bool use_spi); | ||
void bmi160_core_remove(struct device *dev); | ||
|
||
#endif /* BMI160_H_ */ |
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
/* | ||
* BMI160 - Bosch IMU, I2C bits | ||
* | ||
* Copyright (c) 2016, Intel Corporation. | ||
* | ||
* This file is subject to the terms and conditions of version 2 of | ||
* the GNU General Public License. See the file COPYING in the main | ||
* directory of this archive for more details. | ||
* | ||
* 7-bit I2C slave address is: | ||
* - 0x68 if SDO is pulled to GND | ||
* - 0x69 if SDO is pulled to VDDIO | ||
*/ | ||
#include <linux/module.h> | ||
#include <linux/i2c.h> | ||
#include <linux/regmap.h> | ||
#include <linux/acpi.h> | ||
|
||
#include "bmi160.h" | ||
|
||
static int bmi160_i2c_probe(struct i2c_client *client, | ||
const struct i2c_device_id *id) | ||
{ | ||
struct regmap *regmap; | ||
const char *name = NULL; | ||
|
||
regmap = devm_regmap_init_i2c(client, &bmi160_regmap_config); | ||
if (IS_ERR(regmap)) { | ||
dev_err(&client->dev, "Failed to register i2c regmap %d\n", | ||
(int)PTR_ERR(regmap)); | ||
return PTR_ERR(regmap); | ||
} | ||
|
||
if (id) | ||
name = id->name; | ||
|
||
return bmi160_core_probe(&client->dev, regmap, name, false); | ||
} | ||
|
||
static int bmi160_i2c_remove(struct i2c_client *client) | ||
{ | ||
bmi160_core_remove(&client->dev); | ||
|
||
return 0; | ||
} | ||
|
||
static const struct i2c_device_id bmi160_i2c_id[] = { | ||
{"bmi160", 0}, | ||
{} | ||
}; | ||
MODULE_DEVICE_TABLE(i2c, bmi160_i2c_id); | ||
|
||
static const struct acpi_device_id bmi160_acpi_match[] = { | ||
{"BMI0160", 0}, | ||
{ }, | ||
}; | ||
MODULE_DEVICE_TABLE(acpi, bmi160_acpi_match); | ||
|
||
static struct i2c_driver bmi160_i2c_driver = { | ||
.driver = { | ||
.name = "bmi160_i2c", | ||
.acpi_match_table = ACPI_PTR(bmi160_acpi_match), | ||
}, | ||
.probe = bmi160_i2c_probe, | ||
.remove = bmi160_i2c_remove, | ||
.id_table = bmi160_i2c_id, | ||
}; | ||
module_i2c_driver(bmi160_i2c_driver); | ||
|
||
MODULE_AUTHOR("Daniel Baluta <daniel.baluta@intel.com>"); | ||
MODULE_DESCRIPTION("BMI160 I2C driver"); | ||
MODULE_LICENSE("GPL v2"); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
/* | ||
* BMI160 - Bosch IMU, SPI bits | ||
* | ||
* Copyright (c) 2016, Intel Corporation. | ||
* | ||
* This file is subject to the terms and conditions of version 2 of | ||
* the GNU General Public License. See the file COPYING in the main | ||
* directory of this archive for more details. | ||
*/ | ||
#include <linux/module.h> | ||
#include <linux/spi/spi.h> | ||
#include <linux/regmap.h> | ||
#include <linux/acpi.h> | ||
|
||
#include "bmi160.h" | ||
|
||
static int bmi160_spi_probe(struct spi_device *spi) | ||
{ | ||
struct regmap *regmap; | ||
const struct spi_device_id *id = spi_get_device_id(spi); | ||
|
||
regmap = devm_regmap_init_spi(spi, &bmi160_regmap_config); | ||
if (IS_ERR(regmap)) { | ||
dev_err(&spi->dev, "Failed to register spi regmap %d\n", | ||
(int)PTR_ERR(regmap)); | ||
return PTR_ERR(regmap); | ||
} | ||
return bmi160_core_probe(&spi->dev, regmap, id->name, true); | ||
} | ||
|
||
static int bmi160_spi_remove(struct spi_device *spi) | ||
{ | ||
bmi160_core_remove(&spi->dev); | ||
|
||
return 0; | ||
} | ||
|
||
static const struct spi_device_id bmi160_spi_id[] = { | ||
{"bmi160", 0}, | ||
{} | ||
}; | ||
MODULE_DEVICE_TABLE(spi, bmi160_spi_id); | ||
|
||
static const struct acpi_device_id bmi160_acpi_match[] = { | ||
{"BMI0160", 0}, | ||
{ }, | ||
}; | ||
MODULE_DEVICE_TABLE(acpi, bmi160_acpi_match); | ||
|
||
static struct spi_driver bmi160_spi_driver = { | ||
.probe = bmi160_spi_probe, | ||
.remove = bmi160_spi_remove, | ||
.id_table = bmi160_spi_id, | ||
.driver = { | ||
.acpi_match_table = ACPI_PTR(bmi160_acpi_match), | ||
.name = "bmi160_spi", | ||
}, | ||
}; | ||
module_spi_driver(bmi160_spi_driver); | ||
|
||
MODULE_AUTHOR("Daniel Baluta <daniel.baluta@intel.com"); | ||
MODULE_DESCRIPTION("Bosch BMI160 SPI driver"); | ||
MODULE_LICENSE("GPL v2"); |