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
9 //Global Variable===================================================
10 UTOPIA_PRIVATE* psUtopiaPrivate;
11
12 int lib_lowprintf(const char *fmt, ...);
13 #define printf lib_lowprintf
14 char moduleNames[][40] = {
15 #define PREFIX(MODULE) "MODULE_"#MODULE,
16 INCLUDED_MODULE
17 #undef PREFIX
18 };
19
20 char rpoolNames[][40] = {
21 #define PREFIX(MODULE) "RPOOL_"#MODULE,
22 INCLUDED_MODULE
23 #undef PREFIX
24 };
25
26 char ResourceNames[][40] = {
27 #define PREFIX(MODULE) "RESOURCE_"#MODULE,
28 INCLUDED_MODULE
29 #undef PREFIX
30 };
31
32 void BDMARegisterToUtopia(FUtopiaOpen ModuleType);
33 void AESDMARegisterToUtopia(FUtopiaOpen ModuleType);
34 void MBXRegisterToUtopia(FUtopiaOpen ModuleType);
35 void DSCMBRegisterToUtopia(void);
36 void SYSRegisterToUtopia(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 UTOPIARegisterToUtopia((FUtopiaOpen)MODULE_TYPE_UTOPIA_FULL);
54 BDMARegisterToUtopia((FUtopiaOpen)MODULE_TYPE_BDMA_FULL);
55 AESDMARegisterToUtopia((FUtopiaOpen)MODULE_TYPE_AESDMA_FULL);
56 MBXRegisterToUtopia((FUtopiaOpen)MODULE_TYPE_MBX_FULL);
57 DSCMBRegisterToUtopia();
58 SYSRegisterToUtopia(NULL);
59 MsOS_ReleaseMutex(psUtopiaPrivate->u32MutexID);
60
61 return u32Ret;
62 }
63
UtopiaOpen(MS_U32 u32ModuleID,void ** ppInstanceTmp,MS_U32 u32ModuleVersion,const void * const pAttribute)64 MS_U32 UtopiaOpen(MS_U32 u32ModuleID, void** ppInstanceTmp
65 , MS_U32 u32ModuleVersion, const void* const pAttribute)
66 {
67 UTOPIA_MODULE* psUtopiaModule = psUtopiaPrivate->psModuleHead;
68 UTOPIA_INSTANCE** ppInstance = (UTOPIA_INSTANCE**)ppInstanceTmp;
69
70
71 // psUtopiaInstant->u32OpenThreadName = pthred_ctrl(get_name); // FIXME: need to be discussed implementation
72 while(psUtopiaModule != NULL)
73 {
74 if(psUtopiaModule->u32ModuleID == u32ModuleID)//need modify to link list
75 {
76 int ret = psUtopiaModule->fpOpen((void**)ppInstance, pAttribute);
77
78 if(ret)
79 {
80 printf("[utopia error] fail to create instance\n");
81 return ret;
82 }
83
84 (*ppInstance)->psModule = psUtopiaModule;
85 (*ppInstance)->u32AppRequireModuleVersion = u32ModuleVersion;
86 return ret;
87 }
88 psUtopiaModule = psUtopiaModule->psNext;
89 }
90 return 0xFFFFFFFF; // FIXME: 1. error code, 2. to avoid possible fpOpen return value
91 }
92
UtopiaIoctl(void * pInstanceTmp,MS_U32 u32Cmd,void * const pArgs)93 MS_U32 UtopiaIoctl(void* pInstanceTmp, MS_U32 u32Cmd, void* const pArgs)
94 {
95 UTOPIA_INSTANCE* pInstance = (UTOPIA_INSTANCE*)pInstanceTmp;
96 return ((UTOPIA_INSTANCE*)pInstance)->psModule->fpIoctl(pInstance, u32Cmd, pArgs);
97 }
98
UtopiaClose(void * pInstantTmp)99 MS_U32 UtopiaClose(void* pInstantTmp)
100 {
101 UTOPIA_INSTANCE* pInstant = (UTOPIA_INSTANCE*)pInstantTmp;
102
103 UTOPIA_MODULE* psUtopiaModule = psUtopiaPrivate->psModuleHead;
104 while(psUtopiaModule != NULL)
105 {
106 if(psUtopiaModule->u32ModuleID == pInstant->psModule->u32ModuleID)
107 {
108 return psUtopiaModule->fpClose(pInstant);
109 }
110 psUtopiaModule = psUtopiaModule->psNext;
111 }
112 return 0;
113 }
114
115