From e11bb33e7b179e2a8198653ee7bf4c044f3eff1e Mon Sep 17 00:00:00 2001 From: Dmitry Osipenko Date: Sat, 18 Jan 2020 19:29:08 +0300 Subject: [PATCH 1/2] mount-matrix: Support IIO sysfs in_mount_matrix Linux kernel IIO drivers provide mount matrix via standardized sysfs interface. The IIO mount matrix could specified by "directory" and by "type", this patch adds support for the "directory" type which may be used by drivers that use the same shared matrix for all of the sensors or if driver provides only one accelerometer sensor at all. --- src/accel-mount-matrix.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/accel-mount-matrix.c b/src/accel-mount-matrix.c index c66b440..25a0ea5 100644 --- a/src/accel-mount-matrix.c +++ b/src/accel-mount-matrix.c @@ -50,6 +50,21 @@ setup_mount_matrix (GUdevDevice *device) g_clear_pointer (&ret, g_free); } + /* Linux kernel IIO accelerometer drivers provide mount matrix + * via standardized sysfs interface. + * + * See https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-bus-iio + * for more details. */ + mount_matrix = g_udev_device_get_sysfs_attr (device, "in_mount_matrix"); + if (mount_matrix) { + if (parse_mount_matrix (mount_matrix, &ret)) + return ret; + + g_warning ("Failed to parse in_mount_matrix ('%s') from sysfs", + mount_matrix); + g_clear_pointer (&ret, g_free); + } + g_debug ("Failed to auto-detect mount matrix, falling back to identity"); parse_mount_matrix (NULL, &ret); return ret; -- 2.24.1 From 9fdbb3636370e3681f7700fd5c6c66c8003e3b13 Mon Sep 17 00:00:00 2001 From: Dmitry Osipenko Date: Mon, 20 Jan 2020 22:48:52 +0300 Subject: [PATCH 2/2] mount-matrix: Support IIO sysfs in_accel_mount_matrix Linux kernel IIO drivers provide mount matrix via standardized sysfs interface. The IIO mount matrix could specified by "directory" and by "type", this patch adds support for the "by type" option which is used by drivers that use individual matrices for each of the sensors. Tested on Nexus 7 and Acer A500 tablet devices using MPU6050 and KXTF9 IIO drivers respectively, now monitor-sensor reports display's orientation correctly on these devices. --- src/accel-mount-matrix.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/accel-mount-matrix.c b/src/accel-mount-matrix.c index 25a0ea5..0ba0191 100644 --- a/src/accel-mount-matrix.c +++ b/src/accel-mount-matrix.c @@ -50,6 +50,23 @@ setup_mount_matrix (GUdevDevice *device) g_clear_pointer (&ret, g_free); } + /* Some IIO drivers provide multiple sensors via the same sysfs path + * and thus they may have different matrices like in a case of + * accelerometer and angular velocity for example. The accelerometer + * mount matrix is named as in_accel_mount_matrix in that case. + * + * See https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-bus-iio + * for more details. */ + mount_matrix = g_udev_device_get_sysfs_attr (device, "in_accel_mount_matrix"); + if (mount_matrix) { + if (parse_mount_matrix (mount_matrix, &ret)) + return ret; + + g_warning ("Failed to parse in_accel_mount_matrix ('%s') from sysfs", + mount_matrix); + g_clear_pointer (&ret, g_free); + } + /* Linux kernel IIO accelerometer drivers provide mount matrix * via standardized sysfs interface. * -- 2.24.1