From: Andrea Merello <[email protected]>
This series (tries to) add support for Bosch BNO055 IMU to Linux IIO
subsystem. It is made up several patches:
1/14 to 6/14: add some IIO modifiers, and their documentation, to the IIO
core layer, in order to being able to expose the linear
acceleration and Euler angles among standard attributes.
Also update the IIO event monitor tool
7/14: fix binary attributes didn't work with IIO
8/14 to 11/14: add the core IIO BNO055 driver and documentation for sysfs
attributes and DT bindings
12/14: adds serdev BNO055 driver to actually use the IMU via serial line
13/14: adds I2C BNO055 driver to actually use the IMU via I2C wiring
14/14: add a documentation file that describe the bno055 driver and
specifically the calibration
In this series this [1] patch has been also squashed.
Differences wrt v6:
- fix some typos.
- fix some style issues.
- get rid of ifdefs for CONFIG_DEBUG_FS.
- avoid pushing data to the IIO layer if we actually failed reading it.
- rework debugfs file creating failure path.
- fix errors and warning found by kernel test robot <[email protected]>
- rebase
Differences wrt other BNO055 drivers:
Previously at least another driver for the very same chip has been posted
to the Linux ML [0], but it has been never merged, and it seems no one
cared of it since quite a long time.
This driver differs from the above driver on the following aspects:
- This driver supports also serial access (to be reliable, reset pin is
required to be wired)
- The above driver tried to support all IMU HW modes by allowing to
choose one in the DT, and adapting IIO attributes accordingly. This
driver does not rely on DT for this, instead settings are done via
sysfs attributes. All IIO attributes are always exposed; more on this
later on. This driver however supports only a subset of the
HW-supported modes.
- This driver has some support for managing the IMU calibration
Supported operation modes:
- AMG (accelerometer, magnetometer and gyroscope) mode, which provides
raw (uncalibrated) measurements from the said sensors, and allows for
setting some parameters about them (e.g. filter cut-off frequency, max
sensor ranges, etc).
- Fusion mode, which still provides AMG measures, while it also provides
other data calculated by the IMU (e.g. rotation angles, linear
acceleration, etc). In this mode user has no freedom to set any sensor
parameter, since the HW locks them. Autocalibration and correction is
performed by the IMU.
IIO attributes exposing sensors parameters are always present, but in
fusion modes the available values are constrained to just the one used by
the HW. This is reflected in the '*_available' IIO attributes.
Trying to set a not-supported value always falls back to the closest
supported one, which in this case is just the one in use by the HW.
IIO attributes for unavailable measurements (e.g. Euler angles in AMG
mode) can't be read (return -EBUSY, or refuse to enable buffer).
IMU calibration:
The IMU supports for two sets of calibration parameters:
- SIC matrix. user-provided; this driver doesn't currently support it
- Offset and radius parameters. The IMU automatically finds out them when
it is running in fusion mode; supported by this driver.
The driver provides access to autocalibration flags (i.e. you can known
if the IMU has successfully autocalibrated) and to calibration data blob.
The user can save this blob in a "firmware" file (i.e. in /lib/firmware)
that the driver looks for at probe time. If found, then the IMU is
initialized with this calibration data. This saves the user from
performing the calibration procedure every time (which consist of moving
the IMU in various way).
The driver looks for calibration data file using two different names:
first a file whose name is suffixed with the IMU unique ID is searched
for; this is useful when there is more than one IMU instance. If this
file is not found, then a "generic" calibration file is searched for
(which can be used when only one IMU is present, without struggling with
fancy names, that changes on each device).
In AMG mode the IIO 'offset' attributes provide access to the offsets
from calibration data (if any), so that the user can apply them to the
accel, angvel and magn IIO attributes. In fusion mode they are not needed
and read as zero.
Access protocols and serdev module:
The serial protocol is quite simple, but there are tricks to make it
really works. Those tricks and workarounds are documented in the driver
source file.
The core BNO055 driver tries to group readings in burst when appropriate,
in order to optimize triggered buffer operation. The threshold for
splitting a burst (i.e. max number of unused bytes in the middle of a
burst that will be throw away) is provided to the core driver by the
lowlevel access driver (either serdev or I2C) at probe time.
[0] https://www.spinics.net/lists/linux-iio/msg25508.html
[1] https://lore.kernel.org/lkml/[email protected]/
Andrea Merello (14):
iio: add modifiers for linear acceleration
iio: document linear acceleration modifiers
iio: event_monitor: add linear acceleration modifiers
iio: add modifers for pitch, yaw, roll
iio: document pitch, yaw, roll modifiers
iio: event_monitor: add pitch, yaw and roll modifiers
iio: add support for binary attributes
iio: imu: add Bosch Sensortec BNO055 core driver
iio: document bno055 private sysfs attributes
iio: document "serialnumber" sysfs attribute
dt-bindings: iio/imu: Add Bosch BNO055
iio: imu: add BNO055 serdev driver
iio: imu: add BNO055 I2C driver
docs: iio: add documentation for BNO055 driver
Documentation/ABI/testing/sysfs-bus-iio | 25 +
.../ABI/testing/sysfs-bus-iio-bno055 | 81 +
.../bindings/iio/imu/bosch,bno055.yaml | 59 +
Documentation/iio/bno055.rst | 51 +
Documentation/iio/index.rst | 2 +
drivers/iio/imu/Kconfig | 1 +
drivers/iio/imu/Makefile | 1 +
drivers/iio/imu/bno055/Kconfig | 25 +
drivers/iio/imu/bno055/Makefile | 10 +
drivers/iio/imu/bno055/bno055.c | 1698 +++++++++++++++++
drivers/iio/imu/bno055/bno055.h | 13 +
drivers/iio/imu/bno055/bno055_i2c.c | 57 +
drivers/iio/imu/bno055/bno055_ser_core.c | 560 ++++++
drivers/iio/imu/bno055/bno055_ser_trace.c | 14 +
drivers/iio/imu/bno055/bno055_ser_trace.h | 104 +
drivers/iio/industrialio-core.c | 10 +-
include/uapi/linux/iio/types.h | 7 +-
tools/iio/iio_event_monitor.c | 6 +
18 files changed, 2722 insertions(+), 2 deletions(-)
create mode 100644 Documentation/ABI/testing/sysfs-bus-iio-bno055
create mode 100644 Documentation/devicetree/bindings/iio/imu/bosch,bno055.yaml
create mode 100644 Documentation/iio/bno055.rst
create mode 100644 drivers/iio/imu/bno055/Kconfig
create mode 100644 drivers/iio/imu/bno055/Makefile
create mode 100644 drivers/iio/imu/bno055/bno055.c
create mode 100644 drivers/iio/imu/bno055/bno055.h
create mode 100644 drivers/iio/imu/bno055/bno055_i2c.c
create mode 100644 drivers/iio/imu/bno055/bno055_ser_core.c
create mode 100644 drivers/iio/imu/bno055/bno055_ser_trace.c
create mode 100644 drivers/iio/imu/bno055/bno055_ser_trace.h
--
2.17.1
From: Andrea Merello <[email protected]>
Add an I2C driver for communicating to a BNO055 IMU via I2C bus and enable
the BNO055 core driver to work in this scenario.
Signed-off-by: Andrea Merello <[email protected]>
Reviewed-by: Andy Shevchenko <[email protected]>
---
drivers/iio/imu/bno055/Kconfig | 11 ++++++
drivers/iio/imu/bno055/Makefile | 2 +
drivers/iio/imu/bno055/bno055_i2c.c | 57 +++++++++++++++++++++++++++++
3 files changed, 70 insertions(+)
create mode 100644 drivers/iio/imu/bno055/bno055_i2c.c
diff --git a/drivers/iio/imu/bno055/Kconfig b/drivers/iio/imu/bno055/Kconfig
index b51d63b49ea4..fa79b1ac4f85 100644
--- a/drivers/iio/imu/bno055/Kconfig
+++ b/drivers/iio/imu/bno055/Kconfig
@@ -12,3 +12,14 @@ config BOSCH_BNO055_SERIAL
This driver can also be built as a module. If so, the module will be
called bno055_sl.
+
+config BOSCH_BNO055_I2C
+ tristate "Bosch BNO055 attached via I2C bus"
+ depends on I2C
+ select REGMAP_I2C
+ select BOSCH_BNO055
+ help
+ Enable this to support Bosch BNO055 IMUs attached via I2C bus.
+
+ This driver can also be built as a module. If so, the module will be
+ called bno055_i2c.
diff --git a/drivers/iio/imu/bno055/Makefile b/drivers/iio/imu/bno055/Makefile
index ef9219563782..98c624730dae 100644
--- a/drivers/iio/imu/bno055/Makefile
+++ b/drivers/iio/imu/bno055/Makefile
@@ -6,3 +6,5 @@ bno055_ser-y := bno055_ser_core.o
# define_trace.h needs to know how to find our header
CFLAGS_bno055_ser_trace.o := -I$(src)
bno055_ser-$(CONFIG_TRACING) += bno055_ser_trace.o
+
+obj-$(CONFIG_BOSCH_BNO055_I2C) += bno055_i2c.o
diff --git a/drivers/iio/imu/bno055/bno055_i2c.c b/drivers/iio/imu/bno055/bno055_i2c.c
new file mode 100644
index 000000000000..9bb256fdb0d3
--- /dev/null
+++ b/drivers/iio/imu/bno055/bno055_i2c.c
@@ -0,0 +1,57 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Support for I2C-interfaced Bosch BNO055 IMU.
+ *
+ * Copyright (C) 2021-2022 Istituto Italiano di Tecnologia
+ * Electronic Design Laboratory
+ * Written by Andrea Merello <[email protected]>
+ */
+
+#include <linux/i2c.h>
+#include <linux/mod_devicetable.h>
+#include <linux/module.h>
+#include <linux/regmap.h>
+
+#include "bno055.h"
+
+#define BNO055_I2C_XFER_BURST_BREAK_THRESHOLD 3 /* FIXME */
+
+static int bno055_i2c_probe(struct i2c_client *client)
+{
+ struct regmap *regmap;
+
+ regmap = devm_regmap_init_i2c(client, &bno055_regmap_config);
+ if (IS_ERR(regmap))
+ return dev_err_probe(&client->dev, PTR_ERR(regmap),
+ "Unable to init register map");
+
+ return bno055_probe(&client->dev, regmap,
+ BNO055_I2C_XFER_BURST_BREAK_THRESHOLD, true);
+}
+
+static const struct i2c_device_id bno055_i2c_id[] = {
+ {"bno055", 0},
+ { }
+};
+MODULE_DEVICE_TABLE(i2c, bno055_i2c_id);
+
+static const struct of_device_id __maybe_unused bno055_i2c_of_match[] = {
+ { .compatible = "bosch,bno055" },
+ { },
+};
+MODULE_DEVICE_TABLE(of, bno055_i2c_of_match);
+
+static struct i2c_driver bno055_driver = {
+ .driver = {
+ .name = "bno055-i2c",
+ .of_match_table = of_match_ptr(bno055_i2c_of_match),
+ },
+ .probe_new = bno055_i2c_probe,
+ .id_table = bno055_i2c_id,
+};
+module_i2c_driver(bno055_driver);
+
+MODULE_AUTHOR("Andrea Merello");
+MODULE_DESCRIPTION("Bosch BNO055 I2C interface");
+MODULE_IMPORT_NS(IIO_BNO055);
+MODULE_LICENSE("GPL");
--
2.17.1
On 9/7/22 20:21, [email protected] wrote:
> Differences wrt v6:
>
> - fix some typos.
> - fix some style issues.
> - get rid of ifdefs for CONFIG_DEBUG_FS.
> - avoid pushing data to the IIO layer if we actually failed reading it.
> - rework debugfs file creating failure path.
> - fix errors and warning found by kernel test robot <[email protected]>
> - rebase
Rebased on what tree (and what commit)? I can't cleanly apply patch
[05/14].
Thanks.
--
An old man doll... just what I always wanted! - Clara
Il giorno gio 8 set 2022 alle ore 05:47 Bagas Sanjaya
<[email protected]> ha scritto:
>
> On 9/7/22 20:21, [email protected] wrote:
> > Differences wrt v6:
> >
> > - fix some typos.
> > - fix some style issues.
> > - get rid of ifdefs for CONFIG_DEBUG_FS.
> > - avoid pushing data to the IIO layer if we actually failed reading it.
> > - rework debugfs file creating failure path.
> > - fix errors and warning found by kernel test robot <[email protected]>
> > - rebase
>
> Rebased on what tree (and what commit)? I can't cleanly apply patch
> [05/14].
Sorry, it looks like I've raced against recent updates on iio-togreg
branch (i.e. I've rebased, then I've got preemped by something else,
then I've tested and sent the series some days later - I should have
rebased again).
BTW patches can be applied on the top of this
https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio.git/commit/?h=togreg&id=2bc9cd66eb25d0fefbb081421d6586495e25840e
I'll prepare a v8 anyway.
> Thanks.
>
> --
> An old man doll... just what I always wanted! - Clara
On 9/8/22 13:51, Andrea Merello wrote:
>> Rebased on what tree (and what commit)? I can't cleanly apply patch
>> [05/14].
>
> Sorry, it looks like I've raced against recent updates on iio-togreg
> branch (i.e. I've rebased, then I've got preemped by something else,
> then I've tested and sent the series some days later - I should have
> rebased again).
>
> BTW patches can be applied on the top of this
> https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio.git/commit/?h=togreg&id=2bc9cd66eb25d0fefbb081421d6586495e25840e
>
> I'll prepare a v8 anyway.
>
OK.
Don't forget to pass --base to git-format-patch(1) when preparing v8.
--
An old man doll... just what I always wanted! - Clara