const char *hal_common_get_backend_symbol_name(enum hal_module handle);
/**
+ * @brief Get the backend data according to the type of HAL module
+ * @param[in] HAL module id among enum hal_moudle
+ * @param[out] Data pointer where 'hal_backend_[module]_funcs' instance
+ * should be stored from HAL backend binary.
+ * @return @c 0 on success, otherwise a negative error value
+ */
+int hal_common_get_backend(enum hal_module handle, void **data);
+
+/**
+ * @brief Put the backend data according to the type of HAL module
+ * @param[in] HAL module id among enum hal_moudle
+ * @param[in] Data pointer where 'hal_backend_[module]_funcs' instance
+ */
+void hal_common_put_backend(enum hal_module handle, void *data);
+
+/**
* @brief Check HAL ABI version whehter is suppored or not on current platform
* @param[in] HAL module id among enum hal_moudle
* @param[in] HAL ABI version of backend module among enum hal_abi_version
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
+#include <dlfcn.h>
#include <dlog.h>
#include "common.h"
}
EXPORT
+int hal_common_get_backend(enum hal_module module, void **data)
+{
+ void *handle = NULL;
+ hal_backend *backend;
+ const char *library_name, *symbol_name;
+ int ret = 0;
+
+ /* Load module */
+ library_name = hal_common_get_backend_library_name(HAL_MODULE_FOO);
+ if (!library_name) {
+ _E("Failed to get backend library name of %s\n",
+ hal_module_info[module].module_name);
+ return TIZEN_ERROR_INVALID_PARAMETER;
+ }
+
+ handle = dlopen(library_name, RTLD_LAZY);
+ if (!handle) {
+ _E("Failed to load shared library (%s)\n", dlerror());
+ return TIZEN_ERROR_INVALID_PARAMETER;
+ }
+
+ symbol_name = hal_common_get_backend_symbol_name(HAL_MODULE_FOO);
+ if (!symbol_name) {
+ _E("Failed to get backend symbol name of %s\n",
+ hal_module_info[module].module_name);
+ ret = TIZEN_ERROR_INVALID_PARAMETER;
+ goto err;
+ }
+
+ backend = dlsym(handle, symbol_name);
+ if (!backend) {
+ _E("Failed to find backend data (%s)\n", dlerror());
+ ret = TIZEN_ERROR_INVALID_PARAMETER;
+ goto err;
+ }
+
+ /* Print backend module and vendor name */
+
+ /* Check HAL ABI Version */
+ ret = hal_common_check_backend_abi_version(HAL_MODULE_FOO,
+ backend->abi_version);
+ if (ret < 0) {
+ _E("Failed to check ABI version of %s\n",
+ hal_module_info[module].module_name);
+ ret = TIZEN_ERROR_INVALID_PARAMETER;
+ goto err;
+ }
+
+ /* Get the backend module data */
+ if (!backend->init) {
+ _E("hal_backend->init() is NULL for %s\n",
+ hal_module_info[module].module_name);
+ ret = TIZEN_ERROR_INVALID_PARAMETER;
+ goto err;
+ }
+
+ ret = backend->init(data);
+ if (ret < 0) {
+ _E("Failed to initialize backend: name(%s)/vendor(%s)\n",
+ backend->name, backend->vendor);
+ ret = TIZEN_ERROR_INVALID_PARAMETER;
+ goto err;
+ }
+
+ hal_module_info[module].library_backend = backend;
+ hal_module_info[module].library_handle = handle;
+
+ _I("Get HAL backend: name(%s)/vendor(%s)\n",
+ backend->name, backend->vendor);
+
+ return TIZEN_ERROR_NONE;
+err:
+ dlclose(handle);
+ return ret;
+}
+
+EXPORT
+void hal_common_put_backend(enum hal_module module, void *data)
+{
+ hal_backend *backend = NULL;
+ void *handle = NULL;
+ int ret;
+
+ /* Check parameter whether is valid or not */
+ if (module <= HAL_MODULE_UNKNOWN || module >= HAL_MODULE_END) {
+ _E("Invalid parameter of HAL module (%d)\n", module);
+ return;
+ }
+
+ backend = hal_module_info[module].library_backend;
+ handle = hal_module_info[module].library_handle;
+
+ if (backend) {
+ if (backend->exit)
+ backend->exit(data);
+
+ _I("Put HAL backend: name(%s)/vendor(%s)\n",
+ backend->name, backend->vendor);
+ }
+
+ if (handle)
+ dlclose(handle);
+}
+
+EXPORT
int hal_common_check_backend_abi_version(enum hal_module module,
enum hal_abi_version abi_version)
{