1
0
Fork 0
mirror of https://gitlab.postmarketos.org/postmarketOS/pmaports.git synced 2025-07-12 16:19:48 +03:00

temp: iio-sensor-proxy: import fix for broken buffer sensors

Import
https://gitlab.freedesktop.org/hadess/iio-sensor-proxy/-/merge_requests/400
pending merge and tagging of new upstream release.

In pmOS, the chromebooks need these patches, since their accelerometer driver
has been found to implement buffers in a broken way.

Part-of: https://gitlab.postmarketos.org/postmarketos/pmaports/-/merge_requests/6747
This commit is contained in:
Sicelo A. Mhlongo 2025-07-04 21:29:49 +02:00 committed by Henrik Grimler
parent d1f8b4179f
commit b2399f7f09
No known key found for this signature in database
GPG key ID: B0076E490B71616B
5 changed files with 655 additions and 1 deletions

View file

@ -0,0 +1,153 @@
From f35d293e65841a3b9c0de778300c7fa58b181fd0 Mon Sep 17 00:00:00 2001
From: "Sicelo A. Mhlongo" <absicsz@gmail.com>
Date: Sun, 25 May 2025 17:44:29 +0200
Subject: [PATCH 1/4] drv-iio-buffer-*: relocate the .discover method to bring
the .open and .close methods into scope
To fix #411 [0], the .discover method will now attempt to read from the sensor
buffer. Therefore, it will need to call .open and .close. Relocate the method
to ensure the former are within scope. There is no functional change in the
.discover method.
[0] https://gitlab.freedesktop.org/hadess/iio-sensor-proxy/-/issues/411
---
src/drv-iio-buffer-accel.c | 26 +++++++++++++-------------
src/drv-iio-buffer-compass.c | 26 +++++++++++++-------------
src/drv-iio-buffer-light.c | 26 +++++++++++++-------------
3 files changed, 39 insertions(+), 39 deletions(-)
diff --git a/src/drv-iio-buffer-accel.c b/src/drv-iio-buffer-accel.c
index 90747a6..931d5cb 100644
--- a/src/drv-iio-buffer-accel.c
+++ b/src/drv-iio-buffer-accel.c
@@ -120,19 +120,6 @@ read_orientation (gpointer user_data)
return G_SOURCE_CONTINUE;
}
-static gboolean
-iio_buffer_accel_discover (GUdevDevice *device)
-{
- if (!drv_check_udev_sensor_type (device, "iio-buffer-accel", NULL))
- return FALSE;
-
- if (!is_buffer_usable (device))
- return FALSE;
-
- g_debug ("Found IIO buffer accelerometer at %s", g_udev_device_get_sysfs_path (device));
- return TRUE;
-}
-
static void
iio_buffer_accel_set_polling (SensorDevice *sensor_device,
gboolean state)
@@ -205,6 +192,19 @@ iio_buffer_accel_close (SensorDevice *sensor_device)
g_free (sensor_device);
}
+static gboolean
+iio_buffer_accel_discover (GUdevDevice *device)
+{
+ if (!drv_check_udev_sensor_type (device, "iio-buffer-accel", NULL))
+ return FALSE;
+
+ if (!is_buffer_usable (device))
+ return FALSE;
+
+ g_debug ("Found IIO buffer accelerometer at %s", g_udev_device_get_sysfs_path (device));
+ return TRUE;
+}
+
SensorDriver iio_buffer_accel = {
.driver_name = "IIO Buffer accelerometer",
.type = DRIVER_TYPE_ACCEL,
diff --git a/src/drv-iio-buffer-compass.c b/src/drv-iio-buffer-compass.c
index f0399f4..cfe8f4f 100644
--- a/src/drv-iio-buffer-compass.c
+++ b/src/drv-iio-buffer-compass.c
@@ -103,19 +103,6 @@ read_heading (gpointer user_data)
return G_SOURCE_CONTINUE;
}
-static gboolean
-iio_buffer_compass_discover (GUdevDevice *device)
-{
- if (!drv_check_udev_sensor_type (device, "iio-buffer-compass", NULL))
- return FALSE;
-
- if (!is_buffer_usable (device))
- return FALSE;
-
- g_debug ("Found IIO buffer compass at %s", g_udev_device_get_sysfs_path (device));
- return TRUE;
-}
-
static SensorDevice *
iio_buffer_compass_open (GUdevDevice *device)
{
@@ -188,6 +175,19 @@ iio_buffer_compass_close (SensorDevice *sensor_device)
g_free (sensor_device);
}
+static gboolean
+iio_buffer_compass_discover (GUdevDevice *device)
+{
+ if (!drv_check_udev_sensor_type (device, "iio-buffer-compass", NULL))
+ return FALSE;
+
+ if (!is_buffer_usable (device))
+ return FALSE;
+
+ g_debug ("Found IIO buffer compass at %s", g_udev_device_get_sysfs_path (device));
+ return TRUE;
+}
+
SensorDriver iio_buffer_compass = {
.driver_name = "IIO Buffer Compass",
.type = DRIVER_TYPE_COMPASS,
diff --git a/src/drv-iio-buffer-light.c b/src/drv-iio-buffer-light.c
index 4be2398..6046dc3 100644
--- a/src/drv-iio-buffer-light.c
+++ b/src/drv-iio-buffer-light.c
@@ -108,19 +108,6 @@ read_light (gpointer user_data)
return G_SOURCE_CONTINUE;
}
-static gboolean
-iio_buffer_light_discover (GUdevDevice *device)
-{
- if (!drv_check_udev_sensor_type (device, "iio-buffer-als", NULL))
- return FALSE;
-
- if (!is_buffer_usable (device))
- return FALSE;
-
- g_debug ("Found IIO buffer ALS at %s", g_udev_device_get_sysfs_path (device));
- return TRUE;
-}
-
static void
iio_buffer_light_set_polling (SensorDevice *sensor_device,
gboolean state)
@@ -192,6 +179,19 @@ iio_buffer_light_close (SensorDevice *sensor_device)
g_free (sensor_device);
}
+static gboolean
+iio_buffer_light_discover (GUdevDevice *device)
+{
+ if (!drv_check_udev_sensor_type (device, "iio-buffer-als", NULL))
+ return FALSE;
+
+ if (!is_buffer_usable (device))
+ return FALSE;
+
+ g_debug ("Found IIO buffer ALS at %s", g_udev_device_get_sysfs_path (device));
+ return TRUE;
+}
+
SensorDriver iio_buffer_light = {
.driver_name = "IIO Buffer Light sensor",
.type = DRIVER_TYPE_LIGHT,
--
2.50.0

View file

@ -0,0 +1,132 @@
From 7416edf4da98d8e3b75f9eddb7e5c488ac4a4c54 Mon Sep 17 00:00:00 2001
From: "Sicelo A. Mhlongo" <absicsz@gmail.com>
Date: Sun, 25 May 2025 19:17:51 +0200
Subject: [PATCH 2/4] buffer_drv_data_new: rework trigger_name handling
In each buffer driver, the get_trigger_name() call is always immediately
followed by a call to buffer_drv_data_new(). To simplify the code,
buffer_drv_data_new() now calls get_trigger_name(). Incidentally,
iio-sensor-proxy does not actually use the buffer sensor's trigger for
anything.
---
src/drv-iio-buffer-accel.c | 6 +-----
src/drv-iio-buffer-compass.c | 10 +---------
src/drv-iio-buffer-light.c | 9 +--------
src/iio-buffer-utils.c | 9 ++++-----
src/iio-buffer-utils.h | 3 +--
5 files changed, 8 insertions(+), 29 deletions(-)
diff --git a/src/drv-iio-buffer-accel.c b/src/drv-iio-buffer-accel.c
index 931d5cb..06db1aa 100644
--- a/src/drv-iio-buffer-accel.c
+++ b/src/drv-iio-buffer-accel.c
@@ -151,13 +151,9 @@ iio_buffer_accel_open (GUdevDevice *device)
{
SensorDevice *sensor_device;
DrvData *drv_data;
- g_autofree char *trigger_name = NULL;
BufferDrvData *buffer_data;
- /* Get the trigger name, and build the channels from that */
- trigger_name = get_trigger_name (device);
-
- buffer_data = buffer_drv_data_new (device, trigger_name);
+ buffer_data = buffer_drv_data_new (device);
if (!buffer_data)
return NULL;
diff --git a/src/drv-iio-buffer-compass.c b/src/drv-iio-buffer-compass.c
index cfe8f4f..2ae0ccd 100644
--- a/src/drv-iio-buffer-compass.c
+++ b/src/drv-iio-buffer-compass.c
@@ -108,17 +108,9 @@ iio_buffer_compass_open (GUdevDevice *device)
{
SensorDevice *sensor_device;
DrvData *drv_data;
- g_autofree char *trigger_name = NULL;
BufferDrvData *buffer_data;
- /* Get the trigger name, and build the channels from that */
- trigger_name = get_trigger_name (device);
- if (!trigger_name) {
- g_debug ("Could not find trigger for %s", g_udev_device_get_sysfs_path (device));
- return NULL;
- }
-
- buffer_data = buffer_drv_data_new (device, trigger_name);
+ buffer_data = buffer_drv_data_new (device);
if (!buffer_data)
return NULL;
diff --git a/src/drv-iio-buffer-light.c b/src/drv-iio-buffer-light.c
index 6046dc3..2a524c6 100644
--- a/src/drv-iio-buffer-light.c
+++ b/src/drv-iio-buffer-light.c
@@ -139,16 +139,9 @@ iio_buffer_light_open (GUdevDevice *device)
{
SensorDevice *sensor_device;
DrvData *drv_data;
- g_autofree char *trigger_name = NULL;
BufferDrvData *buffer_data;
- /* Get the trigger name, and build the channels from that */
- trigger_name = get_trigger_name (device);
- if (!trigger_name) {
- g_debug ("Could not find trigger for %s", g_udev_device_get_sysfs_path (device));
- return NULL;
- }
- buffer_data = buffer_drv_data_new (device, trigger_name);
+ buffer_data = buffer_drv_data_new (device);
if (!buffer_data)
return NULL;
diff --git a/src/iio-buffer-utils.c b/src/iio-buffer-utils.c
index 7a627d3..bc74e4c 100644
--- a/src/iio-buffer-utils.c
+++ b/src/iio-buffer-utils.c
@@ -880,13 +880,14 @@ buffer_drv_data_free (BufferDrvData *buffer_data)
}
BufferDrvData *
-buffer_drv_data_new (GUdevDevice *device,
- const char *trigger_name)
+buffer_drv_data_new (GUdevDevice *device)
{
BufferDrvData *buffer_data;
+ g_autofree char *trigger_name = NULL;
buffer_data = g_new0 (BufferDrvData, 1);
buffer_data->dev_dir_name = g_udev_device_get_sysfs_path (device);
+ trigger_name = get_trigger_name (device);
if (trigger_name)
buffer_data->trigger_name = g_strdup (trigger_name);
buffer_data->device = g_object_ref (device);
@@ -909,10 +910,8 @@ is_buffer_usable (GUdevDevice *device)
g_autofree char *trigger_name = NULL;
BufferDrvData *buffer_data;
- trigger_name = get_trigger_name (device);
-
/* Temporarily enable the buffer to ensure the kernel driver is buffer-capable */
- buffer_data = buffer_drv_data_new (device, trigger_name);
+ buffer_data = buffer_drv_data_new (device);
if (!buffer_data)
return FALSE;
diff --git a/src/iio-buffer-utils.h b/src/iio-buffer-utils.h
index 597177a..9c5e6db 100644
--- a/src/iio-buffer-utils.h
+++ b/src/iio-buffer-utils.h
@@ -43,8 +43,7 @@ gboolean iio_fixup_sampling_frequency (GUdevDevice *dev);
char *get_trigger_name (GUdevDevice *device);
void buffer_drv_data_free (BufferDrvData *buffer_data);
-BufferDrvData *buffer_drv_data_new (GUdevDevice *device,
- const char *trigger_name);
+BufferDrvData *buffer_drv_data_new (GUdevDevice *device);
void disable_ring_buffer (BufferDrvData *data);
gboolean enable_ring_buffer (BufferDrvData *data);
gboolean is_buffer_usable (GUdevDevice *device);
--
2.50.0

View file

@ -0,0 +1,298 @@
From d00109194422a4fe3e9a7bc1235ffc492459c61a Mon Sep 17 00:00:00 2001
From: "Sicelo A. Mhlongo" <absicsz@gmail.com>
Date: Mon, 26 May 2025 09:11:59 +0200
Subject: [PATCH 3/4] iio-buffer: attempt to read from buffer during sensor
discovery
The kernel drivers for some sensors report support for buffer mode, and allow
the buffer to be enabled, but never return any data in the buffer. Since
59c29aca616f ("drivers: accel: Remove trigger requirement on
iio-buffer-accel"), these sensors fail silently. iio-sensor-proxy must use the
polling method on these sensors.
To achieve this, during sensor discovery, enable the sensor in buffer mode,
then attempt to read data off the buffer. Modify tests in order for the data
file to be opened before startDaemon() is called, since this is now necessary
for sensor discovery.
Fixes: #411 [0]
[0] https://gitlab.freedesktop.org/hadess/iio-sensor-proxy/-/issues/411
---
src/drv-iio-buffer-accel.c | 20 +++++++++++++++++++-
src/drv-iio-buffer-compass.c | 24 +++++++++++++++++++++---
src/drv-iio-buffer-light.c | 24 +++++++++++++++++++++---
src/iio-buffer-utils.c | 32 +++++++++++++++++++++-----------
src/iio-buffer-utils.h | 2 +-
tests/integration-test.py | 16 ++++++++++++++--
6 files changed, 97 insertions(+), 21 deletions(-)
diff --git a/src/drv-iio-buffer-accel.c b/src/drv-iio-buffer-accel.c
index 06db1aa..5900ac5 100644
--- a/src/drv-iio-buffer-accel.c
+++ b/src/drv-iio-buffer-accel.c
@@ -191,12 +191,30 @@ iio_buffer_accel_close (SensorDevice *sensor_device)
static gboolean
iio_buffer_accel_discover (GUdevDevice *device)
{
+ SensorDevice *sensor_device;
+ DrvData *drv_data;
+ gboolean buffer_usable = FALSE;
+
if (!drv_check_udev_sensor_type (device, "iio-buffer-accel", NULL))
return FALSE;
- if (!is_buffer_usable (device))
+ sensor_device = iio_buffer_accel_open (device);
+ if (!sensor_device)
return FALSE;
+ /* Attempt to read from the sensor */
+ drv_data = (DrvData *) sensor_device->priv;
+ enable_ring_buffer (drv_data->buffer_data);
+
+ buffer_usable = is_buffer_usable(drv_data->dev_path);
+
+ /* Close the sensor until it has been claimed */
+ disable_ring_buffer (drv_data->buffer_data);
+ iio_buffer_accel_close (sensor_device);
+
+ if (!buffer_usable)
+ return FALSE;
+
g_debug ("Found IIO buffer accelerometer at %s", g_udev_device_get_sysfs_path (device));
return TRUE;
}
diff --git a/src/drv-iio-buffer-compass.c b/src/drv-iio-buffer-compass.c
index 2ae0ccd..4638134 100644
--- a/src/drv-iio-buffer-compass.c
+++ b/src/drv-iio-buffer-compass.c
@@ -20,7 +20,7 @@ typedef struct {
guint timeout_id;
GUdevDevice *dev;
- const char *dev_path;
+ char *dev_path;
int device_id;
BufferDrvData *buffer_data;
} DrvData;
@@ -125,7 +125,7 @@ iio_buffer_compass_open (GUdevDevice *device)
drv_data = (DrvData *) sensor_device->priv;
drv_data->dev = g_object_ref (device);
drv_data->buffer_data = buffer_data;
- drv_data->dev_path = g_udev_device_get_device_file (device);
+ drv_data->dev_path = get_device_file (device);
return sensor_device;
}
@@ -170,10 +170,28 @@ iio_buffer_compass_close (SensorDevice *sensor_device)
static gboolean
iio_buffer_compass_discover (GUdevDevice *device)
{
+ SensorDevice *sensor_device;
+ DrvData *drv_data;
+ gboolean buffer_usable = FALSE;
+
if (!drv_check_udev_sensor_type (device, "iio-buffer-compass", NULL))
return FALSE;
- if (!is_buffer_usable (device))
+ sensor_device = iio_buffer_compass_open (device);
+ if (!sensor_device)
+ return FALSE;
+
+ /* Attempt to read from the sensor */
+ drv_data = (DrvData *) sensor_device->priv;
+ enable_ring_buffer (drv_data->buffer_data);
+
+ buffer_usable = is_buffer_usable(drv_data->dev_path);
+
+ /* Close the sensor until it has been claimed */
+ disable_ring_buffer (drv_data->buffer_data);
+ iio_buffer_compass_close (sensor_device);
+
+ if (!buffer_usable)
return FALSE;
g_debug ("Found IIO buffer compass at %s", g_udev_device_get_sysfs_path (device));
diff --git a/src/drv-iio-buffer-light.c b/src/drv-iio-buffer-light.c
index 2a524c6..7a423c5 100644
--- a/src/drv-iio-buffer-light.c
+++ b/src/drv-iio-buffer-light.c
@@ -20,7 +20,7 @@ typedef struct {
guint timeout_id;
GUdevDevice *dev;
- const char *dev_path;
+ char *dev_path;
int device_id;
BufferDrvData *buffer_data;
} DrvData;
@@ -156,7 +156,7 @@ iio_buffer_light_open (GUdevDevice *device)
drv_data = (DrvData *) sensor_device->priv;
drv_data->dev = g_object_ref (device);
drv_data->buffer_data = buffer_data;
- drv_data->dev_path = g_udev_device_get_device_file (device);
+ drv_data->dev_path = get_device_file (device);
return sensor_device;
}
@@ -175,10 +175,28 @@ iio_buffer_light_close (SensorDevice *sensor_device)
static gboolean
iio_buffer_light_discover (GUdevDevice *device)
{
+ SensorDevice *sensor_device;
+ DrvData *drv_data;
+ gboolean buffer_usable = FALSE;
+
if (!drv_check_udev_sensor_type (device, "iio-buffer-als", NULL))
return FALSE;
- if (!is_buffer_usable (device))
+ sensor_device = iio_buffer_light_open (device);
+ if (!sensor_device)
+ return FALSE;
+
+ /* Attempt to read from the sensor */
+ drv_data = (DrvData *) sensor_device->priv;
+ enable_ring_buffer (drv_data->buffer_data);
+
+ buffer_usable = is_buffer_usable(drv_data->dev_path);
+
+ /* Close the sensor until it has been claimed */
+ disable_ring_buffer (drv_data->buffer_data);
+ iio_buffer_light_close (sensor_device);
+
+ if (!buffer_usable)
return FALSE;
g_debug ("Found IIO buffer ALS at %s", g_udev_device_get_sysfs_path (device));
diff --git a/src/iio-buffer-utils.c b/src/iio-buffer-utils.c
index bc74e4c..29163ee 100644
--- a/src/iio-buffer-utils.c
+++ b/src/iio-buffer-utils.c
@@ -20,6 +20,7 @@
#include <string.h>
#include <errno.h>
#include <stdio.h>
+#include <glib/gstdio.h>
#define IIO_MIN_SAMPLING_FREQUENCY 10 /* Hz */
@@ -905,19 +906,28 @@ buffer_drv_data_new (GUdevDevice *device)
}
gboolean
-is_buffer_usable (GUdevDevice *device)
+is_buffer_usable (char *path)
{
- g_autofree char *trigger_name = NULL;
- BufferDrvData *buffer_data;
-
- /* Temporarily enable the buffer to ensure the kernel driver is buffer-capable */
- buffer_data = buffer_drv_data_new (device);
- if (!buffer_data)
- return FALSE;
+ gboolean buffer_usable = FALSE;
+ g_autofd int fp = -1;
+ GPollFD fds;
+
+ /* Attempt to read from the sensor buffer */
+ fp = g_open (path, O_RDONLY | O_NONBLOCK);
+ if (fp == -1) {
+ g_warning ("Failed to open '%s': %s", path, g_strerror (errno));
+ } else {
+ fds.fd = fp;
+ fds.events = G_IO_IN | G_IO_ERR;
+ g_poll (&fds, 1, 500);
+
+ if (fds.revents & G_IO_IN)
+ buffer_usable = TRUE;
+ else
+ g_warning ("Buffer '%s' did not have data within 0.5s", path);
+ }
- /* Destroy buffer information until actually needed (in the .open call) */
- g_clear_pointer (&buffer_data, buffer_drv_data_free);
- return TRUE;
+ return buffer_usable;
}
IIOSensorData *
diff --git a/src/iio-buffer-utils.h b/src/iio-buffer-utils.h
index 9c5e6db..2b95625 100644
--- a/src/iio-buffer-utils.h
+++ b/src/iio-buffer-utils.h
@@ -46,4 +46,4 @@ void buffer_drv_data_free (BufferDrvData *buffer_data);
BufferDrvData *buffer_drv_data_new (GUdevDevice *device);
void disable_ring_buffer (BufferDrvData *data);
gboolean enable_ring_buffer (BufferDrvData *data);
-gboolean is_buffer_usable (GUdevDevice *device);
+gboolean is_buffer_usable (char *path);
diff --git a/tests/integration-test.py b/tests/integration-test.py
index 8910539..b596eaa 100755
--- a/tests/integration-test.py
+++ b/tests/integration-test.py
@@ -555,6 +555,9 @@ class Tests(dbusmock.DBusTestCase):
['name', 'accel_3d-dev0'],
[]
)
+ data = self.read_file(top_srcdir + '/tests/iio-buffer-accel-data/orientation-normal.bin')
+ with open(mock_dev_data,'wb') as mock_file:
+ mock_file.write(data)
self.start_daemon()
self.assertEqual(self.get_dbus_property('HasAmbientLight'), False)
self.assertEqual(self.get_dbus_property('HasAccelerometer'), True)
@@ -566,7 +569,6 @@ class Tests(dbusmock.DBusTestCase):
self.assertEqual(self.read_sysfs_attr(accel, 'scan_elements/in_accel_y_en'), b'1')
self.assertEqual(self.read_sysfs_attr(accel, 'scan_elements/in_accel_z_en'), b'1')
- data = self.read_file(top_srcdir + '/tests/iio-buffer-accel-data/orientation-normal.bin')
with open(mock_dev_data,'wb') as mock_file:
mock_file.write(data)
self.proxy.ClaimAccelerometer()
@@ -595,6 +597,8 @@ class Tests(dbusmock.DBusTestCase):
def test_driver_buffer_without_trigger(self):
'''buffer driver picking without trigger'''
+ top_srcdir = os.getenv('top_srcdir', '.')
+ mock_dev_data = self.testbed.get_root_dir() + '/iio-dev-data.bin'
accel = self.testbed.add_device('iio', 'iio-buffer-accel0', None,
['name', 'IIO Test Accelerometer',
'buffer/enable', '0',
@@ -615,6 +619,9 @@ class Tests(dbusmock.DBusTestCase):
'IIO_SENSOR_PROXY_TYPE', 'iio-buffer-accel']
)
+ data = self.read_file(top_srcdir + '/tests/iio-buffer-accel-data/orientation-normal.bin')
+ with open(mock_dev_data,'wb') as mock_file:
+ mock_file.write(data)
self.start_daemon()
self.assertEqual(self.get_dbus_property('HasAmbientLight'), False)
@@ -696,10 +703,12 @@ class Tests(dbusmock.DBusTestCase):
)
env = os.environ.copy()
env['LC_NUMERIC'] = 'fr_FR.UTF-8'
+ data = self.read_file(top_srcdir + '/tests/iio-buffer-accel-data/orientation-normal.bin')
+ with open(mock_dev_data,'wb') as mock_file:
+ mock_file.write(data)
self.start_daemon(env=env)
self.assertEqual(self.get_dbus_property('HasAccelerometer'), True)
- data = self.read_file(top_srcdir + '/tests/iio-buffer-accel-data/orientation-normal.bin')
with open(mock_dev_data,'wb') as mock_file:
mock_file.write(data)
self.proxy.ClaimAccelerometer()
@@ -742,6 +751,9 @@ class Tests(dbusmock.DBusTestCase):
)
env = os.environ.copy()
env['LC_NUMERIC'] = 'fr_FR.UTF-8'
+ data = self.read_file(top_srcdir + '/tests/iio-buffer-accel-data/orientation-normal.bin')
+ with open(mock_dev_data,'wb') as mock_file:
+ mock_file.write(data)
self.start_daemon(env=env)
self.assertEqual(self.get_dbus_property('HasAccelerometer'), True)
--
2.50.0

View file

@ -0,0 +1,63 @@
From 5349b67bf68e07b3d4fef5d39579a2879a144a65 Mon Sep 17 00:00:00 2001
From: "Sicelo A. Mhlongo" <absicsz@gmail.com>
Date: Mon, 26 May 2025 18:05:38 +0200
Subject: [PATCH 4/4] integration-test: add test for sensors that report
non-working buffers
Confirm that when a sensor reports support for buffer operation, and the mode
can actually be enabled, but no data is returned, iio-sensor-proxy will detect
this and switch to polling mode.
---
tests/integration-test.py | 36 ++++++++++++++++++++++++++++++++++++
1 file changed, 36 insertions(+)
diff --git a/tests/integration-test.py b/tests/integration-test.py
index b596eaa..95b9da3 100755
--- a/tests/integration-test.py
+++ b/tests/integration-test.py
@@ -630,6 +630,42 @@ class Tests(dbusmock.DBusTestCase):
self.stop_daemon()
+ def test_iio_broken_buffer_accel(self):
+ '''iio sensor reporting broken buffer support'''
+ top_srcdir = os.getenv('top_srcdir', '.')
+ mock_dev_data = self.testbed.get_root_dir() + '/iio-dev-data.bin'
+ accel = self.testbed.add_device('iio', 'iio-buffer-accel0', None,
+ ['name', 'IIO Test Accelerometer',
+ 'buffer/enable', '0',
+ 'trigger/current_trigger', '',
+ 'scan_elements/in_accel_x_en', '0',
+ 'scan_elements/in_accel_x_index', '0',
+ 'scan_elements/in_accel_x_type', 'le:s16/32>>0',
+ 'scan_elements/in_accel_y_en', '0',
+ 'scan_elements/in_accel_y_index', '1',
+ 'scan_elements/in_accel_y_type', 'le:s16/32>>0',
+ 'scan_elements/in_accel_z_en', '0',
+ 'scan_elements/in_accel_z_index', '2',
+ 'scan_elements/in_accel_z_type', 'le:s16/32>>0',
+ 'scan_elements/in_timestamp_en', '1',
+ 'scan_elements/in_timestamp_index', '3',
+ 'scan_elements/in_timestamp_type', 'le:s64/64>>0'],
+ ['NAME', '"IIO Accelerometer"',
+ 'DEVNAME', '/dev/iio-buffer-accel-test',
+ 'IIO_SENSOR_PROXY_TYPE', 'iio-buffer-accel iio-poll-accel']
+ )
+ trigger = self.testbed.add_device('iio', 'trigger0', None,
+ ['name', 'accel_3d-dev0'],
+ []
+ )
+ self.start_daemon()
+ self.assertEqual(self.have_text_in_log('Built channel array'), True)
+ self.assertEqual(self.have_text_in_log('Disabled sensor'), True)
+ self.assertEqual(self.have_text_in_log('Found IIO poll accelerometer'), True)
+ self.assertEqual(self.get_dbus_property('HasAccelerometer'), True)
+
+ self.stop_daemon()
+
def test_unrequested_readings(self):
'''unrequested property updates'''
self.testbed.add_device('input', 'fake-light', None,
--
2.50.0

View file

@ -2,7 +2,7 @@
pkgname=iio-sensor-proxy pkgname=iio-sensor-proxy
pkgver=9999 pkgver=9999
pkgrel=10 pkgrel=11
pkgdesc="IIO sensors to D-Bus proxy" pkgdesc="IIO sensors to D-Bus proxy"
url="https://gitlab.freedesktop.org/hadess/iio-sensor-proxy" url="https://gitlab.freedesktop.org/hadess/iio-sensor-proxy"
arch="aarch64" arch="aarch64"
@ -30,6 +30,10 @@ source="https://gitlab.freedesktop.org/hadess/iio-sensor-proxy/-/archive/$_commi
0007-data-iio-sensor-proxy.service.in-add-AF_QIPCRTR.patch 0007-data-iio-sensor-proxy.service.in-add-AF_QIPCRTR.patch
0008-drv-ssc-implement-set_polling.patch 0008-drv-ssc-implement-set_polling.patch
0009-tests-integration-test-add-SSC-sensors.patch 0009-tests-integration-test-add-SSC-sensors.patch
0010-drv-iio-buffer-relocate-the-.discover-method-to-brin.patch
0011-buffer_drv_data_new-rework-trigger_name-handling.patch
0012-iio-buffer-attempt-to-read-from-buffer-during-sensor.patch
0013-integration-test-add-test-for-sensors-that-report-no.patch
" "
build() { build() {
@ -64,4 +68,8 @@ d4379f8e53eea02f53640752bef883870a44d0169cf821d3f5bb3245309cac1d1502a7848d5cce60
376999144da2c5a6374de73bfaaf0eb605c5c686640f4de8cbcabbe3e78f3fce4675d5bfdc2dd60dacaa84447a039cf22cc4e5fcda478ea77a00001f052a3d85 0007-data-iio-sensor-proxy.service.in-add-AF_QIPCRTR.patch 376999144da2c5a6374de73bfaaf0eb605c5c686640f4de8cbcabbe3e78f3fce4675d5bfdc2dd60dacaa84447a039cf22cc4e5fcda478ea77a00001f052a3d85 0007-data-iio-sensor-proxy.service.in-add-AF_QIPCRTR.patch
bf0ea8a078eb168937645a661fea5b979bf1747ee0c1cd556a238c25f4f26eefd6b2f7a1da1eb0b7d66dcafe24ce31521d71e1a188a324671b08178b392206af 0008-drv-ssc-implement-set_polling.patch bf0ea8a078eb168937645a661fea5b979bf1747ee0c1cd556a238c25f4f26eefd6b2f7a1da1eb0b7d66dcafe24ce31521d71e1a188a324671b08178b392206af 0008-drv-ssc-implement-set_polling.patch
2a208aa064e4f3d6cb24701f65c5cdc5d35a99f61489ac0ab5f336aa8229bc1aa7571b6d7e928a3a28e53b8e35a07655ec3e8b432d7295d82606f8b1f206e7af 0009-tests-integration-test-add-SSC-sensors.patch 2a208aa064e4f3d6cb24701f65c5cdc5d35a99f61489ac0ab5f336aa8229bc1aa7571b6d7e928a3a28e53b8e35a07655ec3e8b432d7295d82606f8b1f206e7af 0009-tests-integration-test-add-SSC-sensors.patch
f697507221c83e32012e1cfd4f08525791bdae6c3c4ac2d23cb532bf70820f7cebfba3e10c84d0a464dea7da93a3eb64d4d30dc6e5e3771fb9d6c2bcf7b47866 0010-drv-iio-buffer-relocate-the-.discover-method-to-brin.patch
74170846478fcd1cbe5738ae00174f0aa3783afa003f6afb1a19267d847c6685d237ab9e0ece53ea598be4b5fd9a28826179e61a52a97074c945a2bf2d4afe34 0011-buffer_drv_data_new-rework-trigger_name-handling.patch
d4ba829d8a8032bea72598d065e67f4cd3a58eaab7a0f942f4e5019236696aa4f5071318ca6eddc08c20c0681907de907a805582447422bc0e8017a53ef8e700 0012-iio-buffer-attempt-to-read-from-buffer-during-sensor.patch
9273f01d35e0f45ddc943808326d87f3a2e678ea29e607d3d70cabc9ea321db761cc170a86b3093553a4c3dfae1d81c5057d146b9a90ff490c85641f02b040df 0013-integration-test-add-test-for-sensors-that-report-no.patch
" "