From b2399f7f09daab4bbcfe7c3f7c8bc84a81b50a4f Mon Sep 17 00:00:00 2001 From: "Sicelo A. Mhlongo" Date: Fri, 4 Jul 2025 21:29:49 +0200 Subject: [PATCH] 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 --- ...elocate-the-.discover-method-to-brin.patch | 153 +++++++++ ...ata_new-rework-trigger_name-handling.patch | 132 ++++++++ ...pt-to-read-from-buffer-during-sensor.patch | 298 ++++++++++++++++++ ...-add-test-for-sensors-that-report-no.patch | 63 ++++ temp/iio-sensor-proxy/APKBUILD | 10 +- 5 files changed, 655 insertions(+), 1 deletion(-) create mode 100644 temp/iio-sensor-proxy/0010-drv-iio-buffer-relocate-the-.discover-method-to-brin.patch create mode 100644 temp/iio-sensor-proxy/0011-buffer_drv_data_new-rework-trigger_name-handling.patch create mode 100644 temp/iio-sensor-proxy/0012-iio-buffer-attempt-to-read-from-buffer-during-sensor.patch create mode 100644 temp/iio-sensor-proxy/0013-integration-test-add-test-for-sensors-that-report-no.patch diff --git a/temp/iio-sensor-proxy/0010-drv-iio-buffer-relocate-the-.discover-method-to-brin.patch b/temp/iio-sensor-proxy/0010-drv-iio-buffer-relocate-the-.discover-method-to-brin.patch new file mode 100644 index 0000000000..4bbf66cb0c --- /dev/null +++ b/temp/iio-sensor-proxy/0010-drv-iio-buffer-relocate-the-.discover-method-to-brin.patch @@ -0,0 +1,153 @@ +From f35d293e65841a3b9c0de778300c7fa58b181fd0 Mon Sep 17 00:00:00 2001 +From: "Sicelo A. Mhlongo" +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 + diff --git a/temp/iio-sensor-proxy/0011-buffer_drv_data_new-rework-trigger_name-handling.patch b/temp/iio-sensor-proxy/0011-buffer_drv_data_new-rework-trigger_name-handling.patch new file mode 100644 index 0000000000..b457056f70 --- /dev/null +++ b/temp/iio-sensor-proxy/0011-buffer_drv_data_new-rework-trigger_name-handling.patch @@ -0,0 +1,132 @@ +From 7416edf4da98d8e3b75f9eddb7e5c488ac4a4c54 Mon Sep 17 00:00:00 2001 +From: "Sicelo A. Mhlongo" +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 + diff --git a/temp/iio-sensor-proxy/0012-iio-buffer-attempt-to-read-from-buffer-during-sensor.patch b/temp/iio-sensor-proxy/0012-iio-buffer-attempt-to-read-from-buffer-during-sensor.patch new file mode 100644 index 0000000000..c266f0fa43 --- /dev/null +++ b/temp/iio-sensor-proxy/0012-iio-buffer-attempt-to-read-from-buffer-during-sensor.patch @@ -0,0 +1,298 @@ +From d00109194422a4fe3e9a7bc1235ffc492459c61a Mon Sep 17 00:00:00 2001 +From: "Sicelo A. Mhlongo" +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 + #include + #include ++#include + + #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 + diff --git a/temp/iio-sensor-proxy/0013-integration-test-add-test-for-sensors-that-report-no.patch b/temp/iio-sensor-proxy/0013-integration-test-add-test-for-sensors-that-report-no.patch new file mode 100644 index 0000000000..2e671c999e --- /dev/null +++ b/temp/iio-sensor-proxy/0013-integration-test-add-test-for-sensors-that-report-no.patch @@ -0,0 +1,63 @@ +From 5349b67bf68e07b3d4fef5d39579a2879a144a65 Mon Sep 17 00:00:00 2001 +From: "Sicelo A. Mhlongo" +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 + diff --git a/temp/iio-sensor-proxy/APKBUILD b/temp/iio-sensor-proxy/APKBUILD index 61a7e9a1c8..1c530081aa 100644 --- a/temp/iio-sensor-proxy/APKBUILD +++ b/temp/iio-sensor-proxy/APKBUILD @@ -2,7 +2,7 @@ pkgname=iio-sensor-proxy pkgver=9999 -pkgrel=10 +pkgrel=11 pkgdesc="IIO sensors to D-Bus proxy" url="https://gitlab.freedesktop.org/hadess/iio-sensor-proxy" 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 0008-drv-ssc-implement-set_polling.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() { @@ -64,4 +68,8 @@ d4379f8e53eea02f53640752bef883870a44d0169cf821d3f5bb3245309cac1d1502a7848d5cce60 376999144da2c5a6374de73bfaaf0eb605c5c686640f4de8cbcabbe3e78f3fce4675d5bfdc2dd60dacaa84447a039cf22cc4e5fcda478ea77a00001f052a3d85 0007-data-iio-sensor-proxy.service.in-add-AF_QIPCRTR.patch bf0ea8a078eb168937645a661fea5b979bf1747ee0c1cd556a238c25f4f26eefd6b2f7a1da1eb0b7d66dcafe24ce31521d71e1a188a324671b08178b392206af 0008-drv-ssc-implement-set_polling.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 "