⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rmdrm.c

📁 Sigma SMP8634 Mrua v. 2.8.2.0
💻 C
字号:
/* * * Copyright (c) Sigma Designs, Inc. 2005. All rights reserved. * *//** *	@file rmdrm.c *	@brief DRM dynamic module loader * *	@author Julien Lerouge */#define ALLOW_OS_CODE#include "rmdef/rmdef.h"#include "../include/rmdrm.h"#include <dlfcn.h>#include "llad/include/gbus.h"#include "emhwlib/include/emhwlib_event.h"#if (EM86XX_CHIP == EM86XX_CHIPID_TANGO2)#include "xos/include/xos_xrpc.h"#endif#if 0#define RMDRMDEBUG ENABLE#else#define RMDRMDEBUG DISABLE#endif#define xstr(s) str(s)#define str(s) #s#if (EM86XX_MODE == EM86XX_MODEID_WITHHOST) || (EM86XX_CHIP == EM86XX_CHIPID_TANGO2)/* Only compiled on systems with shared libraries */#ifdef _DEBUGstatic const RMascii *drm_string[DRM_COUNT] = {#undef RMDRM_DEFINE#define RMDRM_DEFINE(id, drm, lib)  #drm ,#include "../include/rmdrm.inc"};#endifstatic const RMascii *drm_filename[DRM_COUNT] = {#undef RMDRM_DEFINE#define RMDRM_DEFINE(id, drm, lib)  #lib ,#include "../include/rmdrm.inc"};static void *drm_interface[DRM_COUNT];static void *drm_handle[DRM_COUNT];#endif/** * Load a given DRM * @param id - id of the module to load * @return pointer to the DRM interface, NULL on error */void * load_drm(enum drm_module_id id, const RMascii *filename){#if (EM86XX_MODE == EM86XX_MODEID_WITHHOST) || (EM86XX_CHIP == EM86XX_CHIPID_TANGO2)	RMascii *error;	RMascii **symbol;	RMuint32 nsymbols,i;	void **interface;		if (id >= DRM_COUNT)		return NULL;	if (drm_interface[id])		return drm_interface[id];	if(filename==NULL) filename=drm_filename[id];		RMDBGLOG((RMDRMDEBUG,"Try loading %s module (%s)\n", drm_string[id], filename));	drm_handle[id] = dlopen(filename, RTLD_LAZY);	if (!drm_handle[id]) {		RMDBGLOG((ENABLE, "Error loading %s : %s\n", filename, dlerror()));		return NULL;	}	RMDBGLOG((RMDRMDEBUG,"dlopened %s\n", drm_string[id]));	dlerror();	symbol = dlsym(drm_handle[id], xstr(RMDRM_INTERFACE));	if ((error = dlerror()) != NULL || symbol == NULL) {		RMDBGLOG((ENABLE, "Error getting %s interface : %s\n", drm_string[id], error));		dlclose(drm_handle[id]);		drm_handle[id] = NULL;		drm_interface[id] = NULL;		return NULL;	}	for (nsymbols = 0; symbol[nsymbols] != NULL; nsymbols++);	if (nsymbols == 0) {		RMDBGLOG((ENABLE, "Error, no symbol to load in %s\n", filename));		return NULL;	}	interface = (void **) RMMalloc(sizeof(void *)*nsymbols);	if (interface == NULL) {		RMDBGLOG((ENABLE,"Error : malloc\n"));		return NULL;	}	for (i = 0; i < nsymbols; i++){		RMDBGLOG((RMDRMDEBUG,"Loading symbol %s\n", symbol[i]));		interface[i] = dlsym(drm_handle[id], symbol[i]);		if ((error = dlerror()) != NULL || interface[i] == NULL) {			RMDBGLOG((ENABLE, "Error loading symbol %s : %s\n", symbol[i], error));			dlclose(drm_handle[id]);			drm_handle[id] = NULL;			drm_interface[id] = NULL;			RMFree(interface);			return NULL;		}	}		drm_interface[id] = interface;	RMDBGLOG((RMDRMDEBUG,"got interface %p\n", drm_interface[id]));	return drm_interface[id];#else	/* No shared libraries on pt110 */	return NULL;#endif}/** * Unload a given DRM * @param id - id of the module to unload * @return RM_OK on success */RMstatus unload_drm(enum drm_module_id id){#if (EM86XX_MODE == EM86XX_MODEID_WITHHOST) || (EM86XX_CHIP == EM86XX_CHIPID_TANGO2)	if (id >= DRM_COUNT || drm_interface[id] == NULL)		return RM_ERROR;	dlclose(drm_handle[id]);	drm_handle[id] = NULL;	if (drm_interface[id])		RMFree(drm_interface[id]);	drm_interface[id] = NULL;	return RM_OK;#else	/* No shared libraries on pt110 */	return RM_ERROR;#endif}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -