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