1 #include "utopia_private.h"
2 #include "utopia_module.h"
3 #include <stdio.h>
4 #include "utopia.h"
5 #include "utopia_dapi.h"
6 #include "string.h"
7 #include "MsOS.h"
8 #include "ULog.h"
9
10 //Global Variable===================================================
11 UTOPIA_PRIVATE* psUtopiaPrivate;
12
13 char moduleNames[][40] = {
14 #define PREFIX(MODULE) "MODULE_"#MODULE,
15 INCLUDED_MODULE
16 #undef PREFIX
17 };
18
19 char rpoolNames[][40] = {
20 #define PREFIX(MODULE) "RPOOL_"#MODULE,
21 INCLUDED_MODULE
22 #undef PREFIX
23 };
24
25 char ResourceNames[][40] = {
26 #define PREFIX(MODULE) "RESOURCE_"#MODULE,
27 INCLUDED_MODULE
28 #undef PREFIX
29 };
30
31 void AESDMARegisterToUtopia(FUtopiaOpen ModuleType);
32 void SYSRegisterToUtopia(FUtopiaOpen ModuleType);
33 void DSCMBRegisterToUtopia();
34 void XCRegisterToUtopia(FUtopiaOpen ModuleType);
35 void SEMRegisterToUtopia(FUtopiaOpen ModuleType);
36 void GFXRegisterToUtopia(FUtopiaOpen ModuleType);
37
UtopiaInit()38 MS_U32 UtopiaInit()
39 {
40 MS_U32 u32Ret = 0;
41
42 printf("utopia init\n" );
43 psUtopiaPrivate = (UTOPIA_PRIVATE*)malloc(sizeof(UTOPIA_PRIVATE));
44 memset(psUtopiaPrivate, 0, sizeof(UTOPIA_PRIVATE));
45 psUtopiaPrivate->u32MutexID = MsOS_CreateMutex(E_MSOS_FIFO
46 , "UtopiaPrivateMutex", MSOS_PROCESS_SHARED);
47
48 MsOS_ObtainMutex(psUtopiaPrivate->u32MutexID, MSOS_WAIT_FOREVER);
49 /*
50 * to avoid weak attribute malfunction in static lib,
51 * we explicitly call needed functions
52 */
53
54 AESDMARegisterToUtopia((FUtopiaOpen)MODULE_TYPE_AESDMA_FULL);
55 SYSRegisterToUtopia(NULL);
56 #ifndef MSOS_TYPE_OPTEE
57 DSCMBRegisterToUtopia();
58 #endif
59 XCRegisterToUtopia((FUtopiaOpen)MODULE_TYPE_XC_TEE);
60 DACRegisterToUtopia();
61 TVENCODERRegisterToUtopia((FUtopiaOpen)MODULE_TYPE_TVENCODER_FULL);
62 ACPRegisterToUtopia();
63 SEMRegisterToUtopia((FUtopiaOpen)MODULE_TYPE_SEM_FULL);
64 GFXRegisterToUtopia((FUtopiaOpen)MODULE_TYPE_GFX_FULL);
65
66 MsOS_ReleaseMutex(psUtopiaPrivate->u32MutexID);
67 return u32Ret;
68 }
69
UtopiaOpen(MS_U32 u32ModuleID,void ** ppInstanceTmp,MS_U32 u32ModuleVersion,const void * const pAttribute)70 MS_U32 UtopiaOpen(MS_U32 u32ModuleID, void** ppInstanceTmp
71 , MS_U32 u32ModuleVersion, const void* const pAttribute)
72 {
73 UTOPIA_MODULE* psUtopiaModule = psUtopiaPrivate->psModuleHead;
74 UTOPIA_INSTANCE** ppInstance = (UTOPIA_INSTANCE**)ppInstanceTmp;
75
76
77 // psUtopiaInstant->u32OpenThreadName = pthred_ctrl(get_name); // FIXME: need to be discussed implementation
78 while(psUtopiaModule != NULL)
79 {
80 if(psUtopiaModule->u32ModuleID == u32ModuleID)//need modify to link list
81 {
82 int ret = psUtopiaModule->fpOpen((void**)ppInstance, pAttribute);
83
84 if(ret)
85 {
86 printf("[utopia error] fail to create instance\n");
87 return ret;
88 }
89
90 (*ppInstance)->psModule = psUtopiaModule;
91 (*ppInstance)->u32AppRequireModuleVersion = u32ModuleVersion;
92 return ret;
93 }
94 psUtopiaModule = psUtopiaModule->psNext;
95 }
96 return 0xFFFFFFFF; // FIXME: 1. error code, 2. to avoid possible fpOpen return value
97 }
98
UtopiaIoctl(void * pInstanceTmp,MS_U32 u32Cmd,void * const pArgs)99 MS_U32 UtopiaIoctl(void* pInstanceTmp, MS_U32 u32Cmd, void* const pArgs)
100 {
101 UTOPIA_INSTANCE* pInstance = (UTOPIA_INSTANCE*)pInstanceTmp;
102 return ((UTOPIA_INSTANCE*)pInstance)->psModule->fpIoctl(pInstance, u32Cmd, pArgs);
103 }
104
UtopiaClose(void * pInstantTmp)105 MS_U32 UtopiaClose(void* pInstantTmp)
106 {
107 UTOPIA_INSTANCE* pInstant = (UTOPIA_INSTANCE*)pInstantTmp;
108
109 UTOPIA_MODULE* psUtopiaModule = psUtopiaPrivate->psModuleHead;
110 while(psUtopiaModule != NULL)
111 {
112 if(psUtopiaModule->u32ModuleID == pInstant->psModule->u32ModuleID)
113 {
114 return psUtopiaModule->fpClose(pInstant);
115 }
116 psUtopiaModule = psUtopiaModule->psNext;
117 }
118 return 0;
119 }
120
121