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:
parent
d1f8b4179f
commit
b2399f7f09
5 changed files with 655 additions and 1 deletions
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
"
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue