device-bezel: Support hal-api passthrough and IPC mode selectively by configuration 63/321563/6
authorYoungjae Cho <y0.cho@samsung.com>
Tue, 25 Mar 2025 03:56:38 +0000 (12:56 +0900)
committerYoungjae Cho <y0.cho@samsung.com>
Mon, 7 Apr 2025 04:04:12 +0000 (13:04 +0900)
To support two way communication mode, added switch to selectively
take passthrough or ipc functions by transport. The transport is
determined by searching transport version from manifest file that
matches to the installed backend version.

Before
- Passthrough
  - hal-api(bezel) --(dlopen)--> hal-backend

After
- Passthrough and IPC
  - hal-api(bezel) --(dlopen)--> hal-backend
           |
           |(proxy)
           |
           |-----------(IPC)-----> hal-backend-serivce(stub) --> hal-backend

Change-Id: I3a70a7439067cc3a074fd24e6bb533a167b3ebc5
Signed-off-by: Youngjae Cho <y0.cho@samsung.com>
src/hal-api-device-bezel.c

index 1866737d7ae98ebf41cc659aea12d11ce9f2dfae..a4ba2ee4632a1a6a7482aa9b4d5733a2b29b0707 100644 (file)
 #include <hal/hal-common.h>
 
 #include "hal-device-bezel-interface.h"
+#include "hal-api-device-bezel-ipc.h"
+#include "hal-api-device-bezel-passthrough.h"
 #include "common.h"
 
-static hal_backend_device_bezel_funcs *hal_device_bezel_funcs = NULL;
+static enum hal_common_transport g_hal_transport = HAL_COMMON_TRANSPORT_UNKNOWN;
 
-int hal_device_bezel_get_backend(void)
+static void __attribute__((constructor)) hal_device_bezel_constructor(void)
 {
-       int ret;
-
-       if (hal_device_bezel_funcs)
-               return 0;
-
-       hal_device_bezel_funcs = calloc(1, sizeof(hal_backend_device_bezel_funcs));
-       if (!hal_device_bezel_funcs)
-               return -ENOMEM;
-
-       ret = hal_common_get_backend(HAL_MODULE_DEVICE_BEZEL, (void **)&hal_device_bezel_funcs);
+       int ret = hal_common_get_transport(HAL_MODULE_DEVICE_BEZEL,
+                                               &g_hal_transport);
        if (ret < 0) {
-               _E("Failed to get device-bezel backend");
-               free(hal_device_bezel_funcs);
-               hal_device_bezel_funcs = NULL;
-               return -ENOTSUP;
+               if (ret != -ENOENT)
+                       _W("Failed to get HAL transport from HAL manifest\n");
+               g_hal_transport = HAL_COMMON_TRANSPORT_PASSTHROUGH;
        }
+}
 
-       return 0;
+int hal_device_bezel_get_backend(void)
+{
+       switch (g_hal_transport) {
+       case HAL_COMMON_TRANSPORT_IPC:
+               return hal_device_bezel_ipc_get_backend();
+       case HAL_COMMON_TRANSPORT_PASSTHROUGH:
+               return hal_device_bezel_passthrough_get_backend();
+       case HAL_COMMON_TRANSPORT_UNKNOWN:
+       default:
+               return -ENOTSUP;
+       }
 }
 
 int hal_device_bezel_put_backend(void)
 {
-       int ret = 0;
-
-       if (!hal_device_bezel_funcs)
-               return 0;
-
-       ret = hal_common_put_backend(HAL_MODULE_DEVICE_BEZEL, (void *)hal_device_bezel_funcs);
-       if (ret < 0) {
-               _E("Failed to put device-bezel backend");
-               return ret;
+       switch (g_hal_transport) {
+       case HAL_COMMON_TRANSPORT_IPC:
+               return hal_device_bezel_ipc_get_backend();
+       case HAL_COMMON_TRANSPORT_PASSTHROUGH:
+               return hal_device_bezel_passthrough_get_backend();
+       case HAL_COMMON_TRANSPORT_UNKNOWN:
+       default:
+               return -ENOTSUP;
        }
-
-       free(hal_device_bezel_funcs);
-       hal_device_bezel_funcs = NULL;
-
-       return 0;
 }
 
 int hal_device_bezel_get_state(hal_device_bezel_state_e *state)
 {
-       int ret;
-
-       if (!state)
-               return -EINVAL;
-
-       if (!hal_device_bezel_funcs) {
-               if ((ret = hal_device_bezel_get_backend()) < 0)
-                       return ret;
-       }
-
-       if (!hal_device_bezel_funcs ||
-               !hal_device_bezel_funcs->get_state)
+       switch (g_hal_transport) {
+       case HAL_COMMON_TRANSPORT_IPC:
+               return hal_device_bezel_ipc_get_state(state);
+       case HAL_COMMON_TRANSPORT_PASSTHROUGH:
+               return hal_device_bezel_passthrough_get_state(state);
+       case HAL_COMMON_TRANSPORT_UNKNOWN:
+       default:
                return -ENOTSUP;
-
-       return hal_device_bezel_funcs->get_state(state);
+       }
 }
 
 int hal_device_bezel_set_state(hal_device_bezel_state_e state)
 {
-       int ret;
-
-       if (!hal_device_bezel_funcs) {
-               if ((ret = hal_device_bezel_get_backend()) < 0)
-                       return ret;
-       }
-
-       if (!hal_device_bezel_funcs ||
-               !hal_device_bezel_funcs->set_state)
+       switch (g_hal_transport) {
+       case HAL_COMMON_TRANSPORT_IPC:
+               return hal_device_bezel_ipc_set_state(state);
+       case HAL_COMMON_TRANSPORT_PASSTHROUGH:
+               return hal_device_bezel_passthrough_set_state(state);
+       case HAL_COMMON_TRANSPORT_UNKNOWN:
+       default:
                return -ENOTSUP;
-
-       return hal_device_bezel_funcs->set_state(state);
+       }
 }
 
 int hal_device_bezel_get_sw_state(hal_device_bezel_state_e *state)
 {
-       int ret;
-
-       if (!state)
-               return -EINVAL;
-
-       if (!hal_device_bezel_funcs) {
-               if ((ret = hal_device_bezel_get_backend()) < 0)
-                       return ret;
-       }
-
-       if (!hal_device_bezel_funcs ||
-               !hal_device_bezel_funcs->get_sw_state)
+       switch (g_hal_transport) {
+       case HAL_COMMON_TRANSPORT_IPC:
+               return hal_device_bezel_ipc_get_sw_state(state);
+       case HAL_COMMON_TRANSPORT_PASSTHROUGH:
+               return hal_device_bezel_passthrough_get_sw_state(state);
+       case HAL_COMMON_TRANSPORT_UNKNOWN:
+       default:
                return -ENOTSUP;
-
-       return hal_device_bezel_funcs->get_sw_state(state);
+       }
 }
 
 int hal_device_bezel_set_sw_state(hal_device_bezel_state_e state)
 {
-       int ret;
-
-       if (!hal_device_bezel_funcs) {
-               if ((ret = hal_device_bezel_get_backend()) < 0)
-                       return ret;
-       }
-
-       if (!hal_device_bezel_funcs ||
-               !hal_device_bezel_funcs->set_sw_state)
+       switch (g_hal_transport) {
+       case HAL_COMMON_TRANSPORT_IPC:
+               return hal_device_bezel_ipc_set_sw_state(state);
+       case HAL_COMMON_TRANSPORT_PASSTHROUGH:
+               return hal_device_bezel_passthrough_set_sw_state(state);
+       case HAL_COMMON_TRANSPORT_UNKNOWN:
+       default:
                return -ENOTSUP;
-
-       return hal_device_bezel_funcs->set_sw_state(state);
+       }
 }
 
 int hal_device_bezel_get_vib_state(hal_device_bezel_vib_state_e *state)
 {
-       int ret;
-
-       if (!state)
-               return -EINVAL;
-
-       if (!hal_device_bezel_funcs) {
-               if ((ret = hal_device_bezel_get_backend()) < 0)
-                       return ret;
-       }
-
-       if (!hal_device_bezel_funcs ||
-               !hal_device_bezel_funcs->get_vib_state)
+       switch (g_hal_transport) {
+       case HAL_COMMON_TRANSPORT_IPC:
+               return hal_device_bezel_ipc_get_vib_state(state);
+       case HAL_COMMON_TRANSPORT_PASSTHROUGH:
+               return hal_device_bezel_passthrough_get_vib_state(state);
+       case HAL_COMMON_TRANSPORT_UNKNOWN:
+       default:
                return -ENOTSUP;
-
-       return hal_device_bezel_funcs->get_vib_state(state);
+       }
 }
 
 int hal_device_bezel_set_vib_state(hal_device_bezel_vib_state_e state)
 {
-       int ret;
-
-       if (!hal_device_bezel_funcs) {
-               if ((ret = hal_device_bezel_get_backend()) < 0)
-                       return ret;
-       }
-
-       if (!hal_device_bezel_funcs ||
-               !hal_device_bezel_funcs->set_vib_state)
+       switch (g_hal_transport) {
+       case HAL_COMMON_TRANSPORT_IPC:
+               return hal_device_bezel_ipc_set_vib_state(state);
+       case HAL_COMMON_TRANSPORT_PASSTHROUGH:
+               return hal_device_bezel_passthrough_set_vib_state(state);
+       case HAL_COMMON_TRANSPORT_UNKNOWN:
+       default:
                return -ENOTSUP;
-
-       return hal_device_bezel_funcs->set_vib_state(state);
+       }
 }