temp/iio-sensor-proxy: drop fork

Signed-off-by: Clayton Craft <craftyguy@postmarketos.org>
Part-of: <https://gitlab.postmarketos.org/postmarketOS/pmaports/-/merge_requests/7788>
This commit is contained in:
Clayton Craft 2026-03-16 15:06:45 -07:00 committed by The Friendly Meow (merge) Bot
parent 91470d21d1
commit d65edea0ee
No known key found for this signature in database
15 changed files with 0 additions and 2052 deletions

View file

@ -1,37 +0,0 @@
From c73bdbca1b4278ada24dde68e0d09c352dcaa004 Mon Sep 17 00:00:00 2001
From: "Sicelo A. Mhlongo" <absicsz@gmail.com>
Date: Tue, 30 Sep 2025 13:17:16 +0200
Subject: [PATCH] WIP: iio-sensor-proxy.c: Do not exit based on sensor events
...
---
src/iio-sensor-proxy.c | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
diff --git a/src/iio-sensor-proxy.c b/src/iio-sensor-proxy.c
index 5f26d3d..7505783 100644
--- a/src/iio-sensor-proxy.c
+++ b/src/iio-sensor-proxy.c
@@ -766,8 +766,7 @@ name_acquired_handler (GDBusConnection *connection,
bail:
data->ret = 0;
- g_debug ("No sensors or missing kernel drivers for the sensors");
- g_main_loop_quit (data->loop);
+ g_debug ("No sensors or missing kernel drivers for the sensors. Waiting for hotplug sensors");
}
static gboolean
@@ -1050,9 +1049,6 @@ sensor_changes (GUdevClient *client,
send_driver_changed_dbus_event (data, i);
}
}
-
- if (!any_sensors_left (data))
- g_main_loop_quit (data->loop);
} else if (g_strcmp0 (action, "add") == 0) {
for (i = 0; i < G_N_ELEMENTS(drivers); i++) {
SensorDriver *driver = (SensorDriver *) drivers[i];
--
2.51.0

View file

@ -1,105 +0,0 @@
From 169b29cbb8232bb3ee82f8327a7ad5cdded0256c Mon Sep 17 00:00:00 2001
From: Dylan Van Assche <me@dylanvanassche.be>
Date: Sun, 23 Apr 2023 16:54:10 +0200
Subject: [PATCH 01/10] iio-sensor-proxy: depend on libssc
Add libssc library to iio-sensor-proxy and discover FastRPC
devices as possible subsystems for sensors. The presence of
FastRPC devices indicate the support for Qualcomm Snapdragon Sensor
Core (SSC).
---
meson.build | 3 +++
meson_options.txt | 4 ++++
src/iio-sensor-proxy.c | 15 ++++++++++++++-
src/meson.build | 7 +++++++
4 files changed, 28 insertions(+), 1 deletion(-)
diff --git a/meson.build b/meson.build
index 97270f8..0580d9e 100644
--- a/meson.build
+++ b/meson.build
@@ -46,6 +46,9 @@ gio_dep = dependency('gio-2.0')
gudev_dep = dependency('gudev-1.0', version: '>= 237')
polkit_gobject_dep = dependency('polkit-gobject-1', version: '>= 0.91')
polkit_policy_directory = polkit_gobject_dep.get_pkgconfig_variable('policydir')
+if get_option('ssc-support')
+ libssc_dep = dependency('libssc')
+endif
xmllint = find_program('xmllint', required: false)
diff --git a/meson_options.txt b/meson_options.txt
index de5fbf4..2b60f82 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -18,6 +18,10 @@ option('geoclue-user',
description: 'The USER (existing) as which geoclue service is running',
type: 'string',
value: 'geoclue')
+option('ssc-support',
+ description: 'Enable Qualcomm SSC support',
+ type: 'boolean',
+ value: false)
option('gtk_doc',
type: 'boolean',
value: false,
diff --git a/src/iio-sensor-proxy.c b/src/iio-sensor-proxy.c
index 02d9ba5..342023c 100644
--- a/src/iio-sensor-proxy.c
+++ b/src/iio-sensor-proxy.c
@@ -128,6 +128,11 @@ find_sensors (GUdevClient *client,
platform = g_udev_client_query_by_subsystem (client, "platform");
devices = g_list_concat (devices, input);
devices = g_list_concat (devices, platform);
+#ifdef HAS_LIBSSC
+ GList *fastrpc;
+ fastrpc = g_udev_client_query_by_subsystem (client, "misc");
+ devices = g_list_concat (devices, fastrpc);
+#endif
/* Find the devices */
for (l = devices; l != NULL; l = l->next) {
@@ -721,7 +726,15 @@ name_acquired_handler (GDBusConnection *connection,
gpointer user_data)
{
SensorData *data = user_data;
- const gchar * const subsystems[] = { "iio", "input", "platform", NULL };
+ const gchar * const subsystems[] = {
+ "iio",
+ "input",
+ "platform",
+#ifdef HAS_LIBSSC
+ "misc",
+#endif
+ NULL
+ };
guint i;
data->client = g_udev_client_new (subsystems);
diff --git a/src/meson.build b/src/meson.build
index 4b822fc..3e503de 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -1,5 +1,8 @@
config_h = configuration_data()
config_h.set_quoted('VERSION', meson.project_version())
+if get_option('ssc-support')
+ config_h.set_quoted('HAS_LIBSSC', '1')
+endif
config_h_files = configure_file(
output: 'config.h',
configuration: config_h
@@ -7,6 +10,10 @@ config_h_files = configure_file(
deps = [ gio_dep, gudev_dep, mathlib_dep, polkit_gobject_dep ]
+if get_option('ssc-support')
+ deps = deps + [ libssc_dep ]
+endif
+
resources = gnome.compile_resources(
'iio-sensor-proxy-resources', 'iio-sensor-proxy.gresource.xml',
c_name: 'iio_sensor_proxy',
--
2.47.1

View file

@ -1,195 +0,0 @@
From 176a35a40b639be7d0cdbc4fd67eb681586978dc Mon Sep 17 00:00:00 2001
From: Dylan Van Assche <me@dylanvanassche.be>
Date: Sun, 23 Apr 2023 17:54:46 +0200
Subject: [PATCH 02/10] proximity: support SSC proximity sensor
Add driver for the proximity sensor exposed by libssc.
---
src/drivers.h | 4 ++
src/drv-ssc-proximity.c | 128 ++++++++++++++++++++++++++++++++++++++++
src/iio-sensor-proxy.c | 3 +
src/meson.build | 6 ++
4 files changed, 141 insertions(+)
create mode 100644 src/drv-ssc-proximity.c
diff --git a/src/drivers.h b/src/drivers.h
index 33ad667..464e801 100644
--- a/src/drivers.h
+++ b/src/drivers.h
@@ -161,4 +161,8 @@ extern SensorDriver iio_buffer_compass;
extern SensorDriver iio_poll_proximity;
extern SensorDriver input_proximity;
+#ifdef HAS_LIBSSC
+extern SensorDriver ssc_proximity;
+#endif
+
gboolean drv_check_udev_sensor_type (GUdevDevice *device, const gchar *match, const char *name);
diff --git a/src/drv-ssc-proximity.c b/src/drv-ssc-proximity.c
new file mode 100644
index 0000000..f4aa897
--- /dev/null
+++ b/src/drv-ssc-proximity.c
@@ -0,0 +1,128 @@
+/*
+ * Copyright (c) 2023-2025 Dylan Van Assche
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 3 as published by
+ * the Free Software Foundation.
+ */
+
+#include "drivers.h"
+
+#include <fcntl.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <gio/gio.h>
+#include <libssc-sensor.h>
+#include <libssc-sensor-proximity.h>
+
+typedef struct DrvData {
+ SSCSensorProximity *sensor;
+ guint measurement_id;
+} DrvData;
+
+static gboolean
+ssc_proximity_discover (GUdevDevice *device)
+{
+ SSCSensorProximity *sensor = NULL;
+
+ /* Verify presence of FastRPC device */
+ if (!drv_check_udev_sensor_type (device, "ssc-proximity", NULL))
+ return FALSE;
+
+ /* Open and close SSC proximity sensor for discovering */
+ sensor = ssc_sensor_proximity_new_sync (NULL, NULL);
+ if (!sensor)
+ return FALSE;
+
+ if (!ssc_sensor_proximity_close_sync (sensor, NULL, NULL)) {
+ g_clear_object (&sensor);
+ return FALSE;
+ }
+
+ g_clear_object (&sensor);
+
+ g_debug ("Found SSC proximity at %s", g_udev_device_get_sysfs_path (device));
+ return TRUE;
+}
+
+static void
+measurement_cb (SSCSensorProximity *sensor, gboolean near, gpointer user_data)
+{
+ SensorDevice *sensor_device = user_data;
+ ProximityReadings readings;
+
+ readings.is_near = near ? PROXIMITY_NEAR_TRUE : PROXIMITY_NEAR_FALSE;
+ sensor_device->callback_func (sensor_device, (gpointer) &readings, sensor_device->user_data);
+}
+
+static SensorDevice *
+ssc_proximity_open (GUdevDevice *device)
+{
+ SensorDevice *sensor_device;
+ DrvData *drv_data;
+ g_autoptr (GError) error = NULL;
+
+ sensor_device = g_new0 (SensorDevice, 1);
+ sensor_device->priv = g_new0 (DrvData, 1);
+ drv_data = (DrvData *) sensor_device->priv;
+
+ /* Create sensor */
+ drv_data->sensor = ssc_sensor_proximity_new_sync (NULL, &error);
+ if (!drv_data->sensor) {
+ g_warning ("Creating SSC proximity sensor failed: %s", error->message);
+ g_clear_pointer (&sensor_device->priv, g_free);
+ g_free (sensor_device);
+ return NULL;
+ }
+ g_object_get (drv_data->sensor,
+ SSC_SENSOR_NAME, &sensor_device->name,
+ NULL);
+
+ /* Start listening for measurements */
+ drv_data->measurement_id = g_signal_connect (drv_data->sensor,
+ "measurement",
+ G_CALLBACK (measurement_cb),
+ sensor_device);
+
+ /* Enable sensor */
+ if (!ssc_sensor_proximity_open_sync (drv_data->sensor, NULL, &error)) {
+ g_warning ("Opening SSC proximity sensor failed: %s", error->message);
+ g_clear_object (&drv_data->sensor);
+ g_clear_pointer (&sensor_device->priv, g_free);
+ g_free (sensor_device);
+ return NULL;
+ }
+
+ return sensor_device;
+}
+
+static void
+ssc_proximity_close (SensorDevice *sensor_device)
+{
+ g_autoptr (GError) error = NULL;
+ DrvData *drv_data = (DrvData *) sensor_device->priv;
+
+ /* Stop listening for measurements */
+ g_warn_if_fail (drv_data->measurement_id > 0);
+ g_signal_handler_disconnect (drv_data->sensor, drv_data->measurement_id);
+
+ /* Disable sensor */
+ if (!ssc_sensor_proximity_close_sync (drv_data->sensor, NULL, &error))
+ g_warning ("Closing SSC proximity sensor failed: %s", error->message);
+
+ g_clear_object (&drv_data->sensor);
+ g_clear_pointer (&sensor_device->priv, g_free);
+ g_free (sensor_device);
+}
+
+SensorDriver ssc_proximity = {
+ .driver_name = "SSC proximity sensor",
+ .type = DRIVER_TYPE_PROXIMITY,
+
+ .discover = ssc_proximity_discover,
+ .open = ssc_proximity_open,
+ .close = ssc_proximity_close,
+};
diff --git a/src/iio-sensor-proxy.c b/src/iio-sensor-proxy.c
index 342023c..18263c5 100644
--- a/src/iio-sensor-proxy.c
+++ b/src/iio-sensor-proxy.c
@@ -79,6 +79,9 @@ static const SensorDriver * const drivers[] = {
&iio_buffer_compass,
&iio_poll_proximity,
&input_proximity,
+#ifdef HAS_LIBSSC
+ &ssc_proximity,
+#endif
};
static ReadingsUpdateFunc driver_type_to_callback_func (DriverType type);
diff --git a/src/meson.build b/src/meson.build
index 3e503de..9a74481 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -45,6 +45,12 @@ sources = [
config_h_files,
]
+if get_option('ssc-support')
+ sources = sources + [
+ 'drv-ssc-proximity.c',
+ ]
+endif
+
executable('iio-sensor-proxy',
sources,
dependencies: deps,
--
2.47.1

View file

@ -1,188 +0,0 @@
From 43440a5ef95bccae67ca64f0abe060f194574da5 Mon Sep 17 00:00:00 2001
From: Dylan Van Assche <me@dylanvanassche.be>
Date: Mon, 24 Apr 2023 16:56:20 +0200
Subject: [PATCH 03/10] light: support SSC light sensor
Add driver for the light sensor exposed by libssc.
---
src/drivers.h | 1 +
src/drv-ssc-light.c | 129 +++++++++++++++++++++++++++++++++++++++++
src/iio-sensor-proxy.c | 1 +
src/meson.build | 1 +
4 files changed, 132 insertions(+)
create mode 100644 src/drv-ssc-light.c
diff --git a/src/drivers.h b/src/drivers.h
index 464e801..46df2fd 100644
--- a/src/drivers.h
+++ b/src/drivers.h
@@ -163,6 +163,7 @@ extern SensorDriver input_proximity;
#ifdef HAS_LIBSSC
extern SensorDriver ssc_proximity;
+extern SensorDriver ssc_light;
#endif
gboolean drv_check_udev_sensor_type (GUdevDevice *device, const gchar *match, const char *name);
diff --git a/src/drv-ssc-light.c b/src/drv-ssc-light.c
new file mode 100644
index 0000000..eb43d6c
--- /dev/null
+++ b/src/drv-ssc-light.c
@@ -0,0 +1,129 @@
+/*
+ * Copyright (c) 2023-2025 Dylan Van Assche
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 3 as published by
+ * the Free Software Foundation.
+ */
+
+#include "drivers.h"
+
+#include <fcntl.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <gio/gio.h>
+#include <libssc-sensor.h>
+#include <libssc-sensor-light.h>
+
+typedef struct DrvData {
+ SSCSensorLight *sensor;
+ guint measurement_id;
+} DrvData;
+
+static gboolean
+ssc_light_discover (GUdevDevice *device)
+{
+ SSCSensorLight *sensor;
+
+ /* Verify presence of FastRPC device */
+ if (!drv_check_udev_sensor_type (device, "ssc-light", NULL))
+ return FALSE;
+
+ /* Open and close SSC light sensor for discovering */
+ sensor = ssc_sensor_light_new_sync (NULL, NULL);
+ if (!sensor)
+ return FALSE;
+
+ if (!ssc_sensor_light_close_sync (sensor, NULL, NULL)) {
+ g_clear_object (&sensor);
+ return FALSE;
+ }
+
+ g_clear_object (&sensor);
+
+ g_debug ("Found SSC light at %s", g_udev_device_get_sysfs_path (device));
+ return TRUE;
+}
+
+static void
+measurement_cb (SSCSensorLight *sensor, gfloat intensity, gpointer user_data)
+{
+ SensorDevice *sensor_device = user_data;
+ LightReadings readings;
+
+ readings.level = intensity;
+ readings.uses_lux = TRUE;
+ sensor_device->callback_func (sensor_device, (gpointer) &readings, sensor_device->user_data);
+}
+
+static SensorDevice *
+ssc_light_open (GUdevDevice *device)
+{
+ SensorDevice *sensor_device;
+ DrvData *drv_data;
+ g_autoptr (GError) error = NULL;
+
+ sensor_device = g_new0 (SensorDevice, 1);
+ sensor_device->priv = g_new0 (DrvData, 1);
+ drv_data = (DrvData *) sensor_device->priv;
+
+ /* Create sensor */
+ drv_data->sensor = ssc_sensor_light_new_sync (NULL, &error);
+ if (!drv_data->sensor) {
+ g_warning ("Creating SSC light sensor failed: %s", error->message);
+ g_clear_pointer (&sensor_device->priv, g_free);
+ g_free (sensor_device);
+ return NULL;
+ }
+ g_object_get (drv_data->sensor,
+ SSC_SENSOR_NAME, &sensor_device->name,
+ NULL);
+
+ /* Start listening for measurements */
+ drv_data->measurement_id = g_signal_connect (drv_data->sensor,
+ "measurement",
+ G_CALLBACK (measurement_cb),
+ sensor_device);
+
+ /* Enable sensor */
+ if (!ssc_sensor_light_open_sync (drv_data->sensor, NULL, &error)) {
+ g_warning ("Opening SSC light sensor failed: %s", error->message);
+ g_clear_object (&drv_data->sensor);
+ g_clear_pointer (&sensor_device->priv, g_free);
+ g_free (sensor_device);
+ return NULL;
+ }
+
+ return sensor_device;
+}
+
+static void
+ssc_light_close (SensorDevice *sensor_device)
+{
+ g_autoptr (GError) error = NULL;
+ DrvData *drv_data = (DrvData *) sensor_device->priv;
+
+ /* Stop listening for measurements */
+ g_warn_if_fail (drv_data->measurement_id > 0);
+ g_signal_handler_disconnect (drv_data->sensor, drv_data->measurement_id);
+
+ /* Disable sensor */
+ if (!ssc_sensor_light_close_sync (drv_data->sensor, NULL, &error))
+ g_warning ("Closing SSC light sensor failed: %s", error->message);
+
+ g_clear_object (&drv_data->sensor);
+ g_clear_pointer (&sensor_device->priv, g_free);
+ g_free (sensor_device);
+}
+
+SensorDriver ssc_light = {
+ .driver_name = "SSC light sensor",
+ .type = DRIVER_TYPE_LIGHT,
+
+ .discover = ssc_light_discover,
+ .open = ssc_light_open,
+ .close = ssc_light_close,
+};
diff --git a/src/iio-sensor-proxy.c b/src/iio-sensor-proxy.c
index 18263c5..b4eacc3 100644
--- a/src/iio-sensor-proxy.c
+++ b/src/iio-sensor-proxy.c
@@ -81,6 +81,7 @@ static const SensorDriver * const drivers[] = {
&input_proximity,
#ifdef HAS_LIBSSC
&ssc_proximity,
+ &ssc_light,
#endif
};
diff --git a/src/meson.build b/src/meson.build
index 9a74481..2f3c1e6 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -48,6 +48,7 @@ sources = [
if get_option('ssc-support')
sources = sources + [
'drv-ssc-proximity.c',
+ 'drv-ssc-light.c',
]
endif
--
2.47.1

View file

@ -1,215 +0,0 @@
From 8c296891214b6b7ebbd3263550ef9296e9a9ff1f Mon Sep 17 00:00:00 2001
From: Dylan Van Assche <me@dylanvanassche.be>
Date: Mon, 24 Apr 2023 17:01:10 +0200
Subject: [PATCH 04/10] accelerometer: support SSC accelerometer sensor
Add driver for the accelerometer sensor exposed by libssc.
Mount matrix is supported through environment variables set
by udev rules because extracting the mount matrix from the
Qualcomm Snapdragon Sensor Core (SSC) firmware is not possible yet.
---
src/drivers.h | 1 +
src/drv-ssc-accel.c | 153 +++++++++++++++++++++++++++++++++++++++++
src/iio-sensor-proxy.c | 1 +
src/meson.build | 1 +
4 files changed, 156 insertions(+)
create mode 100644 src/drv-ssc-accel.c
diff --git a/src/drivers.h b/src/drivers.h
index 46df2fd..40707ec 100644
--- a/src/drivers.h
+++ b/src/drivers.h
@@ -164,6 +164,7 @@ extern SensorDriver input_proximity;
#ifdef HAS_LIBSSC
extern SensorDriver ssc_proximity;
extern SensorDriver ssc_light;
+extern SensorDriver ssc_accel;
#endif
gboolean drv_check_udev_sensor_type (GUdevDevice *device, const gchar *match, const char *name);
diff --git a/src/drv-ssc-accel.c b/src/drv-ssc-accel.c
new file mode 100644
index 0000000..676303b
--- /dev/null
+++ b/src/drv-ssc-accel.c
@@ -0,0 +1,153 @@
+/*
+ * Copyright (c) 2023-2025 Dylan Van Assche
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 3 as published by
+ * the Free Software Foundation.
+ */
+
+#include "drivers.h"
+#include "accel-mount-matrix.h"
+
+#include <fcntl.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <gio/gio.h>
+#include <libssc-sensor.h>
+#include <libssc-sensor-accelerometer.h>
+
+typedef struct DrvData {
+ SSCSensorAccelerometer *sensor;
+ guint measurement_id;
+ AccelVec3 *mount_matrix;
+ AccelLocation location;
+ AccelScale scale;
+} DrvData;
+
+static gboolean
+ssc_accelerometer_discover (GUdevDevice *device)
+{
+ SSCSensorAccelerometer *sensor = NULL;
+
+ /* Verify presence of FastRPC device */
+ if (!drv_check_udev_sensor_type (device, "ssc-accel", NULL))
+ return FALSE;
+
+ /* Open and close SSC accelerometer for discovering */
+ sensor = ssc_sensor_accelerometer_new_sync (NULL, NULL);
+ if (!sensor)
+ return FALSE;
+
+ if (!ssc_sensor_accelerometer_close_sync (sensor, NULL, NULL)) {
+ g_clear_object (&sensor);
+ return FALSE;
+ }
+
+ g_clear_object (&sensor);
+
+ g_debug ("Found SSC accelerometer at %s", g_udev_device_get_sysfs_path (device));
+ return TRUE;
+}
+
+static void
+measurement_cb (SSCSensorAccelerometer *sensor, gfloat accel_x, gfloat accel_y, gfloat accel_z, gpointer user_data)
+{
+ SensorDevice *sensor_device = user_data;
+ DrvData *drv_data = (DrvData *) sensor_device->priv;
+ AccelReadings readings;
+ AccelVec3 tmp;
+
+ tmp.x = accel_x;
+ tmp.y = accel_y;
+ tmp.z = accel_z;
+
+ if (!apply_mount_matrix (drv_data->mount_matrix, &tmp))
+ g_warning ("Could not apply mount matrix");
+
+ readings.accel_x = tmp.x;
+ readings.accel_y = tmp.y;
+ readings.accel_z = tmp.z;
+ copy_accel_scale (&readings.scale, drv_data->scale);
+
+ sensor_device->callback_func (sensor_device, (gpointer) &readings, sensor_device->user_data);
+}
+
+static SensorDevice *
+ssc_accelerometer_open (GUdevDevice *device)
+{
+ SensorDevice *sensor_device;
+ DrvData *drv_data;
+ g_autoptr (GError) error = NULL;
+
+ sensor_device = g_new0 (SensorDevice, 1);
+ sensor_device->priv = g_new0 (DrvData, 1);
+ drv_data = (DrvData *) sensor_device->priv;
+
+ /* Setup accel attributes */
+ drv_data->mount_matrix = setup_mount_matrix (device);
+ drv_data->location = setup_accel_location (device);
+ set_accel_scale (&drv_data->scale, 1.0);
+
+ /* Create sensor */
+ drv_data->sensor = ssc_sensor_accelerometer_new_sync (NULL, &error);
+ if (!drv_data->sensor) {
+ g_warning ("Creating SSC accelerometer sensor failed: %s", error->message);
+ g_clear_pointer (&drv_data->mount_matrix, g_free);
+ g_clear_pointer (&sensor_device->priv, g_free);
+ g_free (sensor_device);
+ return NULL;
+ }
+ g_object_get (drv_data->sensor,
+ SSC_SENSOR_NAME, &sensor_device->name,
+ NULL);
+
+ /* Start listening for measurements */
+ drv_data->measurement_id = g_signal_connect (drv_data->sensor,
+ "measurement",
+ G_CALLBACK (measurement_cb),
+ sensor_device);
+
+ /* Enable sensor */
+ if (!ssc_sensor_accelerometer_open_sync (drv_data->sensor, NULL, &error)) {
+ g_warning ("Opening SSC accelerometer sensor failed: %s", error->message);
+ g_clear_object (&drv_data->sensor);
+ g_clear_pointer (&drv_data->mount_matrix, g_free);
+ g_clear_pointer (&sensor_device->priv, g_free);
+ g_free (sensor_device);
+ return NULL;
+ }
+
+ return sensor_device;
+}
+
+static void
+ssc_accelerometer_close (SensorDevice *sensor_device)
+{
+ g_autoptr (GError) error = NULL;
+ DrvData *drv_data = (DrvData *) sensor_device->priv;
+
+ /* Stop listening for measurements */
+ g_warn_if_fail (drv_data->measurement_id > 0);
+ g_signal_handler_disconnect (drv_data->sensor, drv_data->measurement_id);
+
+ /* Disable sensor */
+ if (!ssc_sensor_accelerometer_close_sync (drv_data->sensor, NULL, &error))
+ g_warning ("Closing SSC accelerometer sensor failed: %s", error->message);
+
+ g_clear_object (&drv_data->sensor);
+ g_clear_pointer (&drv_data->mount_matrix, g_free);
+ g_clear_pointer (&sensor_device->priv, g_free);
+ g_free (sensor_device);
+}
+
+SensorDriver ssc_accel = {
+ .driver_name = "SSC accelerometer sensor",
+ .type = DRIVER_TYPE_ACCEL,
+
+ .discover = ssc_accelerometer_discover,
+ .open = ssc_accelerometer_open,
+ .close = ssc_accelerometer_close,
+};
diff --git a/src/iio-sensor-proxy.c b/src/iio-sensor-proxy.c
index b4eacc3..e99f641 100644
--- a/src/iio-sensor-proxy.c
+++ b/src/iio-sensor-proxy.c
@@ -82,6 +82,7 @@ static const SensorDriver * const drivers[] = {
#ifdef HAS_LIBSSC
&ssc_proximity,
&ssc_light,
+ &ssc_accel,
#endif
};
diff --git a/src/meson.build b/src/meson.build
index 2f3c1e6..d59cfdd 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -49,6 +49,7 @@ if get_option('ssc-support')
sources = sources + [
'drv-ssc-proximity.c',
'drv-ssc-light.c',
+ 'drv-ssc-accel.c',
]
endif
--
2.47.1

View file

@ -1,188 +0,0 @@
From 861e0e9bcc1ba400648e1e4a990a331284fff6e0 Mon Sep 17 00:00:00 2001
From: Dylan Van Assche <me@dylanvanassche.be>
Date: Mon, 24 Apr 2023 18:29:15 +0200
Subject: [PATCH 05/10] compass: support SSC compass sensor
Add driver for the compass sensor exposed by libssc.
---
src/drivers.h | 1 +
src/drv-ssc-compass.c | 129 +++++++++++++++++++++++++++++++++++++++++
src/iio-sensor-proxy.c | 1 +
src/meson.build | 1 +
4 files changed, 132 insertions(+)
create mode 100644 src/drv-ssc-compass.c
diff --git a/src/drivers.h b/src/drivers.h
index 40707ec..5e0347c 100644
--- a/src/drivers.h
+++ b/src/drivers.h
@@ -165,6 +165,7 @@ extern SensorDriver input_proximity;
extern SensorDriver ssc_proximity;
extern SensorDriver ssc_light;
extern SensorDriver ssc_accel;
+extern SensorDriver ssc_compass;
#endif
gboolean drv_check_udev_sensor_type (GUdevDevice *device, const gchar *match, const char *name);
diff --git a/src/drv-ssc-compass.c b/src/drv-ssc-compass.c
new file mode 100644
index 0000000..c6f11a9
--- /dev/null
+++ b/src/drv-ssc-compass.c
@@ -0,0 +1,129 @@
+/*
+ * Copyright (c) 2023-2025 Dylan Van Assche
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 3 as published by
+ * the Free Software Foundation.
+ */
+
+#include "drivers.h"
+
+#include <fcntl.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <gio/gio.h>
+#include <libssc-sensor.h>
+#include <libssc-sensor-compass.h>
+
+typedef struct DrvData {
+ SSCSensorCompass *sensor;
+ guint measurement_id;
+} DrvData;
+
+static gboolean
+ssc_compass_discover (GUdevDevice *device)
+{
+ SSCSensorCompass *sensor = NULL;
+
+ /* Verify presence of FastRPC device */
+ if (!drv_check_udev_sensor_type (device, "ssc-compass", NULL))
+ return FALSE;
+
+ /* Open and close SSC compass for discovering */
+ sensor = ssc_sensor_compass_new_sync (NULL, NULL);
+ if (!sensor)
+ return FALSE;
+
+ if (!ssc_sensor_compass_close_sync (sensor, NULL, NULL)) {
+ g_clear_object(&sensor);
+ return FALSE;
+ }
+
+ g_clear_object(&sensor);
+
+ g_debug ("Found SSC compass at %s", g_udev_device_get_sysfs_path (device));
+ return TRUE;
+}
+
+static void
+measurement_cb (SSCSensorCompass *sensor, gfloat azimuth, gpointer user_data)
+{
+ SensorDevice *sensor_device = user_data;
+ CompassReadings readings;
+
+ readings.heading = azimuth;
+
+ sensor_device->callback_func (sensor_device, (gpointer) &readings, sensor_device->user_data);
+}
+
+static SensorDevice *
+ssc_compass_open (GUdevDevice *device)
+{
+ SensorDevice *sensor_device;
+ DrvData *drv_data;
+ g_autoptr (GError) error = NULL;
+
+ sensor_device = g_new0 (SensorDevice, 1);
+ sensor_device->priv = g_new0 (DrvData, 1);
+ drv_data = (DrvData *) sensor_device->priv;
+
+ /* Create sensor */
+ drv_data->sensor = ssc_sensor_compass_new_sync (NULL, &error);
+ if (!drv_data->sensor) {
+ g_warning ("Creating SSC compass sensor failed: %s", error->message);
+ g_clear_pointer (&sensor_device->priv, g_free);
+ g_free (sensor_device);
+ return NULL;
+ }
+ g_object_get (drv_data->sensor,
+ SSC_SENSOR_NAME, &sensor_device->name,
+ NULL);
+
+ /* Start listening for measurements */
+ drv_data->measurement_id = g_signal_connect (drv_data->sensor,
+ "measurement",
+ G_CALLBACK (measurement_cb),
+ sensor_device);
+
+ /* Enable sensor */
+ if (!ssc_sensor_compass_open_sync (drv_data->sensor, NULL, &error)) {
+ g_warning ("Opening SSC compass sensor failed: %s", error->message);
+ g_clear_object (&drv_data->sensor);
+ g_clear_pointer (&sensor_device->priv, g_free);
+ g_free (sensor_device);
+ return NULL;
+ }
+
+ return sensor_device;
+}
+
+static void
+ssc_compass_close (SensorDevice *sensor_device)
+{
+ g_autoptr (GError) error = NULL;
+ DrvData *drv_data = (DrvData *) sensor_device->priv;
+
+ /* Stop listening for measurements */
+ g_warn_if_fail (drv_data->measurement_id > 0);
+ g_signal_handler_disconnect (drv_data->sensor, drv_data->measurement_id);
+
+ /* Disable sensor */
+ if (!ssc_sensor_compass_close_sync (drv_data->sensor, NULL, &error))
+ g_warning ("Closing SSC compass sensor failed: %s", error->message);
+
+ g_clear_object (&drv_data->sensor);
+ g_clear_pointer (&sensor_device->priv, g_free);
+ g_free (sensor_device);
+}
+
+SensorDriver ssc_compass = {
+ .driver_name = "SSC compass sensor",
+ .type = DRIVER_TYPE_COMPASS,
+
+ .discover = ssc_compass_discover,
+ .open = ssc_compass_open,
+ .close = ssc_compass_close,
+};
diff --git a/src/iio-sensor-proxy.c b/src/iio-sensor-proxy.c
index e99f641..9e8760c 100644
--- a/src/iio-sensor-proxy.c
+++ b/src/iio-sensor-proxy.c
@@ -83,6 +83,7 @@ static const SensorDriver * const drivers[] = {
&ssc_proximity,
&ssc_light,
&ssc_accel,
+ &ssc_compass,
#endif
};
diff --git a/src/meson.build b/src/meson.build
index d59cfdd..1e753cc 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -50,6 +50,7 @@ if get_option('ssc-support')
'drv-ssc-proximity.c',
'drv-ssc-light.c',
'drv-ssc-accel.c',
+ 'drv-ssc-compass.c',
]
endif
--
2.47.1

View file

@ -1,55 +0,0 @@
From 630eab1d4a0773f1126a5e3dc56a95cece71a69d Mon Sep 17 00:00:00 2001
From: Dylan Van Assche <me@dylanvanassche.be>
Date: Wed, 26 Apr 2023 18:54:07 +0200
Subject: [PATCH 06/10] data: add libssc udev rules
Add udev rules to indicate possible sensor types like
ssc-accel, ssc-light, ssc-proximity, and ssc-compass
when a FastRPC node is present. This commit enables
the usage of the libssc sensor drivers in iio-sensor-proxy
which are introduced in the previous commits.
---
data/80-iio-sensor-proxy-libssc.rules | 11 +++++++++++
data/meson.build | 10 +++++++++-
2 files changed, 20 insertions(+), 1 deletion(-)
create mode 100644 data/80-iio-sensor-proxy-libssc.rules
diff --git a/data/80-iio-sensor-proxy-libssc.rules b/data/80-iio-sensor-proxy-libssc.rules
new file mode 100644
index 0000000..c4fad16
--- /dev/null
+++ b/data/80-iio-sensor-proxy-libssc.rules
@@ -0,0 +1,11 @@
+# iio-sensor-proxy: libssc
+# IIO sensor to D-Bus proxy with libssc support
+
+ACTION=="remove", GOTO="iio_sensor_proxy_libssc_end"
+
+# Set the sensor type for all the types we recognise for SDSP/ADSP.
+# Some devices expose the sensors via a separate SDSP while others re-use ADSP.
+# These DSPs expose itself as /dev/fastrpc-* in the misc subsystem.
+SUBSYSTEM=="misc", KERNEL=="fastrpc-*", ENV{IIO_SENSOR_PROXY_TYPE}+="ssc-accel ssc-light ssc-proximity ssc-compass"
+
+LABEL="iio_sensor_proxy_libssc_end"
diff --git a/data/meson.build b/data/meson.build
index 97dbc07..8b78125 100644
--- a/data/meson.build
+++ b/data/meson.build
@@ -1,5 +1,13 @@
+rules = files(
+ '80-iio-sensor-proxy.rules'
+)
+
+if get_option('ssc-support')
+ rules += files('80-iio-sensor-proxy-libssc.rules')
+endif
+
install_data(
- '80-iio-sensor-proxy.rules',
+ rules,
install_dir: udev_rules_dir
)
--
2.47.1

View file

@ -1,29 +0,0 @@
From 4522c9a8e07e6645c0c460d93cd57c67768fae71 Mon Sep 17 00:00:00 2001
From: Dylan Van Assche <me@dylanvanassche.be>
Date: Sat, 1 Jun 2024 21:15:15 +0200
Subject: [PATCH 07/10] data: iio-sensor-proxy.service.in: add AF_QIPCRTR
Allow AF_QIPCRTR in lockdown for libssc.
Libssc uses the QMI protocol over QRTR in the kernel.
Systemd limits the address families to UNIX, LOCAL, and NETLINK.
However, QRTR uses its own address family: AF_QIPCRTR.
Add it to the allowed families.
---
data/iio-sensor-proxy.service.in | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/data/iio-sensor-proxy.service.in b/data/iio-sensor-proxy.service.in
index 4bc921b..29ea3c0 100644
--- a/data/iio-sensor-proxy.service.in
+++ b/data/iio-sensor-proxy.service.in
@@ -14,6 +14,6 @@ ProtectControlGroups=true
ProtectHome=true
ProtectKernelModules=true
PrivateTmp=true
-RestrictAddressFamilies=AF_UNIX AF_LOCAL AF_NETLINK
+RestrictAddressFamilies=AF_UNIX AF_LOCAL AF_NETLINK AF_QIPCRTR
MemoryDenyWriteExecute=true
RestrictRealtime=true
--
2.47.1

View file

@ -1,430 +0,0 @@
From 7a195b942cf59088a298f77b00e44291c8dc67d0 Mon Sep 17 00:00:00 2001
From: Dylan Van Assche <me@dylanvanassche.be>
Date: Sat, 11 Jan 2025 21:11:36 +0100
Subject: [PATCH 08/10] drv-ssc-*: implement set_polling
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
set_polling method allows sensors to be enabled/disabled on demand
of the consumers. If all consumers stop listen for a sensor,
iio-sensor-proxy will use this method to disable the sensor hardware
and the other way around.
Co-Developed-By: Jonas Dreßler <verdre@v0yd.nl>
Co-Developed-By: Sicelo A. Mhlongo <absicsz@gmail.com>
---
src/drv-ssc-accel.c | 65 ++++++++++++++++++----------------
src/drv-ssc-compass.c | 77 +++++++++++++++++++++--------------------
src/drv-ssc-light.c | 74 +++++++++++++++++++--------------------
src/drv-ssc-proximity.c | 75 +++++++++++++++++++--------------------
4 files changed, 146 insertions(+), 145 deletions(-)
diff --git a/src/drv-ssc-accel.c b/src/drv-ssc-accel.c
index 676303b..745304c 100644
--- a/src/drv-ssc-accel.c
+++ b/src/drv-ssc-accel.c
@@ -80,7 +80,6 @@ ssc_accelerometer_open (GUdevDevice *device)
{
SensorDevice *sensor_device;
DrvData *drv_data;
- g_autoptr (GError) error = NULL;
sensor_device = g_new0 (SensorDevice, 1);
sensor_device->priv = g_new0 (DrvData, 1);
@@ -91,38 +90,43 @@ ssc_accelerometer_open (GUdevDevice *device)
drv_data->location = setup_accel_location (device);
set_accel_scale (&drv_data->scale, 1.0);
- /* Create sensor */
- drv_data->sensor = ssc_sensor_accelerometer_new_sync (NULL, &error);
- if (!drv_data->sensor) {
- g_warning ("Creating SSC accelerometer sensor failed: %s", error->message);
- g_clear_pointer (&drv_data->mount_matrix, g_free);
- g_clear_pointer (&sensor_device->priv, g_free);
- g_free (sensor_device);
- return NULL;
- }
- g_object_get (drv_data->sensor,
- SSC_SENSOR_NAME, &sensor_device->name,
- NULL);
-
- /* Start listening for measurements */
- drv_data->measurement_id = g_signal_connect (drv_data->sensor,
- "measurement",
- G_CALLBACK (measurement_cb),
- sensor_device);
-
- /* Enable sensor */
- if (!ssc_sensor_accelerometer_open_sync (drv_data->sensor, NULL, &error)) {
- g_warning ("Opening SSC accelerometer sensor failed: %s", error->message);
- g_clear_object (&drv_data->sensor);
- g_clear_pointer (&drv_data->mount_matrix, g_free);
- g_clear_pointer (&sensor_device->priv, g_free);
- g_free (sensor_device);
- return NULL;
- }
-
return sensor_device;
}
+static void
+ssc_accelerometer_set_polling (SensorDevice *sensor_device, gboolean state)
+{
+ DrvData *drv_data = (DrvData *) sensor_device->priv;
+ g_autoptr (GError) error = NULL;
+ if (state) {
+ /* Create sensor */
+ drv_data->sensor = ssc_sensor_accelerometer_new_sync (NULL, &error);
+ if (!drv_data->sensor) {
+ g_warning ("Creating SSC accelerometer sensor failed: %s", error ? error->message : "UNKNOWN");
+ return;
+ }
+
+ /* Start listening for measurements */
+ drv_data->measurement_id = g_signal_connect (drv_data->sensor,
+ "measurement",
+ G_CALLBACK (measurement_cb),
+ sensor_device);
+ /* Enable sensor */
+ if (!ssc_sensor_accelerometer_open_sync (drv_data->sensor, NULL, &error)) {
+ g_warning ("Opening SSC accelerometer sensor failed: %s", error ? error->message : "UNKNOWN");
+ return;
+ }
+ } else {
+ /* Stop listening for measurements */
+ g_warn_if_fail (drv_data->measurement_id > 0);
+ g_signal_handler_disconnect (drv_data->sensor, drv_data->measurement_id);
+
+ /* Disable sensor */
+ if (!ssc_sensor_accelerometer_close_sync (drv_data->sensor, NULL, &error))
+ g_warning ("Closing SSC accelerometer sensor failed: %s", error ? error->message : "UNKNOWN");
+ }
+}
+
static void
ssc_accelerometer_close (SensorDevice *sensor_device)
{
@@ -149,5 +153,6 @@ SensorDriver ssc_accel = {
.discover = ssc_accelerometer_discover,
.open = ssc_accelerometer_open,
+ .set_polling = ssc_accelerometer_set_polling,
.close = ssc_accelerometer_close,
};
diff --git a/src/drv-ssc-compass.c b/src/drv-ssc-compass.c
index c6f11a9..f4af37b 100644
--- a/src/drv-ssc-compass.c
+++ b/src/drv-ssc-compass.c
@@ -63,56 +63,56 @@ static SensorDevice *
ssc_compass_open (GUdevDevice *device)
{
SensorDevice *sensor_device;
- DrvData *drv_data;
- g_autoptr (GError) error = NULL;
sensor_device = g_new0 (SensorDevice, 1);
sensor_device->priv = g_new0 (DrvData, 1);
- drv_data = (DrvData *) sensor_device->priv;
-
- /* Create sensor */
- drv_data->sensor = ssc_sensor_compass_new_sync (NULL, &error);
- if (!drv_data->sensor) {
- g_warning ("Creating SSC compass sensor failed: %s", error->message);
- g_clear_pointer (&sensor_device->priv, g_free);
- g_free (sensor_device);
- return NULL;
- }
- g_object_get (drv_data->sensor,
- SSC_SENSOR_NAME, &sensor_device->name,
- NULL);
-
- /* Start listening for measurements */
- drv_data->measurement_id = g_signal_connect (drv_data->sensor,
- "measurement",
- G_CALLBACK (measurement_cb),
- sensor_device);
-
- /* Enable sensor */
- if (!ssc_sensor_compass_open_sync (drv_data->sensor, NULL, &error)) {
- g_warning ("Opening SSC compass sensor failed: %s", error->message);
- g_clear_object (&drv_data->sensor);
- g_clear_pointer (&sensor_device->priv, g_free);
- g_free (sensor_device);
- return NULL;
- }
return sensor_device;
}
static void
-ssc_compass_close (SensorDevice *sensor_device)
+ssc_compass_set_polling (SensorDevice *sensor_device, gboolean state)
{
- g_autoptr (GError) error = NULL;
DrvData *drv_data = (DrvData *) sensor_device->priv;
+ g_autoptr (GError) error = NULL;
- /* Stop listening for measurements */
- g_warn_if_fail (drv_data->measurement_id > 0);
- g_signal_handler_disconnect (drv_data->sensor, drv_data->measurement_id);
+ if (state) {
+ /* Create sensor */
+ drv_data->sensor = ssc_sensor_compass_new_sync (NULL, &error);
+ if (!drv_data->sensor) {
+ g_warning ("Creating SSC compass sensor failed: %s", error ? error->message : "UNKNOWN");
+ return;
+ }
+ g_object_get (drv_data->sensor,
+ SSC_SENSOR_NAME, &sensor_device->name,
+ NULL);
+
+ /* Start listening for measurements */
+ drv_data->measurement_id = g_signal_connect (drv_data->sensor,
+ "measurement",
+ G_CALLBACK (measurement_cb),
+ sensor_device);
+
+ /* Enable sensor */
+ if (!ssc_sensor_compass_open_sync (drv_data->sensor, NULL, &error)) {
+ g_warning ("Opening SSC compass sensor failed: %s", error ? error->message : "UNKNOWN");
+ return;
+ }
+ } else {
+ /* Stop listening for measurements */
+ g_warn_if_fail (drv_data->measurement_id > 0);
+ g_signal_handler_disconnect (drv_data->sensor, drv_data->measurement_id);
+
+ /* Disable sensor */
+ if (!ssc_sensor_compass_close_sync (drv_data->sensor, NULL, &error))
+ g_warning ("Closing SSC compass sensor failed: %s", error ? error->message : "UNKNOWN");
+ }
+}
- /* Disable sensor */
- if (!ssc_sensor_compass_close_sync (drv_data->sensor, NULL, &error))
- g_warning ("Closing SSC compass sensor failed: %s", error->message);
+static void
+ssc_compass_close (SensorDevice *sensor_device)
+{
+ DrvData *drv_data = (DrvData *) sensor_device->priv;
g_clear_object (&drv_data->sensor);
g_clear_pointer (&sensor_device->priv, g_free);
@@ -125,5 +125,6 @@ SensorDriver ssc_compass = {
.discover = ssc_compass_discover,
.open = ssc_compass_open,
+ .set_polling = ssc_compass_set_polling,
.close = ssc_compass_close,
};
diff --git a/src/drv-ssc-light.c b/src/drv-ssc-light.c
index eb43d6c..04d24dd 100644
--- a/src/drv-ssc-light.c
+++ b/src/drv-ssc-light.c
@@ -63,57 +63,54 @@ static SensorDevice *
ssc_light_open (GUdevDevice *device)
{
SensorDevice *sensor_device;
- DrvData *drv_data;
- g_autoptr (GError) error = NULL;
sensor_device = g_new0 (SensorDevice, 1);
sensor_device->priv = g_new0 (DrvData, 1);
- drv_data = (DrvData *) sensor_device->priv;
-
- /* Create sensor */
- drv_data->sensor = ssc_sensor_light_new_sync (NULL, &error);
- if (!drv_data->sensor) {
- g_warning ("Creating SSC light sensor failed: %s", error->message);
- g_clear_pointer (&sensor_device->priv, g_free);
- g_free (sensor_device);
- return NULL;
- }
- g_object_get (drv_data->sensor,
- SSC_SENSOR_NAME, &sensor_device->name,
- NULL);
-
- /* Start listening for measurements */
- drv_data->measurement_id = g_signal_connect (drv_data->sensor,
- "measurement",
- G_CALLBACK (measurement_cb),
- sensor_device);
-
- /* Enable sensor */
- if (!ssc_sensor_light_open_sync (drv_data->sensor, NULL, &error)) {
- g_warning ("Opening SSC light sensor failed: %s", error->message);
- g_clear_object (&drv_data->sensor);
- g_clear_pointer (&sensor_device->priv, g_free);
- g_free (sensor_device);
- return NULL;
- }
return sensor_device;
}
+static void
+ssc_light_set_polling (SensorDevice *sensor_device, gboolean state)
+{
+ DrvData *drv_data = (DrvData *) sensor_device->priv;
+ g_autoptr (GError) error = NULL;
+ if (state) {
+ /* Create sensor */
+ drv_data->sensor = ssc_sensor_light_new_sync (NULL, &error);
+ if (!drv_data->sensor) {
+ g_warning ("Creating SSC light sensor failed: %s", error ? error->message : "UNKNOWN");
+ return;
+ }
+
+ /* Start listening for measurements */
+ drv_data->measurement_id = g_signal_connect (drv_data->sensor,
+ "measurement",
+ G_CALLBACK (measurement_cb),
+ sensor_device);
+
+ /* Enable sensor */
+ if (!ssc_sensor_light_open_sync (drv_data->sensor, NULL, &error)) {
+ g_warning ("Opening SSC light sensor failed: %s", error ? error->message : "UNKNOWN");
+ return;
+ }
+ } else {
+ /* Stop listening for measurements */
+ g_warn_if_fail (drv_data->measurement_id > 0);
+ g_signal_handler_disconnect (drv_data->sensor, drv_data->measurement_id);
+
+ /* Disable sensor */
+ if (!ssc_sensor_light_close_sync (drv_data->sensor, NULL, &error))
+ g_warning ("Closing SSC light sensor failed: %s", error ? error->message : "UNKNOWN");
+ }
+}
+
static void
ssc_light_close (SensorDevice *sensor_device)
{
g_autoptr (GError) error = NULL;
DrvData *drv_data = (DrvData *) sensor_device->priv;
- /* Stop listening for measurements */
- g_warn_if_fail (drv_data->measurement_id > 0);
- g_signal_handler_disconnect (drv_data->sensor, drv_data->measurement_id);
-
- /* Disable sensor */
- if (!ssc_sensor_light_close_sync (drv_data->sensor, NULL, &error))
- g_warning ("Closing SSC light sensor failed: %s", error->message);
-
g_clear_object (&drv_data->sensor);
g_clear_pointer (&sensor_device->priv, g_free);
g_free (sensor_device);
@@ -125,5 +122,6 @@ SensorDriver ssc_light = {
.discover = ssc_light_discover,
.open = ssc_light_open,
+ .set_polling = ssc_light_set_polling,
.close = ssc_light_close,
};
diff --git a/src/drv-ssc-proximity.c b/src/drv-ssc-proximity.c
index f4aa897..12570ba 100644
--- a/src/drv-ssc-proximity.c
+++ b/src/drv-ssc-proximity.c
@@ -62,56 +62,52 @@ static SensorDevice *
ssc_proximity_open (GUdevDevice *device)
{
SensorDevice *sensor_device;
- DrvData *drv_data;
- g_autoptr (GError) error = NULL;
sensor_device = g_new0 (SensorDevice, 1);
sensor_device->priv = g_new0 (DrvData, 1);
- drv_data = (DrvData *) sensor_device->priv;
-
- /* Create sensor */
- drv_data->sensor = ssc_sensor_proximity_new_sync (NULL, &error);
- if (!drv_data->sensor) {
- g_warning ("Creating SSC proximity sensor failed: %s", error->message);
- g_clear_pointer (&sensor_device->priv, g_free);
- g_free (sensor_device);
- return NULL;
- }
- g_object_get (drv_data->sensor,
- SSC_SENSOR_NAME, &sensor_device->name,
- NULL);
-
- /* Start listening for measurements */
- drv_data->measurement_id = g_signal_connect (drv_data->sensor,
- "measurement",
- G_CALLBACK (measurement_cb),
- sensor_device);
-
- /* Enable sensor */
- if (!ssc_sensor_proximity_open_sync (drv_data->sensor, NULL, &error)) {
- g_warning ("Opening SSC proximity sensor failed: %s", error->message);
- g_clear_object (&drv_data->sensor);
- g_clear_pointer (&sensor_device->priv, g_free);
- g_free (sensor_device);
- return NULL;
- }
return sensor_device;
}
static void
-ssc_proximity_close (SensorDevice *sensor_device)
+ssc_proximity_set_polling (SensorDevice *sensor_device, gboolean state)
{
- g_autoptr (GError) error = NULL;
DrvData *drv_data = (DrvData *) sensor_device->priv;
+ g_autoptr (GError) error = NULL;
+ if (state) {
+ /* Create sensor */
+ drv_data->sensor = ssc_sensor_proximity_new_sync (NULL, &error);
+ if (!drv_data->sensor) {
+ g_warning ("Creating SSC proximity sensor failed: %s", error ? error->message : "UNKNOWN");
+ return;
+ }
+
+ /* Start listening for measurements */
+ drv_data->measurement_id = g_signal_connect (drv_data->sensor,
+ "measurement",
+ G_CALLBACK (measurement_cb),
+ sensor_device);
+
+ /* Enable sensor */
+ if (!ssc_sensor_proximity_open_sync (drv_data->sensor, NULL, &error)) {
+ g_warning ("Opening SSC proximity sensor failed: %s", error ? error->message : "UNKNOWN");
+ return;
+ }
+ } else {
+ /* Stop listening for measurements */
+ g_warn_if_fail (drv_data->measurement_id > 0);
+ g_signal_handler_disconnect (drv_data->sensor, drv_data->measurement_id);
+
+ /* Disable sensor */
+ if (!ssc_sensor_proximity_close_sync (drv_data->sensor, NULL, &error))
+ g_warning ("Closing SSC proximity sensor failed: %s", error ? error->message : "UNKNOWN");
+ }
+}
- /* Stop listening for measurements */
- g_warn_if_fail (drv_data->measurement_id > 0);
- g_signal_handler_disconnect (drv_data->sensor, drv_data->measurement_id);
-
- /* Disable sensor */
- if (!ssc_sensor_proximity_close_sync (drv_data->sensor, NULL, &error))
- g_warning ("Closing SSC proximity sensor failed: %s", error->message);
+static void
+ssc_proximity_close (SensorDevice *sensor_device)
+{
+ DrvData *drv_data = (DrvData *) sensor_device->priv;
g_clear_object (&drv_data->sensor);
g_clear_pointer (&sensor_device->priv, g_free);
@@ -124,5 +120,6 @@ SensorDriver ssc_proximity = {
.discover = ssc_proximity_discover,
.open = ssc_proximity_open,
+ .set_polling = ssc_proximity_set_polling,
.close = ssc_proximity_close,
};
--
2.47.1

View file

@ -1,429 +0,0 @@
From 15f095b67722ffdeb6d8f04d12b9f569d256aa2f Mon Sep 17 00:00:00 2001
From: Dylan Van Assche <me@dylanvanassche.be>
Date: Sun, 12 Jan 2025 20:59:16 +0100
Subject: [PATCH 09/10] tests: integration-test: add SSC sensors
Test all 4 sensors provided by libssc.
---
tests/integration-test.py | 1 +
tests/meson.build | 14 ++
tests/ssc-test.py | 373 ++++++++++++++++++++++++++++++++++++++
3 files changed, 388 insertions(+)
create mode 100755 tests/ssc-test.py
diff --git a/tests/integration-test.py b/tests/integration-test.py
index 4751505..60bbd31 100755
--- a/tests/integration-test.py
+++ b/tests/integration-test.py
@@ -56,6 +56,7 @@ class Tests(dbusmock.DBusTestCase):
def setUpClass(cls):
# run from local build tree if we are in one, otherwise use system instance
builddir = os.getenv('top_builddir', '.')
+ print(os.path.join(builddir, 'src', 'iio-sensor-proxy'))
if os.access(os.path.join(builddir, 'src', 'iio-sensor-proxy'), os.X_OK):
cls.daemon_path = os.path.join(builddir, 'src', 'iio-sensor-proxy')
cls.monitor_sensor_path = os.path.join(builddir, 'src', 'monitor-sensor')
diff --git a/tests/meson.build b/tests/meson.build
index e51e90f..5c19964 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -16,3 +16,17 @@ foreach ut: unit_tests
env: envs,
)
endforeach
+
+if get_option('ssc-support')
+ r = run_command(unittest_inspector, files('ssc-test.py'), check: true)
+ unit_tests = r.stdout().strip().split('\n')
+ foreach ut: unit_tests
+ ut_args = files('ssc-test.py')
+ ut_args += ut
+ test(ut,
+ python3,
+ args: ut_args,
+ env: envs,
+ )
+ endforeach
+endif
diff --git a/tests/ssc-test.py b/tests/ssc-test.py
new file mode 100755
index 0000000..72e24f0
--- /dev/null
+++ b/tests/ssc-test.py
@@ -0,0 +1,373 @@
+#!/usr/bin/python3
+
+# iio-sensor-proxy integration test suite
+#
+# Run in built tree to test local built binaries, or from anywhere else to test
+# system installed binaries.
+#
+# Copyright: (C) 2011 Martin Pitt <martin.pitt@ubuntu.com>
+# (C) 2021 Bastien Nocera <hadess@hadess.net>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+import os
+import sys
+import dbus
+import dbusmock
+import gi
+import tempfile
+import psutil
+import subprocess
+import unittest
+import locale
+import time
+
+try:
+ from gi.repository import GLib
+ from gi.repository import Gio
+except ImportError as e:
+ sys.stderr.write('PyGobject not available for Python 3, or missing GI typelibs: %s\n' % str(e))
+ sys.exit(1)
+
+try:
+ gi.require_version('UMockdev', '1.0')
+ from gi.repository import UMockdev
+except ImportError:
+ sys.stderr.write('umockdev not available (https://github.com/martinpitt/umockdev)\n')
+ sys.exit(1)
+
+
+SP = 'net.hadess.SensorProxy'
+SP_PATH = '/net/hadess/SensorProxy'
+SP_COMPASS = 'net.hadess.SensorProxy.Compass'
+SP_COMPASS_PATH = '/net/hadess/SensorProxy/Compass'
+
+class Tests(dbusmock.DBusTestCase):
+
+ @classmethod
+ def setUpClass(cls):
+ # run from local build tree if we are in one, otherwise use system instance
+ builddir = os.getenv('top_builddir', '.')
+ print(os.path.join(builddir, 'src', 'iio-sensor-proxy'))
+ if os.access(os.path.join(builddir, 'src', 'iio-sensor-proxy'), os.X_OK):
+ cls.daemon_path = os.path.join(builddir, 'src', 'iio-sensor-proxy')
+ cls.monitor_sensor_path = os.path.join(builddir, 'src', 'monitor-sensor')
+ print('Testing binaries from local build tree (%s)' % cls.daemon_path)
+ elif os.environ.get('UNDER_JHBUILD', False):
+ jhbuild_prefix = os.environ['JHBUILD_PREFIX']
+ cls.daemon_path = os.path.join(jhbuild_prefix, 'libexec', 'iio-sensor-proxy')
+ cls.monitor_sensor_path = os.path.join(jhbuild_prefix, 'bin', 'monitor-sensor')
+ print('Testing binaries from JHBuild (%s)' % cls.daemon_path)
+ else:
+ cls.daemon_path = None
+ with open('/usr/lib/systemd/system/iio-sensor-proxy.service') as f:
+ for line in f:
+ if line.startswith('ExecStart='):
+ cls.daemon_path = line.split('=', 1)[1].strip()
+ break
+ assert cls.daemon_path, 'could not determine daemon path from systemd .service file'
+ cls.monitor_sensor_path = '/usr/bin/monitor-sensor'
+ print('Testing installed system binary (%s)' % cls.daemon_path)
+
+ # fail on CRITICALs on client and server side
+ GLib.log_set_always_fatal(GLib.LogLevelFlags.LEVEL_WARNING |
+ GLib.LogLevelFlags.LEVEL_ERROR |
+ GLib.LogLevelFlags.LEVEL_CRITICAL)
+ os.environ['G_DEBUG'] = 'fatal_warnings'
+
+ # set up a fake system D-BUS
+ cls.test_bus = Gio.TestDBus.new(Gio.TestDBusFlags.NONE)
+ cls.test_bus.up()
+ try:
+ del os.environ['DBUS_SESSION_BUS_ADDRESS']
+ except KeyError:
+ pass
+ os.environ['DBUS_SYSTEM_BUS_ADDRESS'] = cls.test_bus.get_bus_address()
+
+ cls.dbus = Gio.bus_get_sync(Gio.BusType.SYSTEM, None)
+ cls.dbus_con = cls.get_dbus(True)
+
+ # Some test outputs require the daemon to run under the fr locale:
+ # so check if that's available
+ try:
+ old_loc = locale.setlocale(locale.LC_ALL, 'fr_FR.UTF-8')
+ locale.setlocale(locale.LC_ALL, old_loc)
+ # We need to make sure the decimal point is correct as on musl libc the above
+ # succeeds yet the tests just fail due to the output being in unexpected format
+ cls.has_fr = locale.localeconv()["decimal_point"] == ","
+ except:
+ cls.has_fr = False
+
+ @classmethod
+ def tearDownClass(cls):
+ cls.test_bus.down()
+ dbusmock.DBusTestCase.tearDownClass()
+
+ def setUp(self):
+ '''Set up a local umockdev testbed.
+
+ The testbed is initially empty.
+ '''
+ self.testbed = UMockdev.Testbed.new()
+ self.polkitd, obj_polkit = self.spawn_server_template(
+ 'polkitd', {}, stdout=subprocess.PIPE)
+ obj_polkit.SetAllowed(['net.hadess.SensorProxy.claim-sensor'])
+
+ self.proxy = None
+ self.log = None
+ self.daemon = None
+
+ def run(self, result=None):
+ super(Tests, self).run(result)
+ if result and len(result.errors) + len(result.failures) > 0 and self.log:
+ with open(self.log.name) as f:
+ sys.stderr.write('\n-------------- daemon log: ----------------\n')
+ sys.stderr.write(f.read())
+ sys.stderr.write('------------------------------\n')
+
+ def tearDown(self):
+ del self.testbed
+ self.stop_daemon()
+
+ if self.polkitd:
+ try:
+ self.polkitd.kill()
+ except OSError:
+ pass
+ self.polkitd.wait()
+ self.polkitd = None
+
+ #
+ # Daemon control and D-BUS I/O
+ #
+
+ def start_daemon(self, env = None, wrapper = None):
+ '''Start daemon and create DBus proxy.
+
+ When done, this sets self.proxy as the Gio.DBusProxy for power-profiles-daemon.
+ '''
+ if not env:
+ env = os.environ.copy()
+ env['G_DEBUG'] = 'fatal-criticals'
+ env['G_MESSAGES_DEBUG'] = 'all'
+ env['UMOCKDEV_DEBUG'] = 'all'
+ # note: Python doesn't propagate the setenv from Testbed.new(), so we
+ # have to do that ourselves
+ env['UMOCKDEV_DIR'] = self.testbed.get_root_dir()
+ self.log = tempfile.NamedTemporaryFile()
+ timeout_multiplier = 1
+ if wrapper:
+ daemon_path = wrapper + [ self.daemon_path ]
+ else:
+ daemon_path = [ self.daemon_path ]
+ if os.getenv('VALGRIND') != None:
+ daemon_path = ['valgrind'] + daemon_path + ['-v']
+ timeout_multiplier = 10
+ else:
+ daemon_path = daemon_path + ['-v']
+
+ self.daemon = subprocess.Popen(daemon_path,
+ env=env, stdout=self.log,
+ stderr=subprocess.STDOUT)
+
+ # wait until the daemon gets online
+ timeout = 100 * timeout_multiplier
+ while timeout > 0:
+ time.sleep(0.1)
+ timeout -= 1
+ try:
+ self.get_dbus_property('HasAccelerometer')
+ break
+ except GLib.GError:
+ pass
+ else:
+ self.fail('daemon did not start in 10 seconds')
+
+ self.proxy = Gio.DBusProxy.new_sync(
+ self.dbus, Gio.DBusProxyFlags.DO_NOT_AUTO_START, None, SP,
+ SP_PATH, SP, None)
+
+ self.assertEqual(self.daemon.poll(), None, 'daemon crashed')
+
+ def stop_daemon(self):
+ '''Stop the daemon if it is running.'''
+
+ if self.daemon:
+ try:
+ for child in psutil.Process(self.daemon.pid).children(recursive=True):
+ child.kill()
+ self.daemon.kill()
+ except OSError:
+ pass
+ self.daemon.wait()
+ self.daemon = None
+ self.proxy = None
+
+ def get_dbus_property(self, name):
+ '''Get property value from daemon D-Bus interface.'''
+
+ proxy = Gio.DBusProxy.new_sync(
+ self.dbus, Gio.DBusProxyFlags.DO_NOT_AUTO_START, None, SP,
+ SP_PATH, 'org.freedesktop.DBus.Properties', None)
+ return proxy.Get('(ss)', SP, name)
+
+ def get_compass_dbus_property(self, name):
+ '''Get property value from daemon compass D-Bus interface.'''
+
+ proxy = Gio.DBusProxy.new_sync(
+ self.dbus, Gio.DBusProxyFlags.DO_NOT_AUTO_START, None, SP,
+ SP_COMPASS_PATH, 'org.freedesktop.DBus.Properties', None)
+ return proxy.Get('(ss)', SP_COMPASS, name)
+
+ def have_text_in_log(self, text):
+ return self.count_text_in_log(text) > 0
+
+ def count_text_in_log(self, text):
+ with open(self.log.name) as f:
+ return f.read().count(text)
+
+ def read_sysfs_attr(self, device, attribute):
+ with open(os.path.join(self.testbed.get_root_dir() + device, attribute), 'rb') as f:
+ return f.read()
+ return None
+
+ def read_file(self, path):
+ with open(path, 'rb') as f:
+ return f.read()
+ return None
+
+ def assertEventually(self, condition, message=None, timeout=50):
+ '''Assert that condition function eventually returns True.
+
+ Timeout is in deciseconds, defaulting to 50 (5 seconds). message is
+ printed on failure.
+ '''
+ while timeout >= 0:
+ context = GLib.MainContext.default()
+ while context.iteration(False):
+ pass
+ if condition():
+ break
+ timeout -= 1
+ time.sleep(0.1)
+ else:
+ self.fail(message or 'timed out waiting for ' + str(condition))
+
+ #
+ # Actual test cases
+ #
+
+ def test_ssc_proximity(self):
+ '''SSC proximity'''
+ prox = self.testbed.add_device('misc', 'ssc-proximity', None,
+ ['name', 'SSC Test Proximity Sensor'],
+ ['NAME', '"SSC Proximity Sensor"',
+ 'DEVNAME', '/dev/fastrpc-sdsp',
+ 'IIO_SENSOR_PROXY_TYPE', 'ssc-proximity']
+ )
+ self.start_daemon()
+ self.assertEqual(self.get_dbus_property('HasAmbientLight'), False)
+ self.assertEqual(self.get_dbus_property('HasAccelerometer'), False)
+ self.assertEqual(self.get_dbus_property('HasProximity'), True)
+ self.assertEqual(self.get_compass_dbus_property('HasCompass'), False)
+
+ # Default values
+ self.assertEqual(self.get_dbus_property('ProximityNear'), False)
+
+ self.proxy.ClaimProximity()
+ self.assertEqual(self.get_dbus_property('ProximityNear'), True)
+ self.assertEventually(lambda: self.get_dbus_property('ProximityNear') == False)
+ self.assertEventually(lambda: self.get_dbus_property('ProximityNear') == True)
+
+ self.stop_daemon()
+
+ def test_ssc_accel(self):
+ '''SSC accelerometer'''
+ prox = self.testbed.add_device('misc', 'ssc-accel', None,
+ ['name', 'SSC Test Accelerometer Sensor'],
+ ['NAME', '"SSC Accelerometer Sensor"',
+ 'DEVNAME', '/dev/fastrpc-sdsp',
+ 'IIO_SENSOR_PROXY_TYPE', 'ssc-accel']
+ )
+ self.start_daemon()
+ self.assertEqual(self.get_dbus_property('HasAmbientLight'), False)
+ self.assertEqual(self.get_dbus_property('HasAccelerometer'), True)
+ self.assertEqual(self.get_dbus_property('HasProximity'), False)
+ self.assertEqual(self.get_compass_dbus_property('HasCompass'), False)
+
+ self.assertEqual(self.get_dbus_property('AccelerometerOrientation'), 'undefined')
+
+ self.proxy.ClaimAccelerometer()
+ self.assertEqual(self.get_dbus_property('AccelerometerOrientation'), 'left-up')
+
+ self.stop_daemon()
+
+ def test_ssc_light(self):
+ '''SSC light'''
+ prox = self.testbed.add_device('misc', 'ssc-light', None,
+ ['name', 'SSC Test Light Sensor'],
+ ['NAME', '"SSC Light Sensor"',
+ 'DEVNAME', '/dev/fastrpc-sdsp',
+ 'IIO_SENSOR_PROXY_TYPE', 'ssc-light']
+ )
+ self.start_daemon()
+ self.assertEqual(self.get_dbus_property('HasAmbientLight'), True)
+ self.assertEqual(self.get_dbus_property('HasAccelerometer'), False)
+ self.assertEqual(self.get_dbus_property('HasProximity'), False)
+ self.assertEqual(self.get_compass_dbus_property('HasCompass'), False)
+
+ # Default values
+ self.assertEqual(self.get_dbus_property('LightLevelUnit'), 'lux')
+ self.assertEqual(self.get_dbus_property('LightLevel'), 0)
+
+ self.proxy.ClaimLight()
+ self.assertEventually(lambda: self.get_dbus_property('LightLevel') == 7)
+ self.assertEqual(self.get_dbus_property('LightLevelUnit'), 'lux')
+
+ self.stop_daemon()
+
+ def test_ssc_compass(self):
+ '''SSC compass'''
+ prox = self.testbed.add_device('misc', 'ssc-compass', None,
+ ['name', 'SSC Test Compass Sensor'],
+ ['NAME', '"SSC Compass Sensor"',
+ 'DEVNAME', '/dev/fastrpc-sdsp',
+ 'IIO_SENSOR_PROXY_TYPE', 'ssc-compass']
+ )
+ self.start_daemon()
+ self.assertEqual(self.get_dbus_property('HasAmbientLight'), False)
+ self.assertEqual(self.get_dbus_property('HasAccelerometer'), False)
+ self.assertEqual(self.get_dbus_property('HasProximity'), False)
+ self.assertEqual(self.get_compass_dbus_property('HasCompass'), True)
+ self.assertEqual(int(self.get_compass_dbus_property('CompassHeading')), 0)
+
+ self.stop_daemon()
+
+ #
+ # Helper methods
+ #
+
+ @classmethod
+ def _props_to_str(cls, properties):
+ '''Convert a properties dictionary to uevent text representation.'''
+
+ prop_str = ''
+ if properties:
+ for k, v in properties.items():
+ prop_str += '%s=%s\n' % (k, v)
+ return prop_str
+
+if __name__ == '__main__':
+ # run ourselves under umockdev
+ if 'umockdev' not in os.environ.get('LD_PRELOAD', ''):
+ os.execvp('umockdev-wrapper', ['umockdev-wrapper'] + sys.argv)
+
+ unittest.main()
--
2.47.1

View file

@ -1,25 +0,0 @@
From 9d8e0b019583b549d61f1cfddc17ea32b17662c6 Mon Sep 17 00:00:00 2001
From: Clayton Craft <clayton@craftyguy.net>
Date: Fri, 2 Jan 2026 17:18:27 -0800
Subject: [PATCH] fixup! data: add libssc udev rules
---
data/80-iio-sensor-proxy-libssc.rules | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/data/80-iio-sensor-proxy-libssc.rules b/data/80-iio-sensor-proxy-libssc.rules
index c4fad16..5eb3d46 100644
--- a/data/80-iio-sensor-proxy-libssc.rules
+++ b/data/80-iio-sensor-proxy-libssc.rules
@@ -6,6 +6,7 @@ ACTION=="remove", GOTO="iio_sensor_proxy_libssc_end"
# Set the sensor type for all the types we recognise for SDSP/ADSP.
# Some devices expose the sensors via a separate SDSP while others re-use ADSP.
# These DSPs expose itself as /dev/fastrpc-* in the misc subsystem.
-SUBSYSTEM=="misc", KERNEL=="fastrpc-*", ENV{IIO_SENSOR_PROXY_TYPE}+="ssc-accel ssc-light ssc-proximity ssc-compass"
+SUBSYSTEM=="misc", KERNEL=="fastrpc-adsp*", ENV{IIO_SENSOR_PROXY_TYPE}+="ssc-accel ssc-light ssc-proximity ssc-compass"
+SUBSYSTEM=="misc", KERNEL=="fastrpc-sdsp*", ENV{IIO_SENSOR_PROXY_TYPE}+="ssc-accel ssc-light ssc-proximity ssc-compass"
LABEL="iio_sensor_proxy_libssc_end"
--
2.52.0

View file

@ -1,63 +0,0 @@
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

@ -1,77 +0,0 @@
# Forked from Alpine to add Qualcomm SSC support with libssc
maintainer="Dylan Van Assche <me@dylanvanassche.be>"
pkgname=iio-sensor-proxy
_pkgver=3.8
pkgver=9999$_pkgver
pkgrel=6
pkgdesc="IIO sensors to D-Bus proxy"
url="https://gitlab.freedesktop.org/hadess/iio-sensor-proxy"
arch="aarch64"
license="GPL-2.0-or-later"
depends="dbus"
makedepends="
eudev-dev
glib-dev
libgudev-dev
meson
polkit-dev
libssc-dev>=0.2.1
"
subpackages="$pkgname-openrc $pkgname-systemd $pkgname-udev"
builddir="$srcdir/$pkgname-$_pkgver"
source="https://gitlab.freedesktop.org/hadess/iio-sensor-proxy/-/archive/$_pkgver/iio-sensor-proxy-$_pkgver.tar.gz
iio-sensor-proxy.initd
system-iio-sensor-proxy.service.d-hexagonrpcd.conf
0001-iio-sensor-proxy-depend-on-libssc.patch
0001-WIP-iio-sensor-proxy.c-Do-not-exit-based-on-sensor-e.patch
0002-proximity-support-SSC-proximity-sensor.patch
0003-light-support-SSC-light-sensor.patch
0004-accelerometer-support-SSC-accelerometer-sensor.patch
0005-compass-support-SSC-compass-sensor.patch
0006-data-add-libssc-udev-rules.patch
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-fixup-data-add-libssc-udev-rules.patch
0013-integration-test-add-test-for-sensors-that-report-no.patch
"
build() {
abuild-meson \
-Db_lto=true \
-Dssc-support=true \
-Dsystemdsystemunitdir=/usr/lib/systemd/system \
. output
meson compile -C output
}
check() {
meson test --print-errorlogs -C output
}
package() {
DESTDIR="$pkgdir" meson install --no-rebuild -C output
install -Dm755 "$srcdir"/$pkgname.initd "$pkgdir"/etc/init.d/$pkgname
install -Dm644 "$srcdir"/system-iio-sensor-proxy.service.d-hexagonrpcd.conf \
"$pkgdir"/usr/lib/systemd/system/iio-sensor-proxy.service.d/hexagonrpcd.conf
}
sha512sums="
9cca8d706c531c9a2e34dfebdc8673a1765b615533e3f7776118c74cb1ce145e472203c6c7804d35701c22cc93755609829bc3817c5920d5961249d7e8de87c6 iio-sensor-proxy-3.8.tar.gz
b25df94e249ca46fe96926e5a866c20dc913fa52a2d9259fb7a3594861c6b2f246fc7fef8a21f5b021f3a71401f734ae27210137b0b1917a7daaffb5e3221f2e iio-sensor-proxy.initd
2e8a876b61093add48e0677dcbfdac148690eddb398ff51ab4edb6547515ad8f8cfec31e8fda6886746b3bf30410b7b63c7486dcfe2441a7e742ea5023981a45 system-iio-sensor-proxy.service.d-hexagonrpcd.conf
d46eeb1deabb6ee6017b86f573fcb717d8b992979bfd447e52c6dabc95d9e6c986ab937f602c2f0a731d10d87d67578aa59930d7faff69b2f42a0eab25f4c60c 0001-iio-sensor-proxy-depend-on-libssc.patch
4b43ea53b71c9be29367897a3c9ba349e9fdb71185300aafc00be69f923d7f27aa02bb7f0f5c5be800f0d494035992e046c010fd70a1754f8a47701b17666926 0001-WIP-iio-sensor-proxy.c-Do-not-exit-based-on-sensor-e.patch
59800fbd73abd77c6cf86ab1bcdce85abefb07e3cd28d58c3e91a4b3cdd9d893a9671e8f0f3dc212064d5744a62b0b24c54fa91ce8f3ac84e361f7ba8cc64ded 0002-proximity-support-SSC-proximity-sensor.patch
7cdcd1d78629f662fa588c90e657c6abed7e43f1462c43f0d14e7756933ea927435077e193429d069b7360ba2d1c16b608226e1707858e56460c82595f054080 0003-light-support-SSC-light-sensor.patch
a956d28d55ee0e0a03bea63caf06881ead7511ac60000a5def61d482b3575006575edd6b0b30ae7874ffd9b2268fd8008a273d6ede561cc44aad46f18233d789 0004-accelerometer-support-SSC-accelerometer-sensor.patch
d4379f8e53eea02f53640752bef883870a44d0169cf821d3f5bb3245309cac1d1502a7848d5cce60d40bcdd484c9baa1f63f60d887613ad25a5ca88721d7c4c8 0005-compass-support-SSC-compass-sensor.patch
4651572ada878fd07ba281426b4cf4b9baf19d8464fd3af1a1c1a98765bcf358d1d445bdef53acd3bf30b1d2c8c234489e96f728d9228e3681e5038f10059573 0006-data-add-libssc-udev-rules.patch
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
4f2d227efb645ce01f4ce997b2923d4a5b12a5d896c47b7e6189fd76abcae4659d5d1fb71608ce4809b19ac5a1129176c81063097826a4a19bc35ed5099537cb 0010-fixup-data-add-libssc-udev-rules.patch
9273f01d35e0f45ddc943808326d87f3a2e678ea29e607d3d70cabc9ea321db761cc170a86b3093553a4c3dfae1d81c5057d146b9a90ff490c85641f02b040df 0013-integration-test-add-test-for-sensors-that-report-no.patch
"

View file

@ -1,8 +0,0 @@
#!/sbin/openrc-run
supervisor=supervise-daemon
command="/usr/libexec/iio-sensor-proxy"
depend() {
need dbus
}

View file

@ -1,8 +0,0 @@
# Make iio-sensor-proxy depend on hexagonrpcd
[Unit]
Wants=hexagonrpcd-adsp-rootpd.service
Wants=hexagonrpcd-adsp-sensorspd.service
Wants=hexagonrpcd-sdsp.service
After=hexagonrpcd-adsp-rootpd.service
After=hexagonrpcd-adsp-sensorspd.service
After=hexagonrpcd-sdsp.service